changeset 1:4a9dcbd9e54f

-files of 0.13 beta -fixes so that it now compiles with the current dmd version
author marton@basel.hu
date Tue, 05 Apr 2011 20:44:01 +0200
parents 586e4a649642
children 54824ff2fe5f
files bin/ddbg.exe ddbgcompile.bat src/breakpoint.d src/callstack.d src/cli/ddbg_help.txt src/cli/ddbgcli.d src/cli/gdbcli.d src/cli/gdbmicli.d src/cli/userinterface.d src/codeview/codeview.d src/codeview/coff.d src/codeview/debuginfo.d src/codeview/decl.d src/codeview/parser.d src/codeview/symboldb.d src/container.d src/dbgprocess.d src/dbgthread.d src/debugger.d src/disasm.d src/expression/datahandler.d src/expression/evaluationcontext.d src/expression/expression.apd src/expression/expression_apd.d src/main.d src/minidump.d src/udis86.d src/util.d src/win32/dbghelp.d udis86-1.4/CHANGES udis86-1.4/COPYING udis86-1.4/LICENSE udis86-1.4/Makefile.in udis86-1.4/Makefile.win32 udis86-1.4/README udis86-1.4/config.h.in udis86-1.4/config.status udis86-1.4/configure udis86-1.4/configure.in udis86-1.4/docs/doc.html udis86-1.4/docs/index.html udis86-1.4/docs/ss.jpg udis86-1.4/docs/style.css udis86-1.4/install-sh udis86-1.4/libudis86/Makefile.in udis86-1.4/libudis86/Makefile.standalone udis86-1.4/libudis86/Makefile.win32 udis86-1.4/libudis86/decode.c udis86-1.4/libudis86/extern.h udis86-1.4/libudis86/input.c udis86-1.4/libudis86/input.h udis86-1.4/libudis86/mnemonics.c udis86-1.4/libudis86/mnemonics.dat udis86-1.4/libudis86/mnemonics.h udis86-1.4/libudis86/mnemonics.pl udis86-1.4/libudis86/opcmap.c udis86-1.4/libudis86/opcmap.h udis86-1.4/libudis86/syn-att.c udis86-1.4/libudis86/syn-intel.c udis86-1.4/libudis86/syn.c udis86-1.4/libudis86/syn.h udis86-1.4/libudis86/types.h udis86-1.4/libudis86/udis86.c udis86-1.4/mkinstalldirs udis86-1.4/tests/Makefile udis86-1.4/tests/Makefile.win32 udis86-1.4/tests/gen.c udis86-1.4/tests/test16.asm udis86-1.4/tests/test32.asm udis86-1.4/tests/test64.asm udis86-1.4/tests/testjmp.asm udis86-1.4/udcli/Makefile.in udis86-1.4/udcli/Makefile.win32 udis86-1.4/udcli/udcli.c udis86-1.4/udis86.h win32/accctrl.d win32/aclapi.d win32/aclui.d win32/basetsd.d win32/basetyps.d win32/cderr.d win32/cguid.d win32/comcat.d win32/commctrl.d win32/commdlg.d win32/core.d win32/cpl.d win32/cplext.d win32/custcntl.d win32/dbt.d win32/dde.d win32/ddeml.d win32/dhcpcsdk.d win32/directx/d3d10.d win32/directx/d3d10effect.d win32/directx/d3d10misc.d win32/directx/d3d10shader.d win32/directx/d3d9.d win32/directx/d3d9.def win32/directx/d3d9caps.d win32/directx/d3d9types.d win32/directx/d3dx10.d win32/directx/d3dx10async.d win32/directx/d3dx10core.d win32/directx/d3dx10math.d win32/directx/d3dx10mesh.d win32/directx/d3dx10tex.d win32/directx/d3dx9.d win32/directx/d3dx9.def win32/directx/dinput8.d win32/directx/dinput8.def win32/directx/dsound8.d win32/directx/dsound8.def win32/directx/dxerr.d win32/directx/dxerr8.d win32/directx/dxerr9.d win32/directx/dxgi.d win32/directx/dxgitype.d win32/dlgs.d win32/docobj.d win32/errorrep.d win32/exdisp.d win32/exdispid.d win32/httpext.d win32/idispids.d win32/imagehlp.d win32/imm.d win32/intshcut.d win32/ipexport.d win32/iphlpapi.d win32/ipifcons.d win32/iprtrmib.d win32/iptypes.d win32/isguids.d win32/lm.d win32/lmaccess.d win32/lmalert.d win32/lmapibuf.d win32/lmat.d win32/lmaudit.d win32/lmbrowsr.d win32/lmchdev.d win32/lmconfig.d win32/lmcons.d win32/lmerr.d win32/lmerrlog.d win32/lmmsg.d win32/lmremutl.d win32/lmrepl.d win32/lmserver.d win32/lmshare.d win32/lmsname.d win32/lmstats.d win32/lmsvc.d win32/lmuse.d win32/lmuseflg.d win32/lmwksta.d win32/lzexpand.d win32/makefile win32/mapi.d win32/mciavi.d win32/mcx.d win32/mgmtapi.d win32/mmsystem.d win32/msacm.d win32/mshtml.d win32/mswsock.d win32/nb30.d win32/nddeapi.d win32/nspapi.d win32/ntdef.d win32/ntdll.d win32/ntldap.d win32/ntsecapi.d win32/oaidl.d win32/objbase.d win32/objfwd.d win32/objidl.d win32/objsafe.d win32/ocidl.d win32/odbcinst.d win32/ole.d win32/ole2.d win32/ole2ver.d win32/oleacc.d win32/oleauto.d win32/olectl.d win32/olectlid.d win32/oledlg.d win32/oleidl.d win32/pbt.d win32/powrprof.d win32/prsht.d win32/psapi.d win32/rapi.d win32/ras.d win32/rasdlg.d win32/raserror.d win32/rassapi.d win32/readme.txt win32/reason.d win32/regstr.d win32/richedit.d win32/richole.d win32/rpc.d win32/rpcdce.d win32/rpcdce2.d win32/rpcdcep.d win32/rpcndr.d win32/rpcnsi.d win32/rpcnsip.d win32/rpcnterr.d win32/schannel.d win32/secext.d win32/servprov.d win32/setupapi.d win32/shellapi.d win32/shldisp.d win32/shlguid.d win32/shlobj.d win32/shlwapi.d win32/snmp.d win32/sql.d win32/sqlext.d win32/sqltypes.d win32/sqlucode.d win32/subauth.d win32/testall.d win32/testcompile.bat win32/tlhelp32.d win32/tmschema.d win32/unknwn.d win32/usp10.d win32/uuid.di win32/vfw.d win32/w32api.d win32/winbase.d win32/winber.d win32/wincon.d win32/wincrypt.d win32/windef.d win32/windows.d win32/winerror.d win32/wingdi.d win32/wininet.d win32/winioctl.d win32/winldap.d win32/winnetwk.d win32/winnls.d win32/winnt.d win32/winperf.d win32/winreg.d win32/winsock.d win32/winsock2.d win32/winspool.d win32/winsvc.d win32/winuser.d win32/winver.d win32/ws2tcpip.d win32/wtypes.d
diffstat 260 files changed, 118334 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
Binary file bin/ddbg.exe has changed
--- a/ddbgcompile.bat	Tue Apr 05 20:35:59 2011 +0200
+++ b/ddbgcompile.bat	Tue Apr 05 20:44:01 2011 +0200
@@ -1,7 +1,7 @@
 REM This is an example how to compile it
 d:
-cd D:\src\ddbg\
-D:\standalone\apaged-0.4.2-beta\bin\apaged.exe D:\src\ddbg\src\expression\expression.apd D:\src\ddbg\src\expression\expression_apd.d
+cd D:\src\ddbg_continued\
+D:\standalone\apaged-0.4.2-beta\bin\apaged.exe D:\src\ddbg_continued\src\expression\expression.apd D:\src\ddbg_continued\src\expression\expression_apd.d
 D:\standalone\dmd.1.066\dmd\windows\bin\bud.exe -CFPATHD:\standalone\dmd.1.066\dmd\windows\bin -DCPATHD:\standalone\dmd.1.066\dmd\windows\bin -I. -Isrc -Jsrc -JD:\src\ddbg\src\cli -version=Windows2000 -version=WindowsNTonly -full -release -O -inline -odobj -ofbin\ddbg.exe udis86-1.4\libudis86\*.obj src\main
 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/breakpoint.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,199 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+module breakpoint;
+
+import std.string;
+import std.c.string;
+
+import dbgthread;
+import codeview.codeview;
+import dbgprocess;
+import util;
+
+import win32.windef;
+
+enum StepMode {
+    e_in, e_over, e_out
+}
+
+/**************************************************************************************************
+    Represents a software breakpoint.
+**************************************************************************************************/
+class Breakpoint
+{
+    //---------------------------------------------------------------------------------------------
+    // constants
+    const ubyte BREAKPOINT_OPCODE = 0xccu;
+
+    //---------------------------------------------------------------------------------------------
+    // variables
+    byte            old_opcode;
+    bool            active,
+                    temporary,
+                    deactivate_d_exception_handler,
+                    propagate,				/// when hit on a jmp/call/ret instruction, shall be reactivated on it's destination
+                    hardware;
+    Breakpoint      foreach_end;
+    Location		location;
+    size_t          frame_ptr,
+                    threadId,
+                    old_dr_value;
+    ubyte           dr_index;
+
+    //---------------------------------------------------------------------------------------------
+    // properties
+    string file()				{ return location is null?null:location.file; }
+    uint line()					{ return location is null?0:location.line; }
+    uint address()				{ return location is null?0:location.address; }
+
+
+    //---------------------------------------------------------------------------------------------
+    // construction
+    this(Location loc, bool temp, uint _threadId, bool _hardware=false)
+    {
+        hardware = _hardware;
+        threadId = _threadId;
+        temporary = temp;
+        location = loc;
+    }
+
+
+    //---------------------------------------------------------------------------------------------
+    // methods
+
+    /**
+     *
+     */
+    string toString()
+    {
+        string tmp;
+        tmp.length = 100;
+        tmp.length = 0;
+        if ( location.path.length > 0 )
+            tmp ~= format("%s ", location.path);
+        if ( file.length > 0 )
+            tmp ~= format("%s:%d ", file, line);
+        if ( location.address > 0 )
+            tmp ~= format("0x%x ", location.address);
+        if ( hardware )
+            tmp ~= "hw ";
+        if ( threadId > 0 )
+            tmp ~= format("thread %s", threadId);
+        else
+            tmp ~= format("all threads");
+        return tmp;
+    }
+
+    /**********************************************************************************************
+        Restores the opcode that has been overwritten for the given breakpoint.
+        Returns success.
+    **********************************************************************************************/
+    bool deactivate(DbgProcess proc)
+    {
+        if ( !active )
+            return true;
+        if ( proc is null )
+            return false;
+
+        if ( hardware )
+        {
+            if ( threadId == 0 )
+            {
+                foreach ( thread; proc.threads.values )
+                    clearHWBP(thread, 0);
+            }
+            else
+                clearHWBP(proc.threads[threadId], 0);
+        }
+        else if( !proc.writeProcessMemory(location.address, &old_opcode, ubyte.sizeof))
+        {
+            DbgIO.println("restoreBreakpoint(): Failed to write original opcode at 0x%x", location.address);
+            return false;
+        }
+
+        active = false;
+        return true;
+    }
+
+    /**********************************************************************************************
+        Writes an int 3 opcode at the address of this breakpoint, saving the overwritten code.
+        Returns success.
+    **********************************************************************************************/
+    bool activate(DbgProcess proc)
+    {
+        if( active )
+            return true;
+        if( location.address == 0 || proc is null )
+            return false;
+
+        debug DbgIO.println("activating bp at 0x%x", location.address);
+
+        if ( hardware )
+        {
+            if ( threadId == 0 )
+            {
+                foreach ( thread; proc.threads.values )
+                    setHWBP(thread, location.address, 0);
+            }
+            else
+                setHWBP(proc.threads[threadId], location.address, 0);
+        }
+        else
+        {
+            uint	oldprot, oldprot2;
+            ubyte	ccByte = cast(ubyte)0xcc;
+
+            if( ubyte.sizeof > proc.readProcessMemory(location.address, &old_opcode, ubyte.sizeof) ) {
+                DbgIO.println( "readProcessMemory(): failed to read breakpoint opcode at 0x%08x", location.address );
+                return false;
+            }
+
+            ubyte opcode = BREAKPOINT_OPCODE;
+            if( ubyte.sizeof > proc.writeProcessMemory(location.address, &opcode, ubyte.sizeof) ) {
+                DbgIO.println("writeProcessMemory(): Failed to write breakpoint at 0x%08x", location.address );
+                return false;
+            }
+        }
+
+        active = true;
+        return true;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void setHWBP(DbgThread thread, size_t address, ubyte index)
+    {
+        assert(index < 4);
+
+        CONTEXT ctx;
+        thread.getContext(ctx, CONTEXT_DEBUG_REGISTERS);
+        DbgIO.println("Dr0 = %x\nDr1 = %x\nDr2 = %x\nDr3 = %x\nDr7 = %x\n", ctx.Dr0, ctx.Dr1, ctx.Dr2, ctx.Dr3, ctx.Dr7);
+
+        old_dr_value = *(&ctx.Dr0 + index);
+        *(&ctx.Dr0 + index) = address+thread.getDsBase;
+        dr_index = index;
+
+        ctx.Dr7 |= 1<<10 | (1 << index) | (15 << (16+index*4));
+        DbgIO.println("Dr0 = %x\nDr1 = %x\nDr2 = %x\nDr3 = %x\nDr7 = %x\n", ctx.Dr0, ctx.Dr1, ctx.Dr2, ctx.Dr3, ctx.Dr7);
+        thread.setContext(ctx);
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void clearHWBP(DbgThread thread, ubyte index)
+    {
+        assert(index < 4);
+
+        CONTEXT ctx;
+        thread.getContext(ctx, CONTEXT_DEBUG_REGISTERS);
+        DbgIO.println("Dr0 = %x\nDr1 = %x\nDr2 = %x\nDr3 = %x\nDr7 = %x\n", ctx.Dr0, ctx.Dr1, ctx.Dr2, ctx.Dr3, ctx.Dr7);
+
+        ctx.Dr7 &= ~((1 << index) | (15 << (16+index*4)));
+        DbgIO.println("Dr0 = %x\nDr1 = %x\nDr2 = %x\nDr3 = %x\nDr7 = %x\n", ctx.Dr0, ctx.Dr1, ctx.Dr2, ctx.Dr3, ctx.Dr7);
+        thread.setContext(ctx);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/callstack.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,114 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+
+import util;
+import codeview.codeview;
+import expression.evaluationcontext;
+
+import std.string;
+
+/**************************************************************************************************
+    Wraps the raw stack data with functions for unwinding it.
+**************************************************************************************************/
+class CallStack
+{
+	ubyte[]	data;
+	uint	base_ptr,	// the "base" of the stack, i.e. the largest address
+			top_ptr,	// the current top of the stack = Esp
+			frame_ptr;	// the current frame pointer
+
+	/**********************************************************************************************
+        Initializes the object with pointers to base, top (esp) and frame (ebp)
+        of the stack. Resizes the data array to the required size.
+    **********************************************************************************************/
+	this(uint base_ptr_, uint top_ptr_, uint frame_ptr_)
+	{
+		base_ptr = base_ptr_;
+		top_ptr = top_ptr_;
+		frame_ptr = frame_ptr_;
+		data.length = base_ptr-top_ptr;
+	}
+
+	/**********************************************************************************************
+        Calculates the first frame.
+        Params: prev_index = first byte of previous frame pointer
+        Returns: Array covering the frame.
+    **********************************************************************************************/
+	ubyte[] firstFrame(out uint prev_index)
+	{
+		prev_index = frame_ptr-top_ptr;
+		if ( prev_index >= data.length )
+            return data;
+		return data[0..prev_index];
+	}
+
+	/**********************************************************************************************
+        Calculates the previous frame.
+        Params:
+        frame_index	= start of desired frame in data array
+        prev_index	= start of previous to desired frame in data array
+        Returns: Array covering the previous frame.
+    **********************************************************************************************/
+	ubyte[] prevFrame(in uint frame_index, out uint prev_index)
+	{
+		if ( frame_index >= data.length-4 )
+			return null;
+
+		uint prev_frame_ptr = (cast(uint[])data)[frame_index>>2];
+		if ( prev_frame_ptr < top_ptr || prev_frame_ptr > base_ptr )
+			return null;
+
+		prev_index = prev_frame_ptr-top_ptr;
+		assert( prev_index > frame_index && prev_index <= data.length );
+		return data[frame_index..prev_index];
+	}
+
+	/**********************************************************************************************
+
+	**********************************************************************************************/
+    ubyte[] getFrame(uint frame_level)
+    {
+		uint	prev_frame_idx;
+		ubyte[]	frame = firstFrame(prev_frame_idx);
+		for ( ; frame_level > 0; --frame_level )
+			frame = prevFrame(prev_frame_idx, prev_frame_idx);
+        return frame;
+    }
+
+	/**********************************************************************************************
+        Loads data from the stack for a given symbol.
+        Returns: Array of bytes continaing the data
+    **********************************************************************************************/
+	bool loadSymbolData(StackSymbol sym, SymbolData symdata, uint frame_level=0)
+	{
+		if ( sym is null )
+			return false;
+		uint	prev_frame_idx;
+		ubyte[]	frame = firstFrame(prev_frame_idx);
+		for ( ; frame_level > 0; --frame_level )
+			frame = prevFrame(prev_frame_idx, prev_frame_idx);
+
+        symdata.defered_load = true;
+
+		bool loadSymbolData(uint offset)
+		{
+			// index is in this frame
+			if ( offset <= frame.length-sym.size ) {
+				symdata.len = sym.size;
+				symdata.ptr = top_ptr + (frame.ptr - data.ptr) + offset;
+				return true;
+			}
+			assert( offset >= frame.length );
+			// consider previous frame
+			offset -= frame.length;
+			frame = prevFrame(prev_frame_idx, prev_frame_idx);
+			if ( frame !is null )
+				return loadSymbolData(offset);
+			return false;
+		}
+
+		return loadSymbolData(frame.length+sym.cvdata.offset);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cli/ddbg_help.txt	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,72 @@
+                Running
+-----------------------------------------------------------------------------
+in                                 step into at source level
+ov                                 step over at source level
+out                                step out at source level
+r                                  run/continue the program
+                Breakpoints
+-----------------------------------------------------------------------------
+bp [<file>:<line>[#<thrd>]] [ind]  set breakpoint #index at given file:line
+                                   optionally only for the given thread id
+                                   optionally with the given breakpoint index
+dbp [<file>:<line>|#index|*]       delete breakpoint by index, line or all
+lbp                                list breakpoints
+ltbp                               list temporary breakpoints
+                Stack/Memory/Registers
+-----------------------------------------------------------------------------
+dm <start> <length>                dump memory (start in hex, length in dec)
+dr [cpu] [fpu] [mmx] [sse]         dump registers [toggle register groups]
+ds                                 dump stack (last line is top)
+lsv                                list variables in current scope
+mi [free] [rsrv]                   memory information. lists blocks in state
+                                   commit and optionally free and reserve
+us                                 unwind stack, prints full stacktrace
+                Expressions
+-----------------------------------------------------------------------------
+= <expr>                           evaluate expression
+ed <depth>                         set max depth of implicit evaluation of
+                                   recursive structures
+el <length>                        set max number of array elements to print
+er                                 toggle between ed 0 and previous ed
+f <number>                         select frame for evaluation.
+                                   default: current frame = 0
+t <expression>                     type of expression
+                Source
+-----------------------------------------------------------------------------
+jkf                                toggle whether to switch to stack frame of
+                                   last known source location on exception
+lsm [substring]                    list source modules
+lsp                                list source search paths
+ps [count]                         print count lines of source before
+                                   and after current location
+sp <path>                          add source search path
+                Disassembly
+-----------------------------------------------------------------------------
+da [start]                         disassemble from start
+                                   (default = function start) to next ret
+dal [#lines]                       disassemble to/from +/- source lines
+                Threads
+-----------------------------------------------------------------------------
+lt                                 list threads
+st <threadId>                      select thread to be evaluation context
+                Minidumps
+-----------------------------------------------------------------------------
+rmd <file>                         read minidump from file
+wmd <file>                         write minidump to file
+                Miscellaneous
+-----------------------------------------------------------------------------
+arg <args>                         set command line arguments
+ii                                 print image information
+ldll                               list loaded DLLs
+lm [substring]                     list debug modules
+ld [substring]                     list data symbols
+lf [substring]                     list function symbols
+lg [substring]                     list global symbols
+lp [substring]                     list global publics
+ls [substring]                     list all symbols
+nc                                 toggle new console for process
+onex <cmd; cmd; ...>               on exception execute list of commands
+onterm <cmd; cmd; ...>             on termination execute list of commands
+q                                  quit debugger
+
+return repeats the last command
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cli/ddbgcli.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,1380 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+module cli.ddbgcli;
+
+import std.string;
+static import std.regexp;
+import std.c.stdio : sscanf;
+import std.c.string;
+import std.demangle;
+
+import minidump;
+import container;
+import util;
+import codeview.codeview;
+import breakpoint;
+import debugger;
+import disasm;
+import callstack;
+import dbgprocess;
+import dbgthread;
+import expression.expression_apd;
+import expression.datahandler : SymbolValue, DataHandler;
+import expression.evaluationcontext;
+import cli.userinterface;
+
+import win32.winbase;
+import win32.winuser;
+import win32.winnt;
+import win32.dbghelp;
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class DdbgCLI : UserInterfaceBase
+{
+    const int   PRINT_SOURCE_LINES = 3;
+
+    string[]	lastcmd,
+                onexCommands,
+                ontermCommands;
+    string		debuggee,
+                command_line;
+
+    uint        current_frame_level;
+
+    bool		quit;
+
+    const ubyte CPU_REGISTERS = 1,
+                FPU_REGISTERS = 2,
+                MMX_REGISTERS = 4,
+                SSE_REGISTERS = 8;
+    ubyte       dump_registers = CPU_REGISTERS;
+
+    uint        lastEvaluationDepth = 1;
+
+    bool        auto_find_scope_frame, /// find frame of last active scope if current frame has no source/symbols
+                jump_to_last_known_location_on_exception = true;
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void init(string[] args)
+    {
+        DbgIO.println(WELCOME_STRING);
+        if ( args.length < 2 )
+            throw new DebuggerException("Usage: ddbg [-cli=<mode>] [-cmd=<commands>] <exe file> [arguments]");
+
+        debuggee = args[1];
+        foreach ( inout arg; args )
+        {
+            if ( find(arg, ' ') >= 0 )
+                arg = "\""~arg~"\"";
+        }
+        command_line = join(args[1..$], " ");
+
+        dbg = new Debugger(debuggee, this);
+    }
+
+    int start()
+    {
+        while ( !quit )
+        {
+            debug
+                readCommand();
+            else
+            {
+                try readCommand();
+                catch ( Exception e )
+                    DbgIO.println(e.msg);
+            }
+        }
+        return 0;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void singleStep()
+    {
+        DbgIO.println(describeLocation(dbg.current_address));
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void exitProcess()
+    {
+        DbgIO.println("Process terminated");
+        cmdQueue ~= ontermCommands;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void loadedDLL(DLL dll)
+    {
+        if( dll !is null && dll.image.name.length ) {
+            DbgIO.write(dll.image.name);
+            DbgIO.println(" loaded at 0x%08x", dll.base);
+        }
+        else
+            DbgIO.writeln("unknown DLL loaded");
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void win32exception(uint threadId, EXCEPTION_RECORD* exrec)
+    {
+        DbgIO.println(
+            "Unhandled Exception: %s(0x%x) at %s thread(%d)",
+            getExceptionName(exrec.ExceptionCode), exrec.ExceptionCode, describeLocation(dbg.current_address), threadId
+        );
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void exception(uint threadId, string class_name, string msg, size_t obj_ptr)
+    {
+        if ( jump_to_last_known_location_on_exception )
+        {
+            uint	index;
+            current_frame_level = 0;
+            Location loc = dbg.images.findLocation(dbg.current_address);
+
+            if ( loc.codeblock is null )
+            {
+                dbg.stack.firstFrame(index);
+                ubyte[] frame = dbg.stack.prevFrame(index, index);
+                while ( loc.codeblock is null && frame !is null )
+                {
+                    uint ret_adr = (cast(uint[])frame)[1];
+                    loc = dbg.images.findLocation(ret_adr);
+                    frame = dbg.stack.prevFrame(index, index);
+                    ++current_frame_level;
+                }
+            }
+        }
+
+        DbgIO.println("Unhandled D Exception (%s", class_name);
+        DbgIO.write(msg.length>0?" \""~msg~"\"":"");
+        DbgIO.println(") at %s thread(%d)", describeLocation(dbg.current_address), threadId);
+        cmdQueue ~= onexCommands;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void userInterrupt()
+    {
+        DbgIO.println("User interrupt at %s", describeLocation(dbg.current_address));
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    bool breakpoint(int index, Breakpoint bp, DbgThread thread)
+    {
+        if ( bp.hardware )
+        {
+            DbgIO.println("Hardware breakpoint for 0x%x hit at %s thread(%d)",
+                bp.address, describeLocation(dbg.current_address), thread.id
+            );
+        }
+        else if ( bp.file is null || bp.line == 0 )
+            DbgIO.println("Unknown breakpoint hit at %s thread(%d)", describeLocation(bp.address), thread.id);
+        else
+        {
+            string[]	source = dbg.getSourceFile(bp.file);
+            string		source_line;
+            if ( source !is null && bp.line <= source.length )
+                source_line = source[bp.line-1];
+
+            if ( !bp.temporary )
+                DbgIO.print("Breakpoint %d hit at ", index);
+            DbgIO.println("%s:%d 0x%x thread(%d)", bp.file, bp.line, bp.address, thread.id);
+            if ( source_line.length > 0 )
+                DbgIO.writeln(source_line);
+        }
+        return true;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void debugString(string str)
+    {
+        printf("OUTPUT DEBUG STRING:\n%s\n", toStringz(str));
+    }
+
+    /**********************************************************************************************
+        Command line parser. Gets called when debuggee is suspended.
+    **********************************************************************************************/
+    bool parseCommand(string input)
+    {
+        if ( strip(input).length > 0 )
+        {
+            auto r = std.regexp.RegExp("(([^\" \\t]+)|(\"[^\"]+\"))+");
+            lastcmd.length = 0;
+            foreach ( m; r.search(input) )
+                lastcmd ~= r.match(0);
+        }
+        if ( lastcmd.length <= 0 )
+            return false;
+
+        switch ( lastcmd[0] )
+        {
+            case "help":
+            case "h":
+            case "?":
+                DbgIO.write(import("ddbg_help.txt"));
+                break;
+            case "=":
+                if ( !dbg.process_loaded && dbg.miniDump is null )
+                    break;
+                if ( lastcmd.length > 1 )
+                {
+                    try DbgIO.writeln(symbolValueToString(dbg.handleData(dbg.evaluateExpression(lastcmd[1], current_frame_level), false)));
+                    catch ( EvaluationException e ) {
+                        DbgIO.writeln(e.toString);
+                    }
+                }
+                break;
+            case "arg":
+                if ( dbg.process_loaded )
+                    DbgIO.println("Warning: process already started");
+                command_line = debuggee~" "~join(lastcmd[1..$], " ");
+                break;
+            // add breakpoint
+            case "bp":
+                int index;
+                if ( lastcmd.length < 2 ) {
+                    DbgIO.println("invalid syntax - see help for details");
+                    break;
+                }
+
+                int pos = find(lastcmd[1], '#');
+                uint threadId;
+                if ( pos > 0 )
+                {
+                    threadId = cast(uint)atoi(lastcmd[1][pos+1..$]);
+                    lastcmd[1] = lastcmd[1][0..pos];
+                }
+                Location loc = new Location(lastcmd[1]);
+                loc.bind(dbg.images, dbg.source_search_paths);
+                if ( lastcmd.length > 2 )
+                    index = cast(int)atoi(lastcmd[2]);
+
+                Breakpoint bp;
+                if ( index <= 0 && dbg.breakpoints.length > 0 )
+                    index = dbg.breakpoints.keys.dup.sort[$-1]+1;
+                bp = dbg.setBreakpoint(loc, index, threadId);
+                DbgIO.println("Breakpoint set: %s", bp.toString);
+                break;
+            // delete breakpoint
+            case "dbp":
+                if ( lastcmd.length > 1 )
+                {
+                    if ( lastcmd[1] == "*" )
+                    {
+                        foreach ( uint i; dbg.breakpoints.keys )
+                            dbg.removeBreakpoint(i);
+                    }
+                    else if ( isNumeric(lastcmd[1]) )
+                    {
+                        if ( !dbg.removeBreakpoint(cast(uint)atoi(lastcmd[1])) )
+                            DbgIO.println("invalid breakpoint index: %s",lastcmd[1]);
+                    }
+                    else
+                    {
+                        Location loc = new Location(lastcmd[1]);
+                        loc.bind(dbg.images, dbg.source_search_paths);
+                        if ( loc !is null )
+                        {
+                            int bp_index;
+                            dbg.getBreakpoint(loc, bp_index);
+                            if ( bp_index >= 0 && !dbg.removeBreakpoint(bp_index) )
+                                DbgIO.println("No breakpoint set at "~lastcmd[1]);
+                        }
+                        else
+                            DbgIO.println("dbp [<source file>:<line>|#index|*]");
+                    }
+                }
+                else
+                    DbgIO.println("dbp [<source file>:<line>|#index|*]");
+                break;
+            // set evaluation depth
+            case "er":
+                lastcmd.length = 1;
+                if ( dbg.evaluationDepth > 1 ) {
+                    lastEvaluationDepth = dbg.evaluationDepth;
+                    lastcmd ~= "1";
+                }
+                else
+                    lastcmd ~= .toString(lastEvaluationDepth);
+            case "ed":
+                if ( lastcmd.length < 2 || !isNumeric(lastcmd[1]) )
+                    DbgIO.println("Usage: ed <depth>");
+                else {
+                    dbg.evaluationDepth = cast(int)atoi(lastcmd[1]);
+                    DbgIO.println("Expression evaluation depth is %d", dbg.evaluationDepth);
+                }
+                break;
+            case "el":
+                if ( lastcmd.length < 2 || !isNumeric(lastcmd[1]) )
+                    DbgIO.println("Usage: el <length>");
+                else {
+                    DataHandler.max_elem_count = cast(int)atoi(lastcmd[1]);
+                    DbgIO.println("Array evaluation length is %d", DataHandler.max_elem_count);
+                }
+                break;
+            // select frame
+            case "f":
+                if ( lastcmd.length > 1 )
+                    current_frame_level = cast(uint)atoi(lastcmd[1]);
+                DbgIO.println("Current frame level is %d", current_frame_level);
+                break;
+            // image base address
+            case "ii":
+                foreach ( img; dbg.images.images )
+                {
+                    uint ibase = img.imageBase;
+                    DbgIO.println("ImageBase\t0x%x", ibase);
+                    DbgIO.println("CodeBase\t0x%x", img.getCodeBase);
+                    DbgIO.println("Sections:\nname\t\taddress\t\tsize\t\tcharacteristics");
+                    foreach ( s; img.sections )
+                        with ( *s.header ) DbgIO.println("%s\t0x%08x\t0x%08x\t0x%08x", cast(char[8])Name, ibase+VirtualAddress, Misc.VirtualSize, Characteristics);
+                }
+                break;
+            // jump to last known source frame
+            case "jkf":
+                jump_to_last_known_location_on_exception = !jump_to_last_known_location_on_exception;
+                DbgIO.println("%s to from of last known source location on exception",
+                    jump_to_last_known_location_on_exception?"Jumping":"Not jumping"
+                );
+            break;
+            // walk memory
+            case "mi":
+                if ( !dbg.process_loaded )
+                    break;
+                uint filteredStates = MEM_COMMIT;
+                foreach ( lc; lastcmd[1..$] )
+                {
+                    switch ( lc )
+                    {
+                        case "free":    filteredStates |= MEM_FREE; break;
+                        case "rsrv":    filteredStates |= MEM_RESERVE; break;
+                        default:
+                    }
+                }
+
+                MEMORY_BASIC_INFORMATION[] mbis = dbg.process.walkMemory;
+
+                DbgIO.println("Base     AlcBase  AlcProt RgnSize  Stat Protect Type");
+                foreach ( mbi; mbis )
+                {
+                    if ( (mbi.State & filteredStates) == 0 )
+                        continue;
+
+                    string state;
+                    switch ( mbi.State )
+                    {
+                        case MEM_COMMIT:    state = "comt"; break;
+                        case MEM_FREE:      state = "free"; break;
+                        case MEM_RESERVE:   state = "rsrv"; break;
+                        default:            state = "unkn"; break;
+                    }
+
+                    string type;
+                    switch ( mbi.Type )
+                    {
+                        case MEM_IMAGE:     type = "imag"; break;
+                        case MEM_MAPPED:    type = "mapd"; break;
+                        case MEM_PRIVATE:   type = "priv"; break;
+                        default:            type = "unkn"; break;
+                    }
+
+                    string protectName(uint prot)
+                    {
+                        string protStr;
+                        switch ( prot & 0xff )
+                        {
+                            case 0:                         protStr = "?"; break;
+                            case PAGE_EXECUTE:              protStr = "x"; break;
+                            case PAGE_EXECUTE_READ:         protStr = "xr"; break;
+                            case PAGE_EXECUTE_READWRITE:    protStr = "xrw"; break;
+                            case PAGE_EXECUTE_WRITECOPY:    protStr = "xwc"; break;
+                            case PAGE_NOACCESS:             protStr = "na"; break;
+                            case PAGE_READONLY:             protStr = "ro"; break;
+                            case PAGE_READWRITE:            protStr = "rw"; break;
+                            case PAGE_WRITECOPY:            protStr = "wc"; break;
+                            default:                        protStr = format("%02x", prot & 0xff); break;
+                        }
+                        protStr ~= " ";
+                        if ( prot & PAGE_GUARD )
+                            protStr ~= "g";
+                        if ( prot & PAGE_NOCACHE )
+                            protStr ~= "nc";
+                        return protStr;
+                    }
+
+                    DbgIO.println("%08x %08x %- 7s %08x %s %- 7s %s",
+                        cast(size_t)mbi.BaseAddress, cast(size_t)mbi.AllocationBase, protectName(mbi.AllocationProtect),
+                        mbi.RegionSize, state, protectName(mbi.Protect), type
+                    );
+                }
+                break;
+            // list breakpoints
+            case "lbp":
+                if ( dbg.breakpoints.length <= 0 )
+                    DbgIO.println("no breakpoints set");
+                foreach ( uint i, bp; dbg.breakpoints )
+                    DbgIO.println("%d %s", i, bp.toString);
+                break;
+            // ldll
+            case "ldll":
+                if ( !dbg.process_loaded )
+                    break;
+                DbgIO.println("Base     Name");
+                foreach ( dll; dbg.process.loaded_dlls )
+                    DbgIO.println("%08x %s", dll.base, dll.image.name);
+                break;
+            // list temporary breakpoints
+            case "ltbp":
+                if ( dbg.temp_breakpoints.empty )
+                    DbgIO.println("no temporary breakpoints set");
+                foreach ( bp; dbg.temp_breakpoints )
+                    DbgIO.writeln(bp.value.toString);
+                break;
+            // list debug modules
+            case "lm":
+                Module[]	modules_noinfo;
+                foreach ( img; dbg.images.images )
+                {
+                    foreach ( m; img.codeView.modulesByIndex )
+                    {
+                        string name = m.name;
+
+                        if ( m.header.iLib > 0 )
+                            name ~= " from "~img.codeView.libraries[m.header.iLib];
+
+                        if ( lastcmd.length > 1 && find(name, lastcmd[1]) < 0 )
+                            continue;
+
+                        bool has_info = false;
+                        with ( m.symbols )
+                        {
+                            if ( proc_symbols.length+stack_symbols.length+data_symbols.length > 0 )
+                            {
+                                DbgIO.println(
+                                    "%s\n\tSymbols: %d proc %d stack %d data",
+                                    name, proc_symbols.length, stack_symbols.length, data_symbols.length
+                                );
+                                has_info = true;
+                            }
+                        }
+                        if ( m.source_module !is null )
+                        {
+                            DbgIO.println("\tSource files:");
+                            has_info = true;
+                            foreach ( sf; m.source_module.files )
+                                DbgIO.println("\t\t%s", sf.name);
+                        }
+                        if ( !has_info )
+                            modules_noinfo ~= m;
+                    }
+                }
+                if ( modules_noinfo.length > 0 )
+                {
+                    DbgIO.println("Modules without debug information:");
+                    foreach ( img; dbg.images.images )
+                    {
+                        foreach ( m; modules_noinfo )
+                        {
+                            string name = m.name;
+
+                            if ( m.header.iLib > 0 )
+                                name ~= " from "~img.codeView.libraries[m.header.iLib];
+
+                            DbgIO.println("%s #segs=%d", name, m.seginfos.length);
+                            if ( m.source_module !is null )
+                            {
+                                DbgIO.println("\tSource files:");
+                                foreach ( sf; m.source_module.files )
+                                    DbgIO.println("\t\t%s", sf.name);
+                            }
+                        }
+                    }
+                }
+                break;
+            // list source modules
+            case "lsm":
+                uint[string]    line_counters;
+                uint[string]    seg_counters;
+                foreach ( img; dbg.images.images )
+                {
+                    if ( img.codeView is null )
+                        continue;
+                    foreach ( m; img.codeView.modulesByIndex )
+                    {
+                        if ( m.source_module is null )
+                            continue;
+                        foreach ( sf; m.source_module.files )
+                        {
+                            if ( lastcmd.length > 1 && find(sf.name, lastcmd[1]) < 0 )
+                                continue;
+                            uint lines = sf.lines.length;
+                            if ( (sf.name in line_counters) is null ) {
+                                seg_counters[sf.name] = sf.segments.length;
+                                line_counters[sf.name] = lines;
+                            }
+                            else {
+                                seg_counters[sf.name] += sf.segments.length;
+                                line_counters[sf.name] += lines;
+                            }
+                        }
+                    }
+                }
+                string[] lc_keys = line_counters.keys.dup;
+                lc_keys.sort;
+                foreach ( key; lc_keys )
+                    DbgIO.println("%s\t\tsegs=%d lines=%d", key, seg_counters[key], line_counters[key]);
+                break;
+            // list source lines per module
+            case "lsl":
+                foreach ( img; dbg.images.images )
+                {
+                    if ( img.codeView is null )
+                        continue;
+                    foreach ( m; img.codeView.modulesByIndex )
+                    {
+                        if ( m.source_module is null )
+                            continue;
+                        DbgIO.println("module %s", m.name);
+                        foreach ( sf; m.source_module.files )
+                        {
+                            DbgIO.println("file %s", sf.name);
+                            if ( lastcmd.length > 1 && find(sf.name, lastcmd[1]) < 0 )
+                                continue;
+                            foreach ( l; sf.lines.reverse )
+                            {
+                                DbgIO.println("line %d", l);
+                            }
+                        }
+                    }
+                }
+                break;
+            // list all symbols
+            case "ls":
+/*
+                void dumpSymbolAVL(AVLNode!(NamedSymbol) node, uint indent=0)
+                {
+                    string indentstr = new char[indent*2];
+                    indentstr[0..indent*2] = ' ';
+                    DbgIO.println("%s%s", indentstr, node.value.name_notype);
+                    if ( node.left !is null )
+                        dumpSymbolAVL(node.left, indent+1);
+                    if ( node.right !is null )
+                        dumpSymbolAVL(node.right, indent+1);
+                }
+                DbgIO.println("AVL dump:");
+                dumpSymbolAVL(dbg.image.codeView.globalNamedSymbols.root);
+*/
+                foreach ( img; dbg.images.images )
+                {
+                    if ( img.codeView is null )
+                        continue;
+                    printSymbols(img.codeView, img.codeView.global_pub.named_symbols, lastcmd.length>1?lastcmd[1]:null);
+                    printSymbols(img.codeView, img.codeView.global_sym.named_symbols, lastcmd.length>1?lastcmd[1]:null);
+                    printSymbols(img.codeView, img.codeView.static_sym.named_symbols, lastcmd.length>1?lastcmd[1]:null);
+                    foreach ( m; img.codeView.modulesByIndex )
+                        printSymbols(img.codeView, m.symbols.named_symbols, lastcmd.length>1?lastcmd[1]:null);
+                }
+                break;
+            // list source search paths
+            case "lsp":
+                foreach ( s; dbg.source_search_paths )
+                    DbgIO.writeln(s);
+                break;
+            // list function symbols
+            case "lf":
+                foreach ( img; dbg.images.images )
+                {
+                    if ( img.codeView is null )
+                        continue;
+                    printSymbols(img.codeView, img.codeView.global_pub.proc_symbols, lastcmd.length>1?lastcmd[1]:null);
+                    printSymbols(img.codeView, img.codeView.global_sym.proc_symbols, lastcmd.length>1?lastcmd[1]:null);
+                    printSymbols(img.codeView, img.codeView.static_sym.proc_symbols, lastcmd.length>1?lastcmd[1]:null);
+                    foreach ( m; img.codeView.modulesByIndex )
+                        printSymbols(img.codeView, m.symbols.proc_symbols, lastcmd.length>1?lastcmd[1]:null);
+                }
+                break;
+            // list data symbols
+            case "ld":
+                foreach ( img; dbg.images.images )
+                {
+                    if ( img.codeView is null )
+                        continue;
+                    printSymbols(img.codeView, img.codeView.global_pub.data_symbols, lastcmd.length>1?lastcmd[1]:null);
+                    printSymbols(img.codeView, img.codeView.global_sym.data_symbols, lastcmd.length>1?lastcmd[1]:null);
+                    printSymbols(img.codeView, img.codeView.static_sym.data_symbols, lastcmd.length>1?lastcmd[1]:null);
+                    foreach ( m; img.codeView.modulesByIndex )
+                        printSymbols(img.codeView, m.symbols.data_symbols, lastcmd.length>1?lastcmd[1]:null);
+                }
+                break;
+            // list global symbols
+            case "lg":
+                foreach ( img; dbg.images.images )
+                {
+                    if ( img.codeView is null )
+                        continue;
+                    printSymbols(img.codeView, img.codeView.global_pub.named_symbols, lastcmd.length>1?lastcmd[1]:null);
+                    printSymbols(img.codeView, img.codeView.global_sym.named_symbols, lastcmd.length>1?lastcmd[1]:null);
+                }
+                break;
+            // list global publics
+            case "lp":
+                foreach ( img; dbg.images.images )
+                {
+                    if ( img.codeView is null )
+                        continue;
+                    printSymbols(img.codeView, img.codeView.global_pub.named_symbols, lastcmd.length>1?lastcmd[1]:null);
+                }
+                break;
+            // list scope variables
+            case "lsv":
+                if ( dbg.process_loaded || dbg.miniDump !is null )
+                    evalScopeSymbols();
+                break;
+            // list threads
+            case "lt":
+                if ( dbg.miniDump !is null )
+                {
+                    DbgIO.println("  id     pri  sus location");
+                    MINIDUMP_THREAD[] threads = dbg.miniDump.threads;
+                    foreach ( thread; threads )
+                    {
+                        CONTEXT* ctx;
+                        ctx = cast(CONTEXT*)dbg.miniDump.rvaToVa(thread.ThreadContext.Rva);
+                        Location    loc = dbg.images.findLocation(ctx.Eip);
+
+                        DbgIO.println("%s%s%- 6d %- 3d  %- 2d  %s",
+                            thread.ThreadId==dbg.thread_id?">":" ", thread.ThreadId==dbg.miniDump.threadInfo.mainThreadId?"*":" ",
+                            thread.ThreadId, thread.Priority, thread.SuspendCount, describeLocation(loc)
+                        );
+                    }
+                }
+                else
+                {
+                    DbgIO.println("  id     pri  sus creation     exit         kernel       user         location");
+                    foreach ( t; dbg.process.threads.values )
+                    {
+                        // id name location pri pri-boost start-info times
+                        ulong   creation,
+                                exit,
+                                kernel,
+                                user;
+
+                        t.times(creation, exit, kernel, user);
+
+                        CONTEXT ctx;
+                        t.getContext(ctx);
+                        Location    loc = dbg.images.findLocation(ctx.Eip);
+
+                        DbgIO.println("%s%s%- 6d %- 3d%s %- 2d  %s %s %s %s %s",
+                            t.id==dbg.thread_id?">":" ", t.id==dbg.process.mainThreadId?"*":" ", t.id,
+                            t.priority, t.priorityBoost?"b":" ", t.suspendCount,
+                            formatTicks(creation), formatTicks(exit), formatTicks(kernel), formatTicks(user),
+                            describeLocation(loc)
+                        );
+                    }
+                }
+                break;
+            // no console
+            case "nc":
+                dbg.create_new_console = !dbg.create_new_console;
+                DbgIO.println("Starting debuggee in %s console", dbg.create_new_console?"new":"this");
+                break;
+            // on exception
+            case "onex":
+                if ( lastcmd.length < 2 )
+                {
+                    foreach ( cmd; onexCommands )
+                        DbgIO.writeln(cmd[0..$-1]);
+                }
+                else
+                {
+                    onexCommands = null;
+                    string cmdList;
+                    foreach ( cmd; lastcmd[1..$] )
+                    {
+                        if ( cmd[0] == '"' && cmd[$-1] == '"' )
+                            cmdList ~= " "~cmd[1..$-1];
+                        else
+                            cmdList ~= " "~cmd;
+                    }
+                    foreach ( cmd; split(cmdList, ";") )
+                        onexCommands ~= strip(cmd)~";";
+                }
+                break;
+            // on termination
+            case "onterm":
+                if ( lastcmd.length < 2 )
+                {
+                    foreach ( cmd; ontermCommands )
+                        DbgIO.writeln(cmd[0..$-1]);
+                }
+                else
+                {
+                    ontermCommands = null;
+                    string cmdList;
+                    foreach ( cmd; lastcmd[1..$] )
+                    {
+                        if ( cmd[0] == '"' && cmd[$-1] == '"' )
+                            cmdList ~= " "~cmd[1..$-1];
+                        else
+                            cmdList ~= " "~cmd;
+                    }
+                    foreach ( cmd; split(cmdList, ";") )
+                        ontermCommands ~= strip(cmd)~";";
+                }
+                break;
+            // print source
+            case "ps":
+                Location    loc;
+                string[]    source;
+
+                do
+                {
+                    if ( current_frame_level > 0 )
+                    {
+                        auto frame = dbg.stack.getFrame(current_frame_level);
+                        if ( frame is null )
+                            goto Lnotfound;
+                        uint ret_adr = (cast(uint[])frame)[1];
+                        loc = dbg.images.findLocation(ret_adr);
+                    }
+                    else
+                        loc = dbg.images.findLocation(dbg.current_address);
+                    debug DbgIO.println("found location %s", loc.file);
+
+                    source = dbg.getSourceFile(loc.file);
+                    if ( source !is null )
+                        break;
+                    if ( auto_find_scope_frame ) {
+                        ++current_frame_level;
+                        continue;
+                    }
+                Lnotfound:
+                    DbgIO.writeln("Source file for current location unknown");
+                    break;
+                }
+                while( source is null );
+
+                int start_line, end_line;
+                if ( lastcmd.length > 1 ) {
+                    start_line = cast(uint)atoi(lastcmd[1]);
+                    end_line = loc.line + start_line;
+                    start_line = loc.line - start_line;
+                }
+                else if ( loc.scope_sym !is null )
+                {
+                    ProcedureSymbol psym = cast(ProcedureSymbol)loc.scope_sym;
+                    auto start_address = loc.getCodeBase + psym.cvdata.offset;
+                    auto start_loc  = dbg.images.findLocation(start_address);
+                    auto end_loc    = dbg.images.findLocation(start_address+psym.cvdata.proc_length-1);
+                    debug DbgIO.println("address range: 0x%x 0x%x", start_address, start_address+psym.cvdata.proc_length-1);
+                    debug DbgIO.println("lines before prev: %d - %d", start_loc.line, end_loc.line);
+                    end_loc = dbg.images.findPrevSrcLine(end_loc);
+                    start_line = start_loc.line;
+                    if ( end_loc !is null )
+                        end_line = end_loc.line;
+                }
+                if ( end_line == 0 ) {
+                    start_line = loc.line - PRINT_SOURCE_LINES;
+                    end_line = loc.line + PRINT_SOURCE_LINES;
+                }
+
+                debug DbgIO.println("lines: %d - %d", start_line, end_line);
+                for ( int l = dmax(0, start_line-1); l < dmin(cast(int)source.length, end_line); ++l )
+                {
+                    if ( l+1 == loc.line )
+                        DbgIO.write(">");
+                    DbgIO.writeln(source[l]);
+                }
+                break;
+            // quit
+            case "q":
+                dbg.abort = true;
+                quit = true;
+                return true;
+            // run/continue
+            case "r":
+                if ( dbg.miniDump !is null ) {
+                    DbgIO.println("Command not valid in post-mortem mode");
+                    break;
+                }
+                if ( dbg.process_loaded ) {
+                    dbg.resume;
+                    return true;
+                }
+                else {
+                    dbg.start(command_line);
+                    return true;
+                }
+            // single-step
+            case "s":
+                if ( dbg.miniDump !is null ) {
+                    DbgIO.println("Command not valid in post-mortem mode");
+                    break;
+                }
+                if ( dbg.process_loaded ) {
+                    dbg.single_step = true;
+                    dbg.activateSingleStep(true);
+                }
+                return true;
+            // add source search path
+            case "sp":
+                if ( lastcmd.length > 1 )
+                {
+                    string sp = lastcmd[1].dup;
+                    if ( sp[$-1] != '\\' )
+                        sp ~= '\\';
+                    dbg.source_search_paths ~= sp;
+                }
+                else
+                    DbgIO.println("usage: sp <search_path>");
+                break;
+            // switch thread
+            case "st":
+                if ( lastcmd.length < 2 ) {
+                    DbgIO.writeln("Usage: st <threadID>");
+                    break;
+                }
+                size_t threadId = cast(size_t)atoi(lastcmd[1]);
+                if ( dbg.miniDump !is null )
+                {
+                    foreach ( thread; dbg.miniDump.threads )
+                    {
+                        if ( threadId == thread.ThreadId ) {
+                            dbg.selectThread(threadId);
+                            break;
+                        }
+                    }
+                }
+                else
+                {
+                    foreach ( t; dbg.process.threads.values )
+                    {
+                        if ( threadId == t.id ) {
+                            dbg.selectThread(threadId);
+                            break;
+                        }
+                    }
+                }
+                break;
+            // step over
+            case "ov":
+                if ( dbg.miniDump !is null ) {
+                    DbgIO.println("Command not valid in post-mortem mode");
+                    break;
+                }
+                if ( dbg.process_loaded && dbg.step(StepMode.e_over) )
+                {
+                    debug foreach ( bp; dbg.temp_breakpoints )
+                        DbgIO.writeln(bp.value.toString);
+                    return true;
+                }
+                break;
+            // step into
+            case "in":
+                if ( dbg.miniDump !is null ) {
+                    DbgIO.println("Command not valid in post-mortem mode");
+                    break;
+                }
+                if ( dbg.process_loaded && dbg.step(StepMode.e_in) )
+                {
+                    debug foreach ( bp; dbg.temp_breakpoints )
+                        DbgIO.writeln(bp.value.toString);
+                    return true;
+                }
+                break;
+            // step out
+            case "out":
+                if ( dbg.miniDump !is null ) {
+                    DbgIO.println("Command not valid in post-mortem mode");
+                    break;
+                }
+                if ( dbg.process_loaded && dbg.step(StepMode.e_out) )
+                {
+                    debug foreach ( bp; dbg.temp_breakpoints )
+                        DbgIO.writeln(bp.value.toString);
+                    return true;
+                }
+                break;
+            // disassemble
+            case "da":
+                if ( !dbg.process_loaded )
+                    break;
+
+                uint start_address;
+                if ( current_frame_level > 0 ) {
+                    auto frame = dbg.stack.getFrame(current_frame_level);
+                    start_address = (cast(uint[])frame)[1];
+                }
+                else
+                    start_address = dbg.current_address;
+
+                if ( lastcmd.length > 1 )
+                    sscanf(toStringz(lastcmd[1]), "%x", &start_address);
+                else
+                {
+                    Location loc = dbg.images.findLocation(dbg.current_address);
+                    if ( loc.scope_sym !is null ) {
+                        ProcedureSymbol psym = cast(ProcedureSymbol)loc.scope_sym;
+                        start_address = loc.getCodeBase + psym.cvdata.offset;
+                        DisAsm.disasm(dbg.process, start_address, start_address+psym.cvdata.proc_length, &printDisassembly);
+                        break;
+                    }
+                }
+                DisAsm.disasm(dbg.process, start_address, 0, &printDisassembly);
+                break;
+            // disassemble line
+            case "dal":
+                if ( !dbg.process_loaded )
+                    break;
+
+                int num_lines = 1;
+                if ( lastcmd.length > 1 )
+                {
+                    sscanf(toStringz(lastcmd[1]), "%d", &num_lines);
+                    if ( num_lines < 0 )
+                        --num_lines;
+                }
+
+                uint start_address;
+                if ( current_frame_level > 0 ) {
+                    auto frame = dbg.stack.getFrame(current_frame_level);
+                    start_address = (cast(uint[])frame)[1];
+                }
+                else
+                    start_address = dbg.current_address;
+
+                for ( ; num_lines != 0; num_lines<0?++num_lines:--num_lines )
+                {
+                    Location loc = dbg.images.findLocation(start_address);
+                    if ( loc is null ) {
+                        DbgIO.println("No source line information available");
+                        break;
+                    }
+                    DisAsm.disasm(
+                        dbg.process,
+                        loc.getCodeBase+loc.codeblock.start,
+                        loc.getCodeBase+loc.codeblock.end,
+                        &printDisassembly
+                    );
+                }
+                break;
+            // dump registers
+            case "dr":
+                if ( lastcmd.length > 1 )
+                {
+                    foreach ( lc; lastcmd[1..$] )
+                    {
+                        switch ( lc )
+                        {
+                            case "cpu": dump_registers |= CPU_REGISTERS;    break;
+                            case "fpu": dump_registers |= FPU_REGISTERS;    break;
+                            case "mmx": dump_registers |= MMX_REGISTERS;    break;
+                            case "sse": dump_registers |= SSE_REGISTERS;    break;
+                            default:
+                                DbgIO.println("Unknown register set \"%s\"", lc);
+                        }
+                    }
+                }
+                if ( dump_registers == 0 ) {
+                    DbgIO.println("No register set selected. See help for usage of \"dr\"");
+                    break;
+                }
+                if ( dbg.miniDump !is null )
+                    printRegisterDump(dbg.miniDump.getContext);
+                else if ( dbg.process_loaded )
+                    printRegisterDump(dbg.process.threads[dbg.thread_id]);
+                break;
+            // dump stack
+            case "ds":
+                if ( !dbg.process_loaded )
+                    break;
+
+                int dump_length;
+                if ( lastcmd.length > 1 )
+                    dump_length = cast(int)atoi(lastcmd[1])*4;
+                else
+                {
+                    CONTEXT ctx;
+                    if ( dbg.process.threads[dbg.thread_id].getContext(ctx, CONTEXT_CONTROL) )
+                        dump_length = ctx.Ebp-ctx.Esp+8;
+                    if ( dump_length <= 0 )
+                        dump_length = 16*4;
+                }
+                int top = dbg.stack.data.length>dump_length?dump_length:dbg.stack.data.length;
+                dumpMemory(dbg.stack.top_ptr, top, dbg.stack.data);
+                break;
+            case "dm":
+                if ( !dbg.process_loaded )
+                    break;
+
+                if ( lastcmd.length < 3 ) {
+                    DbgIO.println("usage: dm <start> <length>");
+                    break;
+                }
+                uint start;
+                sscanf(toStringz(lastcmd[1]), "%x", &start);
+                dumpMemory(start, cast(uint)atoi(lastcmd[2]));
+                break;
+            case "hwbp":
+                int index;
+                if ( lastcmd.length < 2 ) {
+                    DbgIO.println("invalid syntax - see help for details");
+                    break;
+                }
+
+                int pos = find(lastcmd[1], '#');
+                uint threadId;
+                if ( pos > 0 )
+                {
+                    threadId = cast(uint)atoi(lastcmd[1][pos+1..$]);
+                    lastcmd[1] = lastcmd[1][0..pos];
+                }
+
+                Location loc;
+
+                size_t address;
+                sscanf(toStringz(lastcmd[1]), "%x", &address);
+                if ( address > 0 )
+                    loc = new Location(address);
+                else
+                    loc = new Location(lastcmd[1]);
+                loc.bind(dbg.images, dbg.source_search_paths);
+                if ( lastcmd.length > 2 )
+                    index = cast(int)atoi(lastcmd[2]);
+
+                Breakpoint bp;
+                if ( index <= 0 && dbg.breakpoints.length > 0 )
+                    index = dbg.breakpoints.keys.dup.sort[$-1]+1;
+                bp = dbg.setBreakpoint(loc, index, threadId, true);
+                DbgIO.println("Hardware Breakpoint set: %s", bp.toString);
+                break;
+            // type of expression
+            case "t":
+                if ( dbg.process_loaded && lastcmd.length > 1 )
+                {
+                    SymbolData sd;
+                    try {
+                        sd = dbg.evaluateExpression(lastcmd[1], current_frame_level);
+                        string type = demangle("_D0"~sd.type);
+                        DbgIO.println("%s\n%s", sd.type, type);
+                    }
+                    catch ( EvaluationException e ) {
+                        DbgIO.writeln(e.toString);
+                    }
+                }
+                break;
+            // unwind stack
+            case "us":
+                if ( dbg.process_loaded || dbg.miniDump !is null )
+                    unwindStack();
+                break;
+            // write minidump
+            case "wmd":
+                if ( dbg.miniDump !is null ) {
+                    DbgIO.println("Command not valid in post-mortem mode");
+                    break;
+                }
+                if ( !dbg.process_loaded )
+                    break;
+                if ( !MiniDump.haveMiniDump ) {
+                    DbgIO.println("DbgHelp.dll required for MiniDump support.\nInstall the Microsoft Platform SDK or Windows XP.");
+                    break;
+                }
+                if ( lastcmd.length < 2 ) {
+                    DbgIO.println("Usage: wmd <filename>");
+                    break;
+                }
+                dbg.writeMiniDump(lastcmd[1]);
+                break;
+            // read minidump
+            case "rmd":
+                if ( dbg.process_loaded ) {
+                    DbgIO.println("For post-mortem debugging, the process must not be started");
+                    break;
+                }
+                if ( !MiniDump.haveMiniDump ) {
+                    DbgIO.println("DbgHelp.dll required for MiniDump support.\nInstall the Microsoft Platform SDK or Windows XP.");
+                    break;
+                }
+                if ( lastcmd.length < 2 ) {
+                    DbgIO.println("Usage: rmd <filename>");
+                    break;
+                }
+                dbg.readMiniDump(lastcmd[1]);
+                break;
+            // unknown command
+            default:
+                DbgIO.println("Unknown command '%s' ignored!", lastcmd[0]);
+                break;
+        }
+
+        return false;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void dumpMemory(uint start, uint length, ubyte[] _data=null)
+    {
+        ubyte[]	data;
+        if ( _data is null )
+        {
+            data.length = length;
+            if ( !dbg.process.readProcessMemory(start, data.ptr, data.length) )
+                return;
+        }
+        else
+            data = _data;
+        for ( uint i = 0; i < length; ++i )
+        {
+            if ( i % (4*4) == 0 )
+            {
+                if ( i > 0 )
+                    DbgIO.println("");
+                DbgIO.print("%08x:", start+i);
+            }
+            if ( i % 4 == 0 )
+                DbgIO.print(" ");
+            DbgIO.print("%02x", data[i]);
+        }
+        DbgIO.println("");
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void evalScopeSymbols()
+    {
+        uint scope_address = dbg.getScopeAddress(current_frame_level);
+
+        ScopeSymbol scope_sym = dbg.images.findProcedureSymbol(scope_address);
+        if ( scope_sym is null ) {
+            DbgIO.println("No valid scope active");
+            return;
+        }
+
+        for ( ; scope_sym !is null; scope_sym = scope_sym.parent_scope )
+        {
+            DbgIO.println("Scope: %s, parent: %x", scope_sym.name_type, cast(void*)scope_sym.parent_scope);
+
+            StackSymbol[] locals_args = scope_sym.symbols.stack_symbols;
+            auto psym = cast(ProcedureSymbol)scope_sym;
+            if  ( psym !is null )
+                locals_args ~= psym.arguments.stack_symbols;
+            foreach ( sym; locals_args.sort )
+            {
+                string name = sym.mangled_name;
+                DbgIO.print("%s = ", name);
+//                DbgIO.print("%s = [ebp%s%d] ", name, sym.cvdata.offset>0?"+":"", sym.cvdata.offset);
+                try DbgIO.writeln(symbolValueToString(dbg.handleData(dbg.evaluateExpression(name, current_frame_level, sym), true)));
+                catch ( EvaluationException e ) {
+                    DbgIO.println(e.msg);
+                }
+            }
+        }
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void printAsmLine(uint address, string bytes, string asmsource, string symbol, string location, string source)
+    {
+        bool nl = false;
+        if ( location !is null ) {
+            DbgIO.print("%s ", location);
+            nl = true;
+        }
+        if ( source !is null ) {
+            DbgIO.write(source);
+            nl = true;
+        }
+        if ( nl )
+            DbgIO.println;
+
+        // align next column
+        char[] indent;
+        int indcount = 2*12-bytes.length;
+        if ( indcount > 0 ) {
+            indent.length = indcount;
+            indent[0..indcount] = ' ';
+        }
+        // print aligned asm source
+        assert(asmsource !is null);
+        assert(bytes !is null);
+        DbgIO.print("%08x: ", address, bytes, indent, asmsource);
+
+        if ( symbol !is null )
+            DbgIO.write(symbol);
+        DbgIO.println;
+    }
+
+    /**********************************************************************************************
+        Prints the register contents of the given thread's context.
+    **********************************************************************************************/
+    void printRegisterDump(DbgThread thread)
+    {
+        CONTEXT     ctxMem;
+        uint context_flags;
+        if ( dump_registers & CPU_REGISTERS )
+            context_flags |= CONTEXT_FULL;
+        if ( dump_registers & FPU_REGISTERS )
+            context_flags |= CONTEXT_FLOATING_POINT;
+        if ( dump_registers & (MMX_REGISTERS|SSE_REGISTERS) )
+            context_flags |= CONTEXT_EXTENDED_REGISTERS;
+        if ( thread.getContext(ctxMem, context_flags) )
+            printRegisterDump(&ctxMem);
+        else
+            DbgIO.println("ERROR: Couldn't get main thread's context");
+    }
+
+    void printRegisterDump(CONTEXT* ctx)
+    {
+        assert ( ctx !is null );
+
+        bool first = true;
+
+        if ( dump_registers & CPU_REGISTERS )
+        {
+            DbgIO.println("EAX = %08x\tEBX = %08x\tECX = %08x\tEDX = %08x", ctx.Eax, ctx.Ebx, ctx.Ecx, ctx.Edx);
+            DbgIO.println("EDI = %08x\tESI = %08x\tEBP = %08x\tESP = %08x", ctx.Edi, ctx.Esi, ctx.Ebp, ctx.Esp);
+            DbgIO.println("EIP = %08x\tEFL = %08x", ctx.Eip, ctx.EFlags);
+            DbgIO.println(" CS = %08x\t DS = %08x\t ES = %08x\t FS = %08x", ctx.SegCs, ctx.SegDs, ctx.SegEs, ctx.SegFs);
+            DbgIO.println(" GS = %08x\t SS = %08x", ctx.SegGs, ctx.SegSs);
+            first = false;
+        }
+
+        if ( dump_registers & FPU_REGISTERS )
+        {
+            if ( !first )
+                DbgIO.println();
+            DbgIO.println("FCW = %04x\tFSW = %04x\tFTW = %04x\tFOP = %04x",
+                cast(ushort)ctx.FloatSave.ControlWord, cast(ushort)ctx.FloatSave.StatusWord,
+                cast(ushort)ctx.FloatSave.TagWord, (cast(ushort[])ctx.ExtendedRegisters)[3]
+            );
+            DbgIO.println("IP = %08x\tCS = %04x\tDP = %08x\tDS = %04x",
+                (cast(uint[])ctx.ExtendedRegisters)[2], (cast(ushort[])ctx.ExtendedRegisters)[6],
+                (cast(uint[])ctx.ExtendedRegisters)[4], (cast(ushort[])ctx.ExtendedRegisters)[10]
+            );
+            for ( int i = 0; i < 8; ++i )
+                DbgIO.println("ST%d = % .16e", i, (cast(real[])ctx.FloatSave.RegisterArea)[i]);
+            first = false;
+        }
+
+        if ( dump_registers & MMX_REGISTERS )
+        {
+            if ( !first )
+                DbgIO.println();
+            for ( int i = 0; i < 8; ++i )
+            {
+                DbgIO.println("MM%d = %016x", i, (cast(long[])ctx.ExtendedRegisters)[4+i*2]);
+                DbgIO.println("    = [%.6g, %.6g]",
+                    (cast(float[])ctx.ExtendedRegisters)[8+i*4],
+                    (cast(float[])ctx.ExtendedRegisters)[8+i*4+1]
+                );
+            }
+            first = false;
+        }
+
+        if ( dump_registers & SSE_REGISTERS )
+        {
+            if ( !first )
+                DbgIO.println();
+            DbgIO.println("MXCSR = %08x", (cast(uint[])ctx.ExtendedRegisters)[6]);
+            for ( int i = 0; i < 8; ++i )
+            {
+                DbgIO.println("XMM%d = %016x%016x", i, (cast(long[])ctx.ExtendedRegisters)[20+i*2+1], (cast(long[])ctx.ExtendedRegisters)[20+i*2]);
+                DbgIO.println("     = [%.6g, %.6g, %.6g, %.6g]",
+                    (cast(float[])ctx.ExtendedRegisters)[40+i*4],
+                    (cast(float[])ctx.ExtendedRegisters)[40+i*4+1],
+                    (cast(float[])ctx.ExtendedRegisters)[40+i*4+2],
+                    (cast(float[])ctx.ExtendedRegisters)[40+i*4+3]
+                );
+                DbgIO.println("     = [%.12g, %.12g]",
+                    (cast(double[])ctx.ExtendedRegisters)[20+i*2],
+                    (cast(double[])ctx.ExtendedRegisters)[20+i*2+1]
+                );
+            }
+        }
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    string symbolValueToString(SymbolValue val)
+    {
+        return symbolValueToString(val,"");
+    }
+
+    string symbolValueToString(SymbolValue val, string indent)
+    {
+        string str;
+        if ( val.name !is null )
+            str = val.name~" = ";
+        if ( val.value !is null )
+            str ~= val.value;
+        else
+        {
+            if ( val.children.length > 0 )
+            {
+                str ~= "{";
+                bool first = true;
+                foreach ( c; val.children )
+                {
+                    if ( first )
+                        first = false;
+                    else
+                        str ~= ",";
+                    str ~= "\n  "~indent~symbolValueToString(c, indent~"  ");
+                }
+                str ~= "\n"~indent~"}";
+            }
+            else
+                str ~= "{}";
+        }
+        return str;
+    }
+
+    /**********************************************************************************************
+        Read command and call CLI supplied parser function.
+        Gets called when debuggee is suspended.
+    **********************************************************************************************/
+    bool readCommand()
+    {
+        if ( cmdQueue.length <= 0 ) {
+            DbgIO.write("->");
+            string input = DbgIO.readln();
+            cmdQueue ~= input;
+        }
+        if ( cmdQueue.length <= 0 )
+            return false;
+
+        string cmd = strip(cmdQueue[0]);
+        cmdQueue = cmdQueue[1..$];
+        if ( cmd.length > 0 && cmd[$-1] == ';' ) {
+            cmd = cmd[0..$-1];
+            DbgIO.writeln("->"~cmd);
+        }
+        return parseCommand(cmd);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cli/gdbcli.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,832 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+module cli.gdbcli;
+
+import std.string;
+static import std.regexp;
+import std.c.stdio : sscanf;
+import std.c.string;
+import std.demangle;
+
+import util;
+import codeview.codeview;
+import breakpoint;
+import debugger;
+import disasm;
+import callstack;
+import dbgprocess;
+import dbgthread;
+import expression.expression_apd;
+import expression.datahandler : SymbolValue;
+import expression.evaluationcontext;
+import cli.userinterface;
+
+import win32.winbase;
+import win32.winuser;
+import win32.winnt;
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class GDBCLI : UserInterfaceBase
+{
+	string[]    lastcmd;
+
+    uint        current_frame_level;
+
+	string			prompt,
+					command_line,
+					debuggee;
+	bool			fullname = false,
+					quit;
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	this()
+	{
+		prompt = "(gdb) ";
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void init(string[] args)
+	{
+		DbgIO.println(WELCOME_STRING);
+		if ( args.length < 2 )
+			throw new DebuggerException("Usage: ddbg -cli=gdb [-cmd=<commands>] [-fullname] -args <exe file> [arguments]");
+
+		bool	read_args = false;
+		Lfe: foreach ( int i, a; args )
+		{
+			switch ( a )
+			{
+				case "-fullname":
+				case "--fullname":
+                    fullname = true;
+                    break;
+				case "-args":
+				case "--args":
+					read_args=true;
+					break;
+				default:
+                    debuggee = a;
+					if ( read_args )
+					{
+                        if ( find(a, ' ') >= 0 )
+                            command_line = "\""~a~"\"";
+                        else
+                            command_line = a;
+						if ( args.length > i+1 )
+                            command_line ~= " "~join(args[i+1..$], " ");
+						break Lfe;
+					}
+			}
+		}
+
+		dbg = new Debugger(debuggee, this);
+		dbg.create_new_console = true;
+	}
+
+	int start()
+	{
+		while ( !quit )
+		{
+            try readCommand();
+            catch ( Exception e )
+                DbgIO.println(e.msg);
+		}
+		return 0;
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void singleStep()
+	{
+		DbgIO.println(describeLocation(dbg.current_address));
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void exitProcess()
+	{
+		DbgIO.println("Program exited");
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void loadedDLL(DLL dll)
+	{
+		if( dll !is null && dll.image.name.length )
+			DbgIO.writeln(dll.image.name~" loaded");
+		else
+			DbgIO.writeln("unknown DLL loaded");
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void win32exception(uint threadId, EXCEPTION_RECORD* exrec)
+	{
+		DbgIO.println(
+			"Program received signal SIG Unhandled Exception: %s(0x%x) at 0x%x",
+			getExceptionName(exrec.ExceptionCode), exrec.ExceptionCode, exrec.ExceptionAddress //describeLocation(dbg.current_address)
+		);
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void exception(uint threadId, string class_name, string msg, size_t obj_ptr)
+	{
+		DbgIO.println(
+			"Program received signal SIG Unhandled D Exception (%s%s) at %s",
+			class_name, msg.length>0?" \""~msg~"\"":"", describeLocation(dbg.current_address)
+		);
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void userInterrupt()
+	{
+		DbgIO.println("User interrupt at %s", describeLocation(dbg.current_address));
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	bool breakpoint(int index, Breakpoint bp, DbgThread thread)
+	{
+		if ( bp.file is null || bp.line == 0 )
+			DbgIO.println("Unknown breakpoint hit at %s", describeLocation(bp.address));
+		else
+			DbgIO.println("\032\032%s:%d:0:begmidl:0x%08x", fullname?dbg.getFullSourcePath(bp.file):bp.file, bp.line, bp.address);
+		return true;
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void debugString(string str)
+	{
+		printf("Error OUTPUT DEBUG STRING:\n%s\n", toStringz(str));
+	}
+
+    /**********************************************************************************************
+        Command line parser. Gets called when debuggee is suspended.
+    **********************************************************************************************/
+	bool parseCommand(string input)
+	{
+		if ( strip(input).length > 0 )
+		{
+			auto r = std.regexp.RegExp("(([^\" \\t]+)|(\"[^\"]+\"))+");
+			lastcmd.length = 0;
+			foreach ( m; r.search(strip(input)) )
+				lastcmd ~= r.match(0);
+		}
+		if ( lastcmd.length <= 0 )
+			return false;
+
+		int slash_pos = find(lastcmd[0], '/');
+		if ( slash_pos >= 0 ) {
+			lastcmd ~= lastcmd[0];
+			lastcmd[0] = lastcmd[0][0..slash_pos];
+		}
+
+		switch ( lastcmd[0] )
+		{
+			case "help":
+				DbgIO.println("GDB emulation mode - no help available, yet");
+				break;
+			case "delete":
+				if ( lastcmd.length < 2 )
+					DbgIO.println("Warning: too few arguments for set");
+				else switch ( lastcmd[1] )
+				{
+					case "breakpoints":
+						if ( lastcmd.length < 3 )
+						{
+							foreach ( uint i; dbg.breakpoints.keys )
+								dbg.removeBreakpoint(i);
+						}
+						else if ( !isNumeric(lastcmd[2]) )
+							DbgIO.println("Warning: invalid breakpoint index '%s'", lastcmd[2]);
+						else
+							dbg.removeBreakpoint(cast(uint)atoi(lastcmd[2]));
+						break;
+					default:
+						DbgIO.println("Warning: unknown argument %s", lastcmd[1]);
+				}
+				break;
+			case "set":
+				if ( lastcmd.length < 2 )
+					DbgIO.println("Warning: too few arguments for set");
+				else switch ( lastcmd[1] )
+				{
+					case "prompt":
+						if ( lastcmd.length < 3 )
+							DbgIO.println("Warning: too few arguments for set prompt");
+						else
+							prompt = lastcmd[2];
+						break;
+					case "args":
+						if ( dbg.process_loaded )
+							DbgIO.println("Warning: process already started");
+						command_line = debuggee~" "~join(lastcmd[2..$], " ");
+						break;
+					default:
+						DbgIO.println("Warning: unknown variable %s", lastcmd[1]);
+				}
+				break;
+			case "info":
+				if ( lastcmd.length < 2 )
+					DbgIO.println("Warning: too few arguments for info");
+				else
+				{
+					switch ( lastcmd[1] )
+					{
+						case "locals":
+                            if ( dbg.process_loaded )
+                            {
+                                uint scope_address = dbg.getScopeAddress(current_frame_level);
+                                ScopeSymbol scope_sym = dbg.images.findProcedureSymbol(scope_address);
+                                for ( ; scope_sym !is null; scope_sym = scope_sym.parent_scope )
+                                {
+                                    if ( scope_sym is null )
+                                        DbgIO.println("No valid scope active");
+                                    else
+                                        evalStackSymbols(scope_sym.symbols.stack_symbols);
+                                }
+                            }
+							break;
+						case "args":
+                            if ( dbg.process_loaded )
+                            {
+                                uint scope_address = dbg.getScopeAddress(current_frame_level);
+                                ScopeSymbol scope_sym = dbg.images.findProcedureSymbol(scope_address);
+                                for ( ; scope_sym !is null; scope_sym = scope_sym.parent_scope )
+                                {
+                                    if ( scope_sym is null )
+                                        DbgIO.println("No valid scope active");
+                                    else
+                                    {
+                                        auto psym = cast(ProcedureSymbol)scope_sym;
+                                        if ( psym !is null )
+                                            evalStackSymbols(psym.arguments.stack_symbols);
+                                    }
+                                }
+                            }
+							break;
+						case "registers":
+							printRegisterDump(dbg.process.threads[dbg.thread_id]);
+							break;
+						case "frame":
+                            uint scope_address = dbg.getScopeAddress(current_frame_level);
+                            ubyte[] frame = dbg.stack.getFrame(current_frame_level);
+							Location loc = dbg.images.findLocation(scope_address);
+							DbgIO.print("Stack level %d, frame at ", current_frame_level);
+							if ( loc.scope_sym !is null ) {
+								ProcedureSymbol psym = cast(ProcedureSymbol)loc.scope_sym;
+								DbgIO.println("0x%x:", loc.getCodeBase + psym.cvdata.offset + psym.cvdata.debug_start);
+							}
+							else
+								DbgIO.println("0x%x:", dbg.current_address);
+
+							DbgIO.print(" eip = 0x%x in %s (",
+								loc.address, loc.scope_sym is null?"??":loc.scope_sym.name_notype
+							);
+
+							if ( loc.codeblock !is null )
+								DbgIO.print("%s:%d", loc.file, loc.line);
+							else if ( loc.mod !is null )
+								DbgIO.write(loc.mod.name);
+							else
+							{
+								DLL dll = dbg.process.findDLL(loc.address);
+								if ( dll !is null )
+									DbgIO.write(dll.image.name);
+							}
+
+							DbgIO.println("); saved eip 0x%x", (cast(uint[])frame)[1]);
+							break;
+						default:
+							DbgIO.println("Warning: unknown argument %s", lastcmd[1]);
+					}
+				}
+				break;
+            // select frame
+            case "select-frame":
+                if ( lastcmd.length > 1 )
+                    current_frame_level = cast(uint)atoi(lastcmd[1]);
+                DbgIO.println("Current frame level is %d", current_frame_level);
+                break;
+			// add breakpoint
+			case "tbreak":
+			case "clear":
+			case "break":
+				int index;
+				if ( lastcmd.length < 2 ) {
+					DbgIO.println("invalid syntax - see help for details");
+					break;
+				}
+                Location loc = new Location(lastcmd[1]);
+                loc.bind(dbg.images, dbg.source_search_paths);
+                if ( loc is null )
+                    break;
+				if ( lastcmd.length > 2 )
+					index = cast(int)atoi(lastcmd[2]);
+
+				if ( lastcmd[0] == "clear" )
+				{
+					Breakpoint bp = dbg.getBreakpoint(loc, index);
+					dbg.removeBreakpoint(index);
+				}
+				else
+				{
+                    Breakpoint bp;
+				    if ( lastcmd[0] == "tbreak" )
+                        index = -1;
+                    else if ( index <= 0 && dbg.breakpoints.length > 0 )
+                        index = dbg.breakpoints.keys.dup.sort[$-1]+1;
+                    bp = dbg.setBreakpoint(loc, index, 0);
+					DbgIO.println("Breakpoint %d at 0x%08x", index, bp.address);
+				}
+				break;
+			// add source search path
+			case "directory":
+				if ( lastcmd.length > 1 )
+				{
+					string sp = lastcmd[1].dup;
+					if ( find(sp, '/') >= 0 )
+						sp = replace(sp, "/", "\\");
+					if ( sp[$-1] != '\\' )
+						sp ~= '\\';
+					dbg.source_search_paths ~= sp;
+				}
+				else
+					DbgIO.println("usage: ssp <search_path>");
+				break;
+			// quit
+			case "quit":
+			case "q":
+				dbg.abort = true;
+				quit = true;
+				return true;
+			// run/continue
+			case "cont":
+			case "run":
+			case "start":
+				if ( dbg.process_loaded ) {
+					dbg.single_step = false;
+					dbg.paused = false;
+					return true;
+				}
+				else {
+					dbg.start(command_line);
+					return true;
+				}
+			// single-step
+			case "nexti":
+				dbg.single_step = true;
+				dbg.activateSingleStep(true);
+				return true;
+			// step over
+			case "next":
+				if ( dbg.step(StepMode.e_over) )
+					return true;
+				break;
+			// step into
+			case "step":
+				if ( dbg.step(StepMode.e_in) )
+					return true;
+				break;
+			// step out
+			case "finish":
+				if ( dbg.step(StepMode.e_out) )
+					return true;
+				break;
+			// unwind stack
+			case "bt":
+				unwindStack();
+				break;
+			case "print":
+			case "output":
+				if ( dbg.process_loaded && lastcmd.length > 1 )
+				{
+					string expr;
+					if ( lastcmd[1][0] == '/' )
+						expr = lastcmd[2];
+					else
+						expr = lastcmd[1];
+					try DbgIO.println(symbolValueToString(dbg.handleData(dbg.evaluateExpression(expr), false)));
+					catch ( EvaluationException e ) {
+						DbgIO.writeln(e.toString);
+					}
+				}
+				break;
+			case "disassemble":
+                if ( !dbg.process_loaded )
+                    break;
+
+                uint start_address = dbg.current_address;
+				if ( lastcmd.length > 1 )
+					sscanf(toStringz(lastcmd[1]), "%x", &start_address);
+				else
+				{
+					Location loc = dbg.images.findLocation(dbg.current_address);
+					if ( loc.scope_sym !is null ) {
+						ProcedureSymbol psym = cast(ProcedureSymbol)loc.scope_sym;
+						start_address = loc.getCodeBase + psym.cvdata.offset;
+						DisAsm.disasm(dbg.process, start_address, start_address+psym.cvdata.proc_length, &printDisassembly);
+						break;
+					}
+				}
+				DisAsm.disasm(dbg.process, start_address, 0, &printDisassembly);
+				break;
+			case "x":
+				uint start_address;
+				if ( lastcmd.length > 2 )
+				{
+					if ( lastcmd[1].length > 2 && lastcmd[1][0..2] == "0x" )
+						lastcmd[1] = lastcmd[1][2..$];
+					sscanf(toStringz(lastcmd[1]), "%x", &start_address);
+					string count_str = lastcmd[$-1][2..$-2];
+					uint count = cast(uint)atoi(count_str);
+
+					dumpMemory(start_address, count);
+				}
+				else
+					DbgIO.println("Warning: too few arguments for x");
+				break;
+            case "whatis":
+				if ( dbg.process_loaded && lastcmd.length > 1 )
+				{
+				    SymbolData sd = dbg.evaluateExpression(lastcmd[1], current_frame_level);
+				    string type = demangle("_D0"~sd.type);
+					try DbgIO.println("type = %s", type);
+					catch ( EvaluationException e ) {
+						DbgIO.writeln(e.toString);
+					}
+				}
+                break;
+
+
+			// list source search paths
+			case "lsp":
+				foreach ( s; dbg.source_search_paths )
+					DbgIO.writeln(s);
+				break;
+			// list breakpoints
+			case "lbp":
+				if ( dbg.breakpoints.length <= 0 )
+					DbgIO.println("no breakpoints set");
+				foreach ( uint i, bp; dbg.breakpoints )
+					DbgIO.println("%d %s", i, bp.toString);
+				break;
+			// list temporary breakpoints
+			case "ltbp":
+				if ( dbg.temp_breakpoints.empty )
+					DbgIO.println("no temporary breakpoints set");
+				foreach ( bp; dbg.temp_breakpoints )
+					DbgIO.writeln(bp.value.toString);
+				break;
+			// list debug modules
+			case "lm":
+				string[]	modules_noinfo;
+                foreach ( img; dbg.images.images )
+                {
+                    if ( img.codeView is null )
+                        continue;
+                    foreach ( m; img.codeView.modulesByIndex )
+                    {
+                        string name = m.name;
+
+                        if ( m.header.iLib > 0 )
+                            name ~= " from "~img.codeView.libraries[m.header.iLib];
+
+                        if ( lastcmd.length > 1 && find(name, lastcmd[1]) < 0 )
+                            continue;
+
+                        bool has_info = false;
+                        with ( m.symbols ) if ( proc_symbols.length+stack_symbols.length+data_symbols.length > 0 )
+                        {
+                            DbgIO.println(
+                                "%s\n\tSymbols: %d proc %d stack %d data",
+                                name, proc_symbols.length, stack_symbols.length, data_symbols.length
+                            );
+                            has_info = true;
+                        }
+                        if ( m.source_module !is null )
+                        {
+                            DbgIO.println("\tSource files:");
+                            has_info = true;
+                            foreach ( sf; m.source_module.files )
+                                DbgIO.println("\t\t%s", sf.name);
+                        }
+                        if ( !has_info )
+                            modules_noinfo ~= name;
+                    }
+                }
+				if ( modules_noinfo.length > 0 )
+				{
+					DbgIO.println("Modules without debug information:");
+					foreach ( m; modules_noinfo )
+						DbgIO.println("%s ", m);
+				}
+				break;
+			// list source modules
+			case "lsm":
+                foreach ( img; dbg.images.images )
+                {
+                    if ( img.codeView is null )
+                        continue;
+                    foreach ( m; img.codeView.modulesByIndex )
+                    {
+                        if ( m.source_module !is null )
+                        {
+                            foreach ( sf; m.source_module.files )
+                            {
+                                if ( lastcmd.length > 1 && find(sf.name, lastcmd[1]) < 0 )
+                                    continue;
+                                DbgIO.writeln(sf.name);
+                            }
+                        }
+                    }
+                }
+				break;
+			// list all symbols
+			case "ls":
+                foreach ( img; dbg.images.images )
+                {
+                    if ( img.codeView is null )
+                        continue;
+                    printSymbols(img.codeView, img.codeView.global_pub.named_symbols, lastcmd.length>1?lastcmd[1]:null);
+                    printSymbols(img.codeView, img.codeView.global_sym.named_symbols, lastcmd.length>1?lastcmd[1]:null);
+                    printSymbols(img.codeView, img.codeView.static_sym.named_symbols, lastcmd.length>1?lastcmd[1]:null);
+                    foreach ( m; img.codeView.modulesByIndex )
+                        printSymbols(img.codeView, m.symbols.named_symbols, lastcmd.length>1?lastcmd[1]:null);
+                }
+				break;
+			// list function symbols
+			case "lf":
+                foreach ( img; dbg.images.images )
+                {
+                    if ( img.codeView is null )
+                        continue;
+                    printSymbols(img.codeView, img.codeView.global_pub.proc_symbols, lastcmd.length>1?lastcmd[1]:null);
+                    printSymbols(img.codeView, img.codeView.global_sym.proc_symbols, lastcmd.length>1?lastcmd[1]:null);
+                    printSymbols(img.codeView, img.codeView.static_sym.proc_symbols, lastcmd.length>1?lastcmd[1]:null);
+                    foreach ( m; img.codeView.modulesByIndex )
+                        printSymbols(img.codeView, m.symbols.proc_symbols, lastcmd.length>1?lastcmd[1]:null);
+                }
+				break;
+			// list data symbols
+			case "ld":
+                foreach ( img; dbg.images.images )
+                {
+                    if ( img.codeView is null )
+                        continue;
+                    printSymbols(img.codeView, img.codeView.global_pub.data_symbols, lastcmd.length>1?lastcmd[1]:null);
+                    printSymbols(img.codeView, img.codeView.global_sym.data_symbols, lastcmd.length>1?lastcmd[1]:null);
+                    printSymbols(img.codeView, img.codeView.static_sym.data_symbols, lastcmd.length>1?lastcmd[1]:null);
+                    foreach ( m; img.codeView.modulesByIndex )
+                        printSymbols(img.codeView, m.symbols.data_symbols, lastcmd.length>1?lastcmd[1]:null);
+                }
+				break;
+			// list global symbols
+			case "lg":
+                foreach ( img; dbg.images.images )
+                {
+                    if ( img.codeView is null )
+                        continue;
+                    printSymbols(img.codeView, img.codeView.global_pub.named_symbols, lastcmd.length>1?lastcmd[1]:null);
+                    printSymbols(img.codeView, img.codeView.global_sym.named_symbols, lastcmd.length>1?lastcmd[1]:null);
+                }
+				break;
+			// list global publics
+			case "lp":
+                foreach ( img; dbg.images.images )
+                {
+                    if ( img.codeView is null )
+                        continue;
+                    printSymbols(img.codeView, img.codeView.global_pub.named_symbols, lastcmd.length>1?lastcmd[1]:null);
+                }
+				break;
+			// delete breakpoint
+			case "dbp":
+				if ( lastcmd.length > 1 )
+				{
+					if ( lastcmd[1] == "*" )
+					{
+						foreach ( uint i, bp; dbg.breakpoints )
+						{
+							bp.deactivate(dbg.process);
+							dbg.breakpoints.remove(i);
+						}
+					}
+					else if ( isNumeric(lastcmd[1]) )
+					{
+						if ( !dbg.removeBreakpoint(cast(uint)atoi(lastcmd[1])) )
+							DbgIO.println("invalid breakpoint index: %s",lastcmd[1]);
+					}
+					else
+					{
+                        Location loc = new Location(lastcmd[1]);
+                        loc.bind(dbg.images, dbg.source_search_paths);
+						if ( loc !is null )
+						{
+							int bp_index;
+							dbg.getBreakpoint(loc, bp_index);
+							if ( bp_index >= 0 && !dbg.removeBreakpoint(bp_index) )
+								DbgIO.println("No breakpoint set at "~lastcmd[1]);
+						}
+						else
+							DbgIO.println("Usage: dbp [<bp index>|<file:line>]");
+					}
+				}
+				else
+					DbgIO.println("Usage: bp <sourc file>:<line>");
+				break;
+			// dump stack
+			case "ds":
+				int dump_length;
+				if ( lastcmd.length > 1 )
+					dump_length = cast(int)atoi(lastcmd[1])*4;
+				else
+				{
+					CONTEXT ctx;
+					if ( dbg.process.threads[dbg.thread_id].getContext(ctx, CONTEXT_CONTROL) )
+						dump_length = ctx.Ebp-ctx.Esp+8;
+					if ( dump_length <= 0 )
+						dump_length = 16*4;
+				}
+				int top = dbg.stack.data.length>dump_length?dump_length:dbg.stack.data.length;
+				dumpMemory(dbg.stack.top_ptr, top, dbg.stack.data);
+				break;
+			case "dm":
+				if ( lastcmd.length < 3 ) {
+					DbgIO.println("usage: dm <start> <length>");
+					break;
+				}
+				uint start;
+				sscanf(toStringz(lastcmd[1]), "%x", &start);
+				dumpMemory(start, cast(uint)atoi(lastcmd[2]));
+				break;
+
+			// unknown command
+			default:
+				DbgIO.println("Warning: Unknown command '%s' ignored!", lastcmd[0]);
+				break;
+		}
+
+		return false;
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void dumpMemory(uint start, uint length, ubyte[] _data=null)
+	{
+		ubyte[]	data;
+		if ( _data is null )
+		{
+			data.length = length;
+			if ( !dbg.process.readProcessMemory(start, data.ptr, data.length) )
+				return;
+		}
+		else
+			data = _data;
+		for ( uint i = 0; i < length; ++i )
+		{
+			if ( i % (8*4) == 0 )
+			{
+				if ( i > 0 )
+					DbgIO.println("");
+				DbgIO.print("0x%08x:", start+i);
+			}
+			DbgIO.print(" 0x%02x", data[i]);
+		}
+		DbgIO.println("");
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void evalStackSymbols(StackSymbol[] symbols)
+	{
+		foreach ( sym; symbols )
+		{
+            string name = sym.mangled_name;
+            DbgIO.print("%s = ", name);
+            try DbgIO.writeln(symbolValueToString(dbg.handleData(dbg.evaluateExpression(name, current_frame_level, sym), true)));
+            catch ( EvaluationException e ) {
+                DbgIO.println(e.msg);
+            }
+		}
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void printAsmLine(uint address, string bytes, string asmsource, string symbol, string location, string source)
+	{
+	    bool nl = false;
+        if ( location !is null ) {
+            DbgIO.print("0x%08x <??>: // ", address);
+            DbgIO.write(location);
+            nl = true;
+        }
+        if ( source !is null )
+        {
+            if ( !nl )
+				DbgIO.print("0x%08x <??>: // ", address);
+            DbgIO.write(source);
+            nl = true;
+        }
+        if ( nl )
+            DbgIO.println;
+
+		assert(asmsource !is null);
+		DbgIO.print("0x%08x <??>: ", address, asmsource);
+
+		if ( symbol !is null )
+			DbgIO.write(symbol);
+		DbgIO.println;
+	}
+
+    /**********************************************************************************************
+        Prints the register contents of the given thread's context.
+    **********************************************************************************************/
+	void printRegisterDump(DbgThread thread)
+	{
+		CONTEXT ctx;
+		if ( thread.getContext(ctx) )
+		{
+			DbgIO.println("eax\t0x%x -\nebx\t0x%x -\necx\t0x%x -\nedx\t0x%x -", ctx.Eax, ctx.Ebx, ctx.Ecx, ctx.Edx);
+			DbgIO.println("cs\t0x%x -\nds\t0x%x -\nes\t0x%x -\nfs\t0x%x -", ctx.SegCs, ctx.SegDs, ctx.SegEs, ctx.SegFs);
+			DbgIO.println("gs\t0x%x -\nss\t0x%x -\nedi\t0x%x -\nesi\t0x%x -", ctx.SegGs, ctx.SegSs, ctx.Edi, ctx.Esi);
+			DbgIO.println("ebp\t0x%x -\nesp\t0x%x -\neip\t0x%x -\neflags\t0x%x -", ctx.Ebp, ctx.Esp, ctx.Eip, ctx.EFlags);
+		}
+		else
+			DbgIO.println("Warning: Couldn't get main thread's context");
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	string symbolValueToString(SymbolValue val)
+	{
+	    string str;
+	    if ( val.name !is null )
+            str = val.name~" = ";
+        if ( val.value !is null )
+            str ~= val.value;
+        else
+        {
+            if ( val.children.length > 0 )
+            {
+                str ~= "{";
+                bool first = true;
+                foreach ( c; val.children )
+                {
+                    if ( first )
+                        first = false;
+                    else
+                        str ~= ",";
+                    str ~= symbolValueToString(c);
+                }
+                str ~= "}";
+            }
+            else
+                str ~= "{}";
+        }
+        return str;
+	}
+
+    /**********************************************************************************************
+        Read command and call CLI supplied parser function.
+        Gets called when debuggee is suspended.
+    **********************************************************************************************/
+	bool readCommand()
+	{
+	    if ( cmdQueue.length > 0 )
+	    {
+	        string cmd = strip(cmdQueue[0]);
+	        cmdQueue = cmdQueue[1..$];
+            DbgIO.writeln(prompt~cmd);
+	        return parseCommand(cmd);
+	    }
+	    else {
+            DbgIO.write(prompt);
+            string input = DbgIO.readln();
+            return parseCommand(input);
+	    }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cli/gdbmicli.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,88 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+module cli.gdbmicli;
+
+import cli.userinterface;
+import breakpoint;
+import dbgprocess;
+import dbgthread;
+import expression.datahandler;
+
+import util;
+
+import win32.winnt;
+
+class GDBMICLI : UserInterfaceBase
+{
+	void init(string[] args)
+	{
+	}
+
+	int start()
+	{
+	    return 0;
+	}
+
+	bool parseCommand(string input)
+	{
+	    return false;
+	}
+
+	void debugString(string str)
+	{
+	}
+
+	bool breakpoint(int index, Breakpoint bp, DbgThread thread)
+	{
+	    return false;
+	}
+
+	void userInterrupt()
+	{
+	}
+
+	void exception(uint thread_id, string class_name, string msg, size_t obj_ptr)
+	{
+	}
+
+	void win32exception(uint threadId, EXCEPTION_RECORD* exrec)
+	{
+	}
+
+	void loadedDLL(DLL dll)
+	{
+	}
+
+	void exitProcess()
+	{
+	}
+
+	void singleStep()
+	{
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void printAsmLine(uint address, string bytes, string asmsource, string symbol, string location, string source)
+	{
+	}
+
+	string symbolValueToString(SymbolValue val)
+	{
+	    return "";
+	}
+
+    /**********************************************************************************************
+        Read command and call CLI supplied parser function.
+        Gets called when debuggee is suspended.
+    **********************************************************************************************/
+	bool readCommand()
+	{
+		DbgIO.print("->");
+		string input = DbgIO.readln();
+		return parseCommand(input);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cli/userinterface.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,344 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+module cli.userinterface;
+
+import breakpoint;
+import dbgprocess;
+import dbgthread;
+import debugger;
+import expression.datahandler;
+import codeview.codeview;
+import util;
+import disasm;
+import codeview.coff;
+
+import win32.winnt;
+
+import std.string;
+import std.c.string;
+import std.utf;
+
+interface UserInterface
+{
+	void    init(string[] args);
+	int     start();
+
+	bool    readCommand();
+	bool    parseCommand(string cmd);
+	void    runCommands(string cmdstr);
+
+	void    debugString(string str);
+	bool    breakpoint(int index, Breakpoint bp, DbgThread thread);
+	void    userInterrupt();
+	void    exception(uint threadId, string class_name, string msg, size_t obj_ptr);
+	void    win32exception(uint threadId, EXCEPTION_RECORD* exrec);
+	void    loadedDLL(DLL dll);
+	void    exitProcess();
+	void    singleStep();
+}
+
+struct StackTraceEntry
+{
+    uint        index;
+    Location    loc;
+    uint        frame_level;
+    CodeBlock   last_known_cb;
+
+    void describe(UserInterfaceBase ui)
+    {
+        DbgIO.print("#%d ", index);
+        if ( loc is null ) {
+            DbgIO.println("<no debug symbols available>");
+            return;
+        }
+        if ( index > 0 )
+            DbgIO.print("0x%08x in ", loc.address);
+        if ( loc.scope_sym !is null )
+        {
+            ProcedureSymbol psym = cast(ProcedureSymbol)loc.scope_sym;
+
+            string argstr;
+            bool first = true;
+            foreach_reverse ( argsym; psym.arguments.stack_symbols )
+            {
+                string name = argsym.name_notype;
+                if ( !first )
+                    argstr ~= ", ";
+                else
+                    first = false;
+                argstr ~= argsym.name_notype;
+                try {
+                    SymbolValue symval = ui.dbg.handleData(ui.dbg.evaluateExpression(name, frame_level), false);
+                    argstr ~= " = "~ui.symbolValueToString(symval);
+                }
+                catch ( Exception e ) {
+                }
+            }
+            int end = find(psym.name_type, '('),
+                start = find(psym.name_type, ' ');
+            if ( end < 0 )
+                end = psym.name_type.length;
+            if ( start < 0 )
+                start = 0;
+            if ( end-start < 2 )
+                start = 0;
+            DbgIO.print("%s (", psym.name_type[start..end]);
+            DbgIO.write(argstr~") ");
+        }
+        else if ( loc.data_sym !is null )
+            DbgIO.print(loc.data_sym.name_type, " () ");
+        else
+            DbgIO.print("?? () ");
+        if ( loc.codeblock !is null )
+            DbgIO.print("at %s:%d", loc.file, loc.line);
+        else
+        {
+            if ( last_known_cb !is null && last_known_cb.segment !is null )
+                DbgIO.print("at %s:%d ", last_known_cb.segment.file.name, last_known_cb.line);
+            if ( loc.mod !is null )
+                DbgIO.print("from %s", loc.mod.name);
+            else if ( ui.dbg.process !is null )
+            {
+                DLL dll = ui.dbg.process.findDLL(loc.address);
+                if ( dll !is null )
+                    DbgIO.print("from %s", dll.image.name);
+            }
+        }
+        DbgIO.println("");
+    }
+}
+
+abstract class UserInterfaceBase : UserInterface
+{
+	CodeBlock	last_codeblock;
+	Module		last_module;
+	DLL			last_dll;
+
+	Debugger dbg;
+
+    string[]    cmdQueue;
+
+    void printAsmLine(uint address, string bytes, string asmsource, string symbol, string location, string source);
+	string symbolValueToString(SymbolValue val);
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void unwindStack()
+	{
+        StackTraceEntry[] entries;
+
+		uint	index,
+				counter,
+				frame_level;
+        debug DbgIO.println("Stack: base 0x%x top 0x%x frame 0x%x", dbg.stack.base_ptr, dbg.stack.top_ptr, dbg.stack.frame_ptr);
+		Location loc = dbg.images.findLocation(dbg.current_address);
+        if ( loc is null )
+            loc = new Location(dbg.current_address, null);
+		entries ~= StackTraceEntry(counter++, loc, frame_level);
+
+		dbg.stack.firstFrame(index);
+		ubyte[] frame = dbg.stack.prevFrame(index, index);
+        size_t next_frame=1;
+		while ( frame !is null )
+		{
+			uint ret_adr = (cast(uint[])frame)[1];
+			loc = dbg.images.findLocation(ret_adr);
+            if ( loc is null )
+                loc = new Location(ret_adr, null);
+			frame = dbg.stack.prevFrame(index, index);
+			++frame_level;
+            if ( next_frame >= entries.length )
+                entries.length = entries.length*2+1;
+			entries[next_frame++] = StackTraceEntry(counter++, loc, frame_level);
+		}
+        entries.length = next_frame;
+        
+        CodeBlock last_known_cb;
+        foreach_reverse ( ref ste; entries )
+        {
+            if ( ste.loc !is null && ste.loc.codeblock !is null )
+                last_known_cb = ste.loc.codeblock;
+            else
+                ste.last_known_cb = last_known_cb;
+        }
+        
+        foreach ( ste; entries )
+            ste.describe(this);
+	}
+
+    /**********************************************************************************************
+        Prints an instruction with looked up symbols if existant.
+    **********************************************************************************************/
+	bool printDisassembly(ud_t* ud_obj)
+	{
+		// first call
+		if ( ud_obj is null ) {
+			last_codeblock = null;
+			return true;
+		}
+
+		uint    address = cast(uint)ud_insn_off(ud_obj);
+		string  source, location;
+
+		// check whether we have symbols here
+		Location loc = dbg.images.findLocation(address);
+		if ( loc.codeblock !is null )
+		{
+			if ( last_codeblock !is loc.codeblock )
+			{
+				last_codeblock = loc.codeblock;
+				string[] source_file = dbg.getSourceFile(loc.file);
+                location = format("%s:%d", loc.file, loc.line);
+				if ( source_file !is null && loc.line <= source_file.length )
+					source = source_file[loc.line-1];
+			}
+		}
+		else
+		{
+            CodeView cv;
+			CodeBlock cb = dbg.images.findCodeBlockRel(address, cv);
+			if ( cb !is null )
+			{
+				if ( last_codeblock !is cb )
+					last_codeblock = cb;
+			}
+			else
+			{
+				uint seg;
+				Module mod = dbg.images.findModule(address, seg);
+				if ( mod !is null && last_module !is mod ) {
+					last_module = mod;
+					location = mod.name;
+				}
+				else
+				{
+					DLL dll = dbg.process.findDLL(address);
+					if ( dll !is null && last_dll !is dll ) {
+						last_dll = dll;
+						location = dll.image.name;
+					}
+				}
+			}
+		}
+
+		string symbol;
+		bool is_imm=true;
+		uint jmp_dest = DisAsm.calcJumpDestination(dbg.process, dbg.process.threads[dbg.thread_id], ud_obj, is_imm);
+		if ( is_imm && jmp_dest>0 )
+			symbol = "\t"~describeLocation(jmp_dest, false);
+
+		char* hex = ud_insn_hex(ud_obj);
+		uint hexlen = strlen(hex);
+		char* ins = ud_insn_asm(ud_obj);
+
+		printAsmLine(address, hex[0..hexlen], ins[0..strlen(ins)], symbol, location, source);
+		return true;
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void printSymbols(CodeView cv, NamedSymbol[] syms, string substring=null, uint indent=0)
+	{
+		foreach ( ns; syms )
+		{
+			if ( substring.length > 0 && find(ns.name_notype, substring)<0 )
+				continue;
+
+			char[] indent_str;
+			indent_str.length = indent*2;
+			indent_str[0..indent*2] = ' ';
+			ClassInfo cs = ns.classinfo;
+			if ( cs == ProcedureSymbol.classinfo )
+			{
+			    ProcedureSymbol ps = cast(ProcedureSymbol)ns;
+			    size_t start = ps.cvdata.offset+cv.getCodeBase;
+				DbgIO.println("%s%s %d arguments, entry 0x%x, debug start 0x%x, debug end 0x%x",
+                    indent_str, ps.name_type, ps.arguments.symbols.length, start,
+                    start+ps.cvdata.debug_start, start+ps.cvdata.debug_end
+                );
+			}
+			else if ( cs == StackSymbol.classinfo ) {
+				StackSymbol ss = cast(StackSymbol)ns;
+				DbgIO.println("%s%s stack (%s) %x ebp%s%d", indent_str, ns.name_type, ns.mangled_name, ss.cvtype, ss.offset>=0?"+":"", ss.offset);
+			}
+			else if ( cs == DataSymbol.classinfo )
+            {
+				DataSymbol ds = cast(DataSymbol)ns;
+				DbgIO.println("%s%s (%s) data offset: 0x%x size: 0x%x segment: 0x%x type: 0x%x (%s)", indent_str, ds.name_type, ds.name_notype,
+					ds.offset, ds.size, ds.cvdata.segment, ds.cvdata.type, dbg.images.mangleCVtype(ds.cvdata.type)
+				);
+			}
+			else
+				DbgIO.println("%s%s %s", indent_str, ns.name_type, cs.name);
+			ScopeSymbol scs = cast(ScopeSymbol)ns;
+			if ( scs !is null )
+				printSymbols(cv, scs.symbols.named_symbols, substring, indent+1);
+		}
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	string describeLocation(uint vaddress, bool with_address=true)
+	{
+		Location loc = dbg.images.findLocation(vaddress);
+		return describeLocation(loc, with_address);
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	string describeLocation(Location loc, bool with_address=true)
+	{
+		string desc;
+
+		if ( loc is null )
+			return "unknown";
+
+		if ( loc.codeblock !is null )
+			desc = format("%s:%d", loc.file, loc.line);
+		if ( with_address )
+			desc ~= (desc.length>0?" ":"")~format("(0x%08x)", loc.address);
+
+		if ( loc.scope_sym !is null )
+			return loc.scope_sym.name_notype~" "~desc;
+		if ( loc.data_sym !is null )
+			return loc.data_sym.name_notype~" "~desc;
+		if ( loc.mod !is null )
+			return loc.mod.name~" "~desc;
+        if ( dbg.process !is null )
+        {
+            DLL dll = dbg.process.findDLL(loc.address);
+            if ( dll !is null )
+                return dll.image.name~" "~desc;
+        }
+
+		return desc;
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void runCommands(string cmd_string)
+	{
+        cmd_string = replace(cmd_string, "\\\"", "\"");
+        auto r = std.regexp.RegExp("(([^;\" \\t]+)|(\"[^\"]+\"))+|;");
+        string cmd;
+        string[] cmds;
+        foreach ( m; r.search(cmd_string) )
+        {
+            if ( m.match(0) == ";" ) {
+                cmdQueue ~= cmd~";";
+                cmd = null;
+            }
+            else
+                cmd ~= " "~m.match(0);
+        }
+        if ( cmd !is null )
+            cmdQueue ~= cmd~";";
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/codeview/codeview.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,927 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+
+module codeview.codeview;
+
+import std.ctype;
+import std.string;
+import std.math;
+
+import util;
+import container;
+import codeview.coff;
+import codeview.decl;
+
+public import codeview.debuginfo;
+
+//=================================================================================================
+// classes for accessing CodeView data
+
+abstract class Symbol
+{
+	SymbolIndex	symbol_index;
+
+	this(SymbolIndex si) { symbol_index = si; }
+}
+
+class ReturnSymbol : Symbol
+{
+	CVReturnSymbol*	cvdata;
+	ubyte[]			registers;
+
+	this(CVReturnSymbol* cv) { super(SymbolIndex.S_RETURN); cvdata = cv; }
+}
+
+class StringWrap
+{
+    string str;
+
+    this(string _str) { str = _str; }
+
+	int opCmp(Object o)
+	{
+	    NamedSymbol ns = cast(NamedSymbol)o;
+	    if ( ns !is null )
+            return -ns.opCmp(this);
+
+        StringWrap sw = cast(StringWrap)o;
+        if ( sw is null )
+            return -1;
+        if ( str == sw.str )
+            return 0;
+	    if ( str < sw.str )
+            return -1;
+        return 1;
+	}
+}
+
+abstract class NamedSymbol : Symbol
+{
+	string				mangled_name,
+						name_type,
+						name_notype;
+
+    this(SymbolIndex si)    { super(si); }
+
+	int opCmp(Object o)
+	{
+	    string str;
+	    NamedSymbol ns = cast(NamedSymbol)o;
+	    if ( ns is null )
+	    {
+            StringWrap sw = cast(StringWrap)o;
+            if ( sw is null )
+                return -1;
+            str = sw.str;
+        }
+        else
+            str = ns.name_notype;
+        if ( name_notype == str )
+            return 0;
+	    if ( name_notype < str )
+            return -1;
+        return 1;
+	}
+}
+
+class StackSymbol : NamedSymbol
+{
+	CVStackSymbol*	cvdata;
+	int				size;
+
+	this(CVStackSymbol* cv)
+	{
+		super(SymbolIndex.S_BPREL32);
+		cvdata=cv;
+	}
+
+	uint offset() { return cvdata.offset; }
+	uint cvtype() { return cvdata.type; }
+}
+
+class DataSymbol : NamedSymbol
+{
+	CVDataSymbol*	cvdata;
+	uint			size;
+
+	this(SymbolIndex si, CVDataSymbol* cv)
+	{
+		super(si);
+		cvdata=cv;
+	}
+
+	uint offset() { return cvdata.offset; }
+	uint cvtype() { return cvdata.type; }
+}
+
+abstract class ScopeSymbol : NamedSymbol
+{
+	ScopeSymbol		parent_scope;
+	SymbolSet		symbols;
+	uint			lfo;
+
+	this(SymbolIndex si, uint _lfo) { super(si); lfo = _lfo; symbols = new SymbolSet; }
+}
+
+class ProcedureSymbol : ScopeSymbol
+{
+	CVProcedureSymbol*	cvdata;
+	SymbolSet			arguments;
+	ReturnSymbol		return_sym;
+
+	this(SymbolIndex si, uint lfo, CVProcedureSymbol* cvd)
+	{
+		super(si,lfo);
+		cvdata = cvd;
+		arguments = new SymbolSet;
+	}
+}
+
+class SymbolSet
+{
+	ProcedureSymbol[]	proc_symbols;
+	StackSymbol[]		stack_symbols;
+	DataSymbol[]		data_symbols;
+	NamedSymbol[]		named_symbols;
+	Symbol[]			symbols;
+
+    void opCatAssign(SymbolSet s)
+    {
+        symbols ~= s.symbols;
+        named_symbols ~= s.named_symbols;
+        data_symbols ~= s.data_symbols;
+        stack_symbols ~= s.stack_symbols;
+        proc_symbols ~= s.proc_symbols;
+    }
+
+	void add(Symbol s)
+	{
+		NamedSymbol ns = cast(NamedSymbol)s;
+		if ( ns is null ) {
+			symbols ~= s;
+			return;
+		}
+		named_symbols ~= ns;
+		ClassInfo ci = s.classinfo;
+		if ( ci == ProcedureSymbol.classinfo )
+			proc_symbols ~= cast(ProcedureSymbol)s;
+		else if ( ci == StackSymbol.classinfo )
+			stack_symbols ~= cast(StackSymbol)s;
+		else if ( ci == DataSymbol.classinfo )
+			data_symbols ~= cast(DataSymbol)s;
+	}
+
+	/**********************************************************************************************
+        Find procedure symbol covering the given address.
+    **********************************************************************************************/
+	ProcedureSymbol findProcedureSymbol(uint address)
+	{
+		foreach ( ps; proc_symbols )
+			if ( address >= ps.cvdata.offset && address < ps.cvdata.offset+ps.cvdata.proc_length )
+				return ps;
+		return null;
+	}
+
+	/**********************************************************************************************
+        Find data symbol covering the given address.
+    **********************************************************************************************/
+	DataSymbol findDataSymbol(uint address, uint segment)
+	{
+		foreach ( ds; data_symbols )
+		{
+			if ( segment > 0 && ds.cvdata.segment != segment )
+				continue;
+			if ( address == ds.cvdata.offset )
+				return ds;
+		}
+		return null;
+	}
+
+	/**********************************************************************************************
+        Find data symbol by name.
+    **********************************************************************************************/
+	DataSymbol findDataSymbol(string name)
+	{
+		foreach ( ds; data_symbols )
+		{
+			if ( ds.name_notype == name )
+				return ds;
+		}
+		return null;
+	}
+
+	/**********************************************************************************************
+        Find nearest data symbol to the given address.
+    **********************************************************************************************/
+	DataSymbol findNearestDataSymbol(uint address, inout uint min_dist, uint segment)
+	{
+		DataSymbol min_ds;
+		foreach ( ds; data_symbols )
+		{
+			if ( address < ds.cvdata.offset || ds.cvdata.segment != segment )
+				continue;
+			uint dist = abs(cast(int)address-cast(int)ds.cvdata.offset);
+			if ( dist < min_dist ) {
+				min_dist = dist;
+				min_ds = ds;
+			}
+		}
+		return min_ds;
+	}
+}
+
+class Module
+{
+	ModuleHeader*	header;
+	SegInfo[]		seginfos;
+	string			name;
+	ushort			pe_section;
+
+	SymbolSet		symbols;
+
+	SourceModule	source_module;
+
+    CodeView        codeview;
+    
+	this(CodeView cv)
+    {
+        symbols = new SymbolSet;
+        codeview = cv;
+    }
+}
+
+class Location
+{
+    string      path;
+
+	ScopeSymbol	scope_sym;
+	DataSymbol	data_sym;
+	Module		mod;
+	CodeBlock   codeblock;
+    CodeView    codeview;
+	uint		address;
+
+	this(uint addr, CodeView cv)
+	{
+        codeview = cv;
+		address = addr;
+	}
+
+	this(uint addr)
+	{
+		address = addr;
+	}
+
+	this(string p)
+	{
+		path = p;
+	}
+
+    uint line()
+    {
+        if ( codeblock is null )
+            return 0;
+        return codeblock.line;
+    }
+
+	string file()
+	{
+	    if ( codeblock is null || codeblock.segment is null )
+            return null;
+		return codeblock.segment.file.name;
+	}
+    
+    size_t getCodeBase()
+    {
+        return mod.codeview.image.getCodeBase;
+    }
+
+    bool bind(ImageSet images, string[] source_search_paths)
+    {
+        if ( path is null )
+            return false;
+
+		if ( find(path, '"') >= 0 )
+			path = replace(path, "\"", "");
+
+		string[] file_line = split(path, ":");
+		if ( file_line is null || file_line.length < 2 || !isNumeric(file_line[$-1]) ) {
+		    DbgIO.println("Invalid location format. Use <part of filename>:<linenumber>");
+			return false;
+		}
+
+		string	file = join(file_line[0..$-1], ":"),
+				line = file_line[$-1];
+
+		if ( find(file, '/') >= 0 )
+			file = replace(file, "/", "\\");
+        
+		SourceFile[] sfs = images.findSrcFiles(file);
+		if ( sfs.length == 0 )
+			sfs = images.findSrcFiles(file, source_search_paths);
+		if ( sfs.length == 0 ) {
+		    DbgIO.println("Source file \"%s\" not found", file);
+			return false;
+		}
+
+        uint linenum = cast(uint)atoi(line);
+        Location loc;
+        foreach ( sf; sfs )
+        {
+            debug DbgIO.println("searching sf %s", sf.name);
+            auto loc2 = images.findSrcLine(sf, linenum);
+            if ( loc is null )
+                loc = loc2;
+            else if ( loc2 !is null && loc2.line < loc.line )
+                loc = loc2;
+        }
+        if ( loc is null )
+            DbgIO.println("Line %d in \"%s\" not found", linenum, sfs[0].name);
+
+        scope_sym = loc.scope_sym;
+        data_sym = loc.data_sym;
+        mod = loc.mod;
+        codeblock = loc.codeblock;
+        address = loc.address;
+        path = null;
+        return true;
+    }
+}
+
+class UserDefinedType
+{
+	ushort	type_index;
+	string	name;
+}
+
+/**************************************************************************************************
+    Represents the CodeView information of an executable image. Provides methods to browse the
+    information. Objects of this class get created by CodeViewParser.parse.
+**************************************************************************************************/
+class CodeView : DebugInfo
+{
+	Module[string]	modulesByName;
+	Module[]		modulesByIndex;
+
+	SymbolSet		global_pub,
+					global_sym,
+					static_sym;
+	UserDefinedType[]	udtypes;
+	Leaf[][]		type_strings;
+
+	Leaf[string]	UDTsByName;
+
+	string[]		libraries,
+					segnames;
+
+	COFFImage		image;
+
+    AVLTree!(NamedSymbol)   globalNamedSymbols;
+
+    size_t getCodeBase()
+    {
+        return image.getCodeBase;
+    }
+    
+	/**********************************************************************************************
+        Find the module and segment covering the given address.
+    **********************************************************************************************/
+	Module findModule(uint vaddress, out uint segment)
+	{
+		uint address = vaddress-image.getCodeBase;
+		foreach ( m; modulesByIndex )
+		{
+			foreach ( s; m.seginfos )
+			{
+				if ( address < s.offset )
+					continue;
+				if ( address-s.offset < s.cbSeg ) {
+					segment = s.Seg;
+					return m;
+				}
+			}
+		}
+		return null;
+	}
+
+	/**********************************************************************************************
+        Find next source line from the given location.
+    **********************************************************************************************/
+	Location findNextSrcLine(Location loc)
+	{
+		if ( loc is null || loc.codeblock is null || loc.codeblock.segment is null )
+			return null;
+        Location nextloc = findLocation(loc.codeblock.end+image.getCodeBase);
+        return nextloc;
+	}
+
+	/**********************************************************************************************
+        Find previous source line from location that isn't covered by a source codeblock.
+    **********************************************************************************************/
+	Location findPrevSrcLine(Location loc)
+	{
+		if ( loc is null )
+			return null;
+        if ( loc.codeblock !is null )
+            return loc;
+
+        AVLNode!(CodeBlock) node;
+        if ( !codeblocks.find(loc.address-1+image.getCodeBase, node) )
+        {
+            if ( node.value.start > loc.address )
+            {
+                if ( !node.findPrev(node) )
+                    return null;
+            }
+        }
+        Location prevloc = new Location(node.value.start, this);
+        prevloc.codeblock = node.value;
+		findSymbolForLocation(prevloc);
+        assert(prevloc.line != 0);
+        return prevloc;
+	}
+
+	/**********************************************************************************************
+        Find first source line in the given file that has a line number >= line
+        and a start address >= min_start.
+    **********************************************************************************************/
+	Location findSrcLine(SourceFile sf, uint min_line, size_t min_start=0)
+	{
+		if ( sf is null )
+			return null;
+
+        pragma(msg, TODO(__FILE__,__LINE__,"use binary search here"));
+        foreach ( l; sf.lines )
+        {
+            if ( l < min_line )
+                continue;
+            foreach ( cb; sf.blocks_by_line[l] )
+            {
+                if ( cb.start < min_start || cb.end <= cb.start )
+                    continue;
+                Location loc = new Location(cb.start+image.getCodeBase, this);
+                loc.codeblock = cb;
+                findSymbolForLocation(loc);
+                return loc;
+            }
+        }
+		return null;
+	}
+
+	/**********************************************************************************************
+        Find all debug information available for the given address.
+    **********************************************************************************************/
+	Location findLocation(uint vaddress)
+	{
+		Location loc = new Location(vaddress, this);
+		CodeBlock cb = findCodeBlockAbs(vaddress);
+        loc.codeblock = cb;
+		findSymbolForLocation(loc);
+		return loc;
+	}
+
+	/**********************************************************************************************
+        Fill out symbol information (as opposed to source line information) in the given location.
+    **********************************************************************************************/
+	void findSymbolForLocation(Location loc)
+	{
+		ProcedureSymbol psym = findProcedureSymbol(loc.address);
+		if ( psym !is null )
+			loc.scope_sym = psym;
+		else
+		{
+			DataSymbol dsym = findDataSymbol(loc.address, 2);
+			if ( dsym !is null )
+				loc.data_sym = dsym;
+		}
+
+		uint seg;
+		Module mod = findModule(loc.address, seg);
+		if ( mod !is null )
+		{
+			loc.mod = mod;
+			if ( loc.data_sym is null )
+			{
+				uint	min_dist = uint.max;
+				loc.data_sym = global_sym.findNearestDataSymbol(loc.address-image.getCodeBase, min_dist, image.code_section_index+1);
+				if ( loc.data_sym is null )
+                    loc.data_sym = global_pub.findNearestDataSymbol(loc.address-image.getCodeBase, min_dist, image.code_section_index+1);
+			}
+		}
+	}
+
+	/**********************************************************************************************
+        Find procedure symbol covering the given address.
+    **********************************************************************************************/
+	ProcedureSymbol findProcedureSymbol(uint vaddress)
+	{
+		uint address = vaddress-image.getCodeBase;
+		ProcedureSymbol ps;
+		foreach ( m; modulesByIndex )
+		{
+			ps = m.symbols.findProcedureSymbol(address);
+			if ( ps !is null )
+				return ps;
+		}
+		ps = global_sym.findProcedureSymbol(address);
+		if ( ps is null )
+			ps = static_sym.findProcedureSymbol(address);
+		if ( ps is null )
+			ps = global_pub.findProcedureSymbol(address);
+		return ps;
+	}
+
+	/**********************************************************************************************
+        Find data symbol covering the given address.
+    **********************************************************************************************/
+	DataSymbol findDataSymbol(uint vaddress, uint segment=0)
+	{
+		uint address = vaddress-image.getCodeBase;
+		DataSymbol ps;
+		foreach ( m; modulesByIndex )
+		{
+			ps = m.symbols.findDataSymbol(address, segment);
+			if ( ps !is null )
+				break;
+		}
+		ps = global_sym.findDataSymbol(address, segment);
+		if ( ps is null )
+			ps = static_sym.findDataSymbol(address, segment);
+		if ( ps is null )
+			ps = global_pub.findDataSymbol(address, segment);
+		return ps;
+	}
+
+	/**********************************************************************************************
+        Creates a D mangled name from a CodeView symbol.
+        Uses available mangled type info if available, mangles CodeView type info else.
+        Returns: Symbol name with mangled type info.
+    **********************************************************************************************/
+	string mangle(NamedSymbol s)
+	{
+		// use mangled typeinfo if available
+		if ( s.mangled_name !is null && s.mangled_name.length > 2 && s.mangled_name[0..2] == "_D" && isdigit(s.mangled_name[2]) )
+			return s.mangled_name;
+
+		return "_D"~mangleName(s.name_type)~mangleType(s);
+	}
+
+	/**********************************************************************************************
+        Creates the type part of a D mangled name for a CodeView symbol.
+    **********************************************************************************************/
+	string mangleType(Symbol s)
+	{
+		DataSymbol ds = cast(DataSymbol)s;
+		ushort	cvtype;
+		if ( ds !is null )
+			cvtype = ds.cvdata.type;
+		else
+        {
+			StackSymbol ss = cast(StackSymbol)s;
+			if ( ss !is null )
+				cvtype = ss.cvdata.type;
+			else {
+				pragma(msg, TODO(__FILE__,__LINE__,"implement procedure symbol mangling"));
+			}
+		}
+		return mangleCVtype(cvtype);
+	}
+
+	/**********************************************************************************************
+        Creates the type part of a D mangled name for a CodeView type index.
+    **********************************************************************************************/
+	string mangleCVtype(ushort cvtype)
+	{
+		if ( cvtype >= 0x1000 )
+		{
+			uint typeindex = cvtype-0x1000;
+			if ( typeindex >= type_strings.length ) {
+				debug DbgIO.println("undefined complex type 0x%x largest known type 0x%x", cvtype, type_strings.length-1);
+				return null;
+			}
+			Leaf[] typestring = type_strings[typeindex];
+
+			while ( typestring.length > 0 )
+			{
+				switch ( typestring[0].leaf_index )
+				{
+					case LF_MODIFIER_16t:
+						LeafModifer lm = cast(LeafModifer)typestring[0];
+						assert ( lm !is null );
+						return mangleCVtype(lm.index);
+					case LF_POINTER_16t:
+						LeafPointer lp = cast(LeafPointer)typestring[0];
+						assert ( lp !is null );
+						return "P"~mangleCVtype(lp.type);
+					// do not insert new cases here
+					case LF_CLASS_16t:
+						LeafClassStruc lcs = cast(LeafClassStruc)typestring[0];
+						assert ( lcs !is null );
+						return "C"~mangleName(lcs.name);
+					case LF_ARRAY_16t:
+						LeafArray la = cast(LeafArray)typestring[0];
+						assert ( la !is null );
+						debug(cvparser) DbgIO.println("Static array elemtype 0x%x idxtype 0x%x length %d", la.elemtype, la.idxtype, la.length.getUint);
+						uint    count = la.length.getUint,
+                                elmsize = sizeofCV(la.elemtype);
+						if ( elmsize > 0 ) {
+                            count /= elmsize;
+                            assert(la.length.getUint % sizeofCV(la.elemtype) == 0);
+						}
+						else
+                            debug DbgIO.println("WARNING: elm size == 0");
+						return "G"~.toString(count)~mangleCVtype(la.elemtype);
+                    case LF_OEM_16t:
+                        LeafDynArray lda = cast(LeafDynArray)typestring[0];
+						if ( lda !is null )
+                            return "A"~mangleCVtype(lda.elem_type);
+                        LeafAssocArray laa = cast(LeafAssocArray)typestring[0];
+						if ( laa !is null )
+                            return "H"~mangleCVtype(laa.key_type)~mangleCVtype(laa.elem_type);
+                        LeafDelegate ld = cast(LeafDelegate)typestring[0];
+                        if ( ld !is null )
+                            return "D"~mangleCVtype(ld.func_type);
+                        assert(0);
+
+					case LF_STRUCTURE_16t:
+						LeafClassStruc lcs = cast(LeafClassStruc)typestring[0];
+						assert ( lcs !is null );
+						return "S"~mangleName(lcs.name);
+					case LF_PROCEDURE_16t:
+					case LF_METHODLIST_16t:
+						debug(cvparser) DbgIO.println("unmangled procedure or methodlist in complex type");
+						return "";
+					case LF_UNION_16t:
+						LeafUnion lu = cast(LeafUnion)typestring[0];
+						return "S"~mangleName(lu.name);
+					default:
+						DbgIO.println("mangleCVtype: unsupported type leaf 0x%x", typestring[0].leaf_index);
+						typestring = typestring[1..$];
+				}
+			}
+			return null;
+		}
+
+		switch ( cvtype )
+		{
+			case T_NOTYPE:
+				return null;
+			case T_VOID:
+				return "v";
+			case T_PVOID: case T_PFVOID: case T_PHVOID: case T_32PVOID: case T_32PFVOID:
+				return "Pv";
+
+			case T_CHAR:
+				return "g";
+			case T_UCHAR:
+				return "h";
+			case T_RCHAR:
+				return "a";
+            case T_WCHAR:
+                return "u";
+            case T_DCHAR:
+                return "w";
+            case T_32PDCHAR: case T_32PFDCHAR:
+                return "Pw";
+			case T_PFRCHAR: case T_PHRCHAR: case T_32PRCHAR: case T_32PFRCHAR: case T_PRCHAR:
+                return "Pa";
+			case T_PFWCHAR: case T_PHWCHAR: case T_32PWCHAR: case T_32PFWCHAR: case T_PWCHAR:
+                return "Pu";
+			case T_PFCHAR: case T_PHCHAR: case T_32PCHAR: case T_32PFCHAR: case T_PCHAR:
+				return "Pg";
+			case T_PFUCHAR: case T_PHUCHAR: case T_32PUCHAR: case T_32PFUCHAR: case T_PUCHAR:
+				return "Ph";
+
+			case T_SHORT: case T_INT2:
+				return "s";
+			case T_USHORT: case T_UINT2:
+				return "t";
+			case T_PINT2: case T_PSHORT: case T_32PSHORT:
+				return "Ps";
+			case T_PUSHORT: case T_PUINT2: case T_32PUSHORT:
+				return "Pt";
+			case T_INT4:
+			case T_LONG:
+				return "i";
+			case T_UINT4:
+			case T_ULONG:
+				return "k";
+			case T_32PINT4: case T_PINT4:
+				return "Pi";
+			case T_32PUINT4: case T_PUINT4:
+				return "Pk";
+			case T_QUAD:
+				return "l";
+			case T_UQUAD:
+				return "m";
+			case T_32PQUAD: case T_PQUAD:
+				return "Pl";
+			case T_32PUQUAD: case T_PUQUAD:
+				return "Pm";
+			case T_REAL32:
+				return "f";
+			case T_32PREAL32: case T_PREAL32:
+				return "Pf";
+			case T_REAL64:
+				return "d";
+			case T_32PREAL64: case T_PREAL64:
+				return "Pd";
+			case T_REAL80:
+				return "e";
+			case T_PREAL80: case T_PFREAL80: case T_PHREAL80: case T_32PREAL80: case T_32PFREAL80:
+				return "Pe";
+			case T_BOOL08:
+				return "b";
+            case T_32PBOOL08: case T_32PFBOOL08:
+                return "Pb";
+            case T_CPLX80:
+                return "c";
+            case T_CPLX64:
+                return "r";
+            case T_CPLX32:
+                return "q";
+            case T_32PCPLX80: case T_32PFCPLX80:
+                return "Pc";
+            case T_32PCPLX64: case T_32PFCPLX64:
+                return "Pr";
+            case T_32PCPLX32: case T_32PFCPLX32:
+                return "Pq";
+			default:
+				debug DbgIO.println("mangleCVtype: unknown codeview type 0x%x", cvtype);
+		}
+		return null;
+	}
+
+
+    /**************************************************************************************************
+        Returns: size of demangled type
+    **************************************************************************************************/
+    uint sizeofMangled(string m)
+    {
+        assert(m.length > 0);
+        switch ( m[0] )
+        {
+            case 'A':	return ulong.sizeof;
+            case 'G':
+                string n = m[1..$];
+                size_t count = parseNumber(n);
+                return count*sizeofMangled(n);
+            case 'P':	return size_t.sizeof;
+            case 'H':	return size_t.sizeof;
+            case 'v':	return void.sizeof;
+            case 'b':	return bit.sizeof;
+            case 'x':	return bool.sizeof;
+            case 'g':	return byte.sizeof;
+            case 'h':	return ubyte.sizeof;
+            case 's':	return short.sizeof;
+            case 't':	return ushort.sizeof;
+            case 'i':	return int.sizeof;
+            case 'k':	return uint.sizeof;
+            case 'l':	return long.sizeof;
+            case 'm':	return ulong.sizeof;
+            case 'f':	return float.sizeof;
+            case 'd':	return double.sizeof;
+            case 'e':	return real.sizeof;
+            case 'o':	return ifloat.sizeof;
+            case 'p':	return idouble.sizeof;
+            case 'j':	return ireal.sizeof;
+            case 'q':	return cfloat.sizeof;
+            case 'r':	return cdouble.sizeof;
+            case 'c':	return creal.sizeof;
+            case 'a':	return char.sizeof;
+            case 'u':	return wchar.sizeof;
+            case 'w':	return dchar.sizeof;
+            case 'C':
+            case 'S':
+                string  mangled_name = m[1..$],
+                        name = demangleNameSkip(mangled_name);
+                if ( name in UDTsByName ) {
+                    LeafClassStruc lcs = cast(LeafClassStruc)UDTsByName[name];
+                    if ( lcs !is null )
+                        return lcs.length.getUint;
+                    LeafUnion lu = cast(LeafUnion)UDTsByName[name];
+                    if ( lu !is null )
+                        return lu.length.getUint;
+                }
+                assert(0, "unknown struct in sizeofMangled: "~name);
+            default:
+                assert(0, "unknown type in sizeofMangled: "~m);
+        }
+        return 0;
+    }
+
+
+	/**********************************************************************************************
+        Calculates the size of the type specified by a CodeView type index.
+    **********************************************************************************************/
+	uint sizeofCV(uint cvtype)
+	{
+		if ( cvtype >= 0x1000 )
+		{
+			uint typeindex = cvtype-0x1000;
+			if ( typeindex >= type_strings.length ) {
+				debug DbgIO.println("sizeofCV: undefined complex type 0x%x", cvtype);
+				return 0;
+			}
+			Leaf[] typestring = type_strings[typeindex];
+			while ( typestring.length > 0 )
+			{
+				switch ( typestring[0].leaf_index )
+				{
+					case LF_MODIFIER_16t:
+						LeafModifer lm = cast(LeafModifer)typestring[0];
+						assert ( lm !is null );
+						return sizeofCV(lm.index);
+					case LF_ARRAY_16t:
+						LeafArray la = cast(LeafArray)typestring[0];
+						assert ( la !is null );
+						return la.length.getUint;
+					case LF_POINTER_16t:
+					case LF_CLASS_16t:
+						return 4;
+					case LF_STRUCTURE_16t:
+						LeafClassStruc lcs = cast(LeafClassStruc)typestring[0];
+						assert ( lcs !is null );
+						return lcs.length.getUint;
+					case LF_PROCEDURE_16t:
+					case LF_METHODLIST_16t:
+						debug DbgIO.println("unmangled procedure or methodlist in complex type");
+						return 0;
+					case LF_UNION_16t:
+						LeafUnion lu = cast(LeafUnion)typestring[0];
+						return lu.length.getUint;
+                    case LF_OEM_16t:
+                        LeafDynArray lda = cast(LeafDynArray)typestring[0];
+						if ( lda !is null )
+                            return size_t.sizeof*2;
+                        LeafAssocArray laa = cast(LeafAssocArray)typestring[0];
+						if ( laa !is null )
+                            return size_t.sizeof;
+                        LeafDelegate ld = cast(LeafDelegate)typestring[0];
+                        if ( ld !is null )
+                            return size_t.sizeof*2;
+                        assert(0);
+
+					default:
+						DbgIO.println("sizeofCV: unsupported complex type leaf 0x%x", typestring[0].leaf_index);
+						typestring = typestring[1..$];
+				}
+			}
+			return 0;
+		}
+
+		switch ( cvtype )
+		{
+			case T_NOTYPE:
+				return 0;
+			case T_VOID:
+			case T_CHAR:
+			case T_UCHAR:
+			case T_RCHAR:
+			case T_BOOL08:
+				return 1;
+			case T_SHORT: case T_INT2:
+			case T_USHORT: case T_UINT2:
+            case T_WCHAR:
+				return 2;
+			case T_PVOID: case T_PFVOID: case T_PHVOID: case T_32PVOID: case T_32PFVOID:
+			case T_DCHAR: case T_32PDCHAR: case T_32PFDCHAR:
+			case T_PFCHAR: case T_PHCHAR: case T_32PCHAR: case T_32PFCHAR: case T_PCHAR:
+			case T_PFUCHAR: case T_PHUCHAR: case T_32PUCHAR: case T_32PFUCHAR: case T_PUCHAR:
+            case T_PRCHAR: case T_PFRCHAR: case T_PHRCHAR: case T_32PRCHAR: case T_32PFRCHAR:
+            case T_PWCHAR: case T_PFWCHAR: case T_PHWCHAR: case T_32PWCHAR: case T_32PFWCHAR:
+			case T_PINT2: case T_PSHORT: case T_32PSHORT:
+			case T_PUSHORT: case T_PUINT2: case T_32PUSHORT:
+            case T_32PBOOL08: case T_32PFBOOL08:
+			case T_INT4:
+			case T_UINT4:
+			case T_32PINT4: case T_PINT4:
+			case T_32PUINT4: case T_PUINT4:
+			case T_32PQUAD: case T_PQUAD:
+			case T_32PUQUAD: case T_PUQUAD:
+            case T_ULONG:
+			case T_REAL32:
+			case T_32PREAL32: case T_PREAL32:
+			case T_32PREAL64: case T_PREAL64:
+			case T_PREAL80: case T_PFREAL80: case T_PHREAL80: case T_32PREAL80: case T_32PFREAL80:
+            case T_CPLX32:
+            case T_32PCPLX32: case T_32PFCPLX32:
+            case T_32PCPLX64: case T_32PFCPLX64:
+            case T_32PCPLX80: case T_32PFCPLX80:
+				return 4;
+			case T_QUAD:
+			case T_UQUAD:
+			case T_REAL64:
+            case T_CPLX64:
+				return 8;
+            case T_CPLX80:
+			case T_REAL80:
+				return 10;
+			default:
+				debug DbgIO.println("sizeofCV: unknown codeview type 0x%x", cvtype);
+		}
+		return 0;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/codeview/coff.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,227 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+
+module codeview.coff;
+
+import std.file;
+import std.stdio;
+import std.c.string;
+
+import util;
+import codeview.parser;
+import codeview.codeview;
+
+import win32.winnt;
+
+/**************************************************************************************************
+    Type indeces for COFF debug sections.
+**************************************************************************************************/
+enum DebugType
+{
+	UNKNOWN = 0,
+	COFF,
+	CODEVIEW
+}
+
+/**************************************************************************************************
+    Represents a COFF section.
+**************************************************************************************************/
+class Section
+{
+	PIMAGE_SECTION_HEADER	header;
+	ubyte[]					data;
+
+	this(PIMAGE_SECTION_HEADER csh, DataReader dr)
+	{
+		uint old_cursor = dr.cursor;
+		header = csh;
+		assert(dr.data.length>=csh.PointerToRawData+csh.SizeOfRawData);
+		data = dr.data[csh.PointerToRawData .. csh.PointerToRawData+csh.SizeOfRawData];
+		dr.seek(old_cursor);
+	}
+}
+
+/**************************************************************************************************
+    Represents a COFF executable image file.
+**************************************************************************************************/
+class COFFImage
+{
+	private PIMAGE_FILE_HEADER		header;
+	private PIMAGE_OPTIONAL_HEADER	opt_header;
+	private IMAGE_DEBUG_DIRECTORY[]	debug_dirs;
+	Section[]		        sections;
+	CodeView[]				codeview_data;
+
+	size_t					codebase,
+							code_section_index;
+
+	string					name;
+
+    size_t imageSize()
+    {
+        assert(opt_header !is null);
+        return opt_header.SizeOfImage;
+    }
+
+    size_t imageBase()
+    {
+        assert(opt_header !is null);
+        return opt_header.ImageBase;
+    }
+
+	CodeView codeView()
+	{
+	    if ( codeview_data.length == 0 )
+            return null;
+		return codeview_data[0];
+	}
+
+	void load(string filename)
+	{
+		load(cast(ubyte[])read(filename), filename);
+	}
+
+    /**********************************************************************************************
+        Very dirty, preliminary COFF image reader to extract codeview data
+    **********************************************************************************************/
+	void load(ubyte[] data, string filename=null)
+	{
+		DataReader dr = new DataReader(data);
+
+		dr.seek(0x3c);
+		uint pe_offset;
+		dr.read(pe_offset);
+
+		uint pe_sig;
+		dr.seek(pe_offset);
+		dr.read(pe_sig);
+		if ( pe_sig != 0x4550 )
+            throw new Exception("File is not an COFF PE executable");
+
+		ubyte[] buf;
+		assert ( IMAGE_FILE_HEADER.sizeof == 5*4);
+		dr.readA(buf, IMAGE_FILE_HEADER.sizeof);
+		header = cast(PIMAGE_FILE_HEADER)buf.ptr;
+		if ( header.Machine != 0x14c )
+            throw new Exception("Unsupported machine Id in COFF file");
+		uint headersize = header.SizeOfOptionalHeader;
+
+		assert(headersize>=IMAGE_OPTIONAL_HEADER.sizeof);
+		headersize -= IMAGE_OPTIONAL_HEADER.sizeof;
+		dr.readA(buf, IMAGE_OPTIONAL_HEADER.sizeof);
+		opt_header = cast(PIMAGE_OPTIONAL_HEADER)buf.ptr;
+		if ( opt_header.Magic != IMAGE_NT_OPTIONAL_HDR_MAGIC )
+            throw new Exception("Unknown optional header magic");
+
+		assert ( IMAGE_SIZEOF_SHORT_NAME+8*4 == IMAGE_SECTION_HEADER.sizeof);
+		for ( int i = 0; i < header.NumberOfSections; ++i )
+		{
+			dr.readA(buf, IMAGE_SECTION_HEADER.sizeof);
+			sections ~= new Section(cast(PIMAGE_SECTION_HEADER)buf.ptr, dr);
+		}
+
+		dr.seek(fileOffsetFromRVA(opt_header.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress));
+		assert ( IMAGE_DEBUG_DIRECTORY.sizeof == 7*4);
+		dr.readA(debug_dirs, opt_header.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size/IMAGE_DEBUG_DIRECTORY.sizeof);
+
+		foreach ( IMAGE_DEBUG_DIRECTORY dd; debug_dirs )
+		{
+			if ( dd.Type == DebugType.CODEVIEW )
+            {
+				auto cv = CodeViewParser.parse(this, dr.data[dd.PointerToRawData..dd.PointerToRawData+dd.SizeOfData]);
+                if ( cv !is null )
+                    codeview_data ~= cv;
+            }
+			else {
+				debug DbgIO.println("Unsupported COFF Debug Information format 0x%x", dd.Type);
+			}
+		}
+
+        if ( opt_header.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size > 0 )
+        {
+            dr.seek(fileOffsetFromRVA(opt_header.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress));
+            assert ( IMAGE_EXPORT_DIRECTORY.sizeof == 10*4 );
+            dr.readA(buf, IMAGE_EXPORT_DIRECTORY.sizeof);
+            PIMAGE_EXPORT_DIRECTORY export_dir = cast(PIMAGE_EXPORT_DIRECTORY)buf.ptr;
+            dr.seek(fileOffsetFromRVA(export_dir.Name));
+
+            char c;
+            for ( dr.read(c); c != '\0'; dr.read(c) )
+                name ~= c;
+        }
+        if ( name is null && filename !is null )
+            name = filename;
+        if ( codeview_data.length > 0 )
+        {
+            if ( name !is null )
+                DbgIO.println("Loading symbols from %s", name is null?filename:name);
+            else
+                DbgIO.println("Loading symbols");
+        }
+        else
+        {
+            if ( name !is null )
+                DbgIO.println("No symbols available from %s", name is null?filename:name);
+            else
+                DbgIO.println("No symbols available");
+        }
+    }
+
+    /**********************************************************************************************
+        Calculates the file offset from a given virtual address.
+    **********************************************************************************************/
+	private uint fileOffsetFromRVA(uint rva)
+	{
+		foreach ( Section s; sections )
+		{
+			with ( *s.header )
+			{
+				if( rva >= VirtualAddress && rva <= VirtualAddress+Misc.VirtualSize )
+					return rva-VirtualAddress+PointerToRawData;
+			}
+		}
+		return 0;
+	}
+
+    /**********************************************************************************************
+        Calculates the virtual base address where code from this image is loaded to.
+    **********************************************************************************************/
+	size_t getCodeBase()
+	{
+		if ( codebase == 0 )
+		{
+			assert ( opt_header !is null );
+			Section s = findSection(0x20000000, code_section_index);
+			assert ( s !is null );
+			codebase = opt_header.ImageBase + s.header.VirtualAddress;
+		}
+		return codebase;
+	}
+
+    /**********************************************************************************************
+        Calculates the base address for the given section.
+    **********************************************************************************************/
+	uint getSectionBase(uint section)
+	{
+		if ( section > sections.length )
+			return opt_header.ImageBase;
+		return opt_header.ImageBase + sections[section-1].header.VirtualAddress;
+	}
+
+    /**********************************************************************************************
+        Finds a section with the given characteristics.
+    **********************************************************************************************/
+	private Section findSection(uint characteristics, out uint index)
+	{
+		foreach( int i, s; sections )
+		{
+			if( (s.header.Characteristics & characteristics) == characteristics ) {
+				index = i;
+				return s;
+			}
+		}
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/codeview/debuginfo.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,354 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+
+module codeview.debuginfo;
+
+import container;
+import util;
+import codeview.coff;
+import codeview.codeview;
+
+import std.string;
+
+class SourceModule
+{
+    SourceFile[]        files;
+}
+
+class SourceFile
+{
+    SourceModule        source_module;
+    string              name;
+    SourceSegment[]     segments;
+    CodeBlock[][uint]   blocks_by_line;
+    uint[]              lines;
+}
+
+class SourceSegment
+{
+    SourceFile  file;
+    size_t      start,
+                end;
+}
+
+class CodeBlock
+{
+    size_t          start,
+                    end;
+    uint            line;
+    SourceSegment   segment;
+
+    this(size_t s, uint l, SourceSegment seg)
+    {
+        start = s;
+        line = l;
+        segment = seg;
+    }
+
+    /**********************************************************************************************
+        Check if block contains offset
+    **********************************************************************************************/
+    int opCmp(size_t offset)
+    {
+        if ( start > offset )
+            return 1;
+        if ( end <= offset )
+            return -1;
+        return 0;
+    }
+
+    /**********************************************************************************************
+        Compare by start address.
+    **********************************************************************************************/
+    int opCmp(ref CodeBlock cb)
+    {
+        if ( start > cb.start )
+            return 1;
+        if ( start < cb.start )
+            return -1;
+        return 0;
+    }
+
+    string toString()
+    {
+        return format("%s:%d 0x%x-0x%x in 0x%x-0x%x", segment.file.name, line, start, end, segment.start, segment.end);
+    }
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+abstract class DebugInfo
+{
+    SourceModule[]      source_modules;
+    AVLTree!(CodeBlock) codeblocks; /// contains all blocks from all modules
+
+    this()
+    {
+        codeblocks = new AVLTree!(CodeBlock);
+    }
+
+    size_t getCodeBase();
+    
+    void updateCodeblocks()
+    {
+        bool findEnd(AVLNode!(CodeBlock) n)
+        {
+            AVLNode!(CodeBlock) n2;
+            if ( n.findNext(n2) && (n2.value.segment is n.value.segment || n.value.segment.end == n.value.start) )
+                n.value.end = n2.value.start;
+            else
+                n.value.end = n.value.segment.end;
+            return true;
+        }
+        codeblocks.traverseDepthLeft(&findEnd);
+    }
+
+	/**********************************************************************************************
+
+    **********************************************************************************************/
+    CodeBlock findCodeBlockRel(uint address)
+    {
+        CodeBlock cb;
+        if ( !codeblocks.find(address, cb) )
+            return null;
+        return cb;
+    }
+
+    CodeBlock findCodeBlockAbs(uint address)
+    {
+        CodeBlock cb;
+        if ( !codeblocks.find(address-getCodeBase, cb) )
+            return null;
+        return cb;
+    }
+
+	/**********************************************************************************************
+        Find the source files that correspond to the given filepath.
+        That path can be relative to one of the search_paths.
+    **********************************************************************************************/
+	SourceFile[] findSrcFiles(string filepath, string[] search_paths)
+	{
+		string fullpath = getFullPath(filepath);
+		if ( fullpath is null )
+			return null;
+
+        SourceFile[] sfs;
+        foreach ( sm; source_modules )
+        {
+            foreach ( sf; sm.files )
+            {
+                foreach ( sp; search_paths )
+                {
+                    string path = getFullPath(sp~sf.name);
+                    if ( path !is null && icmp(path, fullpath) == 0 )
+                        sfs ~= sf;
+                }
+            }
+        }
+
+		return sfs;
+	}
+
+	/**********************************************************************************************
+        Find source files that contain the given substring in it's path.
+    **********************************************************************************************/
+	SourceFile[] findSrcFiles(string filename_substring)
+	{
+        SourceFile[] sfs;
+        foreach ( sm; source_modules )
+        {
+            foreach ( sf; sm.files )
+            {
+                if ( find(sf.name, filename_substring) >= 0 )
+                    sfs ~= sf;
+            }
+        }
+		return sfs;
+	}
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class ImageSet
+{
+	COFFImage[] images;
+    
+    void opCatAssign(COFFImage image)
+    {
+        images ~= image;
+    }
+
+    void remove(COFFImage image)
+    {
+        foreach ( i, img; images )
+        {
+            if ( img is image )
+            {
+                images = images[0..i]~images[i+1..$];
+                break;
+            }
+        }
+    }
+    
+	Location findLocation(uint vaddress)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto loc = img.codeView.findLocation(vaddress);
+                if ( loc !is null )
+                    return loc;
+            }
+        }
+        return null;
+    }
+
+    CodeBlock findCodeBlockAbs(uint address, out CodeView cv)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto cb = img.codeView.findCodeBlockAbs(address);
+                if ( cb !is null ) {
+                    cv = img.codeView;
+                    return cb;
+                }
+            }
+        }
+        return null;
+    }
+
+    CodeBlock findCodeBlockRel(uint address, out CodeView cv)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto cb = img.codeView.findCodeBlockRel(address);
+                if ( cb !is null ) {
+                    cv = img.codeView;
+                    return cb;
+                }
+            }
+        }
+        return null;
+    }
+
+	Module findModule(uint vaddress, out uint segment)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto mod = img.codeView.findModule(vaddress, segment);
+                if ( mod !is null )
+                    return mod;
+            }
+        }
+        return null;
+    }
+
+	string mangleCVtype(ushort cvtype)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto t = img.codeView.mangleCVtype(cvtype);
+                if ( t !is null )
+                    return t;
+            }
+        }
+        return null;
+    }
+
+	SourceFile[] findSrcFiles(string filename_substring)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto t = img.codeView.findSrcFiles(filename_substring);
+                if ( t !is null )
+                    return t;
+            }
+        }
+        return null;
+    }
+
+  	SourceFile[] findSrcFiles(string filepath, string[] search_paths)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto t = img.codeView.findSrcFiles(filepath, search_paths);
+                if ( t !is null )
+                    return t;
+            }
+        }
+        return null;
+    }
+
+	Location findSrcLine(SourceFile sf, uint min_line, size_t min_start=0)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto t = img.codeView.findSrcLine(sf, min_line, min_start);
+                if ( t !is null )
+                    return t;
+            }
+        }
+        return null;
+    }
+
+	Location findNextSrcLine(Location loc)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto t = img.codeView.findNextSrcLine(loc);
+                if ( t !is null )
+                    return t;
+            }
+        }
+        return null;
+    }
+
+	Location findPrevSrcLine(Location loc)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto t = img.codeView.findPrevSrcLine(loc);
+                if ( t !is null )
+                    return t;
+            }
+        }
+        return null;
+    }
+
+	ProcedureSymbol findProcedureSymbol(uint vaddress)
+    {
+        foreach ( img; images )
+        {
+            if ( img.codeView !is null )
+            {
+                auto t = img.codeView.findProcedureSymbol(vaddress);
+                if ( t !is null )
+                    return t;
+            }
+        }
+        return null;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/codeview/decl.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,723 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+module codeview.decl;
+
+//=================================================================================================
+// structs corresponding to the CodeView 4 file format specification NB09
+
+align(1) struct DirHeader
+{
+	ushort	cbDirHeader,
+			cbDirEntry;
+	uint	cDir,
+			lfoNextDir,
+			flags;
+}
+
+align(1) struct DirEntry
+{
+	ushort	subsection,
+			iMod;
+	uint	lfo,
+			cb;
+}
+
+enum
+{
+    sstModule = 0x120,
+    sstTypes,
+    sstPublic,
+    sstPublicSym,
+    sstSymbols,
+    sstAlignSym,
+    sstSrcLnSeg,
+    sstSrcModule,
+    sstLibraries,
+    sstGlobalSym,
+    sstGlobalPub,
+    sstGlobalTypes,
+    sstMPC,
+    sstSegMap,
+    sstSegName,
+    sstPreComp,
+    sstPreCompMap,
+    sstOffsetMap16,
+    sstOffsetMap32,
+    sstFileIndex,
+    sstStaticSym
+}
+
+align(1) struct ModuleHeader
+{
+	ushort	ovlNumber,
+			iLib,
+			cSeg,
+			Style;
+}
+
+align(1) struct SegInfo
+{
+	ushort	Seg,
+			pad;
+	uint	offset,
+			cbSeg;
+}
+
+enum SymbolIndex
+{
+	S_COMPILE		= 1,
+	S_REGISTER,
+	S_CONSTANT,
+	S_UDT,
+	S_SSEARCH,
+	S_END,
+	S_SKIP,
+	S_CVRESERVE,
+	S_OBJNAME,
+	S_ENDARG,
+	S_COBOLUDT,
+	S_MANYREG,
+	S_RETURN,
+	S_ENTRYTHIS,
+
+	S_BPREL16		= 0x100,
+	S_LDATA16,
+	S_GDATA16,
+	S_PUB16,
+	S_LPROC16,
+	S_GPROC16,
+	S_THUNK16,
+	S_BLOCK16,
+	S_WITH16,
+	S_LABEL16,
+	S_CEXMODEL16,
+	S_VFTPATH16,
+	S_REGREL16,
+
+	S_BPREL32		= 0x200,
+	S_LDATA32,
+	S_GDATA32,
+	S_PUB32,
+	S_LPROC32,
+	S_GPROC32,
+	S_THUNK32,
+	S_BLOCK32,
+	S_WITH32,
+	S_LABEL32,
+	S_CEXMODEL32,
+	S_VFTPATH32,
+	S_REGREL32,
+	S_LTHREAD32,
+	S_GTHREAD32,
+
+	S_PROCREF		= 0x400,
+	S_DATAREF,
+	S_ALIGN,
+}
+
+align(1) struct CVProcedureSymbol
+{
+	uint		pParent,
+				pEnd,
+				pNext,
+				proc_length,
+				debug_start,
+				debug_end,
+				offset;
+	ushort		segment,
+				proctype;
+	ubyte		flags;
+}
+
+align(1) struct CVReturnSymbol
+{
+	ushort	flags;
+	ubyte	style;
+}
+
+align(1) struct CVStackSymbol
+{
+	int		offset;
+	ushort	type;
+}
+
+align(1) struct CVDataSymbol
+{
+	uint	offset;
+	ushort	segment,
+			type;
+}
+
+align(1) struct PackedSymbolsHeader
+{
+	ushort	symhash,
+			addrhash;
+	uint	cbSymbol,
+			cbSymHash,
+			cbAddrHash;
+}
+
+//=================================================================================================
+// D recOEM's
+
+const uint OEM_DIGITALMARS  = 0x0042;
+const uint D_DYN_ARRAY 	    = 0x0001;
+const uint D_ASSOC_ARRAY    = 0x0002;
+const uint D_DELEGATE   	= 0x0003;
+
+//=================================================================================================
+// leaf indeces
+
+const uint LF_MODIFIER_16t	= 0x0001;
+const uint LF_POINTER_16t	= 0x0002;
+const uint LF_ARRAY_16t		= 0x0003;
+const uint LF_CLASS_16t		= 0x0004;
+const uint LF_STRUCTURE_16t	= 0x0005;
+const uint LF_UNION_16t		= 0x0006;
+const uint LF_ENUM_16t		= 0x0007;
+const uint LF_PROCEDURE_16t	= 0x0008;
+const uint LF_MFUNCTION_16t	= 0x0009;
+const uint LF_VTSHAPE		= 0x000a;
+const uint LF_COBOL0_16t	= 0x000b;
+const uint LF_COBOL1		= 0x000c;
+const uint LF_BARRAY_16t	= 0x000d;
+const uint LF_LABEL			= 0x000e;
+const uint LF_NULL			= 0x000f;
+const uint LF_NOTTRAN		= 0x0010;
+const uint LF_DIMARRAY_16t	= 0x0011;
+const uint LF_VFTPATH_16t	= 0x0012;
+const uint LF_PRECOMP_16t	= 0x0013;
+const uint LF_ENDPRECOMP	= 0x0014;
+const uint LF_OEM_16t		= 0x0015;
+const uint LF_TYPESERVER	= 0x0016;
+
+const uint LF_MODIFIER		= 0x1001;
+const uint LF_POINTER		= 0x1002;
+const uint LF_ARRAY			= 0x1003;
+const uint LF_CLASS			= 0x1004;
+const uint LF_STRUCTURE		= 0x1005;
+const uint LF_UNION			= 0x1006;
+const uint LF_ENUM			= 0x1007;
+const uint LF_PROCEDURE		= 0x1008;
+const uint LF_MFUNCTION		= 0x1009;
+const uint LF_COBOL0		= 0x100a;
+const uint LF_BARRAY		= 0x100b;
+const uint LF_DIMARRAY		= 0x100c;
+const uint LF_VFTPATH		= 0x100d;
+const uint LF_PRECOMP		= 0x100e;
+const uint LF_OEM			= 0x100f;
+
+const uint LF_SKIP_16t		= 0x0200;
+const uint LF_ARGLIST_16t	= 0x0201;
+const uint LF_DEFARG_16t	= 0x0202;
+const uint LF_LIST			= 0x0203;
+const uint LF_FIELDLIST_16t	= 0x0204;
+const uint LF_DERIVED_16t	= 0x0205;
+const uint LF_BITFIELD_16t	= 0x0206;
+const uint LF_METHODLIST_16t= 0x0207;
+const uint LF_DIMCONU_16t	= 0x0208;
+const uint LF_DIMCONLU_16t	= 0x0209;
+const uint LF_DIMVARU_16t	= 0x020a;
+const uint LF_DIMVARLU_16t	= 0x020b;
+const uint LF_REFSYM		= 0x020c;
+
+const uint LF_SKIP			= 0x1200;
+const uint LF_ARGLIST		= 0x1201;
+const uint LF_DEFARG		= 0x1202;
+const uint LF_FIELDLIST		= 0x1203;
+const uint LF_DERIVED		= 0x1204;
+const uint LF_BITFIELD		= 0x1205;
+const uint LF_METHODLIST	= 0x1206;
+const uint LF_DIMCONU		= 0x1207;
+const uint LF_DIMCONLU		= 0x1208;
+const uint LF_DIMVARU		= 0x1209;
+const uint LF_DIMVARLU		= 0x120a;
+
+const uint LF_BCLASS_16t	= 0x0400;
+const uint LF_VBCLASS_16t	= 0x0401;
+const uint LF_IVBCLASS_16t	= 0x0402;
+const uint LF_ENUMERATE		= 0x0403;
+const uint LF_FRIENDFCN_16t	= 0x0404;
+const uint LF_INDEX_16t		= 0x0405;
+const uint LF_MEMBER_16t	= 0x0406;
+const uint LF_STMEMBER_16t	= 0x0407;
+const uint LF_METHOD_16t	= 0x0408;
+const uint LF_NESTTYPE_16t	= 0x0409;
+const uint LF_VFUNCTAB_16t	= 0x040a;
+const uint LF_FRIENDCLS_16t	= 0x040b;
+const uint LF_ONEMETHOD_16t	= 0x040c;
+const uint LF_VFUNCOFF_16t	= 0x040d;
+const uint LF_NESTTYPEEX_16t= 0x040e;
+const uint LF_MEMBERMODIFY_16t	= 0x040f;
+
+const uint LF_BCLASS		= 0x1400;
+const uint LF_VBCLASS		= 0x1401;
+const uint LF_IVBCLASS		= 0x1402;
+const uint LF_FRIENDFCN		= 0x1403;
+const uint LF_INDEX			= 0x1404;
+const uint LF_MEMBER		= 0x1405;
+const uint LF_STMEMBER		= 0x1406;
+const uint LF_METHOD		= 0x1407;
+const uint LF_NESTTYPE		= 0x1408;
+const uint LF_VFUNCTAB		= 0x1409;
+const uint LF_FRIENDCLS		= 0x140a;
+const uint LF_ONEMETHOD		= 0x140b;
+const uint LF_VFUNCOFF		= 0x140c;
+const uint LF_NESTTYPEEX	= 0x140d;
+const uint LF_MEMBERMODIFY	= 0x140e;
+
+const uint LF_NUMERIC		= 0x8000;
+const uint LF_CHAR			= 0x8000;
+const uint LF_SHORT			= 0x8001;
+const uint LF_USHORT		= 0x8002;
+const uint LF_LONG			= 0x8003;
+const uint LF_ULONG			= 0x8004;
+const uint LF_REAL32		= 0x8005;
+const uint LF_REAL64		= 0x8006;
+const uint LF_REAL80		= 0x8007;
+const uint LF_REAL128		= 0x8008;
+const uint LF_QUADWORD		= 0x8009;
+const uint LF_UQUADWORD		= 0x800a;
+const uint LF_REAL48		= 0x800b;
+const uint LF_COMPLEX32		= 0x800c;
+const uint LF_COMPLEX64		= 0x800d;
+const uint LF_COMPLEX80		= 0x800e;
+const uint LF_COMPLEX128	= 0x800f;
+const uint LF_VARSTRING		= 0x8010;
+const uint LF_UCHAR			= 0x8011;
+
+//=================================================================================================
+// Primitive Types
+
+// Special Types
+const uint T_NOTYPE 	= 0x0000;
+const uint T_ABS 		= 0x0001;
+const uint T_SEGMENT 	= 0x0002;
+const uint T_VOID 		= 0x0003;
+const uint T_PVOID 		= 0x0103;
+const uint T_PFVOID 	= 0x0203;
+const uint T_PHVOID 	= 0x0303;
+const uint T_32PVOID 	= 0x0403;
+const uint T_32PFVOID 	= 0x0503;
+const uint T_CURRENCY 	= 0x0004;
+const uint T_NBASICSTR 	= 0x0005;
+const uint T_FBASICSTR 	= 0x0006;
+const uint T_NOTTRANS 	= 0x0007;
+const uint T_BIT 		= 0x0060;
+const uint T_PASCHAR 	= 0x0061;
+
+// Character Types
+const uint T_CHAR 		= 0x0010;
+const uint T_UCHAR 		= 0x0020;
+const uint T_PCHAR 		= 0x0110;
+const uint T_PUCHAR 	= 0x0120;
+const uint T_PFCHAR 	= 0x0210;
+const uint T_PFUCHAR 	= 0x0220;
+const uint T_PHCHAR 	= 0x0310;
+const uint T_PHUCHAR 	= 0x0320;
+const uint T_32PCHAR 	= 0x0410;
+const uint T_32PUCHAR 	= 0x0420;
+const uint T_32PFCHAR 	= 0x0510;
+const uint T_32PFUCHAR 	= 0x0520;
+
+// Real Character Types
+const uint T_RCHAR 		= 0x0070;
+const uint T_PRCHAR 	= 0x0170;
+const uint T_PFRCHAR 	= 0x0270;
+const uint T_PHRCHAR 	= 0x0370;
+const uint T_32PRCHAR 	= 0x0470;
+const uint T_32PFRCHAR 	= 0x0570;
+
+// Wide Character Types
+const uint T_WCHAR 		= 0x0071;
+const uint T_PWCHAR 	= 0x0171;
+const uint T_PFWCHAR 	= 0x0271;
+const uint T_PHWCHAR 	= 0x0371;
+const uint T_32PWCHAR 	= 0x0471;
+const uint T_32PFWCHAR 	= 0x0571;
+
+// Double Wide Character Types - D enhancement
+const uint T_DCHAR 		= 0x0078;
+const uint T_32PDCHAR   = 0x0478;
+const uint T_32PFDCHAR  = 0x0578;
+
+// Real 16-bit Integer Types
+const uint T_INT2 		= 0x0072;
+const uint T_UINT2 		= 0x0073;
+const uint T_PINT2 		= 0x0172;
+const uint T_PUINT2 	= 0x0173;
+const uint T_PFINT2 	= 0x0272;
+const uint T_PFUINT2 	= 0x0273;
+const uint T_PHINT2 	= 0x0372;
+const uint T_PHUINT2 	= 0x0373;
+const uint T_32PINT2 	= 0x0472;
+const uint T_32PUINT2 	= 0x0473;
+const uint T_32PFINT2 	= 0x0572;
+const uint T_32PFUINT2 	= 0x0573;
+
+// 16-bit Short Types
+const uint T_SHORT 		= 0x0011;
+const uint T_USHORT 	= 0x0021;
+const uint T_PSHORT 	= 0x0111;
+const uint T_PUSHORT 	= 0x0121;
+const uint T_PFSHORT 	= 0x0211;
+const uint T_PFUSHORT 	= 0x0221;
+const uint T_PHSHORT 	= 0x0311;
+const uint T_PHUSHORT 	= 0x0321;
+const uint T_32PSHORT 	= 0x0411;
+const uint T_32PUSHORT 	= 0x0421;
+const uint T_32PFSHORT 	= 0x0511;
+const uint T_32PFUSHORT = 0x0521;
+
+// Real 32-bit Integer Types
+const uint T_INT4 		= 0x0074;
+const uint T_UINT4 		= 0x0075;
+const uint T_PINT4 		= 0x0174;
+const uint T_PUINT4 	= 0x0175;
+const uint T_PFINT4 	= 0x0274;
+const uint T_PFUINT4 	= 0x0275;
+const uint T_PHINT4 	= 0x0374;
+const uint T_PHUINT4 	= 0x0375;
+const uint T_32PINT4 	= 0x0474;
+const uint T_32PUINT4 	= 0x0475;
+const uint T_32PFINT4 	= 0x0574;
+const uint T_32PFUINT4 	= 0x0575;
+
+// 32-bit Long Types
+const uint T_LONG 		= 0x0012;
+const uint T_ULONG 		= 0x0022;
+const uint T_PLONG 		= 0x0112;
+const uint T_PULONG 	= 0x0122;
+const uint T_PFLONG 	= 0x0212;
+const uint T_PFULONG 	= 0x0222;
+const uint T_PHLONG 	= 0x0312;
+const uint T_PHULONG 	= 0x0322;
+const uint T_32PLONG 	= 0x0412;
+const uint T_32PULONG 	= 0x0422;
+const uint T_32PFLONG 	= 0x0512;
+const uint T_32PFULONG 	= 0x0522;
+
+// Real 64-bit int Types
+const uint T_INT8 		= 0x0076;
+const uint T_UINT8 		= 0x0077;
+const uint T_PINT8 		= 0x0176;
+const uint T_PUINT8 	= 0x0177;
+const uint T_PFINT8 	= 0x0276;
+const uint T_PFUINT8 	= 0x0277;
+const uint T_PHINT8 	= 0x0376;
+const uint T_PHUINT8 	= 0x0377;
+const uint T_32PINT8 	= 0x0476;
+const uint T_32PUINT8 	= 0x0477;
+const uint T_32PFINT8 	= 0x0576;
+const uint T_32PFUINT8 	= 0x0577;
+
+// 64-bit Integral Types
+const uint T_QUAD 		= 0x0013;
+const uint T_UQUAD 		= 0x0023;
+const uint T_PQUAD 		= 0x0113;
+const uint T_PUQUAD 	= 0x0123;
+const uint T_PFQUAD 	= 0x0213;
+const uint T_PFUQUAD 	= 0x0223;
+const uint T_PHQUAD 	= 0x0313;
+const uint T_PHUQUAD 	= 0x0323;
+const uint T_32PQUAD 	= 0x0413;
+const uint T_32PUQUAD 	= 0x0423;
+const uint T_32PFQUAD 	= 0x0513;
+const uint T_32PFUQUAD 	= 0x0523;
+
+// 32-bit Real Types
+const uint T_REAL32 	= 0x0040;
+const uint T_PREAL32 	= 0x0140;
+const uint T_PFREAL32 	= 0x0240;
+const uint T_PHREAL32 	= 0x0340;
+const uint T_32PREAL32 	= 0x0440;
+const uint T_32PFREAL32 = 0x0540;
+
+// 48-bit Real Types
+const uint T_REAL48 	= 0x0044;
+const uint T_PREAL48 	= 0x0144;
+const uint T_PFREAL48 	= 0x0244;
+const uint T_PHREAL48 	= 0x0344;
+const uint T_32PREAL48 	= 0x0444;
+const uint T_32PFREAL48 = 0x0544;
+
+// 64-bit Real Types
+const uint T_REAL64 	= 0x0041;
+const uint T_PREAL64 	= 0x0141;
+const uint T_PFREAL64 	= 0x0241;
+const uint T_PHREAL64 	= 0x0341;
+const uint T_32PREAL64 	= 0x0441;
+const uint T_32PFREAL64 = 0x0541;
+
+// 80-bit Real Types
+const uint T_REAL80 	= 0x0042;
+const uint T_PREAL80 	= 0x0142;
+const uint T_PFREAL80 	= 0x0242;
+const uint T_PHREAL80 	= 0x0342;
+const uint T_32PREAL80 	= 0x0442;
+const uint T_32PFREAL80 = 0x0542;
+
+// 128-bit Real Types
+const uint T_REAL128 	= 0x0043;
+const uint T_PREAL128 	= 0x0143;
+const uint T_PFREAL128 	= 0x0243;
+const uint T_PHREAL128 	= 0x0343;
+const uint T_32PREAL128 = 0x0443;
+const uint T_32PFREAL128 = 0x0543;
+
+// 32-bit Complex Types
+const uint T_CPLX32 	= 0x0050;
+const uint T_PCPLX32 	= 0x0150;
+const uint T_PFCPLX32 	= 0x0250;
+const uint T_PHCPLX32 	= 0x0350;
+const uint T_32PCPLX32 	= 0x0450;
+const uint T_32PFCPLX32 = 0x0550;
+
+// 64-bit Complex Types
+const uint T_CPLX64 	= 0x0051;
+const uint T_PCPLX64 	= 0x0151;
+const uint T_PFCPLX64	= 0x0251;
+const uint T_PHCPLX64 	= 0x0351;
+const uint T_32PCPLX64 	= 0x0451;
+const uint T_32PFCPLX64 = 0x0551;
+
+// 80-bit Complex Types
+const uint T_CPLX80 	= 0x0052;
+const uint T_PCPLX80 	= 0x0152;
+const uint T_PFCPLX80 	= 0x0252;
+const uint T_PHCPLX80 	= 0x0352;
+const uint T_32PCPLX80 	= 0x0452;
+const uint T_32PFCPLX80 = 0x0552;
+
+// 128-bit Complex Types
+const uint T_CPLX128 	= 0x0053;
+const uint T_PCPLX128 	= 0x0153;
+const uint T_PFCPLX128 	= 0x0253;
+const uint T_PHCPLX128 	= 0x0353;
+const uint T_32PCPLX128 = 0x0453;
+const uint T_32PFCPLX128 = 0x0553;
+
+// Boolean Types
+const uint T_BOOL08 	= 0x0030;
+const uint T_BOOL16 	= 0x0031;
+const uint T_BOOL32 	= 0x0032;
+const uint T_BOOL64 	= 0x0033;
+const uint T_PBOOL08 	= 0x0130;
+const uint T_PBOOL16 	= 0x0131;
+const uint T_PBOOL32 	= 0x0132;
+const uint T_PBOOL64 	= 0x0133;
+const uint T_PFBOOL08 	= 0x0230;
+const uint T_PFBOOL16 	= 0x0231;
+const uint T_PFBOOL32 	= 0x0232;
+const uint T_PFBOOL64 	= 0x0233;
+const uint T_PHBOOL08 	= 0x0330;
+const uint T_PHBOOL16 	= 0x0331;
+const uint T_PHBOOL32 	= 0x0332;
+const uint T_PHBOOL64 	= 0x0333;
+const uint T_32PBOOL08 	= 0x0430;
+const uint T_32PBOOL16 	= 0x0431;
+const uint T_32PBOOL32 	= 0x0432;
+const uint T_32PBOOL64 	= 0x0433;
+const uint T_32PFBOOL08 = 0x0530;
+const uint T_32PFBOOL16 = 0x0531;
+const uint T_32PFBOOL32 = 0x0532;
+const uint T_32PFBOOL64 = 0x0533;
+
+//=================================================================================================
+// classes for representing types
+
+class Leaf
+{
+	ushort	leaf_index;
+}
+
+class LeafModifer : Leaf
+{
+	ushort	attribute, index;
+}
+
+class LeafPointer : Leaf
+{
+	ushort	attribute,
+			type;
+}
+
+class LeafArgList : Leaf
+{
+	ushort		argcount;
+	ushort[]	indeces;
+}
+
+class LeafProcedure : Leaf
+{
+	ushort	rvtype;
+	ubyte	call,
+			reserved;
+	ushort	cParms,
+			arglist;
+}
+
+class LeafMFunction : Leaf
+{
+	ushort	rvtype,
+			_class,
+			_this;
+	ubyte	call,
+			reserved;
+	ushort	cParms,
+			arglist;
+	uint	thisadjust;
+}
+
+class LeafNumeric : Leaf
+{
+	union {
+		char	c;
+		ubyte	uc;
+		short	s;
+		ushort	us;
+		int		i;
+		uint	ui;
+		long	l;
+		ulong	ul;
+		float	f;
+		double	d;
+		real	r;
+		cfloat	cf;
+		cdouble	cd;
+		creal	cr;
+		string	str;
+	}
+
+	uint getUint()
+	{
+		switch ( leaf_index )
+		{
+			case LF_USHORT:	return us;
+			case LF_ULONG:	return cast(uint)ul;
+			case LF_UCHAR:	return uc;
+			default:
+				assert ( 0, "unsupported numeric leaf" );
+		}
+		return 0;
+	}
+}
+
+class LeafClassStruc : Leaf
+{
+	ushort	count,
+			field,
+			property,
+			dList,
+			vshape,
+			type;
+	LeafNumeric	length;
+	string	name;
+}
+
+class LeafVTShape : Leaf
+{
+	ubyte[]	descriptor;
+}
+
+class LeafFieldList : Leaf
+{
+	Leaf[]	fields;
+}
+
+class LeafMethodList : Leaf
+{
+}
+
+class LeafDerived : Leaf
+{
+	ushort[]	types;
+}
+
+class LeafBaseClass : Leaf
+{
+	ushort	type,
+			attribute;
+	LeafNumeric	offset;
+}
+
+class LeafMember : Leaf
+{
+	ushort	type,
+			attribute;
+	LeafNumeric	offset;
+	string	name;
+}
+
+class LeafMethod : Leaf
+{
+	ushort	count,
+			mList;
+	string	name;
+}
+
+class LeafArray : Leaf
+{
+	ushort	elemtype,
+			idxtype;
+	LeafNumeric	length;
+	string	name;
+}
+
+class LeafEnum : Leaf
+{
+	ushort	count,
+			type,
+			field,
+			property;
+	string	name;
+}
+
+class LeafEnumNameValue : Leaf
+{
+	ushort	attribute;
+	LeafNumeric	value;
+	string	name;
+}
+
+class LeafNestedType : Leaf
+{
+	ushort	index;
+	string	name;
+}
+
+class LeafStaticDataMember : Leaf
+{
+	ushort	type,
+			attribute;
+	string	name;
+}
+
+class LeafUnion : Leaf
+{
+	ushort	count,
+			field,
+			property;
+	LeafNumeric	length;
+	string	name;
+}
+
+class LeafDynArray : Leaf
+{
+	ushort	index_type,
+			elem_type;
+}
+
+class LeafAssocArray : Leaf
+{
+	ushort	key_type,
+			elem_type;
+}
+
+class LeafDelegate : Leaf
+{
+	ushort	this_type,
+			func_type;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/codeview/parser.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,862 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+
+module codeview.parser;
+
+import codeview.codeview;
+import codeview.decl;
+import codeview.coff;
+
+import util;
+import container;
+
+import std.demangle;
+import std.string;
+
+class CodeViewException : Exception
+{
+	this(string msg) { super(msg); }
+}
+
+class CodeViewParser
+{
+	const uint cv_nb09_sig = intFromStr("NB09");
+
+static:
+    /**********************************************************************************************
+        Parses the given CodeView section data from the given COFF image.
+    **********************************************************************************************/
+	CodeView parse(COFFImage img, ubyte[] data)
+	{
+		if ( data.length <= 0 )
+			return null;
+		CodeView cv = new CodeView;
+
+		cv.image = img;
+		cv.global_pub = new SymbolSet;
+		cv.global_sym = new SymbolSet;
+		cv.static_sym = new SymbolSet;
+
+		DataReader dr = new DataReader(data);
+		uint sig;
+		dr.read(sig);
+		if ( sig != cv_nb09_sig ) {
+			char[4] sigstr;
+			sigstr[] = (cast(char*)&sig)[0..4];
+			debug DbgIO.println("Unsupported CodeView version %s", sigstr);
+			return null;
+		}
+
+		uint lfoDir;
+		dr.read(lfoDir);
+		dr.seek(lfoDir);
+
+		ubyte[] buf;
+		dr.readA(buf, DirHeader.sizeof);
+		DirHeader* head = cast(DirHeader*)buf.ptr;
+		assert(head.cbDirHeader==DirHeader.sizeof);
+		assert(head.cbDirEntry==DirEntry.sizeof);
+
+		DirEntry[] entries;
+		dr.readA(entries, head.cDir);
+
+		foreach ( DirEntry entry; entries )
+		{
+			ubyte[] section_data;
+			dr.seek(entry.lfo);
+			dr.readA(section_data, entry.cb);
+
+			switch ( entry.subsection )
+			{
+				case sstModule:
+					Module mod = parseModule(cv, section_data);
+					assert ( entry.iMod-1 == cv.modulesByIndex.length );
+					cv.modulesByIndex ~= mod;
+					cv.modulesByName[mod.name] = mod;
+					debug(cvsections) DbgIO.println("sstModule section \"%s\"", mod.name);
+					break;
+				case sstAlignSym:
+					debug(cvsections) DbgIO.println("sstAlignSym section");
+					assert ( entry.iMod <= cv.modulesByIndex.length );
+					Module mod = cv.modulesByIndex[entry.iMod-1];
+					parseSymbols(cv, section_data, mod.symbols, true, mod);
+					break;
+				case sstSrcModule:
+					debug(cvsections) DbgIO.println("sstSrcModule section");
+					assert( entry.iMod <= cv.modulesByIndex.length );
+					parseSrcModule(cv, section_data, cv.modulesByIndex[entry.iMod-1]);
+					break;
+				case sstLibraries:
+					debug(cvsections) DbgIO.println("sstLibraries section");
+					parseLibraries(cv, section_data);
+					break;
+				case sstGlobalSym:
+					debug(cvsections) DbgIO.println("sstGlobalSym section");
+					parsePackedSymbols(cv, section_data, cv.global_sym);
+					break;
+				case sstGlobalPub:
+					debug(cvsections) DbgIO.println("sstGlobalPub section");
+					parsePackedSymbols(cv, section_data, cv.global_pub);
+					break;
+				case sstStaticSym:
+					debug(cvsections) DbgIO.println("sstStaticSym section");
+					parsePackedSymbols(cv, section_data, cv.static_sym);
+					break;
+				case sstGlobalTypes:
+					debug(cvsections) DbgIO.println("sstGlobalTypes section");
+					parseGlobalTypes(cv, section_data, entry.lfo);
+					break;
+				case sstSegMap:
+					debug(cvsections) DbgIO.println("sstSegMap section");
+					break;
+				case sstSegName:
+					debug(cvsections) DbgIO.println("sstSegName section");
+					break;
+				case sstFileIndex:
+					debug(cvsections) DbgIO.println("sstFileIndex section");
+					break;
+				case sstSymbols:
+				case sstTypes:
+				case sstPublic:
+				case sstPublicSym:
+				case sstSrcLnSeg:
+				case sstMPC:
+				case sstPreComp:
+				case sstPreCompMap:
+				case sstOffsetMap16:
+				case sstOffsetMap32:
+					debug DbgIO.println("Unprocessed CV section 0x%x", entry.subsection);
+					break;
+				default:
+					debug DbgIO.println("Unknown CV section 0x%x", entry.subsection);
+			}
+		}
+
+		updateSymbols(cv, cv.global_pub.named_symbols);
+		updateSymbols(cv, cv.global_sym.named_symbols);
+		updateSymbols(cv, cv.static_sym.named_symbols);
+		foreach ( m; cv.modulesByIndex )
+			updateSymbols(cv, m.symbols.named_symbols);
+
+        cv.globalNamedSymbols = new AVLTree!(NamedSymbol);
+        foreach ( ns; cv.global_sym.named_symbols )
+            cv.globalNamedSymbols.insert(ns);
+        foreach ( ns; cv.global_pub.named_symbols )
+            cv.globalNamedSymbols.insert(ns);
+        foreach ( ns; cv.static_sym.named_symbols )
+            cv.globalNamedSymbols.insert(ns);
+
+        cv.updateCodeblocks();
+
+		return cv;
+	}
+
+private:
+    T min(T)(T a, T b)
+    {
+        return a<b?a:b;
+    }
+
+    /**********************************************************************************************
+        Parse a Module from the given data.
+    **********************************************************************************************/
+	Module parseModule(CodeView cv, ubyte[] data)
+	{
+		if ( data.length <= 0 )
+			throw new CodeViewException("parseModule on empty data");
+		DataReader dr = new DataReader(data);
+		Module mod = new Module(cv);
+		ubyte[] buf;
+		dr.readA(buf, ModuleHeader.sizeof);
+		mod.header = cast(ModuleHeader*)buf.ptr;
+		assert(mod.header.Style==intFromStr("CV"));
+		dr.readA!(SegInfo)(mod.seginfos, mod.header.cSeg);
+		dr.read(mod.name);
+		return mod;
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void parseSymbols(CodeView cv, ubyte[] data, SymbolSet symbols, bool skip_to_ssearch=false, Module mod=null)
+	{
+		if ( data.length <= 0 )
+			throw new CodeViewException("parseSymbols on empty data");
+		DataReader dr = new DataReader(data);
+
+		uint num_sym;
+
+		// skip until S_SSEARCH symbol is found
+		while ( skip_to_ssearch && dr.available )
+		{
+			ushort	length, index;
+			dr.read(length);
+			dr.read(index);
+			if ( index == SymbolIndex.S_SSEARCH ) {
+				dr.relseek(-4);
+				break;
+			}
+		}
+
+		uint sym_off;
+		bool expecting_arguments=false;
+		ScopeSymbol[uint]	scope_syms;
+		ScopeSymbol			parent_scope;
+
+		while ( dr.available )
+		{
+			ushort	length, index;
+			uint	next_symbol, symbol_start;
+
+			void addSymbol(Symbol sym)
+			{
+				assert( !expecting_arguments || parent_scope !is null );
+				if ( parent_scope !is null )
+				{
+					if ( expecting_arguments )
+						(cast(ProcedureSymbol)parent_scope).arguments.add(sym);
+					else
+						parent_scope.symbols.add(sym);
+				}
+				else
+					symbols.add(sym);
+			}
+
+			symbol_start = dr.cursor;
+			dr.read(length);
+			next_symbol = dr.cursor+length;
+            if ( next_symbol > dr.data.length ) {
+                debug DbgIO.println("WARNING: length %d for symbol exceeds block size %d - skipping section", length, dr.data.length);
+                if ( mod !is null )
+                debug DbgIO.println("in module %s", mod.name);
+                return;
+            }
+			dr.read(index);
+
+			ubyte[] buf;
+			switch ( index )
+			{
+				case SymbolIndex.S_COMPILE:
+					ubyte	machine,
+							language;
+					ushort	flags;
+					dr.read(machine);
+					dr.read(language);
+					dr.read(flags);
+					string version_string;
+					dr.read(version_string);
+					debug(cvsymbols) DbgIO.println("machine: 0x%x, language: %d, flags: 0x%x, version: %s", machine, language, flags, version_string);
+					break;
+				case SymbolIndex.S_SSEARCH:
+					dr.read(sym_off);
+					ushort pe_section;
+					dr.read(pe_section);
+					if ( mod !is null )
+						mod.pe_section = pe_section;
+					break;
+				case SymbolIndex.S_END:
+					debug(cvsymbols) DbgIO.println("S_END");
+					if ( parent_scope !is null )
+					{
+						if ( parent_scope.parent_scope !is null )
+							parent_scope = parent_scope.parent_scope;
+						else
+							parent_scope = null;
+					}
+					else {
+						debug DbgIO.println("S_END with no active parent scope");
+					}
+					expecting_arguments = false;
+					break;
+				case SymbolIndex.S_ENDARG:
+					expecting_arguments = false;
+					break;
+				case SymbolIndex.S_RETURN:
+					dr.readA(buf, CVReturnSymbol.sizeof);
+					ReturnSymbol rsym = new ReturnSymbol(cast(CVReturnSymbol*)buf.ptr);
+					if ( rsym.cvdata.style == 1 ) {
+						ubyte count;
+						dr.read(count);
+						dr.readA!(ubyte)(rsym.registers, count);
+					}
+					ProcedureSymbol psym = cast(ProcedureSymbol)parent_scope;
+					assert(psym !is null);
+					psym.return_sym = rsym;
+					break;
+				case SymbolIndex.S_LPROC32:
+				case SymbolIndex.S_GPROC32:
+					dr.readA(buf, CVProcedureSymbol.sizeof);
+					ProcedureSymbol psym = new ProcedureSymbol(cast(SymbolIndex)index, symbol_start, cast(CVProcedureSymbol*)buf.ptr);
+					dr.read(psym.mangled_name);
+					psym.name_notype = demangleName(psym.mangled_name);
+					psym.name_type = demangle(psym.mangled_name);
+					debug(cvsymbols) DbgIO.println("PROC32 %s (%s) s:%x o:%x", psym.name_type, psym.name_notype, psym.cvdata.segment, psym.cvdata.offset);
+					scope_syms[symbol_start] = psym;
+					addSymbol(psym);
+					assert ( parent_scope is null || psym.cvdata.pParent==parent_scope.lfo );
+					if ( psym.cvdata.pParent in scope_syms )
+					{
+						psym.parent_scope = scope_syms[psym.cvdata.pParent];
+						psym.parent_scope.symbols.add(psym);
+					}
+					parent_scope = psym;
+					expecting_arguments = true;
+					break;
+				case SymbolIndex.S_BPREL32:
+					dr.readA(buf, CVStackSymbol.sizeof);
+					StackSymbol stsym = new StackSymbol(cast(CVStackSymbol*)buf.ptr);
+					dr.read(stsym.mangled_name);
+					stsym.name_notype = demangleName(stsym.mangled_name);
+					stsym.name_type = demangle(stsym.mangled_name);
+					debug(cvsymbols) DbgIO.println(
+						"BPREL32 %s%s [%s] 0x%x o:%d", parent_scope !is null?"("~parent_scope.name_type~") ":"",
+						stsym.name_type, stsym.name_notype, stsym.cvtype, cast(int)stsym.cvdata.offset
+					);
+					addSymbol(stsym);
+					break;
+				case SymbolIndex.S_LDATA32:
+				case SymbolIndex.S_GDATA32:
+				case SymbolIndex.S_PUB32:
+					dr.readA(buf, CVDataSymbol.sizeof);
+					DataSymbol dsym = new DataSymbol(cast(SymbolIndex)index, cast(CVDataSymbol*)buf.ptr);
+					dr.read(dsym.mangled_name);
+					dsym.name_notype = demangleName(dsym.mangled_name);
+					dsym.name_type = demangle(dsym.mangled_name);
+					debug(cvsymbols) DbgIO.println("[LG]DATA|PUB32 %s (%s) s:%x o:%x t:0x%x", dsym.name_type, dsym.name_notype, dsym.cvdata.segment, dsym.offset, dsym.cvtype);
+					addSymbol(dsym);
+					break;
+				case SymbolIndex.S_ALIGN:
+					debug(cvsymbols) DbgIO.println("ALIGN");
+					break;
+				case SymbolIndex.S_UDT:
+					UserDefinedType udt = new UserDefinedType;
+					dr.read(udt.type_index);
+					dr.read(udt.name);
+					cv.udtypes ~= udt;
+					break;
+                case SymbolIndex.S_PROCREF:
+                case SymbolIndex.S_DATAREF:
+                    break;
+				case SymbolIndex.S_REGISTER:
+				case SymbolIndex.S_CONSTANT:
+				case SymbolIndex.S_SKIP:
+				case SymbolIndex.S_CVRESERVE:
+				case SymbolIndex.S_OBJNAME:
+				case SymbolIndex.S_COBOLUDT:
+				case SymbolIndex.S_MANYREG:
+				case SymbolIndex.S_ENTRYTHIS:
+				case SymbolIndex.S_BPREL16:
+				case SymbolIndex.S_LDATA16:
+				case SymbolIndex.S_PUB16:
+				case SymbolIndex.S_LPROC16:
+				case SymbolIndex.S_GPROC16:
+				case SymbolIndex.S_THUNK16:
+				case SymbolIndex.S_BLOCK16:
+				case SymbolIndex.S_WITH16:
+				case SymbolIndex.S_LABEL16:
+				case SymbolIndex.S_CEXMODEL16:
+				case SymbolIndex.S_VFTPATH16:
+				case SymbolIndex.S_REGREL16:
+				case SymbolIndex.S_GDATA16:
+				case SymbolIndex.S_THUNK32:
+				case SymbolIndex.S_BLOCK32:
+				case SymbolIndex.S_WITH32:
+				case SymbolIndex.S_LABEL32:
+				case SymbolIndex.S_CEXMODEL32:
+				case SymbolIndex.S_VFTPATH32:
+				case SymbolIndex.S_REGREL32:
+				case SymbolIndex.S_LTHREAD32:
+				case SymbolIndex.S_GTHREAD32:
+					debug DbgIO.println("unprocessed symbol index 0x%x", index);
+					break;
+				default:
+					debug DbgIO.println("unknown symbol index 0x%x", index);
+			}
+
+            dr.seek(next_symbol);
+		}
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void parseSrcModule(CodeView cv, ubyte[] data, Module mod)
+	{
+		if ( data.length <= 0 )
+			throw new CodeViewException("parseSrcModule on empty data");
+		DataReader dr = new DataReader(data);
+		ushort cFile, cSeg;
+		dr.read(cFile);
+		dr.read(cSeg);
+
+		SourceModule smod = new SourceModule;
+		mod.source_module = smod;
+		cv.source_modules ~= smod;
+
+        uint[]	    baseSrcFile,
+                    start_end;
+        ushort[]	seginds;
+		dr.readA(baseSrcFile, cast(uint)cFile);
+		dr.readA(start_end, cast(uint)cSeg*2);
+		dr.readA(seginds, cast(uint)cSeg);
+		debug(cvparser) DbgIO.println("Module %s files=%d segs=%d", mod.name, cFile, cSeg);
+
+		foreach ( fileoffset; baseSrcFile )
+		{
+			dr.seek(fileoffset);
+			dr.read(cSeg);
+			ushort pad;
+			dr.read(pad);
+
+			SourceFile file = new SourceFile;
+			file.source_module = smod;
+            uint[]  baseSrcLn;
+			dr.readA(baseSrcLn, cast(uint)cSeg);
+			start_end = null;
+			dr.readA(start_end, cast(uint)cSeg*2);
+			dr.read(file.name);
+            debug(cvparser) DbgIO.println("\tFile %s segs=%d", file.name, cSeg);
+			smod.files ~= file;
+
+			foreach ( int i, segoff; baseSrcLn )
+			{
+				dr.seek(segoff);
+				SourceSegment seg = new SourceSegment;
+				file.segments ~= seg;
+				seg.file = file;
+
+				seg.start  = start_end[i*2];
+				seg.end    = start_end[i*2+1];
+
+				dr.read(pad);   // segment index
+				ushort cPair;
+				dr.read(cPair);
+                debug(cvparser) DbgIO.println("\t\tSegment %d lines=%d", file.segments.length-1, cPair);
+
+                uint[]		offset;
+                ushort[]	linenumber;
+				dr.readA(offset, cast(uint)cPair);
+				dr.readA(linenumber, cast(uint)cPair);
+
+                foreach ( int j, l; linenumber ) {
+                    CodeBlock cb = new CodeBlock(offset[j], l, seg);
+                    file.blocks_by_line[l] ~= cb;
+                    debug(cvparser)
+                    {
+                        bool inserted = cv.codeblocks.insert(cb);
+                        if ( !inserted )
+                            DbgIO.println("failed to insert block %s, already exists", cb);
+                    }
+                    else
+                        cv.codeblocks.insert(cb);
+                }
+			}
+
+			file.lines = file.blocks_by_line.keys.dup.sort;
+		}
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void parseLibraries(CodeView cv, ubyte[] data)
+	{
+		if ( data.length <= 0 )
+			throw new CodeViewException("parseLibraries on empty data");
+		DataReader dr = new DataReader(data);
+		while ( dr.available ) {
+			string lib;
+			dr.read(lib);
+			cv.libraries ~= lib;
+		}
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void parsePackedSymbols(CodeView cv, ubyte[] data, SymbolSet symbols)
+	{
+		if ( data.length <= 0 )
+			throw new CodeViewException("parsePackedSymbols on empty data");
+		DataReader dr = new DataReader(data);
+
+		ubyte[] buf;
+		dr.readA(buf, PackedSymbolsHeader.sizeof);
+		PackedSymbolsHeader* gsh = cast(PackedSymbolsHeader*)buf.ptr;
+
+		dr.readA(buf, gsh.cbSymbol);
+		parseSymbols(cv, buf, symbols);
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void parseGlobalTypes(CodeView cv, ubyte[] data, uint absolute_offset)
+	{
+		DataReader dr = new DataReader(data);
+		uint	flags,
+				cType;
+		uint[]	offType;
+		dr.read(flags);
+		dr.read(cType);
+		dr.readA(offType, cType);
+
+		uint	base = dr.cursor;
+		foreach ( off; offType )
+		{
+			dr.seek(base+off);
+			ushort	len;
+			dr.read(len);
+			ubyte[] buf;
+			dr.readA(buf, cast(uint)len);
+			cv.type_strings ~= parseTypeString(cv, buf);
+		}
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	Leaf[] parseTypeString(CodeView cv, ubyte[] data)
+	{
+		debug(cvdump) foreach ( b; data )
+			DbgIO.print("%02x ", b);
+		debug(cvdump) DbgIO.println("");
+		DataReader dr = new DataReader(data);
+		Leaf[] leafs;
+		bool first = true;
+		while ( dr.available )
+		{
+			ushort leaf_index;
+			dr.read(leaf_index);
+			Leaf l;
+//			debug(cvparser) DbgIO.println("parsing 0x%x", leaf_index);
+			switch ( leaf_index )
+			{
+				case LF_MODIFIER_16t:
+					LeafModifer lm = new LeafModifer;
+					l = lm;
+					dr.read(lm.attribute);
+					dr.read(lm.index);
+					break;
+				case LF_POINTER_16t:
+					LeafPointer lp = new LeafPointer;
+					l = lp;
+					dr.read(lp.attribute);
+					dr.read(lp.type);
+					switch ( lp.attribute&0x1f )
+					{
+						case 0:
+						case 10:
+							break;
+						default:
+							debug DbgIO.println("unprocessed pointer type: 0x%x", lp.attribute);
+							assert(0);
+					}
+					break;
+				case LF_ARRAY_16t:
+					LeafArray la = new LeafArray;
+					l = la;
+					dr.read(la.elemtype);
+					dr.read(la.idxtype);
+					la.length = parseNumericLeaf(dr);
+					dr.read(la.name);
+					debug(cvparser) DbgIO.println("LF_ARRAY: %d 0x%x", la.length.getUint, 0x1000+cv.type_strings.length);
+					break;
+				case LF_PROCEDURE_16t:
+					LeafProcedure lp = new LeafProcedure;
+					l = lp;
+					dr.read(lp.rvtype);
+					dr.read(lp.call);
+					dr.read(lp.reserved);
+					dr.read(lp.cParms);
+					dr.read(lp.arglist);
+					break;
+				case LF_MFUNCTION_16t:
+					LeafMFunction lmf = new LeafMFunction;
+					l = lmf;
+					dr.read(lmf.rvtype);
+					dr.read(lmf._class);
+					dr.read(lmf._this);
+					dr.read(lmf.call);
+					dr.read(lmf.reserved);
+					dr.read(lmf.cParms);
+					dr.read(lmf.arglist);
+					dr.read(lmf.thisadjust);
+					break;
+				case LF_VTSHAPE:
+					LeafVTShape lvts = new LeafVTShape;
+					l = lvts;
+					ushort count;
+					dr.read(count);
+					dr.readA(lvts.descriptor, cast(uint)(count+1)>>1);
+					// skip rest of typestring
+					dr.seek(dr.data.length);
+					break;
+				case LF_CLASS_16t:
+				case LF_STRUCTURE_16t:
+					LeafClassStruc lcs = new LeafClassStruc;
+					l = lcs;
+					dr.read(lcs.count);
+					dr.read(lcs.field);
+					dr.read(lcs.property);
+					dr.read(lcs.dList);
+					dr.read(lcs.vshape);
+					lcs.length = parseNumericLeaf(dr);
+					dr.read(lcs.name);
+					lcs.type = cast(ushort)(0x1000+cv.type_strings.length);
+					debug(cvparser) DbgIO.println(
+						"%s 0x%x '%s' fl: 0x%x prop: 0x%x, length=0x%x", leaf_index==LF_CLASS_16t?"class":"struct",
+						lcs.type, lcs.name, lcs.field, lcs.property, lcs.length.getUint
+					);
+
+					cv.UDTsByName[lcs.name] = lcs;
+					break;
+				case LF_ENUM_16t:
+					LeafEnum le = new LeafEnum;
+					l = le;
+					dr.read(le.count);
+					dr.read(le.type);
+					dr.read(le.field);
+					dr.read(le.property);
+					dr.read(le.name);
+					debug(cvparser) DbgIO.println(
+						"enum 0x%x '%s' type: 0x%x fl: 0x%x prop: 0x%x", 0x1000+cv.type_strings.length, le.name, le.type, le.field, le.property
+					);
+					cv.UDTsByName[le.name] = le;
+					break;
+				case LF_UNION_16t:
+					LeafUnion lu = new LeafUnion;
+					l = lu;
+					dr.read(lu.count);
+					dr.read(lu.field);
+					dr.read(lu.property);
+					lu.length = parseNumericLeaf(dr);
+					dr.read(lu.name);
+					// skip rest of typestring
+					dr.seek(dr.data.length);
+					debug(cvparser) DbgIO.println("Union '%s' count %d fields 0x%x length 0x%x", lu.name, lu.count, lu.field, lu.length.getUint);
+					cv.UDTsByName[lu.name] = lu;
+					break;
+                case LF_OEM_16t:
+                    ushort oem;
+                    dr.read(oem);
+                    assert(oem == OEM_DIGITALMARS);
+                    dr.read(oem);
+                    ushort count;
+                    dr.read(count);
+                    assert(count == 2);
+                    switch ( oem )
+                    {
+                        case D_DYN_ARRAY:
+                            LeafDynArray lda = new LeafDynArray;
+                            l = lda;
+                            dr.read(lda.index_type);
+                            dr.read(lda.elem_type);
+                            debug(cvparser) DbgIO.println("Dynamic array index_type 0x%x elem_type 0x%x", lda.index_type, lda.elem_type);
+                            break;
+                        case D_ASSOC_ARRAY:
+                            LeafAssocArray laa = new LeafAssocArray;
+                            l = laa;
+                            dr.read(laa.key_type);
+                            dr.read(laa.elem_type);
+                            debug(cvparser) DbgIO.println("Associativ array key_type 0x%x elem_type 0x%x", laa.key_type, laa.elem_type);
+                            break;
+                        default:
+                            LeafDelegate ld = new LeafDelegate;
+                            l = ld;
+                            dr.read(ld.this_type);
+                            dr.read(ld.func_type);
+                            debug(cvparser) DbgIO.println("Delegate this_type 0x%x func_type 0x%x", ld.this_type, ld.func_type);
+                            break;
+                    }
+                    break;
+
+				case LF_ARGLIST_16t:
+					LeafArgList lal = new LeafArgList;
+					l = lal;
+					dr.read(lal.argcount);
+					dr.readA(lal.indeces, cast(uint)lal.argcount);
+					break;
+				case LF_FIELDLIST_16t:
+					debug(cvparser) DbgIO.println("fieldlist 0x%x", 0x1000+cv.type_strings.length);
+					LeafFieldList lfl = new LeafFieldList;
+					l = lfl;
+					while ( dr.available )
+						lfl.fields ~= parseSubfield(dr);
+					// skip rest of typestring
+					dr.seek(dr.data.length);
+					break;
+				case LF_DERIVED_16t:
+					LeafDerived ld = new LeafDerived;
+					l = ld;
+					ushort count;
+					dr.read(count);
+					dr.readA(ld.types, cast(uint)count);
+					break;
+				case LF_METHODLIST_16t:
+					LeafMethodList lml = new LeafMethodList;
+					l = lml;
+					// skip rest of typestring
+					dr.seek(dr.data.length);
+					break;
+				default:
+					debug DbgIO.println("unprocessed leaf index 0x%x at 0x%x", leaf_index, dr.cursor-2);
+					l = new Leaf;
+			}
+			assert ( l !is null );
+			l.leaf_index = leaf_index;
+			leafs ~= l;
+		}
+		return leafs;
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	Leaf parseSubfield(DataReader dr)
+	{
+		ushort leaf_index;
+		dr.read(leaf_index);
+		Leaf l;
+		switch ( leaf_index )
+		{
+			case LF_BCLASS_16t:
+				LeafBaseClass lbc = new LeafBaseClass;
+				l = lbc;
+				dr.read(lbc.type);
+				dr.read(lbc.attribute);
+				lbc.offset = parseNumericLeaf(dr);
+				debug(cvparser) DbgIO.println("SFbclass");
+				break;
+			case LF_MEMBER_16t:
+				LeafMember lm = new LeafMember;
+				l = lm;
+				dr.read(lm.type);
+				dr.read(lm.attribute);
+				lm.offset = parseNumericLeaf(dr);
+				dr.read(lm.name);
+				debug(cvparser) DbgIO.println("SFmember: %s", lm.name);
+				break;
+			case LF_METHOD_16t:
+				LeafMethod lm = new LeafMethod;
+				l = lm;
+				dr.read(lm.count);
+				dr.read(lm.mList);
+				dr.read(lm.name);
+				debug(cvparser) DbgIO.println("SFmethod: %d 0x%x %s", lm.count, lm.mList, lm.name);
+				break;
+			case LF_ENUMERATE:
+				LeafEnumNameValue le = new LeafEnumNameValue;
+				l = le;
+				dr.read(le.attribute);
+				le.value = parseNumericLeaf(dr);
+				dr.read(le.name);
+				debug(cvparser) DbgIO.println("SFenumerate: %s %d", le.name, le.value.getUint);
+				break;
+			case LF_NESTTYPE_16t:
+				LeafNestedType ln = new LeafNestedType;
+				l = ln;
+				dr.read(ln.index);
+				dr.read(ln.name);
+				debug(cvparser) DbgIO.println("SFnesttype: %s", ln.name);
+				break;
+			case LF_STMEMBER_16t:
+				LeafStaticDataMember ls = new LeafStaticDataMember;
+				l = ls;
+				dr.read(ls.type);
+				dr.read(ls.attribute);
+				dr.read(ls.name);
+				debug(cvparser) DbgIO.println("SFstmember: %s", ls.name);
+				break;
+			case LF_SKIP_16t:
+				dr.seek(dr.data.length);
+				debug(cvparser) DbgIO.println("SFskip");
+				break;
+			default:
+				debug DbgIO.println("unprocessed subfield index 0x%x", leaf_index);
+				l = new Leaf;
+		}
+		if ( dr.available )
+		{
+			ubyte pad;
+			dr.peek(pad);
+			if ( pad > 0xf0 )
+				dr.relseek(pad&0xf);
+		}
+		assert ( l !is null );
+		l.leaf_index = leaf_index;
+		return l;
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	LeafNumeric parseNumericLeaf(DataReader dr)
+	{
+		LeafNumeric nl = new LeafNumeric;
+		dr.read(nl.leaf_index);
+		if ( nl.leaf_index < 0x8000 ) {
+			nl.us = cast(ushort)nl.leaf_index;
+			nl.leaf_index = LF_USHORT;
+		}
+		else switch ( nl.leaf_index )
+		{
+			case LF_VARSTRING:	dr.read(nl.str);	break;
+			case LF_CHAR:		dr.read(nl.c);	break;
+			case LF_SHORT:		dr.read(nl.s);	break;
+			case LF_USHORT:		dr.read(nl.us);	break;
+			case LF_LONG:		dr.read(nl.i);	break;
+			case LF_ULONG:		dr.read(nl.ui);	break;
+			case LF_REAL32:		dr.read(nl.f);	break;
+			case LF_REAL64:		dr.read(nl.d);	break;
+			case LF_REAL80:		dr.read(nl.r);	break;
+			case LF_QUADWORD:	dr.read(nl.l);	break;
+			case LF_UQUADWORD:	dr.read(nl.ul);	break;
+			case LF_COMPLEX32:	dr.read(nl.cf);	break;
+			case LF_COMPLEX64:
+			case LF_COMPLEX80:
+			case LF_REAL48:
+			case LF_COMPLEX128:
+			case LF_REAL128:
+			default:
+				debug DbgIO.println("unknown leaftype %x", nl.leaf_index);
+		}
+		return nl;
+	}
+
+    /**********************************************************************************************
+        Updates symbol size fields and mangled_names. Since both can only
+        be determined fully after sstGlobalTypes have been read.
+    **********************************************************************************************/
+	void updateSymbols(CodeView cv, NamedSymbol[] syms)
+	{
+		foreach ( s; syms )
+		{
+			if ( s.mangled_name is null || s.mangled_name.length <= 0 )
+				s.mangled_name = cv.mangle(s);
+
+			ScopeSymbol scs = cast(ScopeSymbol)s;
+			if ( scs !is null )
+				updateSymbols(cv, scs.symbols.named_symbols);
+			ProcedureSymbol ps = cast(ProcedureSymbol)s;
+			if ( ps !is null )
+				updateSymbols(cv, ps.arguments.named_symbols);
+
+			string type = cv.mangleType(s);
+			if ( type is null )
+				continue;
+
+			DataSymbol ds = cast(DataSymbol)s;
+			if ( ds !is null )
+				ds.size = cv.sizeofCV(ds.cvdata.type);
+			else
+			{
+				StackSymbol ss = cast(StackSymbol)s;
+				if ( ss !is null )
+					ss.size = cv.sizeofCV(ss.cvdata.type);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/codeview/symboldb.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,19 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+
+module codeview.symboldb;
+
+import codeview.codeview;
+import codeview.coff;
+
+abstract class SymbolDatabase
+{
+    COFFImage[] images;
+
+    void addImage(COFFImage image);
+    void removeImage(COFFImage image);
+	Location findLocation(uint vaddress);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/container.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,459 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+
+import std.string;
+debug import std.stdio;
+
+/*******************************************************************************
+    Double linked list
+*******************************************************************************/
+class List(T)
+{
+    class Element
+    {
+        T value;
+        Element prev,
+                next;
+
+        this(T v)
+        {
+            value = v;
+        }
+    }
+
+    Element head,
+            tail;
+
+    List opCatAssign(T v)
+    {
+        if ( tail is null )
+            head = tail = new Element(v);
+        else {
+            tail.next = new Element(v);
+            tail.next.prev = tail;
+            tail = tail.next;
+        }
+        return this;
+    }
+
+    bool empty()
+    {
+        return head is null;
+    }
+
+    void clear()
+    {
+        head = null;
+        tail = null;
+    }
+
+    void remove(Element e)
+    {
+        if ( e is null )
+            return;
+        assert(e !is null);
+        if ( e.prev is null )
+            head = e.next;
+        else
+            e.prev.next = e.next;
+        if ( e.next is null )
+            tail = e.prev;
+        else
+            e.next.prev = e.prev;
+    }
+
+    int opApply(int delegate(inout Element) dg)
+    {
+        for ( Element e=head; e !is null; e = e.next )
+        {
+            int ret = dg(e);
+            if ( ret )
+                return ret;
+        }
+        return 0;
+    }
+
+    int opApplyReverse(int delegate(inout Element) dg)
+    {
+        for ( Element e=tail; e !is null; e = e.prev )
+        {
+            int ret = dg(e);
+            if ( ret )
+                return ret;
+        }
+        return 0;
+    }
+}
+
+/**************************************************************************************************
+    AVL Tree that balances itself after each insertion
+**************************************************************************************************/
+class AVLTree(T)
+{
+    alias AVLNode!(T) node_t;
+    node_t  root;
+    bool    rebalance;
+
+    bool insert(T v)
+    {
+        if ( root is null ) {
+            root = new AVLNode!(T)(v);
+            return true;
+        }
+        else {
+            rebalance = false;
+            return insert(root, v);
+        }
+    }
+
+    bool find(VT,RT)(VT v, out RT res)
+    {
+        if ( root is null )
+            return false;
+        return root.find(v, res);
+    }
+
+    void traverseDepthLeft(RT)(bool delegate(RT v) proc)
+    {
+        if ( root !is null )
+            root.traverseDepthLeft(proc);
+    }
+
+    private bool insert(node_t n, T v)
+    {
+        void updateParents(node_t top=null)
+        {
+            with ( n )
+            {
+                if ( top is null )
+                    top = n;
+
+                balance         = 0;
+                parent.balance  = 0;
+
+                node_t pp = parent.parent;
+                if ( pp is null )
+                    root = top;
+                else
+                {
+                    if ( parent is pp.left )
+                        pp.left = top;
+                    else
+                        pp.right = top;
+                }
+                parent.parent = top;
+                top.parent = pp;
+                if ( top !is n )
+                    parent = top;
+            }
+        }
+
+        with ( n )
+        {
+            if ( v < value )
+            {
+                if ( left is null )
+                {
+                    left = new node_t(v, n);
+                    --balance;
+                    if ( balance != 0 )
+                        rebalance = true;
+                }
+                else if ( !insert(left, v) )
+                    return false;
+            }
+            else if ( v > value )
+            {
+                if ( right is null )
+                {
+                    right = new node_t(v, n);
+                    ++balance;
+                    if ( balance != 0 )
+                        rebalance = true;
+                }
+                else if ( !insert(right, v) )
+                    return false;
+            }
+            else
+                return false;
+
+            if ( rebalance && parent !is null )
+            {
+                assert(balance != 0);
+                if ( n is parent.left )
+                {
+                    if ( parent.balance > 0 )
+                        --parent.balance;
+                    else if ( parent.balance == 0 ) {
+                        --parent.balance;
+                        return true;
+                    }
+                    else
+                    {
+                        // single rotation to the right
+                        if ( balance < 0 )
+                        {
+                            parent.left     = right;
+                            if ( right !is null )
+                                right.parent    = parent;
+                            right           = parent;
+                            updateParents;
+                        }
+                        // double rotation to the right
+                        else
+                        {
+                            assert(right !is null);
+                            node_t r            = right;
+                            parent.left         = r.right;
+                            if ( parent.left !is null )
+                                parent.left.parent  = parent;
+                            right               = r.left;
+                            if ( right !is null )
+                                right.parent    = n;
+                            r.right             = parent;
+                            r.left              = n;
+                            updateParents(r);
+                        }
+                    }
+                }
+                else
+                {
+                    if ( parent.balance < 0 )
+                        ++parent.balance;
+                    else if ( parent.balance == 0 ) {
+                        ++parent.balance;
+                        return true;
+                    }
+                    else
+                    {
+                        // single rotation to the left
+                        if ( balance > 0 )
+                        {
+                            parent.right    = left;
+                            if ( left !is null )
+                                left.parent     = parent;
+                            left            = parent;
+                            updateParents;
+                        }
+                        // double rotation to the left
+                        else
+                        {
+                            assert(left !is null);
+                            node_t l            = left;
+                            parent.right        = l.left;
+                            if ( parent.right !is null )
+                                parent.right.parent = parent;
+                            left                = l.right;
+                            if ( left !is null )
+                                left.parent     = n;
+
+                            l.left              = parent;
+                            l.right             = n;
+                            updateParents(l);
+                        }
+                    }
+                }
+            }
+            rebalance = false;
+            return true;
+        }
+    }
+}
+
+class AVLNode(T)
+{
+    alias AVLNode!(T) node_t;
+    node_t  parent, left, right;
+    byte    balance;
+
+    T       value;
+
+    this(T v, node_t p = null)
+    {
+        value = v;
+        parent = p;
+    }
+
+    void traverseDepthLeft(RT)(bool delegate(RT v) proc)
+    {
+        if ( left !is null )
+            left.traverseDepthLeft(proc);
+
+        static if ( is(RT == AVLNode!(T)) )
+        {
+            if ( !proc(this) )
+                return;
+        }
+        static if ( is(RT == T) )
+        {
+            if ( !proc(value) )
+                return;
+        }
+        static if ( !is(RT == AVLNode!(T)) && !is(RT == T) )
+            static assert(0, "invalid result type for tree traversal");
+
+        if ( right !is null )
+            right.traverseDepthLeft(proc);
+    }
+
+    bool findNext(RT)(inout RT res)
+    {
+        node_t n;
+        if ( right is null )
+        {
+            bool found=false;
+            for ( n = this; n.parent !is null; n = n.parent )
+            {
+                if ( n.parent.left is n )
+                {
+                    static if ( is(T : Object) )
+                        assert(n.parent.value > n.value, "\n"~n.parent.value.toString~"  parent of  "~n.value.toString~"\n");
+                    assert(n.parent.value >  n.value);
+                    n = n.parent;
+                    found = true;
+                    break;
+                }
+                assert(n.parent.value <= n.value);
+            }
+            if ( !found )
+                return false;
+        }
+        else
+        {
+            assert(right.value >= value);
+            n = right;
+            while ( n.left !is null )
+            {
+                static if ( is(T : Object) )
+                    assert(n.left.value < n.value, "\n"~n.left.value.toString~"\tleft of\t"~n.value.toString~"\n");
+                assert(n.left.value < n.value);
+                n = n.left;
+            }
+        }
+
+        static if ( is(RT == AVLNode!(T)) )
+            res = n;
+        static if ( is(RT == T) )
+            res = n.value;
+        static if ( !is(RT == AVLNode!(T)) && !is(RT == T) )
+            static assert(0, "invalid result type for next node search");
+        return true;
+    }
+
+    bool findPrev(RT)(inout RT res)
+    {
+        node_t n;
+        if ( left is null )
+        {
+            bool found=false;
+            for ( n = this; n.parent !is null; n = n.parent )
+            {
+                if ( n.parent.right is n )
+                {
+                    static if ( is(T : Object) )
+                        assert(n.parent.value > n.value, "\n"~n.parent.value.toString~"  parent of  "~n.value.toString~"\n");
+                    assert(n.parent.value <=  n.value);
+                    n = n.parent;
+                    found = true;
+                    break;
+                }
+                assert(n.parent.value <= n.value);
+            }
+            if ( !found )
+                return false;
+        }
+        else
+        {
+            assert(left.value < value);
+            n = left;
+            while ( n.right !is null )
+            {
+                static if ( is(T : Object) )
+                    assert(n.right.value < n.value, "\n"~n.right.value.toString~"\tleft of\t"~n.value.toString~"\n");
+                assert(n.right.value < n.value);
+                n = n.right;
+            }
+        }
+
+        static if ( is(RT == AVLNode!(T)) )
+            res = n;
+        static if ( is(RT == T) )
+            res = n.value;
+        static if ( !is(RT == AVLNode!(T)) && !is(RT == T) )
+            static assert(0, "invalid result type for prev node search");
+        return true;
+    }
+
+    bool find(VT,RT)(VT v, inout RT res)
+    {
+        bool suc;
+        if ( value > v )
+        {
+            if ( left !is null )
+                return left.find(v, res);
+        }
+        else if ( value < v )
+        {
+            if ( right !is null )
+                return right.find(v, res);
+        }
+        else
+            suc = true;
+        static if ( is(RT == AVLNode!(T)) )
+            res = this;
+        static if ( is(RT == T) )
+            res = value;
+        static if ( !is(RT == AVLNode!(T)) && !is(RT == T) )
+            static assert(0, "invalid result type for tree search");
+        return suc;
+    }
+}
+
+unittest
+{
+    AVLTree!(int)  tree = new AVLTree!(int);
+    for ( int i = 0; i < 100; ++i )
+        tree.insert(i);
+
+    bool checkOrder(AVLNode!(int) n)
+    {
+        if ( n.left !is null ) {
+            assert(n.left.parent is n);
+            assert(n.left.value < n.value);
+        }
+        if ( n.right !is null ) {
+            assert(n.right.parent is n);
+            assert(n.right.value >= n.value);
+        }
+        return true;
+    }
+
+    tree.traverseDepthLeft(&checkOrder);
+
+    // check next
+    for ( int i = 0; i < 99; ++i )
+    {
+        AVLNode!(int) n;
+        assert(tree.find(i, n));
+        assert(n.value == i);
+        assert(n.findNext(n));
+        assert(n.value == i+1, .toString(i+1)~" expected, "~.toString(n.value)~" found");
+    }
+
+    tree = new AVLTree!(int);
+    for ( int i = 99; i >= 0; --i )
+        tree.insert(i);
+    tree.traverseDepthLeft(&checkOrder);
+
+    // check next
+    for ( int i = 0; i < 99; ++i )
+    {
+        AVLNode!(int) n;
+        assert(tree.find(i, n));
+        assert(n.value == i);
+        assert(n.findNext(n));
+        assert(n.value == i+1, .toString(i+1)~" expected, "~.toString(n.value)~" found");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/dbgprocess.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,221 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+module dbgprocess;
+
+import win32.winbase;
+import win32.windef;
+
+import std.string;
+import std.c.string;
+
+import util;
+import breakpoint;
+import dbgthread;
+import callstack;
+import codeview.coff;
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class DbgProcess
+{
+public:
+	HANDLE		process_handle;
+	uint        processId,
+                mainThreadId;
+	DLL[]		loaded_dlls;
+
+	DbgThread[uint]	    threads;
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	DLL loadDLL(LOAD_DLL_DEBUG_INFO* lddi)
+	{
+		DLL dll					= new DLL;
+		dll.filehandle		    = lddi.hFile;
+		dll.base				= cast(uint)lddi.lpBaseOfDll;
+		dll.debug_info_offset	= lddi.dwDebugInfoFileOffset;
+		dll.debug_info_size	= lddi.nDebugInfoSize;
+		loaded_dlls ~= dll;
+
+		size_t filesize = GetFileSize(lddi.hFile, null);
+		if ( filesize == 0 )
+		{
+			debug DbgIO.println("Couldn't get DLL %s image size: %s", dll.image.name, lastError);
+			return dll;
+		}
+
+		ubyte[] buf;
+		buf.length = filesize;
+		if ( !ReadFile(lddi.hFile, cast(void*)buf.ptr, buf.length, &filesize, null) || filesize != buf.length )
+		{
+			debug DbgIO.println("Couldn't read DLL image for %s: %s", dll.image.name, lastError);
+			return dll;
+		}
+		dll.image = new COFFImage;
+		dll.image.load(buf);
+
+		return dll;
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	DLL findDLL(size_t vaddress)
+	{
+		foreach ( dll; loaded_dlls )
+		{
+			if ( vaddress < dll.base )
+				continue;
+			assert( dll !is null );
+			assert( dll.image !is null );
+			uint size_image = dll.image.imageSize;
+			if ( vaddress-dll.base > size_image )
+				continue;
+			return dll;
+		}
+		return null;
+	}
+
+    /**********************************************************************************************
+        Loads the given thread's stack and the index of the current frame pointer (ebp).
+        Returns: Arrays of uints.
+    **********************************************************************************************/
+	CallStack loadStack(DbgThread thread)
+	{
+		CONTEXT ctx;
+		if ( !thread.getContext(ctx, CONTEXT_CONTROL) )
+            throw new Exception("Couldn't get thread's context");
+
+		CallStack stack = new CallStack(thread.stack_base, ctx.Esp, ctx.Ebp);
+		uint read = readProcessMemory(ctx.Esp, stack.data.ptr, stack.data.length);
+		if ( read == 0 )
+            throw new Exception("Couldn't read thread's stack memory");
+		else if ( read < stack.data.length )
+			stack.data.length = read;
+		return stack;
+	}
+
+    /**********************************************************************************************
+        Read from debuggee's memory.
+        Returns: #bytes read
+    **********************************************************************************************/
+	size_t readProcessMemory(size_t address, void* data, size_t size, bool changeProtect=false)
+	{
+		uint oldprot;
+		if( changeProtect && !VirtualProtectEx(process_handle, cast(void*)address, size, PAGE_READONLY, &oldprot) ) {
+			debug DbgIO.println("readProcessMemory(): Failed to obtain read access to page at 0x%08x: %s", address, lastError);
+			return false;
+		}
+
+		size_t numbytes;
+		if( !ReadProcessMemory(process_handle, cast(void*)address, data, size, &numbytes) ) {
+			debug DbgIO.println("ReadProcessMemory() returned false reading address 0x%08x: %s", address, lastError);
+            return 0;
+		}
+		if ( numbytes != size ) {
+			debug DbgIO.println("readProcessMemory(): Failed to read at address 0x%08x: %s", address, lastError);
+		}
+
+		if( changeProtect && !VirtualProtectEx(process_handle, cast(void*)address, size, oldprot, &oldprot) ) {
+			DbgIO.println("writeProcessMemory(): Failed to restore access to page at 0x%08x: %s", address, lastError);
+			return 0;
+		}
+
+		return numbytes;
+	}
+
+    /**********************************************************************************************
+        Write to debuggee's memory.
+        Returns success.
+    **********************************************************************************************/
+	size_t writeProcessMemory(size_t address, void* data, size_t size)
+	{
+		uint oldprot;
+
+		if( !VirtualProtectEx(process_handle, cast(void*)address, size, PAGE_EXECUTE_READWRITE, &oldprot) )
+		{
+			DbgIO.println("writeProcessMemory(): Failed to obtain write access to page at 0x%08x: %s", address, lastError);
+			return false;
+		}
+
+		size_t numbytes;
+		if( !WriteProcessMemory(process_handle, cast(void*)address, data, size, &numbytes) )
+			DbgIO.println("writeProcessMemory(): Failed to write byte at 0x%08x: %s", address, lastError);
+
+		if( !VirtualProtectEx(process_handle, cast(void*)address, size, oldprot, &oldprot) )
+		{
+			DbgIO.println("writeProcessMemory(): Failed to restore access to page at 0x%08x: %s", address, lastError);
+			return false;
+		}
+
+		if ( !FlushInstructionCache(process_handle, cast(void*)address, numbytes) )
+		{
+			DbgIO.println("writeProcessMemory(): FlushInstructionCache failed for 0x%08x: %s", address, lastError());
+			return false;
+		}
+
+		return numbytes;
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	ClassInfo getClassInfo(size_t obj_ptr)
+	{
+		uint	vtbl,
+				ci_ptr;
+		readProcessMemory(obj_ptr, &vtbl, size_t.sizeof);
+		readProcessMemory(vtbl, &ci_ptr, size_t.sizeof);
+		ubyte[] data;
+		data.length = ClassInfo.classinfo.init.length;
+		readProcessMemory(ci_ptr, data.ptr, data.length);
+		return cast(ClassInfo)data.ptr;
+	}
+
+    /**********************************************************************************************
+        simple check for invalidity of a memory block
+    **********************************************************************************************/
+    const size_t MEMCHECK_MIN = 0x1000;
+    bool isInvalidMem(size_t ptr, size_t len)
+    {
+        uint tmp;
+        if ( uint.sizeof != readProcessMemory(ptr, &tmp, uint.sizeof)
+            || uint.sizeof != readProcessMemory(ptr+len-uint.sizeof, &tmp, uint.sizeof) )
+            return true;
+        return false;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    MEMORY_BASIC_INFORMATION[] walkMemory()
+    {
+        SYSTEM_INFO                 si;
+        MEMORY_BASIC_INFORMATION[]  mbis;
+        GetSystemInfo(&si);
+        for ( void* ptr = si.lpMinimumApplicationAddress; ptr < si.lpMaximumApplicationAddress; )
+        {
+            mbis.length = mbis.length + 1;
+            VirtualQueryEx(process_handle, ptr, &mbis[$-1], MEMORY_BASIC_INFORMATION.sizeof);
+            ptr = mbis[$-1].BaseAddress + mbis[$-1].RegionSize;
+        }
+        return mbis;
+    }
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class DLL
+{
+public:
+	HANDLE	filehandle;
+	uint	base,
+			debug_info_offset,
+			debug_info_size;
+	COFFImage	image;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/dbgthread.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,135 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+module dbgthread;
+
+import util;
+
+import win32.winbase;
+import win32.windef;
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class DbgThread
+{
+	HANDLE	handle;
+	uint	id,
+			stack_base;
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	this(HANDLE h, uint i)
+	{
+		handle = h;
+		id = i;
+
+		// get current esp as stack base
+		CONTEXT ctx;
+		if ( getContext(ctx, CONTEXT_CONTROL) )
+			stack_base = ctx.Esp;
+	}
+
+    int priority()
+    {
+        return GetThreadPriority(handle);
+    }
+
+    bool priorityBoost()
+    {
+        int boost;
+        GetThreadPriorityBoost(handle, &boost);
+        return cast(bool)boost;
+    }
+
+    void times(out ulong creation, out ulong exit, out ulong kernel, out ulong user)
+    {
+        GetThreadTimes(handle, cast(FILETIME*)&creation, cast(FILETIME*)&exit, cast(FILETIME*)&kernel, cast(FILETIME*)&user);
+    }
+
+    uint suspendCount()
+    {
+        uint count = suspend;
+        resume;
+        return count;
+    }
+
+    uint suspend()
+    {
+        return SuspendThread(handle);
+    }
+
+    uint resume()
+    {
+        return ResumeThread(handle);
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	bool getContext(out CONTEXT ctx, uint flags=CONTEXT_FULL)
+	{
+		ctx.ContextFlags = flags;
+		suspend;
+		bool res = cast(bool)GetThreadContext(handle, &ctx);
+		resume;
+		return res;
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	bool setContext(ref CONTEXT ctx)
+	{
+		suspend;
+		auto res = cast(bool)SetThreadContext(handle, &ctx);
+        resume;
+        return res;
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    size_t getDsBase()
+    {
+        CONTEXT ctx;
+        getContext(ctx);
+
+        LDT_ENTRY sel_entry;
+        GetThreadSelectorEntry(handle, ctx.SegDs, &sel_entry);
+        return (cast(size_t)sel_entry.BaseHi << 24) | (cast(size_t)sel_entry.BaseMid << 16) | cast(size_t)sel_entry.BaseLow;
+    }
+
+    /**********************************************************************************************
+        Wrapper function for changing the thread's context. Calls the
+        modify(ctx) delegate that can do the actual change.
+        Returns: success
+    **********************************************************************************************/
+	bool changeContext(void delegate(ref CONTEXT ctx) modify, uint flags=CONTEXT_FULL)
+	{
+//		if ( 0 > SuspendThread(thread) )
+//		{
+//			DbgIO.println("ERROR: Couldn't SuspendThread to reset instruction pointer: %s", getLastError);
+//			return false;
+//		}
+
+		CONTEXT ctx;
+		if ( getContext(ctx, flags) )
+		{
+			modify(ctx);
+			if ( !SetThreadContext(handle, &ctx) )
+				DbgIO.println("ERROR: Couldn't SetThreadContext to reset instruction pointer: %s", lastError);
+		} else
+			DbgIO.println("ERROR: Couldn't GetThreadContext to reset instruction pointer: %s", lastError);
+
+//		if ( 0 > ResumeThread(thread) )
+//		{
+//			DbgIO.println("ERROR: Couldn't ResumeThread to reset instruction pointer: %s", getLastError);
+//			return false;
+//		}
+
+		return true;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/debugger.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,1378 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+
+/**************************************************************************************************
+    The main debugger code. Handles win32 debugging events,
+    manages breakpoints, calls the disassembler, etc.
+**************************************************************************************************/
+
+import std.file;
+import std.string;
+import std.format;
+
+import win32.winbase;
+import win32.winuser;
+import win32.winnt;
+import win32.dbghelp;
+
+import minidump;
+import container;
+import util;
+import breakpoint;
+import dbgprocess;
+import dbgthread;
+import disasm;
+import callstack;
+import expression.evaluationcontext;
+import expression.expression_apd;
+import expression.datahandler;
+import codeview.coff;
+import codeview.codeview;
+import cli.userinterface;
+
+const uint      VERSION_MAJOR = 0,
+                VERSION_MINOR = 12,
+                VERSION_PATCH = 0;
+const string	VERSION_STRING =    "Ddbg "~itoa(VERSION_MAJOR)~"."~itoa(VERSION_MINOR)
+                                    ~(VERSION_PATCH>0?"."~itoa(VERSION_PATCH):"")~" beta",
+                WELCOME_STRING =	VERSION_STRING~" - D Debugger\n"~
+                                    "Copyright (c) 2007 Jascha Wetzel\n"~
+                                    "see http://ddbg.mainia.de/doc.html for documentation\n";
+
+class DebuggerException : Exception
+{
+    this(...)
+    {
+        string str;
+
+        void putc(dchar c)
+        {
+            str ~= c;
+        }
+
+        doFormat(&putc, _arguments, _argptr);
+        super(str);
+    }
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class Debugger
+{
+    const uint STATUS_DIGITAL_MARS_D_EXCEPTION = (3 << 30) | (1 << 29) | (0 << 28) | ('D' << 16) | 1;
+
+    //=============================================================================================
+    // variables
+    bool	            paused,
+                        process_loaded,
+                        abort,
+                        single_step;
+
+    size_t			    current_address;
+    uint                last_line;
+
+    string[][string]	source_files;
+    string[]			source_search_paths;
+
+    string			    main_image_file;
+    COFFImage           main_image;
+    ImageSet            images;
+
+    Breakpoint[uint]	breakpoints;
+    List!(Breakpoint)   temp_breakpoints;
+    Breakpoint		    passing_breakpoint;
+    DbgProcess		    process;
+    MiniDump            miniDump;
+
+    CallStack           current_stack;
+
+    EXCEPTION_RECORD*   exceptionRecord;
+    DEBUG_EVENT 	    debug_event;
+    uint			    process_id,
+                        thread_id;
+
+    UserInterface	    ui;
+
+    uint                evaluationDepth = 1;
+    bool                create_new_console;
+
+    //=============================================================================================
+    // construction
+
+    /**********************************************************************************************
+        Uses the debugger's CLI arguments for the debuggee.
+        Example: debugger debuggee arg0 arg1 ...
+    **********************************************************************************************/
+    this(string debuggee, UserInterface _ui)
+    {
+        assert(_ui !is null);
+        images = new ImageSet;
+        ui = _ui;
+        openImage(debuggee);
+        source_search_paths ~= ".\\";
+        temp_breakpoints = new List!(Breakpoint);
+    }
+
+    CallStack stack()
+    {
+        if ( current_stack is null )
+        {
+            if ( process !is null )
+                current_stack = process.loadStack(process.threads[thread_id]);
+            else if ( miniDump !is null ) {
+                CONTEXT* ctx = miniDump.getContext;
+                // TODO: where does that 4-byte offset come from
+                ubyte[] data = miniDump.getMemory(miniDump.thread.Stack.Memory)[4..$];
+                current_stack = new CallStack(cast(size_t)miniDump.thread.Stack.StartOfMemoryRange+data.length, ctx.Esp, ctx.Ebp);
+                current_stack.data = data;
+            }
+        }
+        return current_stack;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    bool step(StepMode mode)
+    {
+        if ( !process_loaded )
+            return false;
+        Location loc = images.findLocation(current_address);
+
+        int bpi=-1;
+        Breakpoint bp;
+
+        switch ( mode )
+        {
+            //-------------------------------------------------------------------------------------
+            case StepMode.e_in:
+                Location next_loc = images.findNextSrcLine(loc);
+                if ( next_loc !is null )
+                {
+                    bp = setBreakpoint(next_loc, bpi, thread_id);
+                    if ( bp !is null )
+                        addForeachBreakpoint(bp);
+                }
+
+                size_t disasm_end;
+                if ( loc.codeblock !is null )
+                    disasm_end = loc.codeblock.end+loc.getCodeBase;
+                DisAsm.disasm(
+                    process, current_address, disasm_end,
+                    (ud_t* ud_obj) { return setBranchBreakpoints(ud_obj,StepMode.e_in); }
+                );
+                break;
+            //-------------------------------------------------------------------------------------
+            case StepMode.e_out:
+                uint ret_adr = getReturnAddress(loc);
+                if ( ret_adr > 0 ) {
+                    debug DbgIO.println("setting step-out to 0x%08x", ret_adr);
+                    bp = setBreakpoint(ret_adr, bpi, thread_id);
+                    if ( bp !is null )
+                        bp.frame_ptr = getFramePointer(loc, 1);
+                }
+                else
+                {
+                    debug DbgIO.println("no scope found - falling back on disasm-step-out");
+                    DisAsm.disasm(
+                        process, current_address, 0,
+                        (ud_t* ud_obj) { return setBranchBreakpoints(ud_obj,StepMode.e_out); }
+                    );
+                }
+                break;
+            //-------------------------------------------------------------------------------------
+            case StepMode.e_over:
+                Location next_loc = images.findNextSrcLine(loc);
+                if ( next_loc !is null )
+                {
+                    bp = setBreakpoint(next_loc, bpi, thread_id);
+                    if ( bp !is null )
+                    {
+                        bp.frame_ptr = getFramePointer(loc);
+                        debug DbgIO.println("FP for step over is 0x%x", bp.frame_ptr);
+                        addForeachBreakpoint(bp);
+                    }
+                }
+
+                size_t disasm_end;
+                if ( loc.codeblock !is null )
+                    disasm_end = loc.codeblock.end+loc.getCodeBase;
+                DisAsm.disasm(
+                    process, current_address, disasm_end,
+                    (ud_t* ud_obj) { return setBranchBreakpoints(ud_obj,StepMode.e_over); }
+                );
+                break;
+            default:
+                assert(0);
+        }
+
+        return true;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void addForeachBreakpoint(Breakpoint foreach_end)
+    {
+        CodeView cv;
+        CodeBlock cb = images.findCodeBlockAbs(current_address, cv);
+        if ( cb !is null )
+        {
+            CodeBlock cbs[] = cb.segment.file.blocks_by_line[cb.line];
+            if ( cbs.length > 1 && cb is cbs[0] )
+            {
+                Location loc = images.findLocation(cbs[1].start+cv.getCodeBase);
+                if ( loc.scope_sym !is null && find(loc.scope_sym.mangled_name, "__foreachbody") >= 0 )
+                {
+                    int bpi;
+                    if ( getBreakpoint(loc.address, bpi) is null ) {
+                        Breakpoint bp = new Breakpoint(loc, true, thread_id);
+                        bp.foreach_end = foreach_end;
+                        foreach_end.foreach_end = foreach_end;
+                        addBreakpoint(bp, -1);
+                    }
+                }
+            }
+        }
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    uint getReturnAddress(Location loc)
+    {
+        ProcedureSymbol psym = cast(ProcedureSymbol)loc.scope_sym;
+        if ( psym !is null )
+        {
+            uint	index;
+            ubyte[] frame = stack.firstFrame(index);
+
+            if ( frame is null )
+                throw new DebuggerException("getReturnAddress: null frame");
+
+            uint adr = current_address-psym.cvdata.offset-loc.getCodeBase;
+            if ( adr >= psym.cvdata.debug_start && adr < psym.cvdata.debug_end ) {
+                frame = stack.prevFrame(index, index);
+                if ( frame.length >= 8 )
+                    return (cast(uint[])frame)[1];
+            }
+        }
+        return 0;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    uint getFramePointer(Location loc, uint level=0)
+    {
+        ProcedureSymbol psym = cast(ProcedureSymbol)loc.scope_sym;
+        if ( psym !is null )
+        {
+            uint frame_ptr;
+            if ( level > 0 )
+            {
+                uint	index,
+                        l;
+                ubyte[] frame = stack.firstFrame(index);
+                if ( frame is null )
+                    throw new DebuggerException("getCurrenFramePointer: null frame");
+
+                for ( l = 0; l < level && frame !is null; ++l )
+                    frame = stack.prevFrame(index, index);
+                if ( frame is null )
+                    throw new DebuggerException("getCurrenFramePointer: null frame at level %d", l);
+
+                frame_ptr = (cast(uint[])frame)[0];
+            }
+            else
+                frame_ptr = stack.frame_ptr;
+
+            uint adr = current_address-psym.cvdata.offset-loc.getCodeBase;
+            if ( adr >= psym.cvdata.debug_start && adr < psym.cvdata.debug_end )
+                return frame_ptr;
+        }
+        return 0;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    SymbolData evaluateExpression(string expr, uint frame_level=0, NamedSymbol symbol=null)
+    {
+        SyntaxTree* root;
+        bool success;
+        try success = parse("", expr, root, true);
+        catch( ParserException e )
+            throw new EvaluationException("Parser: "~e.toString);
+        if ( !success )
+            throw new EvaluationException("Parser: Invalid expression!");
+
+        string elmtype;
+        uint scope_address;
+        if ( frame_level == 0 )
+            scope_address = current_address;
+        else {
+            ubyte[]	frame = stack.getFrame(frame_level);
+            scope_address = (cast(uint[])frame)[1];
+        }
+
+        SymbolData sd;
+        auto loc = images.findLocation(current_address);
+        if ( loc.codeview is null )
+            throw new EvaluationException("No debug symbols available");
+        root.Expr(new EvaluationContext(
+            loc.codeview, scope_address,
+            miniDump, process, process is null?null:process.threads[thread_id],
+            stack, frame_level), sd
+        );
+        return sd;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    SymbolValue handleData(SymbolData sd, bool decreaseED)
+    {
+        auto loc = images.findLocation(current_address);
+        if ( loc.codeview is null )
+            throw new EvaluationException("No debug symbols available");
+        EvaluationContext ctx = new EvaluationContext(
+            loc.codeview, 0,
+            miniDump, process, process is null?null:process.threads[thread_id],
+            stack, 0
+        );
+
+        ubyte[] data = sd.getData(ctx);
+        if ( data.length <= 0 )
+            throw new EvaluationException("Expression evaluated to empty data");
+
+        uint ed = evaluationDepth;
+        if ( decreaseED )
+            --ed;
+        SymbolValue val = DataHandler.handle(ctx, sd.type, data, ed);
+        if ( val is null )
+            throw new EvaluationException("No DataHandler for type "~sd.type);
+        return val;
+    }
+
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    uint getScopeAddress(uint frame_level)
+    {
+        uint scope_address;
+        if ( frame_level == 0 )
+            scope_address = current_address;
+        else {
+            ubyte[]	frame = stack.getFrame(frame_level);
+            if ( frame !is null )
+                scope_address = (cast(uint[])frame)[1];
+        }
+        return scope_address;
+    }
+
+
+    //=============================================================================================
+    // process & thread handling
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void selectThread(size_t threadId)
+    {
+        thread_id = threadId;
+        current_stack = null;
+
+        if ( process !is null ) {
+            CONTEXT ctx;
+            if ( !process.threads[threadId].getContext(ctx) )
+                throw new DebuggerException("Couldn't get thread's context");
+            current_address = ctx.Eip;
+        }
+        else if ( miniDump !is null ) {
+            miniDump.selectThread(threadId);
+            CONTEXT* ctx = miniDump.getContext;
+            current_address = ctx.Eip;
+        }
+        else
+            throw new DebuggerException("Invalid debugger state");
+    }
+
+    /**********************************************************************************************
+        Loads and parses the PE image.
+        Returns: success
+    **********************************************************************************************/
+    void openImage(string filename)
+    {
+        assert(filename.length);
+        filename = strip(filename);
+        if ( !exists(filename) )
+            filename ~= ".exe";
+        if ( !exists(filename) )
+            throw new DebuggerException("Couldn't open \"%s\"", filename[0..$-4]);
+        main_image_file = filename.dup;
+
+        main_image = new COFFImage;
+        main_image.load(main_image_file);
+//		catch ( Exception e ) {
+//			throw new DebuggerException("Failed to load COFF image \""~main_image_file~"\": "~e.msg);
+//		}
+        if ( main_image.codeView is null )
+            DbgIO.println("WARNING: No debugging symbols found in main image, try compiling and linking with -g");
+        images ~= main_image;
+       // return true;
+    }
+
+    /**********************************************************************************************
+        Creates the child process for the debuggee.
+        Returns: success
+    **********************************************************************************************/
+    bool createDebugProcess(string command_line)
+    {
+        // initialiZe process startup information
+        STARTUPINFOA* startInfo	= new STARTUPINFOA;
+        startInfo.cb			= STARTUPINFO.sizeof;
+        startInfo.dwFlags		= STARTF_FORCEONFEEDBACK | STARTF_USESHOWWINDOW;
+        startInfo.wShowWindow   = SW_SHOWNORMAL;
+
+        PROCESS_INFORMATION	procInfo;	// process info
+
+        // create process
+        uint flags = DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS;
+        if ( create_new_console )
+            flags |= CREATE_NEW_CONSOLE;
+
+        bool suc = cast(bool)CreateProcessA(
+            toStringz(main_image_file), toStringz(command_line), cast(LPSECURITY_ATTRIBUTES)null,
+            cast(LPSECURITY_ATTRIBUTES)null, false, flags, null, cast(char*)null,
+            cast(LPSTARTUPINFOA)startInfo, cast(LPPROCESS_INFORMATION)&procInfo
+        );
+        if( !suc )
+            throw new DebuggerException("CreateProcess failed on %s", main_image_file);
+        assert(procInfo.dwProcessId);
+
+        // open process for all access
+        HANDLE hChildProcess = OpenProcess(PROCESS_ALL_ACCESS, false, procInfo.dwProcessId);
+        if( hChildProcess == null ) {
+            TerminateProcess(procInfo.hProcess, 0);
+            throw new DebuggerException("OpenProcess failed");
+        }
+        process_id = procInfo.dwProcessId;
+
+        CloseHandle(procInfo.hProcess);
+        return true;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void resume()
+    {
+        single_step = false;
+        paused = false;
+    }
+
+    //=============================================================================================
+    // exception handling
+
+    /**********************************************************************************************
+        Debugger's main loop. Handles win32 debugging events.
+    **********************************************************************************************/
+    void start(string command_line)
+    {
+        createDebugProcess(command_line);
+
+        while( !abort )
+        {
+            if( WaitForDebugEvent(&debug_event, win32.winbase.INFINITE) )
+            {
+                if( debug_event.dwProcessId != process_id ) {
+                    debug DbgIO.println("WARNING: Exception for unhandled process received: PID=%d", debug_event.dwProcessId);
+                    ContinueDebugEvent(debug_event.dwProcessId, debug_event.dwThreadId, DBG_CONTINUE);
+                    continue;
+                }
+
+                current_stack = null;
+                thread_id = debug_event.dwThreadId;
+                exceptionRecord = null;
+
+                bool exception_handled = true;
+                switch( debug_event.dwDebugEventCode )
+                {
+                    case OUTPUT_DEBUG_STRING_EVENT:
+                        char[] debug_string;
+                        paused = false;
+
+                        debug_string.length = debug_event.DebugString.nDebugStringLength;
+                        process.readProcessMemory(cast(uint)debug_event.DebugString.lpDebugStringData, debug_string.ptr, debug_string.length);
+                        if ( debug_event.DebugString.fUnicode )
+                            DbgIO.println("WARNING: Unicode debug strings not implemented, yet. Output might be corrupted");
+
+                        if ( debug_string.length > 3 && debug_string[0..4] == "DDL:" )
+                        {
+                            string cmdStr = debug_string[4..$];
+                            if ( strip(cmdStr).length > 0 )
+                            {
+                                auto r = std.regexp.RegExp("(([^\" \\t]+)|(\"[^\"]+\"))+");
+                                string[] cmd;
+                                foreach ( m; r.search(strip(cmdStr)) )
+                                    cmd ~= r.match(0);
+                                switch ( cmd[0] )
+                                {
+                                    case "load":
+                                        DbgIO.println("loadImage not implemented, yet: %s %s", cmd[1], cmd[2]);
+                                        break;
+                                    default:
+                                        DbgIO.println("WARNING: Unknown DDL command recieved: %s", cmdStr);
+                                        break;
+                                }
+                            }
+                        }
+                        else if ( debug_string.length > 5 && debug_string[0..5] == "Ddbg:" )
+                        {
+                            ui.runCommands(debug_string[5..$]);
+                            paused = true;
+                        }
+                        else
+                            ui.debugString(debug_string);
+                        break;
+
+                    case EXCEPTION_DEBUG_EVENT:
+                        exceptionRecord = &debug_event.Exception.ExceptionRecord;
+                        exception_handled = handleExceptionEvent(exceptionRecord);
+                        break;
+
+                    case LOAD_DLL_DEBUG_EVENT:
+                        DLL dll = process.loadDLL(&debug_event.LoadDll);
+                        if ( dll.image !is null )
+                        {
+                            images ~= dll.image;
+                            foreach ( bp; breakpoints )
+                            {
+                                if ( bp.location.address == 0 )
+                                {
+                                    debug DbgIO.println("binding bp %s", bp.toString);
+                                    if ( bp.location.bind(images, source_search_paths) ) {
+                                        debug DbgIO.println("activating bp %s", bp.toString);
+                                        bp.activate(process);
+                                    }
+                                }
+                            }
+                        }
+                        ui.loadedDLL(dll);
+                        paused = false;
+                        break;
+
+                    case UNLOAD_DLL_DEBUG_EVENT:
+//						DebugDLL* dll = process.findDLL(cast(uint)debug_event.LoadDll.lpBaseOfDll);
+//						ui.unloadedDLL(dll);
+//                        images.remove(dll.image);
+                        paused = false;
+                        break;
+
+                    case CREATE_THREAD_DEBUG_EVENT:
+                        process.threads[debug_event.dwThreadId] = new DbgThread(debug_event.CreateThread.hThread, debug_event.dwThreadId);
+                        paused = false;
+                        break;
+
+                    case EXIT_THREAD_DEBUG_EVENT:
+                        process.threads.remove(debug_event.dwThreadId);
+                        paused = false;
+                        break;
+
+                    case CREATE_PROCESS_DEBUG_EVENT:
+                        process 					    = new DbgProcess;
+                        process.processId               = process_id;
+                        process.process_handle	        = debug_event.CreateProcessInfo.hProcess;
+                        process.mainThreadId	        = debug_event.dwThreadId;
+                        process.threads[debug_event.dwThreadId] = new DbgThread(debug_event.CreateProcessInfo.hThread, debug_event.dwThreadId);
+                        process_loaded = true;
+
+                        if ( main_image !is null && main_image.codeView !is null )
+                        {
+                            DataSymbol mainds;
+                            if ( main_image.codeView.global_pub !is null )
+                                mainds = main_image.codeView.global_pub.findDataSymbol("_main");
+                            if ( mainds !is null )
+                            {
+                                int bpi=-1;
+                                Breakpoint bp = setBreakpoint(mainds.offset+main_image.getCodeBase, bpi, 0, true);
+                                bp.deactivate_d_exception_handler = true;
+                            }
+                        }
+
+                        foreach ( bp; breakpoints )
+                        {
+                            if ( bp.location.address != 0 && !bp.activate(process) )
+                                throw new DebuggerException("Error: couldn't write breakpoint opcode at %s:%d", bp.file, bp.line);
+                        }
+                        foreach ( bp; temp_breakpoints )
+                        {
+                            debug DbgIO.println("tbp activated %s", bp.value);
+                            if ( bp.value.location.address != 0 && !bp.value.activate(process) )
+                                throw new DebuggerException("Error: couldn't write breakpoint opcode at %s:%d", bp.value.file, bp.value.line);
+                        }
+                        break;
+
+                    case EXIT_PROCESS_DEBUG_EVENT:
+                        process_loaded = false;
+                        delete process;
+                        paused = true;
+                        single_step = false;
+                        ui.exitProcess;
+                        break;
+
+                    case RIP_EVENT:
+                        debug DbgIO.println("DebugEvent: "~getEventName(debug_event.dwDebugEventCode));
+                        paused = true;
+                        break;
+
+                    default:
+                        throw new DebuggerException("Win32Debugger ERROR - unknown debug event: %d", debug_event.dwDebugEventCode);
+                }
+
+                if ( single_step )
+                {
+                    ui.singleStep();
+                    paused = true;
+                    activateSingleStep(true);
+                }
+
+                if ( paused )
+                {
+                    bool cont=false;
+                    while ( !cont )
+                    {
+                        debug
+                            cont = ui.readCommand();
+                        else
+                        {
+                            try cont = ui.readCommand();
+                            catch ( Exception e )
+                                DbgIO.println("%s", e.msg);
+                        }
+                    }
+                    paused = false;
+                }
+
+                if ( !abort )
+                {
+                    exceptionRecord = null;
+                    ContinueDebugEvent(
+                        debug_event.dwProcessId, debug_event.dwThreadId,
+                        exception_handled?DBG_CONTINUE:DBG_EXCEPTION_NOT_HANDLED
+                    );
+                }
+            }
+            else
+                throw new DebuggerException("ERROR: WaitForDebugEvent failed: %s", lastError);
+        }
+    }
+
+    /**********************************************************************************************
+        Activates single step execution by setting the trap flag in
+        the eflags register of the currently considered thread.
+    **********************************************************************************************/
+    void activateSingleStep(bool enable)
+    {
+        if ( !(thread_id in process.threads) )
+            return;
+        if ( enable )
+            process.threads[thread_id].changeContext(delegate(ref CONTEXT ctx){ ctx.EFlags |= 1<<8; });
+        else if ( !enable )
+            process.threads[thread_id].changeContext(delegate(ref CONTEXT ctx){ ctx.EFlags &= ~(1<<8); });
+        single_step = enable;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void getExceptionNameMessage(size_t objPtr, out char[] class_name, out char[] msg)
+    {
+        // get thrown object's class name
+        ClassInfo ci = process.getClassInfo(objPtr);
+        class_name.length = ci.name.length;
+        process.readProcessMemory(cast(uint)ci.name.ptr, class_name.ptr, class_name.length);
+
+        // get object's data
+        uint[] objdata;
+        objdata.length = ci.init.length;
+        process.readProcessMemory(objPtr, objdata.ptr, objdata.length*uint.sizeof);
+
+        char[]	name;
+        name ~= class_name;
+        do
+        {
+            if ( name == "object.Exception" )
+            {
+                msg.length = objdata[2];
+                process.readProcessMemory(objdata[3], msg.ptr, msg.length);
+                break;
+            }
+
+            ubyte[] data;
+            data.length = ClassInfo.classinfo.init.length;
+            process.readProcessMemory(cast(uint)cast(void*)ci.base, data.ptr, data.length);
+            ci = cast(ClassInfo)data.ptr;
+            name.length = ci.name.length;
+            process.readProcessMemory(cast(uint)ci.name.ptr, name.ptr, name.length);
+        }
+        while ( ci.base !is null );
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    bool handleExceptionEvent(EXCEPTION_RECORD* exrec)
+    {
+        current_address = cast(uint)exrec.ExceptionAddress;
+        Lswitch: switch ( exrec.ExceptionCode )
+        {
+            case EXCEPTION_BREAKPOINT:
+                debug DbgIO.println("EXCEPTION_BREAKPOINT");
+                int bp_index;
+                Breakpoint bp = getBreakpoint(current_address, bp_index);
+                if ( bp !is null ) {
+                    handleBreakpoint(bp, bp_index);
+                    last_line = bp.line;
+                }
+                else
+                    ui.breakpoint(-1, new Breakpoint(images.findLocation(cast(uint)exrec.ExceptionAddress), false, 0, false), process.threads[thread_id]);
+                break;
+            case EXCEPTION_SINGLE_STEP:
+                debug DbgIO.println("EXCEPTION_SINGLE_STEP");
+                // check whether this is a HWBP or real single step
+                CONTEXT ctx;
+                process.threads[thread_id].getContext(ctx, CONTEXT_DEBUG_REGISTERS);
+
+                if ( (ctx.Dr6 & 0xf) > 0 )
+                {
+                    debug DbgIO.println("Hardware breakpoint");
+                    size_t dr = void;
+                    if ( ctx.Dr6 & 1 )
+                        dr = ctx.Dr0;
+                    else if ( ctx.Dr6 & 2 )
+                        dr = ctx.Dr1;
+                    else if ( ctx.Dr6 & 4 )
+                        dr = ctx.Dr2;
+                    else if ( ctx.Dr6 & 8 )
+                        dr = ctx.Dr3;
+                    int bp_index;
+                    foreach( i, bp; breakpoints )
+                    {
+                        if( !bp.hardware )
+                            continue;
+                        if ( dr == bp.address ) {
+                            handleBreakpoint(bp, i);
+                            break Lswitch;
+                        }
+                    }
+
+                    ui.breakpoint(-1, new Breakpoint(images.findLocation(dr), false, 0, false), process.threads[thread_id]);
+                }
+                else
+                {
+                    debug DbgIO.println("Single Step exception");
+                    // pause if interactive single step is active
+                    paused = single_step;
+
+                    if ( passing_breakpoint !is null )
+                    {
+                        debug DbgIO.println("passing breakpoint");
+                        activateSingleStep(false);
+                        paused = false;
+                        if ( process !is null && !passing_breakpoint.activate(process) )
+                            throw new DebuggerException("ERROR: Failed to write breakpoint opcode at %s:%d", passing_breakpoint.file, passing_breakpoint.line);
+                        passing_breakpoint = null;
+                    }
+                }
+                break;
+            // ctrl+c
+            case DBG_CONTROL_C:
+                ui.userInterrupt();
+                paused = true;
+                break;
+            // D exceptions
+            case STATUS_DIGITAL_MARS_D_EXCEPTION:
+                // normal non-post-mortem mode
+                if ( process !is null && !debug_event.Exception.dwFirstChance )
+                {
+                    char[] class_name, msg;
+                    getExceptionNameMessage(exrec.ExceptionInformation[0], class_name, msg);
+                    ui.exception(thread_id, class_name, msg, exrec.ExceptionInformation[0]);
+                    paused = true;
+                    return false;
+                }
+                // minidump mode
+                else if ( miniDump !is null )
+                {
+                    string  className,
+                            message;
+                    className = (cast(char*)exrec.ExceptionInformation[1])[0..exrec.ExceptionInformation[0]];
+                    message = (cast(char*)exrec.ExceptionInformation[3])[0..exrec.ExceptionInformation[2]];
+                    ui.exception(thread_id, className, message, 0);
+                    paused = true;
+                    return false;
+                }
+                paused = false;
+                return false;
+            default:
+                ui.win32exception(thread_id, exrec);
+                paused = true;
+                single_step = false;
+                return false;
+        }
+        return true;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void handleBreakpoint(Breakpoint bp, uint bp_index)
+    {
+        CONTEXT ctx;
+        if ( !process.threads[thread_id].getContext(ctx) )
+            throw new DebuggerException("Error: Couldn't GetThreadContext to reset instruction pointer: %s", lastError);
+
+        if ( !bp.hardware )
+        {
+            if ( process !is null && !bp.deactivate(process) )
+                throw new DebuggerException("ERROR: Failed to write opcode for breakpoint at %s:%d", bp.file, bp.line);
+
+            // adjust for "int 3" instruction byte
+            --ctx.Eip;
+            if ( !process.threads[thread_id].setContext(ctx) )
+                throw new DebuggerException("Error: Couldn't SetThreadContext to reset instruction pointer: %s", lastError);
+        }
+
+        // check if we have a constrained thread
+        if ( bp.threadId > 0 && thread_id != bp.threadId )
+        {
+            debug DbgIO.println("skipping bp in incorrect thread %d", thread_id);
+            if ( !bp.hardware ) {
+                passing_breakpoint = bp;
+                activateSingleStep(true);
+            }
+        }
+        // check if breakpoint requires a certain frame
+        else if ( bp.frame_ptr > 0 && bp.frame_ptr != ctx.Ebp )
+        {
+            debug DbgIO.println("skipping bp in incorrect frame, Ebp=0x%x required=0x%x", ctx.Ebp, bp.frame_ptr);
+            if ( !bp.hardware ) {
+                passing_breakpoint = bp;
+                activateSingleStep(true);
+            }
+        }
+        // restore non-temporary breakpoints
+        else if ( !bp.temporary )
+        {
+            ui.breakpoint(bp_index, bp, process.threads[thread_id]);
+            paused = true;
+            if ( !bp.hardware ) {
+                passing_breakpoint = bp;
+                activateSingleStep(true);
+            }
+        }
+        // propagate breakpoints to jmp/call/ret destination
+        else if ( bp.propagate )
+        {
+            debug DbgIO.println("propagate");
+            foreach ( tbp; temp_breakpoints )
+            {
+                if ( tbp.value is bp ) {
+                    temp_breakpoints.remove(tbp);
+                    break;
+                }
+            }
+            DisAsm.disasm(process, current_address, 0, (ud_t* ud_obj){return setPropagatedBreakpoint(ud_obj,bp);});
+        }
+        // temporary breakpoints
+        else
+        {
+            if ( bp.deactivate_d_exception_handler ) {
+                debug DbgIO.println("deactivateDExceptionHandler");
+                deactivateDExceptionHandler();
+            }
+            else {
+                clearTemporaryBreakpoints();
+                paused = ui.breakpoint(-1, bp, process.threads[thread_id]);
+            }
+        }
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void deactivateDExceptionHandler()
+    {
+        if ( main_image is null || main_image.codeView is null )
+            return;
+
+        // deactivate default D exception handling
+        bool found=false;
+        foreach ( ds; main_image.codeView.global_pub.data_symbols )
+        {
+            if ( ds.name_notype == "_no_catch_exceptions" ) {
+                uint address = ds.offset+main_image.getSectionBase(ds.cvdata.segment);
+                bool nce = true;
+                process.writeProcessMemory(address, &nce, bool.sizeof);
+                found = true;
+                break;
+            }
+            else if ( ds.name_notype == "_cr_trapExceptions"
+                || ds.name_notype == "_rt_trapExceptions" )
+            {
+                uint address = ds.offset+main_image.getSectionBase(ds.cvdata.segment);
+                bool nce = false;
+                process.writeProcessMemory(address, &nce, bool.sizeof);
+                found = true;
+                break;
+            }
+        }
+        if ( !found ) {
+            debug DbgIO.println("Neither Phobos nor Tango exception handler switch not found");
+        }
+    }
+
+    //=============================================================================================
+    // source&symbol handling
+
+    /**********************************************************************************************
+        Searches the cache for the given source file and loads it if nessecary.
+        Tries to load the source file from all source_search_paths.
+        Returns: Array of lines of the source file.
+    **********************************************************************************************/
+    string[] getSourceFile(string filename)
+    {
+        if ( filename is null || filename.length <= 0 )
+            return null;
+        if ( !(filename in source_files) )
+        {
+            string full = getFullSourcePath(filename);
+            if ( full is null || !exists(full) )
+                return null;
+            auto lines = splitlines(cast(string)read(full));
+            source_files[filename] = lines;
+        }
+        return source_files[filename];
+    }
+
+    /**********************************************************************************************
+        Tries to find the source file in all source_search_paths.
+        Returns: Full path of the file
+    **********************************************************************************************/
+    string getFullSourcePath(string filename)
+    {
+        string full = getFullPath(filename);
+        if ( exists(full) )
+            return full;
+        foreach ( string sp; source_search_paths )
+        {
+            full = getFullPath(sp~filename);
+            if ( exists(full) )
+                return full;
+        }
+        return filename;
+    }
+
+
+    //=============================================================================================
+    // breakpoint handling
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    bool setPropagatedBreakpoint(ud* ud_obj, Breakpoint prev_bp)
+    {
+        if ( ud_obj is null )
+            return true;
+
+        int bpi=-1;
+        Breakpoint bp;
+        if ( DisAsm.isConditionalJump(ud_obj.mnemonic)
+            || ud_obj.mnemonic == ud_mnemonic_code.UD_Ijmp
+            || ud_obj.mnemonic == ud_mnemonic_code.UD_Icall )
+        {
+            bool is_imm=false;
+            uint jmp_dest = DisAsm.calcJumpDestination(process, process.threads[thread_id], ud_obj, is_imm);
+            assert(!is_imm);
+            debug DbgIO.println("propagating jmp/call bp to 0x%x", jmp_dest);
+            Location loc = images.findLocation(jmp_dest);
+            if ( loc.file !is null )
+                bp = setBreakpoint(jmp_dest, bpi, thread_id);
+            else {
+                debug DbgIO.println("not source info available - checking for unconditional jmp at destination");
+                DisAsm.disasm(process, jmp_dest, 0, (ud_t* ud_obj){return propagateUncondJmp(ud_obj, prev_bp);});
+            }
+            if ( bp !is null )
+                bp.frame_ptr = prev_bp.frame_ptr;
+        }
+        else if ( ud_obj.mnemonic == ud_mnemonic_code.UD_Iret || ud_obj.mnemonic == ud_mnemonic_code.UD_Iretf )
+        {
+            uint index;
+            size_t ret_adr = (cast(uint[])stack.data)[0];
+            Location loc = images.findLocation(ret_adr);
+            if ( loc.file !is null )
+                bp = setBreakpoint(ret_adr, bpi, thread_id);
+            else
+                debug DbgIO.println("not setting BP on unknown ret address 0x%x", ret_adr);
+            if ( bp !is null )
+                bp.frame_ptr = prev_bp.frame_ptr;
+        }
+        else {
+            debug DbgIO.println("unknown instruction for propagating breakpoint");
+            assert(0);
+        }
+
+        return false;
+    }
+
+    /**********************************************************************************************
+        Propagate breakpoint if unconditional jump is found.
+        Used for virtual functions with redirectors.
+    **********************************************************************************************/
+    bool propagateUncondJmp(ud* ud_obj, Breakpoint prev_bp)
+    {
+        if ( ud_obj is null )
+            return true;
+
+        int bpi=-1;
+        Breakpoint bp;
+        if ( DisAsm.isConditionalJump(ud_obj.mnemonic)
+            || ud_obj.mnemonic == ud_mnemonic_code.UD_Icall )
+        {
+            debug DbgIO.println("aborting propagateUncondJmp: condJmp or call");
+            return false;
+        }
+        else if ( ud_obj.mnemonic == ud_mnemonic_code.UD_Ijmp )
+        {
+            bool is_imm=false;
+            uint jmp_dest = DisAsm.calcJumpDestination(process, process.threads[thread_id], ud_obj, is_imm);
+            debug DbgIO.println("propagating bp to 0x%x", jmp_dest);
+            Location loc = images.findLocation(jmp_dest);
+            if ( loc.file !is null )
+                bp = setBreakpoint(jmp_dest, bpi, thread_id);
+            else {
+                debug DbgIO.println("not source info available - checking for unconditional jmp at destination");
+            }
+            if ( bp !is null )
+                bp.frame_ptr = prev_bp.frame_ptr;
+
+            return false;
+        }
+        else if ( ud_obj.mnemonic == ud_mnemonic_code.UD_Iret || ud_obj.mnemonic == ud_mnemonic_code.UD_Iretf ) {
+            debug DbgIO.println("aborting propagateUncondJmp: ret");
+            return false;
+        }
+        else
+            return true;
+    }
+
+    /**********************************************************************************************
+        If the opcode is an immediate jump or a call, sets a temporary breakpoint
+        at it's destination. If it's a memory call, sets a call-propagating breakpoint at
+        the call instruction.
+    **********************************************************************************************/
+    bool setBranchBreakpoints(ud_t* ud_obj, StepMode mode)
+    {
+        // first call
+        if ( ud_obj is null )
+            return true;
+
+        int bpi=-1;
+        Breakpoint bp;
+
+        if ( DisAsm.isConditionalJump(ud_obj.mnemonic) || ud_obj.mnemonic == ud_mnemonic_code.UD_Ijmp )
+        {
+            if ( mode!=StepMode.e_out )
+            {
+                bool is_imm=true;
+                uint jmp_dest = DisAsm.calcJumpDestination(process, process.threads[thread_id], ud_obj, is_imm);
+                if ( is_imm )
+                    bp = setBreakpoint(jmp_dest, bpi, thread_id, false);
+                else
+                {
+                    // set propagating breakpoint
+                    bp = setBreakpoint(cast(size_t)ud_obj.insn_offset, bpi, thread_id, true);
+                    if ( bp !is null )
+                        bp.propagate = true;
+                }
+            }
+        }
+        else if ( ud_obj.mnemonic == ud_mnemonic_code.UD_Icall )
+        {
+            if ( mode==StepMode.e_in )
+            {
+                bool is_imm=true;
+                uint jmp_dest = DisAsm.calcJumpDestination(process, process.threads[thread_id], ud_obj, is_imm);
+                if ( is_imm )
+                {
+                    Location loc = images.findLocation(jmp_dest);
+                    if ( loc.file !is null )
+                        bp = setBreakpoint(jmp_dest, bpi, thread_id, false);
+                    else
+                        debug DbgIO.println("not setting BP on unknown call destination 0x%x", jmp_dest);
+                }
+                else
+                {
+                    // set propagating breakpoint
+                    bp = setBreakpoint(cast(size_t)ud_obj.insn_offset, bpi, thread_id, true);
+                    if ( bp !is null )
+                        bp.propagate = true;
+                }
+            }
+        }
+        else if ( ud_obj.mnemonic == ud_mnemonic_code.UD_Iret || ud_obj.mnemonic == ud_mnemonic_code.UD_Iretf )
+        {
+            if ( mode!=StepMode.e_out )
+            {
+                Location loc = images.findLocation(current_address);
+                if ( loc.scope_sym !is null && find(loc.scope_sym.mangled_name, "__foreachbody") >= 0 )
+                {
+                    ProcedureSymbol ps = cast(ProcedureSymbol)loc.scope_sym;
+                    if ( ps !is null )
+                    {
+                        setBreakpoint(ps.cvdata.offset+loc.getCodeBase, bpi, thread_id);
+                        uint ret_adr = getReturnAddress(images.findLocation(getReturnAddress(loc)));
+                        if ( ret_adr > 0 )
+                            setBreakpoint(ret_adr, bpi, thread_id);
+                    }
+                }
+                if ( mode != StepMode.e_over || loc.scope_sym is null || find(loc.scope_sym.mangled_name, "__foreachbody") < 0 )
+                {
+                    uint ret_adr = getReturnAddress(loc);
+                    if ( ret_adr > 0 )
+                    {
+                        debug DbgIO.println("setBranchBPs: using return address from frame");
+                        loc = images.findLocation(ret_adr);
+                        if ( loc.file !is null )
+                            bp = setBreakpoint(ret_adr, bpi, thread_id, true);
+                        else
+                            debug DbgIO.println("not setting BP on unknown ret address 0x%x", ret_adr);
+                    }
+                    else
+                    {
+                        bp = setBreakpoint(cast(size_t)ud_obj.insn_offset, bpi, thread_id, true);
+                        if ( bp !is null )
+                            bp.propagate = true;
+                    }
+                }
+            }
+            else
+            {
+                bp = setBreakpoint(cast(size_t)ud_obj.insn_offset, bpi, thread_id, true);
+                if ( bp !is null )
+                    bp.propagate = true;
+            }
+        }
+        return true;
+    }
+
+    /**********************************************************************************************
+        Removes breakpoint from list and deactivates it.
+        Returns: success
+    **********************************************************************************************/
+    bool removeBreakpoint(uint bp_index)
+    {
+        if ( bp_index in breakpoints )
+        {
+            Breakpoint bp = breakpoints[bp_index];
+            if ( process !is null && !bp.deactivate(process) )
+                throw new DebuggerException("ERROR: Failed to write breakpoint opcode at %s:%d", bp.file, bp.line);
+            breakpoints.remove(bp_index);
+            if ( passing_breakpoint is bp ) {
+                passing_breakpoint = null;
+                activateSingleStep(false);
+            }
+            delete bp;
+            return true;
+        }
+        return false;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void clearTemporaryBreakpoints()
+    {
+        debug DbgIO.println("clearing temporary breakpoints");
+        if ( process !is null )
+        {
+            foreach ( bp; temp_breakpoints )
+            {
+                if ( bp.value.foreach_end !is null && bp.value.foreach_end.address != current_address )
+                {
+                    if ( !bp.value.hardware )
+                        passing_breakpoint = bp.value;
+                    activateSingleStep(true);
+                    continue;
+                }
+                if ( !bp.value.deactivate(process) )
+                    throw new DebuggerException("ERROR: Failed to restore opcode for breakpoint at %s:%d", bp.value.file, bp.value.line);
+                temp_breakpoints.remove(bp);
+            }
+        }
+    }
+
+    /**********************************************************************************************
+        Creates a breakpoint at the given location and adds it with the given index.
+        Overwrites the breakpoint at the same index if existant.
+        Adds a temporary breakpoint instead if index < 0.
+        Reaturns: Existing breakpoint at the location or new breakpoint.
+    **********************************************************************************************/
+    Breakpoint setBreakpoint(Location loc, inout int new_index, uint threadId, bool hardware=false)
+    {
+        if ( loc is null )
+            return null;
+
+        // lookup existing breakpoint
+        Breakpoint bp;
+        if ( new_index >= 0 )
+        {
+            int bp_index;
+            bp = getBreakpoint(loc, bp_index);
+            if( bp !is null ) {
+                new_index = bp_index;
+                return bp;
+            }
+        }
+
+        // create a breakpoint
+        bp = new Breakpoint(loc, new_index<0, threadId, hardware);
+        addBreakpoint(bp, new_index);
+        return bp;
+    }
+
+    /**********************************************************************************************
+        Creates a breakpoint at the given address and adds it with the given index.
+        Overwrites the breakpoint at the same index if existant.
+        Adds a temporary breakpoint instead if index < 0.
+        Reaturns: Existing breakpoint at the address or new breakpoint.
+    **********************************************************************************************/
+    Breakpoint setBreakpoint(size_t address, inout int new_index, uint threadId, bool set_on_current_line=false, bool hardware=false)
+    {
+        Location loc = images.findLocation(address);
+
+        Breakpoint bp;
+        int bp_index;
+        bp = getBreakpoint(address, bp_index);
+        if( bp !is null ) {
+            debug DbgIO.println("instead 0x%08x using existing breakpoint at 0x%08x", address, bp.address);
+            new_index = bp_index;
+            return bp;
+        }
+
+        if ( !set_on_current_line && loc.codeblock !is null && current_address == loc.codeblock.start+loc.getCodeBase ) {
+            debug DbgIO.println("not setting bp at current 0x%08x", address);
+            return null;
+        }
+        bp = new Breakpoint(loc, new_index<0, threadId, hardware);
+        addBreakpoint(bp, new_index);
+        return bp;
+    }
+
+    /**********************************************************************************************
+        Adds the given breakpoint with at the given index.
+        Adds it as temporary breakpoint if new_index < 0.
+        Activates the breakpoint.
+    **********************************************************************************************/
+    void addBreakpoint(Breakpoint bp, int new_index)
+    {
+        // add to breakpoint list
+        if ( bp.temporary )
+            temp_breakpoints ~= bp;
+        else
+            breakpoints[new_index] = bp;
+
+        // set breakpoing as active in debugger
+        if ( process !is null && !bp.activate(process) )
+            throw new DebuggerException("ERROR: Failed to write breakpoint opcode at %s:%d", bp.file, bp.line);
+    }
+
+    /**********************************************************************************************
+        Searches the breakpoints for one that is set at the given source
+        location.
+        Returns: Index of the breakpoint in the breakpoints array.
+    **********************************************************************************************/
+    Breakpoint getBreakpoint(Location loc, out int bp_index)
+    {
+        foreach( uint i, Breakpoint bp; breakpoints )
+        {
+            if( !bp.hardware && bp.file == loc.file && bp.line == loc.line
+                || bp.hardware && bp.address == loc.address )
+            {
+                bp_index = i;
+                return bp;
+            }
+        }
+        foreach( bp; temp_breakpoints )
+        {
+            if( !bp.value.hardware && bp.value.file == loc.file && bp.value.line == loc.line
+                || bp.value.hardware && bp.value.address == loc.address )
+            {
+                bp_index = -1;
+                return bp.value;
+            }
+        }
+        return getBreakpoint(loc.address, bp_index);
+    }
+
+    /**********************************************************************************************
+        Searches for a breakpoint at the given address.
+        Returns: Index of breakpoint in breakpoints array.
+    **********************************************************************************************/
+    Breakpoint getBreakpoint(uint address, out int bp_index)
+    {
+        foreach ( uint i, Breakpoint bp; breakpoints )
+        {
+            if ( bp.address == address ) {
+                bp_index = i;
+                return bp;
+            }
+        }
+        foreach ( bp; temp_breakpoints )
+        {
+            if ( bp.value.address == address ) {
+                bp_index = -1;
+                return bp.value;
+            }
+        }
+        return null;
+    }
+
+    //=============================================================================================
+    // Minidumps
+
+    void writeMiniDump(string filename)
+    {
+        char[] class_name, msg;
+        if ( exceptionRecord !is null
+            && exceptionRecord.ExceptionCode != EXCEPTION_BREAKPOINT
+            && exceptionRecord.ExceptionCode != EXCEPTION_SINGLE_STEP
+            && exceptionRecord.ExceptionCode != DBG_CONTROL_C )
+        {
+            getExceptionNameMessage(exceptionRecord.ExceptionInformation[0], class_name, msg);
+        }
+        MiniDump.writeMiniDump(filename, process, thread_id, exceptionRecord, class_name, msg);
+    }
+
+    void readMiniDump(string filename)
+    {
+        try {
+            miniDump = new MiniDump(filename);
+            selectThread(miniDump.threads[miniDump.selectedThread].ThreadId);
+            if ( miniDump.exceptionRecord !is null )
+                handleExceptionEvent(miniDump.exceptionRecord);
+            else
+                thread_id = miniDump.threadInfo.currentThreadId;
+            //miniDump.threadInfo.mainThreadId
+        }
+        catch ( Exception e )
+            DbgIO.writeln("Error: "~e.msg);
+        //return miniDump !is null;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/disasm.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,162 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+
+import util;
+import dbgprocess;
+import dbgthread;
+public import udis86;
+import util;
+
+import std.string;
+
+import win32.winnt;
+
+class DisAsm
+{
+    /**********************************************************************************************
+        Calculates the absolute destination address of a jxx or call instruction.
+        Params: is_imm = if true, only JIMM destinations will be considered. Out value is whether destination was JIMM
+    **********************************************************************************************/
+	static int calcJumpDestination(DbgProcess process, DbgThread thread, ud_t* ud_obj, inout bool is_imm)
+	{
+		if ( !isConditionalJump(ud_obj.mnemonic)
+			&& ud_obj.mnemonic != ud_mnemonic_code.UD_Icall
+			&& ud_obj.mnemonic != ud_mnemonic_code.UD_Ijmp )
+			return 0;
+
+		uint address, destination;
+		if ( ud_obj.operand[0].type == ud_type.UD_OP_MEM || ud_obj.operand[0].type == ud_type.UD_OP_REG )
+		{
+			if ( is_imm ) {
+				is_imm = false;
+				return 0;
+			}
+			is_imm = false;
+			CONTEXT ctx;
+			thread.getContext(ctx, CONTEXT_FULL);
+			switch ( ud_obj.operand[0].base )
+			{
+			    case ud_type.UD_NONE:   break;
+				case ud_type.UD_R_EAX:	address = ctx.Eax;	break;
+				case ud_type.UD_R_EBX:	address = ctx.Ebx;	break;
+				case ud_type.UD_R_ECX:	address = ctx.Ecx;	break;
+				case ud_type.UD_R_EDX:	address = ctx.Edx;	break;
+				case ud_type.UD_R_ESI:	address = ctx.Esi;	break;
+				case ud_type.UD_R_EDI:	address = ctx.Edi;	break;
+				default:
+					DbgIO.println("WARNING: yet unsupported register 0x%x used in jmp/call destination", ud_obj.operand[0].base);
+					break;
+			}
+			if ( ud_obj.operand[0].type == ud_type.UD_OP_MEM )
+			{
+                switch ( ud_obj.operand[0].offset )
+                {
+                    case 8:		address += ud_obj.operand[0].lval._ubyte;	break;
+                    case 16:	address += ud_obj.operand[0].lval.uword;	break;
+                    case 32:	address += ud_obj.operand[0].lval.udword;	break;
+                    default:
+                        DbgIO.println("WARNING: yet unsupported offset size used in jmp/call destination");
+                        break;
+                }
+                process.readProcessMemory(address, &destination, uint.sizeof);
+			}
+			else
+                destination = address;
+		}
+		else if ( ud_obj.operand[0].type == ud_type.UD_OP_JIMM )
+		{
+			is_imm = true;
+			address		= cast(uint)ud_insn_off(ud_obj);
+			destination	= address+ud_insn_len(ud_obj);
+			switch ( ud_obj.operand[0].size )
+			{
+				case 8:
+					destination += ud_obj.operand[0].lval.sbyte;
+					break;
+				case 16:
+					destination += ud_obj.operand[0].lval.sword;
+					break;
+				case 32:
+					destination += ud_obj.operand[0].lval.sdword;
+					break;
+				case 48:
+					DbgIO.println("WARNING: 48bit immediate jump destinations not implemented, yet");
+					break;
+				case 64:
+					DbgIO.println("WARNING: 64bit immediate jump destinations not implemented, yet");
+					break;
+                default:
+                    assert(0);
+			}
+		}
+		else
+			DbgIO.println("yet unsupported jmp/call destination");
+		return destination;
+	}
+
+    /**********************************************************************************************
+        Test if given mnemonic a a conditional jump (i.e. jxx, not jmp).
+    **********************************************************************************************/
+	static bool isConditionalJump(ud_mnemonic_code opcode)
+	{
+		if ( ud_mnemonic_code.UD_Ijmp == opcode )
+			return false;
+		if ( ud_mnemonic_code.UD_Ijcxz <= opcode && ud_mnemonic_code.UD_Ijnle >= opcode )
+			return true;
+		if ( ud_mnemonic_code.UD_Ija <= opcode && ud_mnemonic_code.UD_Ijnc >= opcode )
+			return true;
+		if ( ud_mnemonic_code.UD_Iloop <= opcode && ud_mnemonic_code.UD_Iloopz >= opcode )
+			return true;
+		return false;
+	}
+
+    /**********************************************************************************************
+        Wrapper function for disassembly. Calls the delegate callback for each instruction.
+    **********************************************************************************************/
+	static void disasm(DbgProcess process, uint start, uint stop, bool delegate(ud_t*) callback)
+	{
+		ubyte[]	code;
+
+		bool disasm(uint length, bool abort_at_ret)
+		{
+			ud_t	ud_obj;
+			ud_init(&ud_obj);
+			ud_set_pc(&ud_obj, start);
+			ud_set_input_buffer(&ud_obj, code.ptr, length);
+			ud_set_mode(&ud_obj, 32);
+			ud_set_syntax(&ud_obj, &ud_translate_intel);
+
+			// init callback
+			callback(cast(ud_t*)null);
+
+			while ( ud_disassemble(&ud_obj) )
+			{
+				if ( !callback(&ud_obj) )
+					return false;
+				if ( abort_at_ret && (ud_obj.mnemonic == ud_mnemonic_code.UD_Iret || ud_obj.mnemonic == ud_mnemonic_code.UD_Iretf) )
+					return false;
+			}
+			return true;
+		}
+
+		if ( stop > 0 && stop <= start ) {
+			DbgIO.println("ERROR: invalid address range: Eip=0x%x >= 0x%x", start, stop);
+			return;
+		}
+
+		code.length = stop>0?stop-start:512;
+		bool more;
+		uint read;
+		do
+		{
+			read = process.readProcessMemory(start, code.ptr, code.length);
+			if ( read == 0 )
+				DbgIO.println("ERROR: Couldn't read from process' memory for disassembly: %s", lastError);
+			if ( read > 0 )
+				more = disasm(read, stop==0);
+			start += code.length;
+		} while ( stop == 0 && more && read > 0 );
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/expression/datahandler.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,599 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+module expression.datahandler;
+
+import std.string;
+import std.utf;
+
+import codeview.codeview;
+import codeview.decl;
+import dbgprocess;
+import util;
+import minidump;
+import expression.evaluationcontext;
+
+import internal.aaA;
+
+T min(T)(T a, T b)
+{
+    return a<b?a:b;
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class SymbolValue
+{
+    string          name,
+                    value;
+    SymbolValue[]   children;
+
+    this() {}
+
+    this(string v)
+    {
+        value = v;
+    }
+
+    this(string n, string v)
+    {
+        name = n;
+        value = v;
+    }
+}
+
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class DataHandler
+{
+	static DataHandler[string] s_dataHandlerRegistry;
+	static uint max_elem_count = 32;
+
+	static this()
+	{
+		s_dataHandlerRegistry["b"] = new DataHandler_bool;
+		s_dataHandlerRegistry["a"] = new DataHandler_num;
+		s_dataHandlerRegistry["w"] = new DataHandler_num;
+		s_dataHandlerRegistry["u"] = new DataHandler_num;
+		s_dataHandlerRegistry["g"] = new DataHandler_num;
+		s_dataHandlerRegistry["h"] = new DataHandler_num;
+		s_dataHandlerRegistry["i"] = new DataHandler_num;
+		s_dataHandlerRegistry["l"] = new DataHandler_num;
+		s_dataHandlerRegistry["k"] = new DataHandler_num;
+		s_dataHandlerRegistry["m"] = new DataHandler_num;
+		s_dataHandlerRegistry["s"] = new DataHandler_num;
+		s_dataHandlerRegistry["t"] = new DataHandler_num;
+		s_dataHandlerRegistry["v"] = new DataHandler_num;
+		s_dataHandlerRegistry["f"] = new DataHandler_num;
+		s_dataHandlerRegistry["d"] = new DataHandler_num;
+		s_dataHandlerRegistry["e"] = new DataHandler_num;
+		s_dataHandlerRegistry["x"] = new DataHandler_num;
+		s_dataHandlerRegistry["Aa"] = new DataHandler_string;
+		s_dataHandlerRegistry["Au"] = new DataHandler_string;
+		s_dataHandlerRegistry["Aw"] = new DataHandler_string;
+		s_dataHandlerRegistry["P*"] = new DataHandler_num;
+		s_dataHandlerRegistry["A*"] = new DataHandler_A;
+		s_dataHandlerRegistry["G*"] = new DataHandler_G;
+		s_dataHandlerRegistry["S*"] = new DataHandler_SCU;
+		s_dataHandlerRegistry["C*"] = new DataHandler_SCU;
+		s_dataHandlerRegistry["PC*"] = new DataHandler_SCU;
+		s_dataHandlerRegistry["E*"] = new DataHandler_E;
+		s_dataHandlerRegistry["H*"] = new DataHandler_H;
+	}
+
+    static SymbolValue handle(EvaluationContext ctx, string type, ubyte[] data, int depth)
+    {
+		if ( type.length <= 0 )
+			return null;
+
+		DataHandler* handler = type in s_dataHandlerRegistry;
+		if ( type.length > 1 && handler is null )
+			handler = type[0..2]~"*" in s_dataHandlerRegistry;
+		if ( handler is null )
+			handler = type[0]~"*" in s_dataHandlerRegistry;
+
+        SymbolValue val;
+		if ( handler !is null ) {
+			debug(datahandler) DbgIO.println("%s is handling data", handler.classinfo.name);
+			val = handler.toString(ctx, type, data, depth);
+		}
+		return val;
+	}
+
+	abstract SymbolValue toString(EvaluationContext ctx, string mangled_type, ubyte[] data, int depth);
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class DataHandler_H : DataHandler
+{
+	SymbolValue toString(EvaluationContext ctx, string mangled_type, ubyte[] data, int depth)
+	{
+	    SymbolValue val = new SymbolValue;
+
+		size_t ptr = (cast(size_t[])data)[0];
+		if ( ptr == 0 ) {
+			val.value = "null";
+	        return val;
+		}
+
+	    if ( depth == 0 ) {
+	        val.value = "...";
+	        return val;
+	    }
+
+		int i;
+		pragma(msg, TODO(__FILE__,__LINE__,"allow named types (C,S,D,F, etc.)"));
+		for ( i = 1; i < mangled_type.length && find(lowercase, mangled_type[i]) < 0; ++i ) {}
+
+		string		key_type	= mangled_type[1..i+1],
+					val_type	= mangled_type[i+1..$];
+        size_t      val_tsize   = ctx.codeView.sizeofMangled(val_type),
+                    key_tsize	= ctx.codeView.sizeofMangled(key_type);
+
+        if ( key_type.length == 0 ) {
+            val.value = "invalid key type "~key_type;
+            return val;
+        }
+        if ( val_type.length == 0 ) {
+            val.value = "invalid val type "~val_type;
+            return val;
+        }
+
+		bool evalaaA(void* ptr)
+		{
+			if ( ptr is null )
+				return true;
+			ubyte[] data;
+			size_t len = aaA.sizeof+key_tsize+val_tsize;
+			data = ctx.readMemory(cast(size_t)ptr, len);
+			if ( data is null )
+                return false;
+
+			uint i=aaA.sizeof;
+			SymbolValue k = handle(ctx, key_type, data[i..i+key_tsize], depth>0?depth-1:depth);
+			i += key_tsize;
+			SymbolValue v = handle(ctx, val_type, data[i..i+val_tsize], depth>0?depth-1:depth);
+			v.name = k.value;
+			val.children ~= v;
+			return true;
+		}
+
+		bool evalBB(uint ptr)
+		{
+			ubyte[] data = ctx.readMemory(cast(size_t)ptr, BB.sizeof);
+			if ( data is null )
+                return false;
+
+			BB* bb = cast(BB*)data.ptr;
+            size_t blen = bb.b.length*size_t.sizeof;
+			debug DbgIO.println("%d nodes, bb.b.length=%d", bb.nodes, bb.b.length);
+
+			data = ctx.readMemory(cast(size_t)bb.b.ptr, blen);
+			if ( data is null )
+                return false;
+			bb.b = cast(aaA*[])data;
+
+			foreach ( a; bb.b )
+			{
+			    if ( !evalaaA(a) )
+                    return false;
+			}
+			return true;
+		}
+
+		if ( !evalBB(ptr) )
+            val.value = format("invalid AA pointer 0x%x", ptr);
+
+		return val;
+	}
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class DataHandler_E : DataHandler
+{
+	SymbolValue toString(EvaluationContext ctx, string mangled_type, ubyte[] data, int depth)
+	{
+	    SymbolValue val = new SymbolValue;
+		string	mangled = mangled_type[1..$].dup,
+				name;
+ 		name = demangleNameSkip(mangled);
+		if ( (name in ctx.codeView.UDTsByName) !is null )
+		{
+			LeafEnum lf = cast(LeafEnum)ctx.codeView.UDTsByName[name];
+			if ( lf is null ) {
+				val.value = "invalid codeview information for enum type "~name;
+				return val;
+			}
+			uint index = lf.field-0x1000;
+			if ( index >= ctx.codeView.type_strings.length ) {
+				val.value = "invalid codeview information for enum type "~name;
+				return val;
+			}
+			LeafFieldList fields = cast(LeafFieldList)ctx.codeView.type_strings[lf.field-0x1000][0];
+			if ( fields is null ) {
+				val.value = "invalid codeview information for enum type "~name;
+				return val;
+			}
+			assert(data.length >= 4);
+			uint value = (cast(uint[])data)[0];
+			foreach ( f; fields.fields )
+			{
+				LeafEnumNameValue ef = cast(LeafEnumNameValue)f;
+				assert(ef !is null);
+				if ( ef.value.getUint == value ) {
+					val.value = ef.name;
+					return val;
+				}
+			}
+			val.value = "invalid enum value";
+		}
+		else
+			val.value = "unknown enum type "~name;
+        return val;
+	}
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class DataHandler_SCU : DataHandler
+{
+	SymbolValue toString(EvaluationContext ctx, string mangled_type, ubyte[] data, int depth)
+	{
+	    SymbolValue val = new SymbolValue;
+
+		string	scu_name_mangled,
+				scu_name;
+		if ( mangled_type[0] == 'P' )
+		{
+		    assert(data.length==size_t.sizeof);
+            if ( *cast(size_t*)data.ptr == 0 ) {
+                val.value = "null";
+                return val;
+            }
+			scu_name_mangled = mangled_type[2..$].dup;
+		}
+		else
+			scu_name_mangled = mangled_type[1..$].dup;
+ 		scu_name = demangleNameSkip(scu_name_mangled);
+
+	    if ( depth == 0 ) {
+	        val.value = "...";
+	        return val;
+	    }
+
+		if ( (scu_name in ctx.codeView.UDTsByName) is null ) {
+            val.value = format("unknown type %s", scu_name);
+            return val;
+		}
+
+		LeafClassStruc  lcs;
+		LeafUnion       lu;
+
+		LeafFieldList   lfl;
+		uint            type_length;
+
+        lcs = cast(LeafClassStruc)ctx.codeView.UDTsByName[scu_name];
+        debug DbgIO.println("%s %x", scu_name, lcs.field);
+        if ( lcs !is null && lcs.field-0x1000 < ctx.codeView.type_strings.length ) {
+            lfl = cast(LeafFieldList)ctx.codeView.type_strings[lcs.field-0x1000][0];
+            type_length = lcs.length.getUint();
+        }
+        else
+        {
+            lu = cast(LeafUnion)ctx.codeView.UDTsByName[scu_name];
+            if ( lu !is null && lu.field-0x1000 < ctx.codeView.type_strings.length ) {
+                lfl = cast(LeafFieldList)ctx.codeView.type_strings[lu.field-0x1000][0];
+                type_length = lu.length.getUint();
+            }
+        }
+
+		if ( lfl is null ) {
+			val.value = "{no debug symbols available}";
+			return val;
+		}
+
+		ubyte[] tmpdata;
+		if ( mangled_type[0] == 'P' || mangled_type[0] == 'C' )
+		{
+			assert(data.length==size_t.sizeof);
+			debug(datahandler) DbgIO.println("dereferencing class/struct reference at 0x%x", *cast(size_t*)data.ptr);
+			tmpdata = ctx.readMemory(*cast(size_t*)data.ptr, type_length);
+			if ( tmpdata is null ) {
+				val.value = format("invalid class pointer 0x%08x", *cast(size_t*)data.ptr);
+				return val;
+			}
+		}
+		else
+			tmpdata = data;
+
+		void listMembers(LeafFieldList lfl, SymbolValue root)
+		{
+			foreach ( l; lfl.fields )
+			{
+				if ( l.leaf_index == LF_BCLASS_16t )
+				{
+					LeafBaseClass lbc = cast(LeafBaseClass)l;
+					assert ( lbc !is null );
+					if ( lbc.type-0x1000 >= ctx.codeView.type_strings.length ) {
+						root.children ~= new SymbolValue("unknown base class "~format("0x%04x", lbc.type));
+						continue;
+					}
+					LeafClassStruc lcs = cast(LeafClassStruc)ctx.codeView.type_strings[lbc.type-0x1000][0];
+					assert ( lcs !is null );
+					if ( lcs.field == 0 )
+						continue;
+					if ( lcs.field-0x1000 >= ctx.codeView.type_strings.length ) {
+						root.children ~= new SymbolValue("unknown field list "~format("0x%04x", lcs.field));
+						continue;
+					}
+					Leaf[] fields = ctx.codeView.type_strings[lcs.field-0x1000];
+					debug(datahandler) DbgIO.println("processing base class ", lcs.name);
+
+                    SymbolValue v = new SymbolValue;
+                    v.name = lcs.name;
+                    listMembers(cast(LeafFieldList)fields[0], v);
+					root.children ~= v;
+				}
+				else if ( l.leaf_index == LF_MEMBER_16t )
+				{
+					LeafMember lm = cast(LeafMember)l;
+					assert ( lm !is null );
+					uint	size	= ctx.codeView.sizeofCV(lm.type),
+							offset	= lm.offset.getUint;
+
+                    LeafPointer lp;
+                    bool seen_type;
+                    if ( lm.type >= 0x1000 && lm.type-0x1000 < ctx.codeView.type_strings.length )
+                        lp = cast(LeafPointer)ctx.codeView.type_strings[lm.type-0x1000][0];
+                    if ( depth > 0 )
+                    {
+                        debug(datahandler) DbgIO.println("processing member %s cvtype 0x%x mangled %s", lm.name, lm.type, ctx.codeView.mangleCVtype(lm.type));
+                        if ( offset+size > tmpdata.length )
+                            root.children ~= new SymbolValue(lm.name, format("invalid: offset=0x%x size=%d", offset, size));
+                        else
+                        {
+                            SymbolValue v = handle(ctx, ctx.codeView.mangleCVtype(lm.type), tmpdata[offset..offset+size], depth>0?depth-1:depth);
+                            if ( v !is null ) {
+                                v.name = lm.name;
+                                root.children ~= v;
+                            }
+                            else
+                                root.children ~= new SymbolValue(lm.name, "null");
+                        }
+                    }
+				}
+			}
+		}
+
+        listMembers(lfl, val);
+		return val;
+	}
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class DataHandler_A : DataHandler
+{
+	SymbolValue toString(EvaluationContext ctx, string mangled_type, ubyte[] data, int depth)
+	{
+	    SymbolValue val = new SymbolValue;
+		size_t[] idata  = cast(size_t[])data;
+
+		if ( idata[1] == 0 ) {
+			val.value = "null";
+			return val;
+		}
+
+	    if ( depth == 0 ) {
+	        val.value = "...";
+	        return val;
+	    }
+
+		mangled_type = mangled_type[1..$];
+		uint    elm_size    = ctx.codeView.sizeofMangled(mangled_type);
+		size_t  alen        = min(idata[0],max_elem_count)*elm_size;
+
+		ubyte[]	tmpdata = ctx.readMemory(idata[1], alen);
+		if ( tmpdata is null )
+			val.value = format("invalid array: ptr=0x%08x $=%d", idata[1], idata[0]);
+        else
+        {
+            uint off_end = tmpdata.length;
+            for ( uint i = 0, off=0; off < off_end; ++i, off+=elm_size ) {
+                SymbolValue v = handle(ctx, mangled_type, tmpdata[off..off+elm_size], depth>0?depth-1:depth);
+                if ( v is null )
+                    val.children ~= new SymbolValue("["~.toString(i)~"]", "null");
+                else {
+                    v.name = "["~.toString(i)~"]";
+                    val.children ~= v;
+                }
+            }
+            if ( idata[0] > max_elem_count )
+                val.children ~= new SymbolValue("... $", format("%d", idata[0]));
+        }
+		return val;
+	}
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class DataHandler_G : DataHandler
+{
+	SymbolValue toString(EvaluationContext ctx, string mangled_type, ubyte[] data, int depth)
+	{
+        SymbolValue val = new SymbolValue;
+
+	    if ( depth == 0 ) {
+	        val.value = "...";
+	        return val;
+	    }
+
+        mangled_type = mangled_type[1..$];
+        uint	count       = parseNumber(mangled_type),
+                elm_size    = ctx.codeView.sizeofMangled(mangled_type),
+                off_end     = min(count,max_elem_count)*elm_size;
+        if ( count*elm_size != data.length )
+            throw new EvaluationException("unexpected data length: have "~.toString(data.length)~" should be "~.toString(count*elm_size));
+        for ( uint i = 0, off=0; off < off_end; ++i, off+=elm_size ) {
+            SymbolValue v = handle(ctx, mangled_type, data[off..off+elm_size], depth>0?depth-1:depth);
+            if ( v is null )
+                val.children ~= new SymbolValue("["~.toString(i)~"]", "null");
+            else {
+                v.name = "["~.toString(i)~"]";
+                val.children ~= v;
+            }
+        }
+        if ( count > max_elem_count )
+            val.children ~= new SymbolValue("... $", format("%d", count));
+		return val;
+	}
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class DataHandler_string : DataHandler
+{
+	SymbolValue toString(EvaluationContext ctx, string mangled_type, ubyte[] data, int depth)
+	{
+	    SymbolValue val = new SymbolValue;
+
+        string str;
+		uint[] idata = cast(uint[])data;
+		if ( idata[1] == 0 ) {
+		    val.value = "null";
+		    return val;
+		}
+
+        assert(mangled_type[0] == 'A');
+
+        switch ( mangled_type[1] )
+        {
+            case 'a':
+                str = cast(string)ctx.readMemory(idata[1], idata[0]);
+                if ( str is null ) {
+                    val.value = format("invalid string: ptr=0x%08x $=%d", idata[1], idata[0]);
+                    return val;
+                }
+                break;
+            case 'u':
+                wstring wstr;
+                size_t len = idata[0]*wchar.sizeof;
+
+                wstr = cast(wstring)ctx.readMemory(idata[1], len);
+                if ( wstr is null ) {
+                    val.value = format("invalid string: ptr=0x%08x $=%d", idata[1], idata[0]);
+                    return val;
+                }
+                str = toUTF8(wstr);
+                break;
+            case 'w':
+                dstring dstr;
+                size_t len = idata[0]*dchar.sizeof;
+
+                dstr = cast(dstring)ctx.readMemory(idata[1], len);
+                if ( dstr is null ) {
+                    val.value = format("invalid string: ptr=0x%08x $=%d", idata[1], idata[0]);
+                    return val;
+                }
+                str = toUTF8(dstr);
+                break;
+            default:
+                assert(0);
+        }
+        val.value = "\""~replace(replace(str, "\\", "\\\\"), "\"", "\\\"")~"\"";
+		return val;
+	}
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class DataHandler_num : DataHandler
+{
+	SymbolValue toString(EvaluationContext ctx, string mangled_type, ubyte[] data, int depth)
+	{
+	    SymbolValue val = new SymbolValue;
+		switch ( mangled_type[0] )
+		{
+			case 'a':
+				val.value = (cast(char[])data)[0..1];
+				break;
+			//~ case 'u':
+                //~ val.value = toUTF8((cast(wchar[])data)[0..1]);
+				//~ break;
+			case 'w':
+                val.value = toUTF8((cast(dchar[])data)[0..1]);
+				break;
+			case 'g':
+				val.value = format("%d", (cast(byte[])data)[0]);
+				break;
+			case 'h':
+				val.value = format("%d", (cast(ubyte[])data)[0]);
+				break;
+			case 's':
+				val.value = format("%d", (cast(short[])data)[0]);
+				break;
+			case 't':
+			case 'u':
+				val.value = format("%d", (cast(ushort[])data)[0]);
+				break;
+			case 'i':
+				val.value = format("%d", (cast(int[])data)[0]);
+				break;
+			case 'P':
+			case 'v':
+			case 'k':
+				val.value = format("0x%08x", (cast(uint[])data)[0]);
+				break;
+			case 'l':
+				val.value = format("%d", (cast(long[])data)[0]);
+				break;
+			case 'm':
+				val.value = format("%d", (cast(ulong[])data)[0]);
+				break;
+			case 'f':
+				val.value = format("% .6g", (cast(float[])data)[0]);
+				break;
+			case 'd':
+				val.value = format("% .12g", (cast(double[])data)[0]);
+				break;
+			case 'e':
+				val.value = format("% .16g", (cast(real[])data)[0]);
+				break;
+			case 'x':
+			case 'b':
+				val.value = format("%s", (cast(bool[])data)[0]?"true":"false");
+				break;
+			default:
+				assert(0, mangled_type);
+		}
+		return val;
+	}
+}
+
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class DataHandler_bool : DataHandler
+{
+	SymbolValue toString(EvaluationContext ctx, string mangled_type, ubyte[] data, int depth)
+	{
+	    SymbolValue val = new SymbolValue;
+		assert(mangled_type[0]=='b');
+		val.value = format("%s", (cast(bool[])data)[0]);
+		return val;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/expression/evaluationcontext.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,320 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+module expression.evaluationcontext;
+
+import container;
+import codeview.decl;
+import codeview.codeview;
+import minidump;
+import dbgprocess;
+import dbgthread;
+import callstack;
+import util;
+import expression.datahandler;
+
+import std.string;
+
+import win32.winnt;
+
+class EvaluationException : Exception
+{
+	this(string m) { super(m); }
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class SymbolData
+{
+    string  type;
+    bool    defered_load;
+
+    union
+    {
+        ubyte[] data;
+        struct {
+            size_t  len,
+                    ptr;
+        }
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    ubyte[] getData(EvaluationContext ctx)
+    {
+		if ( defered_load )
+		{
+            debug(eval) DbgIO.println("defered load: ptr=%x len=%d", ptr, len);
+			defered_load = false;
+			data = ctx.readMemory(ptr, len);
+		}
+        return data;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    bool loadElementSlice(size_t start, size_t end, CodeView cv)
+    {
+        assert(end>=start);
+        size_t size = cv.sizeofMangled(type);
+        start *= size;
+        end *= size;
+        if ( defered_load )
+        {
+            if ( end > len )
+                return false;
+            ptr += start;
+            len = end-start;
+        }
+        else
+        {
+            if ( end > data.length )
+                return false;
+            data = data[start..end];
+        }
+        return true;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    bool loadByteSlice(size_t start, size_t end)
+    {
+        assert(end>=start);
+        if ( defered_load )
+        {
+            if ( end > len )
+                return false;
+            ptr += start;
+            len = end-start;
+        }
+        else
+        {
+            if ( end > data.length )
+                return false;
+            data = data[start..end];
+        }
+        return true;
+    }
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class EvaluationContext
+{
+    CodeView    codeView;
+	MiniDump    miniDump;
+	DbgProcess  process;
+	DbgThread   thread;
+
+	uint        frameLevel;
+	CallStack   stack;
+	ScopeSymbol scopeSym;
+
+    NamedSymbol[]   scopeSymbols;
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    this(CodeView _cv,
+		uint _current_address,
+		MiniDump _miniDump,
+		DbgProcess _process,
+		DbgThread _thread,
+		CallStack _stack,
+		uint _frame_level=0
+    )
+    {
+        miniDump = _miniDump;
+        thread = _thread;
+        codeView = _cv;
+        process = _process;
+        stack = _stack;
+        frameLevel = _frame_level;
+
+		uint segment;
+		scopeSym = codeView.findProcedureSymbol(_current_address);
+        for ( ; scopeSym !is null; scopeSym = scopeSym.parent_scope )
+        {
+            scopeSymbols ~= scopeSym.symbols.named_symbols;
+            ProcedureSymbol psym = cast(ProcedureSymbol)scopeSym;
+            if ( psym !is null )
+                scopeSymbols ~= psym.arguments.named_symbols;
+		}
+    }
+
+    bool getContext(out CONTEXT ctx, uint context_flags)
+    {
+        if ( process !is null )
+            return thread.getContext(ctx, context_flags);
+        else if ( miniDump !is null ) {
+            CONTEXT* ptr = miniDump.getContext;
+            if ( ptr !is null ) {
+                ctx = *ptr;
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    NamedSymbol findSymbol(string name, inout NamedSymbol[] symbols)
+    {
+        if ( symbols is null )
+        {
+            StringWrap sw = new StringWrap(name);
+            AVLNode!(NamedSymbol) res;
+            if ( codeView.globalNamedSymbols.find(sw, res) )
+            {
+                NamedSymbol ns = res.value;
+                ScopeSymbol scopesym = cast(ScopeSymbol)ns;
+                if ( scopesym is null )
+                    return ns;
+                symbols = scopesym.symbols.named_symbols;
+                return null;
+            }
+            foreach ( ns; scopeSymbols )
+            {
+                if ( name == ns.name_notype )
+                {
+                    debug(findSymbol) DbgIO.println("%s == %s", name, ns.name_notype);
+                    ScopeSymbol scopesym = cast(ScopeSymbol)ns;
+                    if ( scopesym is null )
+                        return ns;
+                    symbols = scopesym.symbols.named_symbols;
+                    return null;
+                }
+            }
+        }
+        else
+        {
+            foreach ( ns; symbols )
+            {
+                if ( name == ns.name_notype )
+                {
+                    debug(findSymbol) DbgIO.println("%s == %s", name, ns.name_notype);
+                    ScopeSymbol scopesym = cast(ScopeSymbol)ns;
+                    if ( scopesym is null )
+                        return ns;
+                    symbols = scopesym.symbols.named_symbols;
+                    return null;
+                }
+            }
+        }
+        return null;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    SymbolData loadSymbolData(NamedSymbol symbol)
+    {
+        StackSymbol stacksym = cast(StackSymbol)symbol;
+        SymbolData symdata = new SymbolData;
+        if ( stacksym !is null )
+        {
+            if ( stacksym.size == 0 )
+                stacksym.size = codeView.sizeofCV(stacksym.cvdata.type);
+            debug(eval) DbgIO.println("reading stack symbol size=%d cv type 0x%x", stacksym.size, stacksym.cvdata.type);
+            if ( !stack.loadSymbolData(stacksym, symdata, frameLevel) )
+                throw new EvaluationException("Couldn't load stack symbol "~symbol.name_notype);
+        }
+        else
+        {
+            DataSymbol datasym = cast(DataSymbol)symbol;
+            if ( datasym !is null )
+            {
+                if ( datasym.size == 0 )
+                    datasym.size = codeView.sizeofCV(datasym.cvdata.type);
+                debug(eval) DbgIO.println("reading global symbol size=%d cv type 0x%x", datasym.size, datasym.cvdata.type);
+
+                symdata.ptr = codeView.image.getSectionBase(datasym.cvdata.segment)+datasym.cvdata.offset;
+                symdata.len = datasym.size;
+                symdata.defered_load = true;
+            }
+            else
+                throw new EvaluationException("Can only evaluate Data and Stack Data Symbols, yet");
+        }
+
+        symdata.type = codeView.mangleType(symbol);
+        if ( symdata.type is null )
+            throw new EvaluationException("Symbol "~symbol.name_notype~" has unknown CV type");
+        return symdata;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    bool findMember(string ident, LeafFieldList lfl, inout size_t size, inout size_t offset, inout string type)
+    {
+        if ( lfl is null )
+            return false;
+        foreach ( l; lfl.fields )
+        {
+            if ( l.leaf_index == LF_BCLASS_16t )
+            {
+                LeafBaseClass lbc = cast(LeafBaseClass)l;
+                assert ( lbc !is null );
+                if ( lbc.type-0x1000 >= codeView.type_strings.length )
+                {
+                    throw new EvaluationException(
+                        "unknown base class "~format("0x%04x", lbc.type)~" in type information for expression"
+                    );
+                }
+                LeafClassStruc lcs = cast(LeafClassStruc)codeView.type_strings[lbc.type-0x1000][0];
+                assert ( lcs !is null );
+                if ( lcs.field == 0 )
+                    continue;
+                if ( lcs.field-0x1000 >= codeView.type_strings.length )
+                {
+                    throw new EvaluationException(
+                        "unknown field list "~format("0x%04x", lcs.field)~" in type information for expression"
+                    );
+                }
+                Leaf[] fields = codeView.type_strings[lcs.field-0x1000];
+                if ( findMember(ident, cast(LeafFieldList)fields[0], size, offset, type) )
+                    return true;
+            }
+            else if ( l.leaf_index == LF_MEMBER_16t )
+            {
+                LeafMember lm = cast(LeafMember)l;
+                assert ( lm !is null );
+                if ( lm.name != ident )
+                    continue;
+                type	= codeView.mangleCVtype(lm.type);
+                size	= codeView.sizeofCV(lm.type);
+                offset	= lm.offset.getUint;
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    ubyte[] readMemory(size_t ptr, size_t len)
+    {
+        if ( miniDump !is null )
+            return miniDump.readMemory(ptr, len);
+
+        if ( process is null )
+            return null;
+
+        if ( len > process.MEMCHECK_MIN && process.isInvalidMem(ptr, len) )
+            return null;
+        ubyte data[] = new ubyte[len];
+        if ( len != process.readProcessMemory(ptr, data.ptr, data.length) )
+            return null;
+        return data;
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/expression/expression.apd	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,1075 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+
+APDProperties
+{
+    parser_type = lr
+}
+
+APDDeclaration
+{
+module expression.expression_apd;
+    
+import codeview.decl;
+import codeview.codeview;
+import expression.evaluationcontext;
+import expression.datahandler;
+import util;
+
+//import internal.aaA;
+
+	struct aaA
+	{
+	    aaA *left;
+	    aaA *right;
+	    hash_t hash;
+	    /* key   */
+	    /* value */
+	}
+
+        struct BB
+	{
+	    aaA*[] b;
+	    size_t nodes;       // total number of aaA nodes
+	}
+
+import std.demangle;
+import std.stdio;
+
+import win32.winnt;
+
+/**********************************************************************************************
+
+**********************************************************************************************/
+bool castArrayIndex(ubyte[] data, string type, out size_t index)
+{
+    assert(type.length>0);
+    switch ( type[0] )
+    {
+        case 'a':
+            if ( *cast(char*)data.ptr < 0 )
+                throw new EvaluationException("Cannot access array with negative index");
+        case 'h':
+            index = *cast(ubyte*)data.ptr;
+            return true;
+        case 's':
+            if ( *cast(short*)data.ptr < 0 )
+                throw new EvaluationException("Cannot access array with negative index");
+        case 't':
+            index = *cast(ushort*)data.ptr;
+            return true;
+        case 'i':
+            if ( *cast(int*)data.ptr < 0 )
+                throw new EvaluationException("Cannot access array with negative index");
+        case 'k':
+            index = *cast(uint*)data.ptr;
+            return true;
+        case 'l':
+            if ( *cast(long*)data.ptr < 0 )
+                throw new EvaluationException("Cannot access array with negative index");
+        case 'm':
+            index = cast(size_t)*cast(ulong*)data.ptr;
+            return true;
+        default:
+    }
+    return false;
+}
+
+/**********************************************************************************************
+
+**********************************************************************************************/
+//    debug = parser;
+unittest
+{
+    bool test(string expr)
+    {
+        SyntaxTree* root;
+        bool success;
+        try success = parse(expr, root);
+        catch ( ParserException e ) {
+            debug(parser) writefln("%s", e.toString);
+            return false;
+        }
+        return success;
+    }
+
+    assert(test("a.bc"));
+    assert(test("bc[def..ghij]"));
+    assert(!test("\"a\\\"\\\u2f85qwe '\""));
+    assert(test("a.bc[def..ghij].klmno.pqrstu[0..'a'][\"a\\\"\\u2f85qwe '\"]"));
+    assert(!test("a.bc.[def..ghij]"));
+    assert(!test("[def..ghij]"));
+    assert(!test("a."));
+    assert(test("asdf[0][i].qwer"));
+    assert(test("cast(uint)asdf"));
+    assert(test("(cast(mystruct)asdf).qwer"));
+    assert(test("(cast(string[])asdf)[0][2..13]"));
+    assert(test("(cast(char[string])asdf)[\"qwer\"]"));
+    assert(!test("(cast(mystruct)asdf).(cast(char[][])qwer)[0]"));
+    assert(test("cast(float)asdf.qwer"));
+    assert(!test("cast.qwer"));
+    assert(!test("cast(uint).qwer"));
+    assert(!test("cast(asdf.qwer).qwer"));
+    assert(test("(cast(string)mystruct.tzui)[0..4]"));
+    assert(test("cast(Vec!(float,3))mystruct"));
+    assert(test("cast(Vec!(float,3,\"asdf\",Vec!(float)))mystruct"));
+    assert(test("vertices[inds[10193]].y"));
+    assert(test("*cast(uint*)#eax"));
+}
+
+}
+
+Whitespace
+{
+    regexp("[\\t\\n\\r ]+");
+}
+
+
+/**************************************************************************************************
+    Expressions
+**************************************************************************************************/
+Expr(EvaluationContext ctx, out SymbolData symdata)
+{
+    Deref Cast DotChain
+    {
+        DotChain(ctx, symdata);
+        Cast(ctx, symdata);
+        Deref(ctx, symdata);
+    }
+}
+
+Deref(EvaluationContext ctx, ref SymbolData symdata)
+{
+    "*" Deref
+    {
+        if ( symdata is null )
+            throw new EvaluationException("Invalid data for dereferencing");
+        if ( symdata.type[0] != 'P' )
+            throw new EvaluationException("Cannot dereference non-pointer of type "~demangleType(symdata.type));
+        symdata.type = symdata.type[1..$];
+        assert(symdata.type.length>0);
+        ubyte[] data = symdata.getData(ctx);
+        if ( data.length != size_t.sizeof ) {
+            throw new EvaluationException("Invalid pointer data size = "~.toString(data.length));
+        }
+        symdata.ptr = (cast(size_t[])data)[0];
+        symdata.len = ctx.codeView.sizeofMangled(symdata.type);
+        symdata.defered_load = true;
+
+        Deref(ctx, symdata);
+    }
+
+    epsilon;
+}
+
+DotChain(EvaluationContext ctx, out SymbolData symdata)
+{
+    Register
+    {
+        Register(ctx, symdata);
+    }
+
+    "("     !("(%d) Expression expected after (")
+    Expr    !("(%d) ) expected")
+    ")"
+    RefExpr
+    {
+        Expr(ctx, symdata);
+        RefExpr(ctx, null, null, "", symdata);
+    }
+
+    Ident
+    RefExpr
+    {
+        string id;
+        Ident(id);
+
+        NamedSymbol[] symbols;
+        NamedSymbol symbol = ctx.findSymbol(id, symbols);
+        if ( symbol !is null )
+            symdata = ctx.loadSymbolData(symbol);
+        else
+            debug DbgIO.println("symbol %s not found", id);
+        RefExpr(ctx, symbol, symbols, id, symdata);
+    }
+
+    Lit
+    { Lit(symdata); }
+}
+
+RefExpr(EvaluationContext ctx, NamedSymbol symbol, NamedSymbol[] symbols, string prefix, ref SymbolData symdata)
+{
+    //-------------------------------------------------------------------------
+    // . Operator
+    //-------------------------------------------------------------------------
+    "." Ident RefExpr
+    {
+        string id;
+        Ident(id);
+        prefix ~= "."~id;
+
+        if ( symdata is null )
+        {
+            symbol = ctx.findSymbol(prefix, symbols);
+            if ( symbol !is null )
+                symdata = ctx.loadSymbolData(symbol);
+        }
+        else
+        {
+			switch ( symdata.type[0] )
+			{
+				//---------------------------------------------------------------------------------
+				// primitive types
+				case 'v': case 'b': case 'x': case 'g': case 'h': case 's':	case 't': case 'i': case 'k': case 'l': case 'm': case 'f':
+				case 'd': case 'e': case 'o': case 'p': case 'j': case 'q': case 'r': case 'c': case 'a': case 'u': case 'w':
+					throw new EvaluationException(
+						"Type mismatch - unexpected . operator in expression of type "~demangleType(symdata.type)
+					);
+				//---------------------------------------------------------------------------------
+                // array properties
+				case 'G':
+                    switch ( id )
+                    {
+                        case "length":
+                            symdata.type = symdata.type[1..$];
+                            size_t len = parseNumber(symdata.type);
+                            symdata.type = "k";
+                            symdata.data = (cast(ubyte*)&len)[0..size_t.sizeof].dup;
+                            symdata.defered_load = false;
+                            break;
+                        case "ptr":
+                            // TODO: can this always be guaranteed?
+                            assert(symdata.defered_load);
+                            size_t ptr = symdata.ptr;
+                            symdata.data = (cast(ubyte*)&ptr)[0..size_t.sizeof];
+                            symdata.defered_load = false;
+                            symdata.type = symdata.type[1..$];
+                            parseNumber(symdata.type);
+                            symdata.type = "P"~symdata.type;
+                            break;
+                        default:
+                            throw new EvaluationException(
+                                "Type mismatch - invalid property "~id~" after expression of type "~demangleType(symdata.type)
+                            );
+                    }
+                    break;
+                case 'A':
+                    switch ( id )
+                    {
+                        case "length":
+                            ubyte[] data = symdata.getData(ctx);
+                            symdata.type = "k";
+                            size_t len = (cast(size_t[])data)[0];
+                            symdata.data = (cast(ubyte*)&len)[0..size_t.sizeof].dup;
+                            symdata.defered_load = false;
+                            break;
+                        case "ptr":
+                            ubyte[] data = symdata.getData(ctx);
+                            symdata.type = "k";
+                            size_t len = (cast(size_t[])data)[1];
+                            symdata.data = (cast(ubyte*)&len)[0..size_t.sizeof].dup;
+                            symdata.defered_load = false;
+                            break;
+                        default:
+                            throw new EvaluationException(
+                                "Type mismatch - invalid property "~id~" after expression of type "~demangleType(symdata.type)
+                            );
+                    }
+                    break;
+                case 'H':
+                    switch ( id )
+                    {
+                        case "length":
+                            ubyte[] data = symdata.getData(ctx);
+                            symdata.ptr = *cast(size_t*)data.ptr;
+                            symdata.len = BB.sizeof;
+                            symdata.defered_load = true;
+                            data = symdata.getData(ctx);
+                            BB* bb = cast(BB*)data.ptr;
+
+                            symdata.type = "k";
+                            symdata.data = (cast(ubyte*)&bb.nodes)[0..size_t.sizeof].dup;
+                            symdata.defered_load = false;
+                            break;
+                        default:
+                            throw new EvaluationException(
+                                "Type mismatch - invalid property "~id~" after expression of type "~demangleType(symdata.type)
+                            );
+                    }
+                    break;
+				//---------------------------------------------------------------------------------
+				// references to structs/classes
+				case 'P':
+                    symdata.type = symdata.type[1..$];
+					if ( symdata.type[0] != 'C' && symdata.type[0] != 'S' )
+					{
+                        throw new EvaluationException(
+                            "Type mismatch - unexpected . operator after expression of type "~demangleType("P"~symdata.type)
+                        );
+					}
+
+                    ubyte[] data = symdata.getData(ctx);
+                    if ( symdata.data.length <= 0 )
+                        throw new EvaluationException("Subexpression evaluated to empty data");
+					symdata.ptr = (cast(uint[])data)[0];
+					symdata.len = ctx.codeView.sizeofMangled(symdata.type);
+					symdata.defered_load = true;
+
+					if ( symdata.ptr == 0 )
+						throw new EvaluationException("pointer is null");
+                    // fall through to struct handling
+
+				//---------------------------------------------------------------------------------
+				// classes/structs
+				case 'C':
+				case 'S':
+                    symdata.type = symdata.type[1..$];
+                    string	scu_name = demangleNameSkip(symdata.type);
+                    assert ( symdata.type.length <= 0 );
+                    if ( (scu_name in ctx.codeView.UDTsByName) is null )
+                        throw new EvaluationException("unknown type \""~scu_name~"\"");
+
+                    LeafClassStruc  lcs = cast(LeafClassStruc)ctx.codeView.UDTsByName[scu_name];
+                    LeafUnion       lu;
+                    LeafFieldList   lfl;
+                    uint            type_length;
+
+                    if ( lcs !is null && lcs.field-0x1000 < ctx.codeView.type_strings.length ) {
+                        Leaf[] fields = ctx.codeView.type_strings[lcs.field-0x1000];
+                        lfl = cast(LeafFieldList)fields[0];
+                        type_length = lcs.length.getUint();
+                    }
+                    else
+                    {
+                        lu = cast(LeafUnion)ctx.codeView.UDTsByName[scu_name];
+                        if ( lu !is null && lu.field-0x1000 < ctx.codeView.type_strings.length ) {
+                            Leaf[] fields = ctx.codeView.type_strings[lu.field-0x1000];
+                            lfl = cast(LeafFieldList)fields[0];
+                            type_length = lu.length.getUint();
+                        }
+                    }
+                    if ( lfl is null )
+                        throw new EvaluationException("invalid struct/class debug symbols");
+
+                    size_t  size,
+                            offset;
+                    if ( !ctx.findMember(id, lfl, size, offset, symdata.type) )
+                        throw new EvaluationException("struct \""~scu_name~"\" has no element \""~id~"\"");
+                    assert ( symdata.type.length > 0 );
+                    debug(eval) DbgIO.println("member: type=%s size=%d offset=%d", symdata.type, size, offset);
+
+                    if ( !symdata.loadByteSlice(offset, offset+size) )
+                        throw new EvaluationException("invalid offset into struct for member \""~id~"\"");
+					break;
+				//---------------------------------------------------------------------------------
+				// unsupported
+				default:
+					throw new EvaluationException("yet unsupported type "~demangleType(symdata.type)~" in expression");
+			}
+        }
+
+        RefExpr(ctx, symbol, symbols, prefix, symdata);
+    }
+
+    //-------------------------------------------------------------------------
+    // [] Operator
+    //-------------------------------------------------------------------------
+    "["     !("(%d) Arguments expected after [")
+    Args    !("(%d) ] expected")
+    "]"
+    RefExpr
+    {
+        if ( symdata is null )
+            throw new EvaluationException("Unknown symbol "~prefix);
+
+        SymbolData  argdata;
+        size_t      start, end;
+        Args(ctx, argdata, start, end);
+
+        bool isIndex = argdata is null;
+        if ( !isIndex && castArrayIndex(argdata.getData(ctx), argdata.type, start) ) {
+            isIndex = true;
+            end = start+1;
+        }
+
+        switch ( symdata.type[0] )
+        {
+            //---------------------------------------------------------------------------------
+            // primitive types
+            case 'v': case 'b': case 'x': case 'g': case 'h': case 's':	case 't': case 'i': case 'k': case 'l': case 'm': case 'f':
+            case 'd': case 'e': case 'o': case 'p': case 'j': case 'q': case 'r': case 'c': case 'a': case 'u': case 'w':
+            // pointers, classes/structs
+            case 'P': case 'C': case 'S':
+                throw new EvaluationException(
+                    "Type mismatch - unexpected [] operator after expression of type "~demangleType(symdata.type)
+                );
+            //---------------------------------------------------------------------------------
+            // static arrays
+            case 'G':
+                if ( !isIndex )
+                    throw new EvaluationException("Cannot access static array with index type "~demangleType(argdata.type));
+
+                symdata.type = symdata.type[1..$];
+                size_t count = parseNumber(symdata.type);
+                assert(symdata.type.length>0);
+
+                if ( end-start > 1 )
+                {
+                    if ( end > count )
+                        throw new EvaluationException("Array index out of bounds: "~.toString(start)~".."~.toString(end)~" ($="~.toString(count)~")");
+                    size_t size = ctx.codeView.sizeofMangled(symdata.type);
+                    if ( symdata.defered_load ) {
+                        symdata.ptr += start * size;
+                        symdata.len = (end-start) * size;
+                    }
+                    else
+                        symdata.data = symdata.data[start*size .. end*size];
+                    symdata.type = "G"~.toString(end-start)~symdata.type;
+                }
+                else
+                {
+                    if ( !symdata.loadElementSlice(start, end, ctx.codeView) )
+                        throw new EvaluationException("Array index out of bounds: "~.toString(start)~".."~.toString(end)~" ($="~.toString(count)~")");
+                }
+                break;
+            //---------------------------------------------------------------------------------
+            // dynamic arrays
+            case 'A':
+                if ( !isIndex )
+                    throw new EvaluationException("Cannot access dynamic array with index type "~demangleType(argdata.type));
+
+                ubyte[] data = symdata.getData(ctx);
+                if ( data.length < 8 )
+                    throw new EvaluationException("Subexpression evaluated to empty data");
+
+                if ( end-start > 1 )
+                {
+                    if ( end > (cast(size_t[])data)[0] )
+                        throw new EvaluationException("Array index out of bounds: "~.toString(start)~".."~.toString(end)~" ($="~.toString(symdata.len)~")");
+                    size_t size = ctx.codeView.sizeofMangled(symdata.type[1..$]);
+                    (cast(size_t[])data)[1] += start * size,
+                    (cast(size_t[])data)[0] = end-start;
+                }
+                else
+                {
+                    symdata.type = symdata.type[1..$];
+                    assert(symdata.type.length>0);
+                    symdata.ptr = (cast(size_t[])data)[1];
+                    symdata.len = (cast(size_t[])data)[0] * ctx.codeView.sizeofMangled(symdata.type);
+                    symdata.defered_load = true;
+
+                    if ( !symdata.loadElementSlice(start, end, ctx.codeView) )
+                        throw new EvaluationException("Array index out of bounds: "~.toString(start)~".."~.toString(end)~" ($="~.toString(symdata.len)~")");
+                }
+                break;
+            //---------------------------------------------------------------------------------
+            // associative arrays
+            case 'H':
+                int i;
+                for ( i = 1; i < symdata.type.length && std.string.find(lowercase, symdata.type[i]) < 0; ++i ) {}
+                string		key_type	= symdata.type[1..i+1],
+                            val_type	= symdata.type[i+1..$];
+                size_t      val_tsize   = ctx.codeView.sizeofMangled(val_type);
+                TypeInfo	key_ti		= TypeInfoFromMangled(key_type);
+
+                aaA* loadaaA(void* ptr)
+                {
+                    if ( ptr is null )
+                        return null;
+                    ubyte[] data;
+                    data.length = aaA.sizeof+key_ti.tsize+val_tsize;
+                    if ( data.length != ctx.process.readProcessMemory(cast(uint)ptr, data.ptr, data.length) )
+                        return null;
+                    aaA* a = cast(aaA*)data.ptr;
+                    if ( std.string.find(lowercase, key_type[0]) < 0 )
+                    switch ( key_type[0] )
+                    {
+                        case 'A':
+                            ubyte[] tmp = *cast(ubyte[]*)(a+1);
+                            if ( tmp.length > ctx.process.MEMCHECK_MIN && ctx.process.isInvalidMem(cast(size_t)tmp.ptr, tmp.length) )
+                                return null;
+                            data = new ubyte[tmp.length];
+                            if ( data.length != ctx.process.readProcessMemory(cast(size_t)tmp.ptr, data.ptr, data.length) )
+                                return null;
+                            *cast(ubyte[]*)(a+1) = data;
+                            break;
+                        case 'P':
+                            break;
+                        default:
+                            throw new EvaluationException("only basic, pointer and array key types are supported, yet");
+                    }
+                    return a;
+                }
+
+                ubyte[] findKey(size_t ptr, hash_t hash, ubyte[] key_data)
+                {
+                    ubyte[] data;
+                    data.length = BB.sizeof;
+                    if ( data.length != ctx.process.readProcessMemory(ptr, data.ptr, data.length) )
+                        return null;
+                    BB* bb = cast(BB*)data.ptr;
+                    size_t blen = bb.b.length*size_t.sizeof;
+                    debug(eval) DbgIO.println("%d nodes, bb.b.length=%d", bb.nodes, bb.b.length);
+
+                    if ( blen > ctx.process.MEMCHECK_MIN && ctx.process.isInvalidMem(cast(size_t)bb.b.ptr, blen) )
+                        return null;
+                    data = new ubyte[blen];
+                    if ( data.length != ctx.process.readProcessMemory(cast(uint)bb.b.ptr, data.ptr, data.length) )
+                        return null;
+                    bb.b = cast(aaA*[])data;
+
+                    uint i = hash % bb.b.length;
+                    debug(eval) DbgIO.println("start index=%d", i);
+                    aaA* a = loadaaA(bb.b[i]);
+                    while ( a !is null )
+                    {
+                        if ( hash == a.hash )
+                        {
+                            debug(eval) DbgIO.println("equal 0x%x", a.hash);
+                            auto cmp = key_ti.compare(key_data.ptr, a+1);
+                            debug(eval) DbgIO.println("%s: %d == %d -> %d", key_ti, *cast(uint*)key_data.ptr, *cast(uint*)(a+1), cmp);
+                            if ( cmp == 0 )
+                                return ((cast(ubyte*)(a+1))+key_ti.tsize)[0 .. val_tsize];
+                            a = cmp < 0 ? loadaaA(a.left) : loadaaA(a.right);
+                        }
+                        else {
+                            debug(eval) DbgIO.println("not equal 0x%x", a.hash);
+                            a = hash < a.hash ? loadaaA(a.left) : loadaaA(a.right);
+                        }
+                    }
+                    return null;
+                }
+
+                if ( key_type != argdata.type )
+                    throw new EvaluationException("Invalid key type for associative array. Expected "~demangleType(key_type)~" found "~demangleType(argdata.type));
+                TypeInfo ti = TypeInfoFromMangled(argdata.type);
+                hash_t index_hash = ti.getHash(argdata.data.ptr);
+
+                debug(eval) DbgIO.println("searching, hash=0x%x", index_hash);
+                ubyte[] data = symdata.getData(ctx);
+                symdata.data = findKey((cast(size_t[])data)[0], index_hash, argdata.getData(ctx));
+                symdata.type = val_type;
+                break;
+            //---------------------------------------------------------------------------------
+            // unsupported
+            default:
+                throw new EvaluationException("yet unsupported type "~demangleType(symdata.type)~" in expression");
+        }
+
+        RefExpr(ctx, symbol, null, null, symdata);
+    }
+
+    //-------------------------------------------------------------------------
+    // end of refexpr
+    //-------------------------------------------------------------------------
+    epsilon
+    {
+        if ( symdata is null )
+            throw new EvaluationException("Unknown symbol "~prefix);
+    }
+}
+
+Args(EvaluationContext ctx, out SymbolData argdata, out size_t start, out size_t end)
+{
+    Expr
+    ".."    !("(%d) Second slice argument expected")
+    Expr=Expr2
+    {
+        SymbolData arg1, arg2;
+        Expr(ctx, arg1);
+        Expr2(ctx, arg2);
+
+        bool isIndex = castArrayIndex(arg1.getData(ctx), arg1.type, start);
+        isIndex = isIndex && castArrayIndex(arg2.getData(ctx), arg2.type, end);
+        if ( !isIndex )
+            throw new EvaluationException("Slices may only have integer indeces, not "~demangleType(arg1.type)~".."~demangleType(arg2.type));
+    }
+
+    Expr
+    { Expr(ctx, argdata); }
+}
+
+
+/**************************************************************************************************
+    Registers
+**************************************************************************************************/
+Register(EvaluationContext ctx, out SymbolData symdata)
+{
+    RegName
+    {
+        string  name;
+        ubyte   width;
+        RegName(name, width);
+
+		CONTEXT threadCtx;
+		uint context_flags;
+        context_flags |= CONTEXT_FULL;
+        context_flags |= CONTEXT_FLOATING_POINT;
+        context_flags |= CONTEXT_EXTENDED_REGISTERS;
+		if ( !ctx.getContext(threadCtx, context_flags) )
+			throw new EvaluationException("Couldn't get main thread's context");
+
+        ubyte* ptr;
+        switch ( name[1..$] )
+        {
+            case "ax":
+            case "eax":
+            case "al":  ptr = cast(ubyte*)&threadCtx.Eax;   break;
+            case "ah":  ptr = (cast(ubyte*)&threadCtx.Eax)+1;   break;
+            case "bx":
+            case "ebx":
+            case "bl":  ptr = cast(ubyte*)&threadCtx.Ebx;   break;
+            case "bh":  ptr = (cast(ubyte*)&threadCtx.Ebx)+1;   break;
+            case "cx":
+            case "ecx":
+            case "cl":  ptr = cast(ubyte*)&threadCtx.Ecx;   break;
+            case "ch":  ptr = (cast(ubyte*)&threadCtx.Ecx)+1;   break;
+            case "dx":
+            case "edx":
+            case "dl":  ptr = cast(ubyte*)&threadCtx.Edx;   break;
+            case "dh":  ptr = (cast(ubyte*)&threadCtx.Edx)+1;   break;
+            case "edi":
+            case "di":  ptr = cast(ubyte*)&threadCtx.Edi;   break;
+            case "esi":
+            case "si":  ptr = cast(ubyte*)&threadCtx.Esi;   break;
+            case "ebp":
+            case "bp":  ptr = cast(ubyte*)&threadCtx.Ebp;   break;
+            case "esp":
+            case "sp":  ptr = cast(ubyte*)&threadCtx.Esp;   break;
+            case "eip": ptr = cast(ubyte*)&threadCtx.Eip;   break;
+            case "efl": ptr = cast(ubyte*)&threadCtx.EFlags;    break;
+            case "cs":  ptr = cast(ubyte*)&threadCtx.SegCs; break;
+            case "ds":  ptr = cast(ubyte*)&threadCtx.SegDs; break;
+            case "es":  ptr = cast(ubyte*)&threadCtx.SegEs; break;
+            case "fs":  ptr = cast(ubyte*)&threadCtx.SegFs; break;
+            case "gs":  ptr = cast(ubyte*)&threadCtx.SegGs; break;
+            default:
+                int i = name[$-1]-'0';
+                if ( name[0..2] == "st" )
+                    ptr = cast(ubyte*)&((cast(real[])threadCtx.FloatSave.RegisterArea)[i]);
+                else if ( name[0..2] == "mm" )
+                    ptr = cast(ubyte*)&((cast(long[])threadCtx.ExtendedRegisters)[4+i*2]);
+                else if ( name[0..3] == "xmm" )
+                    ptr = cast(ubyte*)&((cast(long[])threadCtx.ExtendedRegisters)[20+i*2]);
+                else
+                    assert(0);
+        }
+
+        symdata = new SymbolData;
+        switch ( width )
+        {
+            case 8:
+                symdata.type = "h";
+                symdata.data = ptr[0..1].dup;
+                break;
+            case 16:
+                symdata.type = "t";
+                symdata.data = ptr[0..2].dup;
+                break;
+            case 32:
+                symdata.type = "k";
+                symdata.data = ptr[0..4].dup;
+                break;
+            case 64:
+                symdata.type = "m";
+                symdata.data = ptr[0..8].dup;
+                break;
+            case 80:
+                symdata.type = "e";
+                symdata.data = ptr[0..10].dup;
+                break;
+            case 128:
+                symdata.type = "G4k";
+                symdata.data = ptr[0..16].dup;
+                break;
+            default:
+                assert(0, "unhandled register width "~.toString(width));
+        }
+    }
+}
+
+RegName(out string name, out ubyte width)
+{
+    regexp("#(e[abcd]x|e[ds]i|e[bs]p|eip|efl)")
+    { name = _ST_match; width = 32; }
+
+    regexp("#([abcd]x|[ds]i|[bs]p|(cdefgs)s)")
+    { name = _ST_match; width = 16; }
+
+    regexp("#[abcd][hl]")
+    { name = _ST_match; width = 8; }
+
+    regexp("#st[0-7]")
+    { name = _ST_match; width = 8*real.sizeof; }
+
+    regexp("#mm[0-7]")
+    { name = _ST_match; width = 64; }
+
+    regexp("#xmm[0-7]")
+    { name = _ST_match; width = 128; }
+}
+
+
+/**************************************************************************************************
+    Casts
+**************************************************************************************************/
+Cast(EvaluationContext ctx, ref SymbolData symdata)
+{
+    "cast"  !("(%d) ( expected")
+    "("     !("(%d) Type expected")
+    Type    !("(%d) ) expected")
+    ")"
+    {
+        symdata.type = "";
+        Type(ctx, symdata.type);
+        if ( symdata.type.length <= 0 )
+            throw new EvaluationException("Unknown type in cast");
+    }
+
+    epsilon;
+}
+
+Type(EvaluationContext ctx, ref string mangled)
+{
+    BaseType QuantList
+    {
+        string  unmangled;
+        BaseType(ctx, unmangled);
+
+		switch ( unmangled )
+		{
+			case "void":	mangled = "v";	break;
+			case "bool":	mangled = "b";	break;
+			case "byte":	mangled = "g";	break;
+			case "ubyte":	mangled = "h";	break;
+			case "char":	mangled = "a";	break;
+			case "wchar":	mangled = "u";	break;
+			case "dchar":	mangled = "w";	break;
+			case "short":	mangled = "s";	break;
+			case "ushort":	mangled = "t";	break;
+			case "int":		mangled = "i";	break;
+			case "uint":	mangled = "k";	break;
+			case "long":	mangled = "l";	break;
+			case "ulong":	mangled = "m";	break;
+			case "float":	mangled = "f";	break;
+			case "double":	mangled = "d";	break;
+			case "real":	mangled = "e";	break;
+			default:
+				Leaf lf;
+				if ( (unmangled in ctx.codeView.UDTsByName) is null )
+				{
+					foreach ( un, l; ctx.codeView.UDTsByName )
+					{
+						if ( std.string.find(un, "."~unmangled) > 0 ) {
+							lf = l;
+							break;
+						}
+					}
+				}
+				else
+					lf = ctx.codeView.UDTsByName[unmangled];
+
+				if ( lf !is null )
+				{
+					string fqn;
+					switch ( lf.leaf_index )
+					{
+						case LF_CLASS_16t:
+							mangled = "C";
+							fqn = (cast(LeafClassStruc)lf).name;
+							break;
+						case LF_STRUCTURE_16t:
+							mangled = "S";
+							fqn = (cast(LeafClassStruc)lf).name;
+							break;
+						case LF_ENUM_16t:
+							mangled = "E";
+							fqn = (cast(LeafEnum)lf).name;
+							break;
+						default:
+							assert(0);
+					}
+					string[] parts = std.string.split(fqn, ".");
+					foreach ( p; parts ) {
+						mangled ~= .toString(p.length);
+						mangled ~= p;
+					}
+				}
+                else
+                    throw new EvaluationException("Unknown BaseType "~unmangled);
+				break;
+		}
+
+		QuantList(ctx, mangled);
+    }
+}
+
+BaseType(EvaluationContext ctx, out string type)
+{
+    FQNIdent TplParams
+    {
+        FQNIdent(type);
+        string str;
+        TplParams(ctx, str);
+        type ~= str;
+    }
+}
+
+QuantList(EvaluationContext ctx, ref string mangled)
+{
+    Quantifier QuantList
+    {
+        Quantifier(ctx, mangled);
+        QuantList(ctx, mangled);
+    }
+
+    epsilon;
+}
+
+Quantifier(EvaluationContext ctx, ref string mangled)
+{
+    "*"
+    { mangled = "P"~mangled; }
+
+    "[" "]"
+    { mangled = "A"~mangled; }
+
+    "["
+    Integer  !("(%d) ] expected")
+    "]"
+    {
+        ulong len;
+        Integer(len);
+        mangled = "G"~.toString(len)~mangled;
+    }
+
+    "["     !("(%d) ], type or size expected")
+    Type    !("(%d) ] expected")
+    "]"
+    {
+        string index_mangled;
+        Type(ctx, index_mangled);
+        mangled = "H"~index_mangled~mangled;
+    }
+}
+
+TplParams(EvaluationContext ctx, out string str)
+{
+    "!"         !("(%d) ( expected")
+    "("         !("(%d) Template parameters expected")
+    TplParam
+    TplParams2  !("(%d) ) expected")
+    ")"
+    {
+        string tmp;
+        TplParam(ctx, tmp);
+        str = "!("~tmp;
+        TplParams2(ctx, tmp);
+        str ~= tmp~")";
+    }
+
+    epsilon;
+}
+
+TplParams2(EvaluationContext ctx, out string str)
+{
+    "," !("(%d) Template parameter expected")
+    TplParam
+    TplParams2
+    {
+        TplParam(ctx, str);
+        string tmp;
+        TplParams2(ctx, tmp);
+        str ~= tmp;
+    }
+
+    epsilon;
+}
+
+TplParam(EvaluationContext ctx, out string str)
+{
+    Type    { Type(ctx, str); }
+    StrLit  { StrLit(str); }
+}
+
+
+/**************************************************************************************************
+    Terminals
+**************************************************************************************************/
+Lit(out SymbolData litdata)
+{
+    Sign Integer IntegerSuffix
+    {
+        litdata = new SymbolData;
+        IntegerSuffix(litdata.type);
+        ulong val;
+        Integer(val);
+
+        if ( val > 0x7fffffffffffffff )
+            litdata.type = "m";
+        else if ( val > 0xffffffff )
+            litdata.type = litdata.type[0]=='i'||litdata.type[0]=='l'?"l":"m";
+        else if ( val > 0x7fffffff && litdata.type[0] == 'i' )
+            litdata.type = "k";
+
+        litdata.data = (cast(ubyte*)&val)[0 .. (litdata.type[0] == 'k' || litdata.type[0] == 'i')?uint.sizeof:ulong.sizeof].dup;
+        Sign(litdata);
+    }
+
+    // String
+    regexp("\"(([^\"\\\\]*(\\\\(['\"\\?\\\\abfnrtv]|(x[0-9a-fA-F]{2})|(u[0-9a-fA-F]{4})|(U[0-9a-fA-F]{8})))?)*)\"")
+    {
+        litdata = new SymbolData;
+        litdata.type = "Aa";
+        litdata.data = cast(ubyte[])_ST_match;
+    }
+
+    // Char
+    regexp("'(([^'\\\\]|(\\\\(['\"\\?\\\\abfnrtv]|(x[0-9a-fA-F]{2})|(u[0-9a-fA-F]{4})|(U[0-9a-fA-F]{8})))))'")
+    {
+        litdata = new SymbolData;
+        litdata.type = "a";
+        litdata.data = cast(ubyte[])_ST_match[0..1];
+    }
+}
+
+StrLit(out string str)
+{
+    // Integer
+    Integer
+    {
+        ulong val;
+        Integer(val);
+        str = .toString(val);
+    }
+
+    // String
+    regexp("\"(([^\"\\\\]*(\\\\(['\"\\?\\\\abfnrtv]|(x[0-9a-fA-F]{2})|(u[0-9a-fA-F]{4})|(U[0-9a-fA-F]{8})))?)*)\"")
+    { str = _ST_match; }
+
+    // Char
+    regexp("'(([^'\\\\]|(\\\\(['\"\\?\\\\abfnrtv]|(x[0-9a-fA-F]{2})|(u[0-9a-fA-F]{4})|(U[0-9a-fA-F]{8})))))'")
+    { str = _ST_match; }
+}
+
+Ident(out string id)
+{
+    regexp("[a-zA-Z_][_a-zA-Z0-9]*")
+    { id = _ST_match; }
+}
+
+FQNIdent(out string id)
+{
+    Ident
+    { Ident(id); }
+
+    FQNIdent "." Ident
+    {
+        FQNIdent(id);
+        string tmp;
+        Ident(tmp);
+        id ~= "."~tmp;
+    }
+}
+
+/**************************************************************************************************
+    Integers
+**************************************************************************************************/
+Integer(out ulong val)
+{
+    // hex
+    regexp("0[xX][0-9a-fA-F_]+")
+    {
+        foreach ( b; _ST_match[2..$] )
+        {
+            val <<= 4;
+            if ( b > 'F' )
+                val |= b-'W';
+            else if ( b > '9' )
+                val |= b-'7';
+            else
+                val |= b-'0';
+        }
+    }
+
+    // binary
+    regexp("0[bB][01_]+")
+    {
+        foreach ( b; _ST_match[2..$] )
+        {
+            val <<= 1;
+            if ( b == '1' )
+                val |= 1;
+        }
+    }
+
+    // octal
+    regexp("0[0-7_]+")
+    {
+        foreach ( b; _ST_match[1..$] ) {
+            val <<= 3;
+            val |= b-'0';
+        }
+    }
+
+    // decimal
+    regexp("0|([1-9][0-9_]*)")
+    {
+        foreach ( b; _ST_match ) {
+            val *= 10;
+            val += b-'0';
+        }
+    }
+}
+
+IntegerSuffix(out string type)
+{
+    "L" "u"
+    { type = "m"; }
+
+    "L" "U"
+    { type = "m"; }
+
+    "u" "L"
+    { type = "m"; }
+
+    "U" "L"
+    { type = "m"; }
+
+    "L"
+    { type = "l"; }
+
+    regexp("[uU]")
+    { type = "k"; }
+
+    epsilon
+    { type = "i"; }
+}
+
+Sign(ref SymbolData symdata)
+{
+    "-"
+    {
+        switch ( symdata.type[0] )
+        {
+            case 'i':
+                *cast(int*)symdata.data.ptr = 0-*cast(int*)symdata.data.ptr;
+                break;
+            case 'k':
+                *cast(uint*)symdata.data.ptr = 0-*cast(uint*)symdata.data.ptr;
+                break;
+            case 'l':
+                *cast(long*)symdata.data.ptr = 0-*cast(long*)symdata.data.ptr;
+                break;
+            case 'm':
+                *cast(ulong*)symdata.data.ptr = 0-*cast(ulong*)symdata.data.ptr;
+                break;
+            default:
+                assert(0);
+        }
+    }
+
+    epsilon;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/expression/expression_apd.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,4376 @@
+// Written in the D programming language
+
+/*
+ *  This file has been automatically generated by APaGeD v0.4.2 beta - Attributed Parser Generator for D.
+ *
+ *  Sections generated from custom input are marked as "generated code" and
+ *  are subject to the terms and conditions stated in one of these sections.
+ *  The remaining sections are part of the APaGeD package and subject
+ *  to the terms and conditions of the corresponding license.
+ *
+ *  Attributed Parser Generator for D
+ *  Copyright (c) 2007 Jascha Wetzel. All rights reserved
+ *  License: Artistic License 2.0
+ */
+
+// generated code start
+
+#line 12 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+module expression.expression_apd;
+    
+import codeview.decl;
+import codeview.codeview;
+import expression.evaluationcontext;
+import expression.datahandler;
+import util;
+
+//import internal.aaA;
+
+	struct aaA
+	{
+	    aaA *left;
+	    aaA *right;
+	    hash_t hash;
+	    /* key   */
+	    /* value */
+	}
+
+        struct BB
+	{
+	    aaA*[] b;
+	    size_t nodes;       // total number of aaA nodes
+	}
+
+import std.demangle;
+import std.stdio;
+
+import win32.winnt;
+
+/**********************************************************************************************
+
+**********************************************************************************************/
+bool castArrayIndex(ubyte[] data, string type, out size_t index)
+{
+    assert(type.length>0);
+    switch ( type[0] )
+    {
+        case 'a':
+            if ( *cast(char*)data.ptr < 0 )
+                throw new EvaluationException("Cannot access array with negative index");
+        case 'h':
+            index = *cast(ubyte*)data.ptr;
+            return true;
+        case 's':
+            if ( *cast(short*)data.ptr < 0 )
+                throw new EvaluationException("Cannot access array with negative index");
+        case 't':
+            index = *cast(ushort*)data.ptr;
+            return true;
+        case 'i':
+            if ( *cast(int*)data.ptr < 0 )
+                throw new EvaluationException("Cannot access array with negative index");
+        case 'k':
+            index = *cast(uint*)data.ptr;
+            return true;
+        case 'l':
+            if ( *cast(long*)data.ptr < 0 )
+                throw new EvaluationException("Cannot access array with negative index");
+        case 'm':
+            index = cast(size_t)*cast(ulong*)data.ptr;
+            return true;
+        default:
+    }
+    return false;
+}
+
+/**********************************************************************************************
+
+**********************************************************************************************/
+//    debug = parser;
+unittest
+{
+    bool test(string expr)
+    {
+        SyntaxTree* root;
+        bool success;
+        try success = parse(expr, root);
+        catch ( ParserException e ) {
+            debug(parser) writefln("%s", e.toString);
+            return false;
+        }
+        return success;
+    }
+
+    assert(test("a.bc"));
+    assert(test("bc[def..ghij]"));
+    assert(!test("\"a\\\"\\\u2f85qwe '\""));
+    assert(test("a.bc[def..ghij].klmno.pqrstu[0..'a'][\"a\\\"\\u2f85qwe '\"]"));
+    assert(!test("a.bc.[def..ghij]"));
+    assert(!test("[def..ghij]"));
+    assert(!test("a."));
+    assert(test("asdf[0][i].qwer"));
+    assert(test("cast(uint)asdf"));
+    assert(test("(cast(mystruct)asdf).qwer"));
+    assert(test("(cast(string[])asdf)[0][2..13]"));
+    assert(test("(cast(char[string])asdf)[\"qwer\"]"));
+    assert(!test("(cast(mystruct)asdf).(cast(char[][])qwer)[0]"));
+    assert(test("cast(float)asdf.qwer"));
+    assert(!test("cast.qwer"));
+    assert(!test("cast(uint).qwer"));
+    assert(!test("cast(asdf.qwer).qwer"));
+    assert(test("(cast(string)mystruct.tzui)[0..4]"));
+    assert(test("cast(Vec!(float,3))mystruct"));
+    assert(test("cast(Vec!(float,3,\"asdf\",Vec!(float)))mystruct"));
+    assert(test("vertices[inds[10193]].y"));
+    assert(test("*cast(uint*)#eax"));
+}
+// generated code end
+
+version(Tango)
+{
+  
+}
+else
+{
+    import std.string;
+    debug import std.stdio;
+}
+
+/**************************************************************************************************
+    Semantic Analyzer
+**************************************************************************************************/
+
+class SemanticException : Exception
+{
+    this(string msg)
+    {
+        super(msg);
+    }
+}
+
+struct SyntaxTree
+{
+    uint            _ST_rule,
+                    _ST_line_number,
+                    _ST_column_number;
+    debug
+    {
+        string          _ST_node_name,
+                        _ST_match,
+                        _ST_match_ws;
+        SyntaxTree*[]   _ST_children;
+    }
+    else
+    {
+        union
+        {
+            struct {
+                string      _ST_match,
+                            _ST_match_ws;
+            }
+            SyntaxTree*[]   _ST_children;
+        }
+    }
+
+    debug
+    {
+        SyntaxTree* parent;
+
+        string indent()
+        {
+            string str;
+            for ( SyntaxTree* n = parent; n !is null; n = n.parent )
+                str ~= "  ";
+            return str;
+        }
+
+        void print(string indent = "")
+        {
+            version(Tango)
+                Stdout.format("{}{}{}", indent, _ST_node_name, _ST_rule);
+            else
+                writef("%s%s%d", indent, _ST_node_name, _ST_rule);
+            if ( _ST_children.length == 0 )
+            {
+                version(Tango)
+                    Stdout.formatln(" (\"{}\")", _ST_match);
+                else
+                    writefln(" (\"%s\")", _ST_match);
+            }
+            else
+            {
+                version(Tango)
+                    Stdout.newline;
+                else
+                    writefln;
+            }
+            foreach ( c; _ST_children )
+                c.print(indent~"  ");
+        }
+    }
+
+    void opCatAssign(SyntaxTree* n)
+    {
+        _ST_children ~= n;
+    }
+
+    // augmented semantic code
+// generated code start
+    alias _S_Expr Expr;
+void _S_Expr(EvaluationContext ctx, out SymbolData symdata)
+{
+
+    switch ( _ST_rule )
+    {
+    case 0:
+        debug assert(_ST_children.length == 3);
+        void delegate(EvaluationContext ctx, ref SymbolData symdata) Deref = &_ST_children[0]._S_Deref;
+        void delegate(EvaluationContext ctx, ref SymbolData symdata) Cast = &_ST_children[1]._S_Cast;
+        void delegate(EvaluationContext ctx, out SymbolData symdata) DotChain = &_ST_children[2]._S_DotChain;
+
+#line 136 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        DotChain(ctx, symdata);
+        Cast(ctx, symdata);
+        Deref(ctx, symdata);
+        break;
+
+    default:
+        assert(0);
+    }
+}
+void _S_Deref(EvaluationContext ctx, ref SymbolData symdata)
+{
+
+    switch ( _ST_rule )
+    {
+    case 1:
+        debug assert(_ST_children.length == 1);
+        void delegate(EvaluationContext ctx, ref SymbolData symdata) Deref = &_ST_children[0]._S_Deref;
+
+#line 146 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        if ( symdata is null )
+            throw new EvaluationException("Invalid data for dereferencing");
+        if ( symdata.type[0] != 'P' )
+            throw new EvaluationException("Cannot dereference non-pointer of type "~demangleType(symdata.type));
+        symdata.type = symdata.type[1..$];
+        assert(symdata.type.length>0);
+        ubyte[] data = symdata.getData(ctx);
+        if ( data.length != size_t.sizeof ) {
+            throw new EvaluationException("Invalid pointer data size = "~.toString(data.length));
+        }
+        symdata.ptr = (cast(size_t[])data)[0];
+        symdata.len = ctx.codeView.sizeofMangled(symdata.type);
+        symdata.defered_load = true;
+
+        Deref(ctx, symdata);
+        break;
+    case 2:
+        debug assert(_ST_children.length == 0);
+        break;
+
+    default:
+        assert(0);
+    }
+}
+void _S_DotChain(EvaluationContext ctx, out SymbolData symdata)
+{
+
+    switch ( _ST_rule )
+    {
+    case 3:
+        debug assert(_ST_children.length == 1);
+        void delegate(EvaluationContext ctx, out SymbolData symdata) Register = &_ST_children[0]._S_Register;
+
+#line 170 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        Register(ctx, symdata);
+        break;
+    case 4:
+        debug assert(_ST_children.length == 2);
+        void delegate(EvaluationContext ctx, out SymbolData symdata) Expr = &_ST_children[0]._S_Expr;
+        void delegate(EvaluationContext ctx, NamedSymbol symbol, NamedSymbol[] symbols, string prefix, ref SymbolData symdata) RefExpr = &_ST_children[1]._S_RefExpr;
+
+#line 178 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        Expr(ctx, symdata);
+        RefExpr(ctx, null, null, "", symdata);
+        break;
+    case 5:
+        debug assert(_ST_children.length == 2);
+        void delegate(out string id) Ident = &_ST_children[0]._S_Ident;
+        void delegate(EvaluationContext ctx, NamedSymbol symbol, NamedSymbol[] symbols, string prefix, ref SymbolData symdata) RefExpr = &_ST_children[1]._S_RefExpr;
+
+#line 185 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        string id;
+        Ident(id);
+
+        NamedSymbol[] symbols;
+        NamedSymbol symbol = ctx.findSymbol(id, symbols);
+        if ( symbol !is null )
+            symdata = ctx.loadSymbolData(symbol);
+        else
+            debug DbgIO.println("symbol %s not found", id);
+        RefExpr(ctx, symbol, symbols, id, symdata);
+        break;
+    case 6:
+        debug assert(_ST_children.length == 1);
+        void delegate(out SymbolData litdata) Lit = &_ST_children[0]._S_Lit;
+
+#line 199 "D:\src\ddbg_continued\src\expression\expression.apd"
+ Lit(symdata);
+        break;
+
+    default:
+        assert(0);
+    }
+}
+void _S_RefExpr(EvaluationContext ctx, NamedSymbol symbol, NamedSymbol[] symbols, string prefix, ref SymbolData symdata)
+{
+
+    switch ( _ST_rule )
+    {
+    case 7:
+        debug assert(_ST_children.length == 2);
+        void delegate(out string id) Ident = &_ST_children[0]._S_Ident;
+        void delegate(EvaluationContext ctx, NamedSymbol symbol, NamedSymbol[] symbols, string prefix, ref SymbolData symdata) RefExpr = &_ST_children[1]._S_RefExpr;
+
+#line 208 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        string id;
+        Ident(id);
+        prefix ~= "."~id;
+
+        if ( symdata is null )
+        {
+            symbol = ctx.findSymbol(prefix, symbols);
+            if ( symbol !is null )
+                symdata = ctx.loadSymbolData(symbol);
+        }
+        else
+        {
+			switch ( symdata.type[0] )
+			{
+				//---------------------------------------------------------------------------------
+				// primitive types
+				case 'v': case 'b': case 'x': case 'g': case 'h': case 's':	case 't': case 'i': case 'k': case 'l': case 'm': case 'f':
+				case 'd': case 'e': case 'o': case 'p': case 'j': case 'q': case 'r': case 'c': case 'a': case 'u': case 'w':
+					throw new EvaluationException(
+						"Type mismatch - unexpected . operator in expression of type "~demangleType(symdata.type)
+					);
+				//---------------------------------------------------------------------------------
+                // array properties
+				case 'G':
+                    switch ( id )
+                    {
+                        case "length":
+                            symdata.type = symdata.type[1..$];
+                            size_t len = parseNumber(symdata.type);
+                            symdata.type = "k";
+                            symdata.data = (cast(ubyte*)&len)[0..size_t.sizeof].dup;
+                            symdata.defered_load = false;
+                            break;
+                        case "ptr":
+                            // TODO: can this always be guaranteed?
+                            assert(symdata.defered_load);
+                            size_t ptr = symdata.ptr;
+                            symdata.data = (cast(ubyte*)&ptr)[0..size_t.sizeof];
+                            symdata.defered_load = false;
+                            symdata.type = symdata.type[1..$];
+                            parseNumber(symdata.type);
+                            symdata.type = "P"~symdata.type;
+                            break;
+                        default:
+                            throw new EvaluationException(
+                                "Type mismatch - invalid property "~id~" after expression of type "~demangleType(symdata.type)
+                            );
+                    }
+                    break;
+                case 'A':
+                    switch ( id )
+                    {
+                        case "length":
+                            ubyte[] data = symdata.getData(ctx);
+                            symdata.type = "k";
+                            size_t len = (cast(size_t[])data)[0];
+                            symdata.data = (cast(ubyte*)&len)[0..size_t.sizeof].dup;
+                            symdata.defered_load = false;
+                            break;
+                        case "ptr":
+                            ubyte[] data = symdata.getData(ctx);
+                            symdata.type = "k";
+                            size_t len = (cast(size_t[])data)[1];
+                            symdata.data = (cast(ubyte*)&len)[0..size_t.sizeof].dup;
+                            symdata.defered_load = false;
+                            break;
+                        default:
+                            throw new EvaluationException(
+                                "Type mismatch - invalid property "~id~" after expression of type "~demangleType(symdata.type)
+                            );
+                    }
+                    break;
+                case 'H':
+                    switch ( id )
+                    {
+                        case "length":
+                            ubyte[] data = symdata.getData(ctx);
+                            symdata.ptr = *cast(size_t*)data.ptr;
+                            symdata.len = BB.sizeof;
+                            symdata.defered_load = true;
+                            data = symdata.getData(ctx);
+                            BB* bb = cast(BB*)data.ptr;
+
+                            symdata.type = "k";
+                            symdata.data = (cast(ubyte*)&bb.nodes)[0..size_t.sizeof].dup;
+                            symdata.defered_load = false;
+                            break;
+                        default:
+                            throw new EvaluationException(
+                                "Type mismatch - invalid property "~id~" after expression of type "~demangleType(symdata.type)
+                            );
+                    }
+                    break;
+				//---------------------------------------------------------------------------------
+				// references to structs/classes
+				case 'P':
+                    symdata.type = symdata.type[1..$];
+					if ( symdata.type[0] != 'C' && symdata.type[0] != 'S' )
+					{
+                        throw new EvaluationException(
+                            "Type mismatch - unexpected . operator after expression of type "~demangleType("P"~symdata.type)
+                        );
+					}
+
+                    ubyte[] data = symdata.getData(ctx);
+                    if ( symdata.data.length <= 0 )
+                        throw new EvaluationException("Subexpression evaluated to empty data");
+					symdata.ptr = (cast(uint[])data)[0];
+					symdata.len = ctx.codeView.sizeofMangled(symdata.type);
+					symdata.defered_load = true;
+
+					if ( symdata.ptr == 0 )
+						throw new EvaluationException("pointer is null");
+                    // fall through to struct handling
+
+				//---------------------------------------------------------------------------------
+				// classes/structs
+				case 'C':
+				case 'S':
+                    symdata.type = symdata.type[1..$];
+                    string	scu_name = demangleNameSkip(symdata.type);
+                    assert ( symdata.type.length <= 0 );
+                    if ( (scu_name in ctx.codeView.UDTsByName) is null )
+                        throw new EvaluationException("unknown type \""~scu_name~"\"");
+
+                    LeafClassStruc  lcs = cast(LeafClassStruc)ctx.codeView.UDTsByName[scu_name];
+                    LeafUnion       lu;
+                    LeafFieldList   lfl;
+                    uint            type_length;
+
+                    if ( lcs !is null && lcs.field-0x1000 < ctx.codeView.type_strings.length ) {
+                        Leaf[] fields = ctx.codeView.type_strings[lcs.field-0x1000];
+                        lfl = cast(LeafFieldList)fields[0];
+                        type_length = lcs.length.getUint();
+                    }
+                    else
+                    {
+                        lu = cast(LeafUnion)ctx.codeView.UDTsByName[scu_name];
+                        if ( lu !is null && lu.field-0x1000 < ctx.codeView.type_strings.length ) {
+                            Leaf[] fields = ctx.codeView.type_strings[lu.field-0x1000];
+                            lfl = cast(LeafFieldList)fields[0];
+                            type_length = lu.length.getUint();
+                        }
+                    }
+                    if ( lfl is null )
+                        throw new EvaluationException("invalid struct/class debug symbols");
+
+                    size_t  size,
+                            offset;
+                    if ( !ctx.findMember(id, lfl, size, offset, symdata.type) )
+                        throw new EvaluationException("struct \""~scu_name~"\" has no element \""~id~"\"");
+                    assert ( symdata.type.length > 0 );
+                    debug(eval) DbgIO.println("member: type=%s size=%d offset=%d", symdata.type, size, offset);
+
+                    if ( !symdata.loadByteSlice(offset, offset+size) )
+                        throw new EvaluationException("invalid offset into struct for member \""~id~"\"");
+					break;
+				//---------------------------------------------------------------------------------
+				// unsupported
+				default:
+					throw new EvaluationException("yet unsupported type "~demangleType(symdata.type)~" in expression");
+			}
+        }
+
+        RefExpr(ctx, symbol, symbols, prefix, symdata);
+        break;
+    case 8:
+        debug assert(_ST_children.length == 2);
+        void delegate(EvaluationContext ctx, out SymbolData argdata, out size_t start, out size_t end) Args = &_ST_children[0]._S_Args;
+        void delegate(EvaluationContext ctx, NamedSymbol symbol, NamedSymbol[] symbols, string prefix, ref SymbolData symdata) RefExpr = &_ST_children[1]._S_RefExpr;
+
+#line 383 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        if ( symdata is null )
+            throw new EvaluationException("Unknown symbol "~prefix);
+
+        SymbolData  argdata;
+        size_t      start, end;
+        Args(ctx, argdata, start, end);
+
+        bool isIndex = argdata is null;
+        if ( !isIndex && castArrayIndex(argdata.getData(ctx), argdata.type, start) ) {
+            isIndex = true;
+            end = start+1;
+        }
+
+        switch ( symdata.type[0] )
+        {
+            //---------------------------------------------------------------------------------
+            // primitive types
+            case 'v': case 'b': case 'x': case 'g': case 'h': case 's':	case 't': case 'i': case 'k': case 'l': case 'm': case 'f':
+            case 'd': case 'e': case 'o': case 'p': case 'j': case 'q': case 'r': case 'c': case 'a': case 'u': case 'w':
+            // pointers, classes/structs
+            case 'P': case 'C': case 'S':
+                throw new EvaluationException(
+                    "Type mismatch - unexpected [] operator after expression of type "~demangleType(symdata.type)
+                );
+            //---------------------------------------------------------------------------------
+            // static arrays
+            case 'G':
+                if ( !isIndex )
+                    throw new EvaluationException("Cannot access static array with index type "~demangleType(argdata.type));
+
+                symdata.type = symdata.type[1..$];
+                size_t count = parseNumber(symdata.type);
+                assert(symdata.type.length>0);
+
+                if ( end-start > 1 )
+                {
+                    if ( end > count )
+                        throw new EvaluationException("Array index out of bounds: "~.toString(start)~".."~.toString(end)~" ($="~.toString(count)~")");
+                    size_t size = ctx.codeView.sizeofMangled(symdata.type);
+                    if ( symdata.defered_load ) {
+                        symdata.ptr += start * size;
+                        symdata.len = (end-start) * size;
+                    }
+                    else
+                        symdata.data = symdata.data[start*size .. end*size];
+                    symdata.type = "G"~.toString(end-start)~symdata.type;
+                }
+                else
+                {
+                    if ( !symdata.loadElementSlice(start, end, ctx.codeView) )
+                        throw new EvaluationException("Array index out of bounds: "~.toString(start)~".."~.toString(end)~" ($="~.toString(count)~")");
+                }
+                break;
+            //---------------------------------------------------------------------------------
+            // dynamic arrays
+            case 'A':
+                if ( !isIndex )
+                    throw new EvaluationException("Cannot access dynamic array with index type "~demangleType(argdata.type));
+
+                ubyte[] data = symdata.getData(ctx);
+                if ( data.length < 8 )
+                    throw new EvaluationException("Subexpression evaluated to empty data");
+
+                if ( end-start > 1 )
+                {
+                    if ( end > (cast(size_t[])data)[0] )
+                        throw new EvaluationException("Array index out of bounds: "~.toString(start)~".."~.toString(end)~" ($="~.toString(symdata.len)~")");
+                    size_t size = ctx.codeView.sizeofMangled(symdata.type[1..$]);
+                    (cast(size_t[])data)[1] += start * size,
+                    (cast(size_t[])data)[0] = end-start;
+                }
+                else
+                {
+                    symdata.type = symdata.type[1..$];
+                    assert(symdata.type.length>0);
+                    symdata.ptr = (cast(size_t[])data)[1];
+                    symdata.len = (cast(size_t[])data)[0] * ctx.codeView.sizeofMangled(symdata.type);
+                    symdata.defered_load = true;
+
+                    if ( !symdata.loadElementSlice(start, end, ctx.codeView) )
+                        throw new EvaluationException("Array index out of bounds: "~.toString(start)~".."~.toString(end)~" ($="~.toString(symdata.len)~")");
+                }
+                break;
+            //---------------------------------------------------------------------------------
+            // associative arrays
+            case 'H':
+                int i;
+                for ( i = 1; i < symdata.type.length && std.string.find(lowercase, symdata.type[i]) < 0; ++i ) {}
+                string		key_type	= symdata.type[1..i+1],
+                            val_type	= symdata.type[i+1..$];
+                size_t      val_tsize   = ctx.codeView.sizeofMangled(val_type);
+                TypeInfo	key_ti		= TypeInfoFromMangled(key_type);
+
+                aaA* loadaaA(void* ptr)
+                {
+                    if ( ptr is null )
+                        return null;
+                    ubyte[] data;
+                    data.length = aaA.sizeof+key_ti.tsize+val_tsize;
+                    if ( data.length != ctx.process.readProcessMemory(cast(uint)ptr, data.ptr, data.length) )
+                        return null;
+                    aaA* a = cast(aaA*)data.ptr;
+                    if ( std.string.find(lowercase, key_type[0]) < 0 )
+                    switch ( key_type[0] )
+                    {
+                        case 'A':
+                            ubyte[] tmp = *cast(ubyte[]*)(a+1);
+                            if ( tmp.length > ctx.process.MEMCHECK_MIN && ctx.process.isInvalidMem(cast(size_t)tmp.ptr, tmp.length) )
+                                return null;
+                            data = new ubyte[tmp.length];
+                            if ( data.length != ctx.process.readProcessMemory(cast(size_t)tmp.ptr, data.ptr, data.length) )
+                                return null;
+                            *cast(ubyte[]*)(a+1) = data;
+                            break;
+                        case 'P':
+                            break;
+                        default:
+                            throw new EvaluationException("only basic, pointer and array key types are supported, yet");
+                    }
+                    return a;
+                }
+
+                ubyte[] findKey(size_t ptr, hash_t hash, ubyte[] key_data)
+                {
+                    ubyte[] data;
+                    data.length = BB.sizeof;
+                    if ( data.length != ctx.process.readProcessMemory(ptr, data.ptr, data.length) )
+                        return null;
+                    BB* bb = cast(BB*)data.ptr;
+                    size_t blen = bb.b.length*size_t.sizeof;
+                    debug(eval) DbgIO.println("%d nodes, bb.b.length=%d", bb.nodes, bb.b.length);
+
+                    if ( blen > ctx.process.MEMCHECK_MIN && ctx.process.isInvalidMem(cast(size_t)bb.b.ptr, blen) )
+                        return null;
+                    data = new ubyte[blen];
+                    if ( data.length != ctx.process.readProcessMemory(cast(uint)bb.b.ptr, data.ptr, data.length) )
+                        return null;
+                    bb.b = cast(aaA*[])data;
+
+                    uint i = hash % bb.b.length;
+                    debug(eval) DbgIO.println("start index=%d", i);
+                    aaA* a = loadaaA(bb.b[i]);
+                    while ( a !is null )
+                    {
+                        if ( hash == a.hash )
+                        {
+                            debug(eval) DbgIO.println("equal 0x%x", a.hash);
+                            auto cmp = key_ti.compare(key_data.ptr, a+1);
+                            debug(eval) DbgIO.println("%s: %d == %d -> %d", key_ti, *cast(uint*)key_data.ptr, *cast(uint*)(a+1), cmp);
+                            if ( cmp == 0 )
+                                return ((cast(ubyte*)(a+1))+key_ti.tsize)[0 .. val_tsize];
+                            a = cmp < 0 ? loadaaA(a.left) : loadaaA(a.right);
+                        }
+                        else {
+                            debug(eval) DbgIO.println("not equal 0x%x", a.hash);
+                            a = hash < a.hash ? loadaaA(a.left) : loadaaA(a.right);
+                        }
+                    }
+                    return null;
+                }
+
+                if ( key_type != argdata.type )
+                    throw new EvaluationException("Invalid key type for associative array. Expected "~demangleType(key_type)~" found "~demangleType(argdata.type));
+                TypeInfo ti = TypeInfoFromMangled(argdata.type);
+                hash_t index_hash = ti.getHash(argdata.data.ptr);
+
+                debug(eval) DbgIO.println("searching, hash=0x%x", index_hash);
+                ubyte[] data = symdata.getData(ctx);
+                symdata.data = findKey((cast(size_t[])data)[0], index_hash, argdata.getData(ctx));
+                symdata.type = val_type;
+                break;
+            //---------------------------------------------------------------------------------
+            // unsupported
+            default:
+                throw new EvaluationException("yet unsupported type "~demangleType(symdata.type)~" in expression");
+        }
+
+        RefExpr(ctx, symbol, null, null, symdata);
+        break;
+    case 9:
+        debug assert(_ST_children.length == 0);
+
+#line 568 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        if ( symdata is null )
+            throw new EvaluationException("Unknown symbol "~prefix);
+        break;
+
+    default:
+        assert(0);
+    }
+}
+void _S_Args(EvaluationContext ctx, out SymbolData argdata, out size_t start, out size_t end)
+{
+
+    switch ( _ST_rule )
+    {
+    case 10:
+        debug assert(_ST_children.length == 2);
+        void delegate(EvaluationContext ctx, out SymbolData symdata) Expr = &_ST_children[0]._S_Expr;
+        void delegate(EvaluationContext ctx, out SymbolData symdata) Expr2 = &_ST_children[1]._S_Expr;
+
+#line 579 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        SymbolData arg1, arg2;
+        Expr(ctx, arg1);
+        Expr2(ctx, arg2);
+
+        bool isIndex = castArrayIndex(arg1.getData(ctx), arg1.type, start);
+        isIndex = isIndex && castArrayIndex(arg2.getData(ctx), arg2.type, end);
+        if ( !isIndex )
+            throw new EvaluationException("Slices may only have integer indeces, not "~demangleType(arg1.type)~".."~demangleType(arg2.type));
+        break;
+    case 11:
+        debug assert(_ST_children.length == 1);
+        void delegate(EvaluationContext ctx, out SymbolData symdata) Expr = &_ST_children[0]._S_Expr;
+
+#line 591 "D:\src\ddbg_continued\src\expression\expression.apd"
+ Expr(ctx, argdata);
+        break;
+
+    default:
+        assert(0);
+    }
+}
+void _S_Register(EvaluationContext ctx, out SymbolData symdata)
+{
+
+    switch ( _ST_rule )
+    {
+    case 12:
+        debug assert(_ST_children.length == 1);
+        void delegate(out string name, out ubyte width) RegName = &_ST_children[0]._S_RegName;
+
+#line 601 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        string  name;
+        ubyte   width;
+        RegName(name, width);
+
+		CONTEXT threadCtx;
+		uint context_flags;
+        context_flags |= CONTEXT_FULL;
+        context_flags |= CONTEXT_FLOATING_POINT;
+        context_flags |= CONTEXT_EXTENDED_REGISTERS;
+		if ( !ctx.getContext(threadCtx, context_flags) )
+			throw new EvaluationException("Couldn't get main thread's context");
+
+        ubyte* ptr;
+        switch ( name[1..$] )
+        {
+            case "ax":
+            case "eax":
+            case "al":  ptr = cast(ubyte*)&threadCtx.Eax;   break;
+            case "ah":  ptr = (cast(ubyte*)&threadCtx.Eax)+1;   break;
+            case "bx":
+            case "ebx":
+            case "bl":  ptr = cast(ubyte*)&threadCtx.Ebx;   break;
+            case "bh":  ptr = (cast(ubyte*)&threadCtx.Ebx)+1;   break;
+            case "cx":
+            case "ecx":
+            case "cl":  ptr = cast(ubyte*)&threadCtx.Ecx;   break;
+            case "ch":  ptr = (cast(ubyte*)&threadCtx.Ecx)+1;   break;
+            case "dx":
+            case "edx":
+            case "dl":  ptr = cast(ubyte*)&threadCtx.Edx;   break;
+            case "dh":  ptr = (cast(ubyte*)&threadCtx.Edx)+1;   break;
+            case "edi":
+            case "di":  ptr = cast(ubyte*)&threadCtx.Edi;   break;
+            case "esi":
+            case "si":  ptr = cast(ubyte*)&threadCtx.Esi;   break;
+            case "ebp":
+            case "bp":  ptr = cast(ubyte*)&threadCtx.Ebp;   break;
+            case "esp":
+            case "sp":  ptr = cast(ubyte*)&threadCtx.Esp;   break;
+            case "eip": ptr = cast(ubyte*)&threadCtx.Eip;   break;
+            case "efl": ptr = cast(ubyte*)&threadCtx.EFlags;    break;
+            case "cs":  ptr = cast(ubyte*)&threadCtx.SegCs; break;
+            case "ds":  ptr = cast(ubyte*)&threadCtx.SegDs; break;
+            case "es":  ptr = cast(ubyte*)&threadCtx.SegEs; break;
+            case "fs":  ptr = cast(ubyte*)&threadCtx.SegFs; break;
+            case "gs":  ptr = cast(ubyte*)&threadCtx.SegGs; break;
+            default:
+                int i = name[$-1]-'0';
+                if ( name[0..2] == "st" )
+                    ptr = cast(ubyte*)&((cast(real[])threadCtx.FloatSave.RegisterArea)[i]);
+                else if ( name[0..2] == "mm" )
+                    ptr = cast(ubyte*)&((cast(long[])threadCtx.ExtendedRegisters)[4+i*2]);
+                else if ( name[0..3] == "xmm" )
+                    ptr = cast(ubyte*)&((cast(long[])threadCtx.ExtendedRegisters)[20+i*2]);
+                else
+                    assert(0);
+        }
+
+        symdata = new SymbolData;
+        switch ( width )
+        {
+            case 8:
+                symdata.type = "h";
+                symdata.data = ptr[0..1].dup;
+                break;
+            case 16:
+                symdata.type = "t";
+                symdata.data = ptr[0..2].dup;
+                break;
+            case 32:
+                symdata.type = "k";
+                symdata.data = ptr[0..4].dup;
+                break;
+            case 64:
+                symdata.type = "m";
+                symdata.data = ptr[0..8].dup;
+                break;
+            case 80:
+                symdata.type = "e";
+                symdata.data = ptr[0..10].dup;
+                break;
+            case 128:
+                symdata.type = "G4k";
+                symdata.data = ptr[0..16].dup;
+                break;
+            default:
+                assert(0, "unhandled register width "~.toString(width));
+        }
+        break;
+
+    default:
+        assert(0);
+    }
+}
+void _S_RegName(out string name, out ubyte width)
+{
+
+    switch ( _ST_rule )
+    {
+    case 13:
+        debug assert(_ST_children.length == 0);
+
+#line 696 "D:\src\ddbg_continued\src\expression\expression.apd"
+ name = _ST_match; width = 32;
+        break;
+    case 14:
+        debug assert(_ST_children.length == 0);
+
+#line 699 "D:\src\ddbg_continued\src\expression\expression.apd"
+ name = _ST_match; width = 16;
+        break;
+    case 15:
+        debug assert(_ST_children.length == 0);
+
+#line 702 "D:\src\ddbg_continued\src\expression\expression.apd"
+ name = _ST_match; width = 8;
+        break;
+    case 16:
+        debug assert(_ST_children.length == 0);
+
+#line 705 "D:\src\ddbg_continued\src\expression\expression.apd"
+ name = _ST_match; width = 8*real.sizeof;
+        break;
+    case 17:
+        debug assert(_ST_children.length == 0);
+
+#line 708 "D:\src\ddbg_continued\src\expression\expression.apd"
+ name = _ST_match; width = 64;
+        break;
+    case 18:
+        debug assert(_ST_children.length == 0);
+
+#line 711 "D:\src\ddbg_continued\src\expression\expression.apd"
+ name = _ST_match; width = 128;
+        break;
+
+    default:
+        assert(0);
+    }
+}
+void _S_Cast(EvaluationContext ctx, ref SymbolData symdata)
+{
+
+    switch ( _ST_rule )
+    {
+    case 19:
+        debug assert(_ST_children.length == 1);
+        void delegate(EvaluationContext ctx, ref string mangled) Type = &_ST_children[0]._S_Type;
+
+#line 724 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        symdata.type = "";
+        Type(ctx, symdata.type);
+        if ( symdata.type.length <= 0 )
+            throw new EvaluationException("Unknown type in cast");
+        break;
+    case 20:
+        debug assert(_ST_children.length == 0);
+        break;
+
+    default:
+        assert(0);
+    }
+}
+void _S_Type(EvaluationContext ctx, ref string mangled)
+{
+
+    switch ( _ST_rule )
+    {
+    case 21:
+        debug assert(_ST_children.length == 2);
+        void delegate(EvaluationContext ctx, out string type) BaseType = &_ST_children[0]._S_BaseType;
+        void delegate(EvaluationContext ctx, ref string mangled) QuantList = &_ST_children[1]._S_QuantList;
+
+#line 737 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        string  unmangled;
+        BaseType(ctx, unmangled);
+
+		switch ( unmangled )
+		{
+			case "void":	mangled = "v";	break;
+			case "bool":	mangled = "b";	break;
+			case "byte":	mangled = "g";	break;
+			case "ubyte":	mangled = "h";	break;
+			case "char":	mangled = "a";	break;
+			case "wchar":	mangled = "u";	break;
+			case "dchar":	mangled = "w";	break;
+			case "short":	mangled = "s";	break;
+			case "ushort":	mangled = "t";	break;
+			case "int":		mangled = "i";	break;
+			case "uint":	mangled = "k";	break;
+			case "long":	mangled = "l";	break;
+			case "ulong":	mangled = "m";	break;
+			case "float":	mangled = "f";	break;
+			case "double":	mangled = "d";	break;
+			case "real":	mangled = "e";	break;
+			default:
+				Leaf lf;
+				if ( (unmangled in ctx.codeView.UDTsByName) is null )
+				{
+					foreach ( un, l; ctx.codeView.UDTsByName )
+					{
+						if ( std.string.find(un, "."~unmangled) > 0 ) {
+							lf = l;
+							break;
+						}
+					}
+				}
+				else
+					lf = ctx.codeView.UDTsByName[unmangled];
+
+				if ( lf !is null )
+				{
+					string fqn;
+					switch ( lf.leaf_index )
+					{
+						case LF_CLASS_16t:
+							mangled = "C";
+							fqn = (cast(LeafClassStruc)lf).name;
+							break;
+						case LF_STRUCTURE_16t:
+							mangled = "S";
+							fqn = (cast(LeafClassStruc)lf).name;
+							break;
+						case LF_ENUM_16t:
+							mangled = "E";
+							fqn = (cast(LeafEnum)lf).name;
+							break;
+						default:
+							assert(0);
+					}
+					string[] parts = std.string.split(fqn, ".");
+					foreach ( p; parts ) {
+						mangled ~= .toString(p.length);
+						mangled ~= p;
+					}
+				}
+                else
+                    throw new EvaluationException("Unknown BaseType "~unmangled);
+				break;
+		}
+
+		QuantList(ctx, mangled);
+        break;
+
+    default:
+        assert(0);
+    }
+}
+void _S_BaseType(EvaluationContext ctx, out string type)
+{
+
+    switch ( _ST_rule )
+    {
+    case 22:
+        debug assert(_ST_children.length == 2);
+        void delegate(out string id) FQNIdent = &_ST_children[0]._S_FQNIdent;
+        void delegate(EvaluationContext ctx, out string str) TplParams = &_ST_children[1]._S_TplParams;
+
+#line 812 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        FQNIdent(type);
+        string str;
+        TplParams(ctx, str);
+        type ~= str;
+        break;
+
+    default:
+        assert(0);
+    }
+}
+void _S_QuantList(EvaluationContext ctx, ref string mangled)
+{
+
+    switch ( _ST_rule )
+    {
+    case 23:
+        debug assert(_ST_children.length == 2);
+        void delegate(EvaluationContext ctx, ref string mangled) Quantifier = &_ST_children[0]._S_Quantifier;
+        void delegate(EvaluationContext ctx, ref string mangled) QuantList = &_ST_children[1]._S_QuantList;
+
+#line 823 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        Quantifier(ctx, mangled);
+        QuantList(ctx, mangled);
+        break;
+    case 24:
+        debug assert(_ST_children.length == 0);
+        break;
+
+    default:
+        assert(0);
+    }
+}
+void _S_Quantifier(EvaluationContext ctx, ref string mangled)
+{
+
+    switch ( _ST_rule )
+    {
+    case 25:
+        debug assert(_ST_children.length == 0);
+
+#line 834 "D:\src\ddbg_continued\src\expression\expression.apd"
+ mangled = "P"~mangled;
+        break;
+    case 26:
+        debug assert(_ST_children.length == 0);
+
+#line 837 "D:\src\ddbg_continued\src\expression\expression.apd"
+ mangled = "A"~mangled;
+        break;
+    case 27:
+        debug assert(_ST_children.length == 1);
+        void delegate(out ulong val) Integer = &_ST_children[0]._S_Integer;
+
+#line 842 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        ulong len;
+        Integer(len);
+        mangled = "G"~.toString(len)~mangled;
+        break;
+    case 28:
+        debug assert(_ST_children.length == 1);
+        void delegate(EvaluationContext ctx, ref string mangled) Type = &_ST_children[0]._S_Type;
+
+#line 851 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        string index_mangled;
+        Type(ctx, index_mangled);
+        mangled = "H"~index_mangled~mangled;
+        break;
+
+    default:
+        assert(0);
+    }
+}
+void _S_TplParams(EvaluationContext ctx, out string str)
+{
+
+    switch ( _ST_rule )
+    {
+    case 29:
+        debug assert(_ST_children.length == 2);
+        void delegate(EvaluationContext ctx, out string str) TplParam = &_ST_children[0]._S_TplParam;
+        void delegate(EvaluationContext ctx, out string str) TplParams2 = &_ST_children[1]._S_TplParams2;
+
+#line 865 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        string tmp;
+        TplParam(ctx, tmp);
+        str = "!("~tmp;
+        TplParams2(ctx, tmp);
+        str ~= tmp~")";
+        break;
+    case 30:
+        debug assert(_ST_children.length == 0);
+        break;
+
+    default:
+        assert(0);
+    }
+}
+void _S_TplParams2(EvaluationContext ctx, out string str)
+{
+
+    switch ( _ST_rule )
+    {
+    case 31:
+        debug assert(_ST_children.length == 2);
+        void delegate(EvaluationContext ctx, out string str) TplParam = &_ST_children[0]._S_TplParam;
+        void delegate(EvaluationContext ctx, out string str) TplParams2 = &_ST_children[1]._S_TplParams2;
+
+#line 881 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        TplParam(ctx, str);
+        string tmp;
+        TplParams2(ctx, tmp);
+        str ~= tmp;
+        break;
+    case 32:
+        debug assert(_ST_children.length == 0);
+        break;
+
+    default:
+        assert(0);
+    }
+}
+void _S_TplParam(EvaluationContext ctx, out string str)
+{
+
+    switch ( _ST_rule )
+    {
+    case 33:
+        debug assert(_ST_children.length == 1);
+        void delegate(EvaluationContext ctx, ref string mangled) Type = &_ST_children[0]._S_Type;
+
+#line 893 "D:\src\ddbg_continued\src\expression\expression.apd"
+ Type(ctx, str);
+        break;
+    case 34:
+        debug assert(_ST_children.length == 1);
+        void delegate(out string str) StrLit = &_ST_children[0]._S_StrLit;
+
+#line 894 "D:\src\ddbg_continued\src\expression\expression.apd"
+ StrLit(str);
+        break;
+
+    default:
+        assert(0);
+    }
+}
+void _S_Lit(out SymbolData litdata)
+{
+
+    switch ( _ST_rule )
+    {
+    case 35:
+        debug assert(_ST_children.length == 3);
+        void delegate(ref SymbolData symdata) Sign = &_ST_children[0]._S_Sign;
+        void delegate(out ulong val) Integer = &_ST_children[1]._S_Integer;
+        void delegate(out string type) IntegerSuffix = &_ST_children[2]._S_IntegerSuffix;
+
+#line 904 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        litdata = new SymbolData;
+        IntegerSuffix(litdata.type);
+        ulong val;
+        Integer(val);
+
+        if ( val > 0x7fffffffffffffff )
+            litdata.type = "m";
+        else if ( val > 0xffffffff )
+            litdata.type = litdata.type[0]=='i'||litdata.type[0]=='l'?"l":"m";
+        else if ( val > 0x7fffffff && litdata.type[0] == 'i' )
+            litdata.type = "k";
+
+        litdata.data = (cast(ubyte*)&val)[0 .. (litdata.type[0] == 'k' || litdata.type[0] == 'i')?uint.sizeof:ulong.sizeof].dup;
+        Sign(litdata);
+        break;
+    case 36:
+        debug assert(_ST_children.length == 0);
+
+#line 923 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        litdata = new SymbolData;
+        litdata.type = "Aa";
+        litdata.data = cast(ubyte[])_ST_match;
+        break;
+    case 37:
+        debug assert(_ST_children.length == 0);
+
+#line 931 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        litdata = new SymbolData;
+        litdata.type = "a";
+        litdata.data = cast(ubyte[])_ST_match[0..1];
+        break;
+
+    default:
+        assert(0);
+    }
+}
+void _S_StrLit(out string str)
+{
+
+    switch ( _ST_rule )
+    {
+    case 38:
+        debug assert(_ST_children.length == 1);
+        void delegate(out ulong val) Integer = &_ST_children[0]._S_Integer;
+
+#line 942 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        ulong val;
+        Integer(val);
+        str = .toString(val);
+        break;
+    case 39:
+        debug assert(_ST_children.length == 0);
+
+#line 950 "D:\src\ddbg_continued\src\expression\expression.apd"
+ str = _ST_match;
+        break;
+    case 40:
+        debug assert(_ST_children.length == 0);
+
+#line 954 "D:\src\ddbg_continued\src\expression\expression.apd"
+ str = _ST_match;
+        break;
+
+    default:
+        assert(0);
+    }
+}
+void _S_Ident(out string id)
+{
+
+    switch ( _ST_rule )
+    {
+    case 41:
+        debug assert(_ST_children.length == 0);
+
+#line 960 "D:\src\ddbg_continued\src\expression\expression.apd"
+ id = _ST_match;
+        break;
+
+    default:
+        assert(0);
+    }
+}
+void _S_FQNIdent(out string id)
+{
+
+    switch ( _ST_rule )
+    {
+    case 42:
+        debug assert(_ST_children.length == 1);
+        void delegate(out string id) Ident = &_ST_children[0]._S_Ident;
+
+#line 966 "D:\src\ddbg_continued\src\expression\expression.apd"
+ Ident(id);
+        break;
+    case 43:
+        debug assert(_ST_children.length == 2);
+        void delegate(out string id) FQNIdent = &_ST_children[0]._S_FQNIdent;
+        void delegate(out string id) Ident = &_ST_children[1]._S_Ident;
+
+#line 969 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        FQNIdent(id);
+        string tmp;
+        Ident(tmp);
+        id ~= "."~tmp;
+        break;
+
+    default:
+        assert(0);
+    }
+}
+void _S_Integer(out ulong val)
+{
+
+    switch ( _ST_rule )
+    {
+    case 44:
+        debug assert(_ST_children.length == 0);
+
+#line 984 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        foreach ( b; _ST_match[2..$] )
+        {
+            val <<= 4;
+            if ( b > 'F' )
+                val |= b-'W';
+            else if ( b > '9' )
+                val |= b-'7';
+            else
+                val |= b-'0';
+        }
+        break;
+    case 45:
+        debug assert(_ST_children.length == 0);
+
+#line 999 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        foreach ( b; _ST_match[2..$] )
+        {
+            val <<= 1;
+            if ( b == '1' )
+                val |= 1;
+        }
+        break;
+    case 46:
+        debug assert(_ST_children.length == 0);
+
+#line 1010 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        foreach ( b; _ST_match[1..$] ) {
+            val <<= 3;
+            val |= b-'0';
+        }
+        break;
+    case 47:
+        debug assert(_ST_children.length == 0);
+
+#line 1019 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        foreach ( b; _ST_match ) {
+            val *= 10;
+            val += b-'0';
+        }
+        break;
+
+    default:
+        assert(0);
+    }
+}
+void _S_IntegerSuffix(out string type)
+{
+
+    switch ( _ST_rule )
+    {
+    case 48:
+        debug assert(_ST_children.length == 0);
+
+#line 1030 "D:\src\ddbg_continued\src\expression\expression.apd"
+ type = "m";
+        break;
+    case 49:
+        debug assert(_ST_children.length == 0);
+
+#line 1033 "D:\src\ddbg_continued\src\expression\expression.apd"
+ type = "m";
+        break;
+    case 50:
+        debug assert(_ST_children.length == 0);
+
+#line 1036 "D:\src\ddbg_continued\src\expression\expression.apd"
+ type = "m";
+        break;
+    case 51:
+        debug assert(_ST_children.length == 0);
+
+#line 1039 "D:\src\ddbg_continued\src\expression\expression.apd"
+ type = "m";
+        break;
+    case 52:
+        debug assert(_ST_children.length == 0);
+
+#line 1042 "D:\src\ddbg_continued\src\expression\expression.apd"
+ type = "l";
+        break;
+    case 53:
+        debug assert(_ST_children.length == 0);
+
+#line 1045 "D:\src\ddbg_continued\src\expression\expression.apd"
+ type = "k";
+        break;
+    case 54:
+        debug assert(_ST_children.length == 0);
+
+#line 1048 "D:\src\ddbg_continued\src\expression\expression.apd"
+ type = "i";
+        break;
+
+    default:
+        assert(0);
+    }
+}
+void _S_Sign(ref SymbolData symdata)
+{
+
+    switch ( _ST_rule )
+    {
+    case 55:
+        debug assert(_ST_children.length == 0);
+
+#line 1054 "D:\src\ddbg_continued\src\expression\expression.apd"
+
+        switch ( symdata.type[0] )
+        {
+            case 'i':
+                *cast(int*)symdata.data.ptr = 0-*cast(int*)symdata.data.ptr;
+                break;
+            case 'k':
+                *cast(uint*)symdata.data.ptr = 0-*cast(uint*)symdata.data.ptr;
+                break;
+            case 'l':
+                *cast(long*)symdata.data.ptr = 0-*cast(long*)symdata.data.ptr;
+                break;
+            case 'm':
+                *cast(ulong*)symdata.data.ptr = 0-*cast(ulong*)symdata.data.ptr;
+                break;
+            default:
+                assert(0);
+        }
+        break;
+    case 56:
+        debug assert(_ST_children.length == 0);
+        break;
+
+    default:
+        assert(0);
+    }
+}
+
+// generated code end
+}
+
+#line 1443 "D:\src\ddbg_continued\src\expression\expression_apd.d"
+// Written in the D programming language
+
+/*
+ *  This file has been automatically generated by APaGeD v0.4.2 beta - Attributed Parser Generator for D.
+ *
+ *  Sections generated from custom input are marked as "generated code" and
+ *  are subject to the terms and conditions stated in one of these sections.
+ *  The remaining sections are part of the APaGeD package and subject
+ *  to the terms and conditions of the corresponding license.
+ *
+ *  Attributed Parser Generator for D
+ *  Copyright (c) 2007 Jascha Wetzel. All rights reserved
+ *  License: Artistic License 2.0
+ */
+
+/**************************************************************************************************
+    Lexer
+**************************************************************************************************/
+
+version(Tango)
+// the following block is stolen from phobos.
+// the copyright notice applies for this block only.
+{
+/*
+ *  Copyright (C) 2003-2004 by Digital Mars, www.digitalmars.com
+ *  Written by Walter Bright
+ *
+ *  This software is provided 'as-is', without any express or implied
+ *  warranty. In no event will the authors be held liable for any damages
+ *  arising from the use of this software.
+ *
+ *  Permission is granted to anyone to use this software for any purpose,
+ *  including commercial applications, and to alter it and redistribute it
+ *  freely, subject to the following restrictions:
+ *
+ *  o  The origin of this software must not be misrepresented; you must not
+ *     claim that you wrote the original software. If you use this software
+ *     in a product, an acknowledgment in the product documentation would be
+ *     appreciated but is not required.
+ *  o  Altered source versions must be plainly marked as such, and must not
+ *     be misrepresented as being the original software.
+ *  o  This notice may not be removed or altered from any source
+ *     distribution.
+ */
+
+bool isValidDchar(dchar c)
+{
+    /* Note: FFFE and FFFF are specifically permitted by the
+     * Unicode standard for application internal use, but are not
+     * allowed for interchange.
+     * (thanks to Arcane Jill)
+     */
+
+    return c < 0xD800 ||
+	(c > 0xDFFF && c <= 0x10FFFF /*&& c != 0xFFFE && c != 0xFFFF*/);
+}
+
+/***************
+ * Decodes and returns character starting at s[idx]. idx is advanced past the
+ * decoded character. If the character is not well formed, a UtfException is
+ * thrown and idx remains unchanged.
+ */
+
+dchar decode(in char[] s, inout size_t idx)
+    {
+	size_t len = s.length;
+	dchar V;
+	size_t i = idx;
+	char u = s[i];
+
+	if (u & 0x80)
+	{   uint n;
+	    char u2;
+
+	    /* The following encodings are valid, except for the 5 and 6 byte
+	     * combinations:
+	     *	0xxxxxxx
+	     *	110xxxxx 10xxxxxx
+	     *	1110xxxx 10xxxxxx 10xxxxxx
+	     *	11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+	     *	111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
+	     *	1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
+	     */
+	    for (n = 1; ; n++)
+	    {
+		if (n > 4)
+		    goto Lerr;		// only do the first 4 of 6 encodings
+		if (((u << n) & 0x80) == 0)
+		{
+		    if (n == 1)
+			goto Lerr;
+		    break;
+		}
+	    }
+
+	    // Pick off (7 - n) significant bits of B from first byte of octet
+	    V = cast(dchar)(u & ((1 << (7 - n)) - 1));
+
+	    if (i + (n - 1) >= len)
+		goto Lerr;			// off end of string
+
+	    /* The following combinations are overlong, and illegal:
+	     *	1100000x (10xxxxxx)
+	     *	11100000 100xxxxx (10xxxxxx)
+	     *	11110000 1000xxxx (10xxxxxx 10xxxxxx)
+	     *	11111000 10000xxx (10xxxxxx 10xxxxxx 10xxxxxx)
+	     *	11111100 100000xx (10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx)
+	     */
+	    u2 = s[i + 1];
+	    if ((u & 0xFE) == 0xC0 ||
+		(u == 0xE0 && (u2 & 0xE0) == 0x80) ||
+		(u == 0xF0 && (u2 & 0xF0) == 0x80) ||
+		(u == 0xF8 && (u2 & 0xF8) == 0x80) ||
+		(u == 0xFC && (u2 & 0xFC) == 0x80))
+		goto Lerr;			// overlong combination
+
+	    for (uint j = 1; j != n; j++)
+	    {
+		u = s[i + j];
+		if ((u & 0xC0) != 0x80)
+		    goto Lerr;			// trailing bytes are 10xxxxxx
+		V = (V << 6) | (u & 0x3F);
+	    }
+	    if (!isValidDchar(V))
+		goto Lerr;
+	    i += n;
+	}
+	else
+	{
+	    V = cast(dchar) u;
+	    i++;
+	}
+
+	idx = i;
+	return V;
+
+      Lerr:
+	throw new Exception("4invalid UTF-8 sequence");
+    }
+}
+else
+{
+    import std.utf;
+}
+
+// lexer code
+// generated code start
+// ((?\*)|(?\()|(?\))|(?\.)|(?\[)|(?\])|(?\.\.)|(?#(e[abcd]x|e[ds]i|e[bs]p|eip|efl))|(?#([abcd]x|[ds]i|[bs]p|(cdefgs)s))|(?#[abcd][hl])|(?#st[0-7])|(?#mm[0-7])|(?#xmm[0-7])|(?cast)|(?!)|(?,)|(?"(([^"\\]*(\\(['"\?\\abfnrtv]|(x[0-9a-fA-F]{2})|(u[0-9a-fA-F]{4})|(U[0-9a-fA-F]{8})))?)*)")|(?'(([^'\\]|(\\(['"\?\\abfnrtv]|(x[0-9a-fA-F]{2})|(u[0-9a-fA-F]{4})|(U[0-9a-fA-F]{8})))))')|(?[a-zA-Z_][_a-zA-Z0-9]*)|(?0[xX][0-9a-fA-F_]+)|(?0[bB][01_]+)|(?0[0-7_]+)|(?0|([1-9][0-9_]*))|(?L)|(?u)|(?U)|(?[uU])|(?\-)).*?
+bool mainLexer(string input, out uint token, out string match)
+{
+    uint s = 0;
+    static int r56=-1, r57=-1, r58=-1, r59=-1, r60=-1, r61=-1, r62=-1, r63=-1, r64=-1, r65=-1, 
+        r66=-1, r67=-1, r68=-1, r69=-1, r70=-1, r71=-1, r72=-1, r73=-1, r74=-1, r75=-1, 
+        r76=-1, r77=-1, r78=-1, r79=-1, r80=-1, r81=-1, r82=-1, r83=-1, r84=-1, r85=-1, 
+        r86=-1;
+
+    for ( size_t p = 0, q = 0, p_end = input.length; p < p_end; q = p )
+    {
+        dchar c = cast(dchar)input[p];
+        if ( c & 0x80 )
+            decode(input, p);
+        else
+            ++p;
+        switch ( s )
+        {
+            case 0:
+                if ( c == 0x4c ) {
+                    s = 14;
+                    r66 = p;
+                }
+                else if ( c == 0x28 ) {
+                    s = 2;
+                    r57 = p;
+                }
+                else if ( c == 0x63 ) {
+                    s = 13;
+                    r66 = p;
+                }
+                else if ( c == 0x75 ) {
+                    s = 16;
+                    r66 = p;
+                }
+                else if ( c == 0x2d ) {
+                    s = 11;
+                    r64 = p;
+                }
+                else if ( c == 0x55 ) {
+                    s = 17;
+                    r66 = p;
+                }
+                else if ( c == 0x23 ) {
+                    s = 18;
+                }
+                else if ( c == 0x2e ) {
+                    s = 12;
+                    r65 = p;
+                }
+                else if ( c == 0x2c ) {
+                    s = 10;
+                    r63 = p;
+                }
+                else if ( c == 0x2a ) {
+                    s = 1;
+                    r56 = p;
+                }
+                else if ( c == 0x5d ) {
+                    s = 5;
+                    r60 = p;
+                }
+                else if ( c == 0x21 ) {
+                    s = 8;
+                    r61 = p;
+                }
+                else if ( c == 0x29 ) {
+                    s = 3;
+                    r58 = p;
+                }
+                else if ( c == 0x5b ) {
+                    s = 4;
+                    r59 = p;
+                }
+                else if ( c == 0x30 ) {
+                    s = 19;
+                    r62 = p;
+                }
+                else if ( c >= 0x31 && c <= 0x39 ) {
+                    s = 9;
+                    r62 = p;
+                }
+                else if ( c == 0x22 ) {
+                    s = 6;
+                }
+                else if ( c == 0x27 ) {
+                    s = 7;
+                }
+                else if ( c >= 0x41 && c <= 0x4b || c >= 0x4d && c <= 0x54 || c >= 0x56 && c <= 0x5a || c == 0x5f || c >= 0x61 && c <= 0x62 || c >= 0x64 && c <= 0x74 || c >= 0x76 && c <= 0x7a ) {
+                    s = 15;
+                    r66 = p;
+                }
+                else
+                    return false;
+                break;
+            case 1:
+                if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 129;
+                }
+                else
+                    goto finish1;
+                break;
+            case 2:
+                if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 128;
+                }
+                else
+                    goto finish2;
+                break;
+            case 3:
+                if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 127;
+                }
+                else
+                    goto finish3;
+                break;
+            case 4:
+                if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 126;
+                }
+                else
+                    goto finish4;
+                break;
+            case 5:
+                if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 125;
+                }
+                else
+                    goto finish5;
+                break;
+            case 6:
+                if ( c == 0x5c ) {
+                    s = 103;
+                }
+                else if ( c == 0x22 ) {
+                    s = 104;
+                    r67 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 105;
+                }
+                else
+                    return false;
+                break;
+            case 7:
+                if ( c == 0x5c ) {
+                    s = 81;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x26 || c >= 0x28 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 82;
+                }
+                else
+                    return false;
+                break;
+            case 8:
+                if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 80;
+                }
+                else
+                    goto finish8;
+                break;
+            case 9:
+                if ( c >= 0x30 && c <= 0x39 || c == 0x5f ) {
+                    s = 79;
+                    r68 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 20;
+                }
+                else
+                    goto finish9;
+                break;
+            case 10:
+                if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 78;
+                }
+                else
+                    goto finish10;
+                break;
+            case 11:
+                if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 77;
+                }
+                else
+                    goto finish11;
+                break;
+            case 12:
+                if ( c == 0x2e ) {
+                    s = 75;
+                    r69 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 74;
+                }
+                else
+                    goto finish12;
+                break;
+            case 13:
+                if ( c == 0x61 ) {
+                    s = 69;
+                    r70 = p;
+                }
+                else if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x5a || c == 0x5f || c >= 0x61 && c <= 0x7a ) {
+                    s = 68;
+                    r70 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 67;
+                }
+                else
+                    goto finish13;
+                break;
+            case 14:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x5a || c == 0x5f || c >= 0x61 && c <= 0x7a ) {
+                    s = 68;
+                    r70 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 67;
+                }
+                else
+                    goto finish14;
+                break;
+            case 15:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x5a || c == 0x5f || c >= 0x61 && c <= 0x7a ) {
+                    s = 68;
+                    r70 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 67;
+                }
+                else
+                    goto finish15;
+                break;
+            case 16:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x5a || c == 0x5f || c >= 0x61 && c <= 0x7a ) {
+                    s = 68;
+                    r70 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 67;
+                }
+                else
+                    goto finish16;
+                break;
+            case 17:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x5a || c == 0x5f || c >= 0x61 && c <= 0x7a ) {
+                    s = 68;
+                    r70 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 67;
+                }
+                else
+                    goto finish17;
+                break;
+            case 18:
+                if ( c == 0x62 ) {
+                    s = 37;
+                }
+                else if ( c == 0x78 ) {
+                    s = 33;
+                }
+                else if ( c == 0x73 ) {
+                    s = 38;
+                }
+                else if ( c == 0x64 ) {
+                    s = 36;
+                }
+                else if ( c == 0x6d ) {
+                    s = 32;
+                }
+                else if ( c == 0x63 ) {
+                    s = 35;
+                }
+                else if ( c == 0x61 ) {
+                    s = 34;
+                }
+                else if ( c == 0x65 ) {
+                    s = 39;
+                }
+                else
+                    return false;
+                break;
+            case 19:
+                if ( c == 0x58 || c == 0x78 ) {
+                    s = 21;
+                }
+                else if ( c == 0x42 || c == 0x62 ) {
+                    s = 22;
+                }
+                else if ( c >= 0x30 && c <= 0x37 || c == 0x5f ) {
+                    s = 23;
+                    r71 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 20;
+                }
+                else
+                    goto finish19;
+                break;
+            case 20:
+                goto finish20;
+            case 21:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c == 0x5f || c >= 0x61 && c <= 0x66 ) {
+                    s = 29;
+                    r72 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 20;
+                }
+                else
+                    goto finish21;
+                break;
+            case 22:
+                if ( c >= 0x30 && c <= 0x31 || c == 0x5f ) {
+                    s = 26;
+                    r73 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 20;
+                }
+                else
+                    goto finish22;
+                break;
+            case 23:
+                if ( c >= 0x30 && c <= 0x37 || c == 0x5f ) {
+                    s = 25;
+                    r74 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 24;
+                }
+                else
+                    goto finish23;
+                break;
+            case 24:
+                goto finish24;
+            case 25:
+                if ( c >= 0x30 && c <= 0x37 || c == 0x5f ) {
+                    s = 25;
+                    r71 = r74;
+                    r74 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 24;
+                    r71 = r74;
+                }
+                else
+                    goto finish25;
+                break;
+            case 26:
+                if ( c >= 0x30 && c <= 0x31 || c == 0x5f ) {
+                    s = 28;
+                    r75 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 27;
+                }
+                else
+                    goto finish26;
+                break;
+            case 27:
+                goto finish27;
+            case 28:
+                if ( c >= 0x30 && c <= 0x31 || c == 0x5f ) {
+                    s = 28;
+                    r73 = r75;
+                    r75 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 27;
+                    r73 = r75;
+                }
+                else
+                    goto finish28;
+                break;
+            case 29:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c == 0x5f || c >= 0x61 && c <= 0x66 ) {
+                    s = 31;
+                    r76 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 30;
+                }
+                else
+                    goto finish29;
+                break;
+            case 30:
+                goto finish30;
+            case 31:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c == 0x5f || c >= 0x61 && c <= 0x66 ) {
+                    s = 31;
+                    r72 = r76;
+                    r76 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 30;
+                    r72 = r76;
+                }
+                else
+                    goto finish31;
+                break;
+            case 32:
+                if ( c == 0x6d ) {
+                    s = 64;
+                }
+                else
+                    return false;
+                break;
+            case 33:
+                if ( c == 0x6d ) {
+                    s = 60;
+                }
+                else
+                    return false;
+                break;
+            case 34:
+                if ( c == 0x78 ) {
+                    s = 48;
+                    r77 = p;
+                }
+                else if ( c == 0x68 || c == 0x6c ) {
+                    s = 53;
+                    r78 = p;
+                }
+                else
+                    return false;
+                break;
+            case 35:
+                if ( c == 0x78 ) {
+                    s = 48;
+                    r77 = p;
+                }
+                else if ( c == 0x64 ) {
+                    s = 55;
+                }
+                else if ( c == 0x68 || c == 0x6c ) {
+                    s = 53;
+                    r78 = p;
+                }
+                else
+                    return false;
+                break;
+            case 36:
+                if ( c == 0x78 ) {
+                    s = 48;
+                    r77 = p;
+                }
+                else if ( c == 0x69 ) {
+                    s = 48;
+                    r77 = p;
+                }
+                else if ( c == 0x68 || c == 0x6c ) {
+                    s = 53;
+                    r78 = p;
+                }
+                else
+                    return false;
+                break;
+            case 37:
+                if ( c == 0x78 ) {
+                    s = 48;
+                    r77 = p;
+                }
+                else if ( c == 0x70 ) {
+                    s = 48;
+                    r77 = p;
+                }
+                else if ( c == 0x68 || c == 0x6c ) {
+                    s = 53;
+                    r78 = p;
+                }
+                else
+                    return false;
+                break;
+            case 38:
+                if ( c == 0x69 ) {
+                    s = 48;
+                    r77 = p;
+                }
+                else if ( c == 0x70 ) {
+                    s = 48;
+                    r77 = p;
+                }
+                else if ( c == 0x74 ) {
+                    s = 49;
+                }
+                else
+                    return false;
+                break;
+            case 39:
+                if ( c == 0x69 ) {
+                    s = 40;
+                }
+                else if ( c == 0x66 ) {
+                    s = 41;
+                }
+                else if ( c == 0x64 ) {
+                    s = 42;
+                }
+                else if ( c == 0x62 ) {
+                    s = 43;
+                }
+                else if ( c == 0x73 ) {
+                    s = 45;
+                }
+                else if ( c == 0x61 || c == 0x63 ) {
+                    s = 44;
+                }
+                else
+                    return false;
+                break;
+            case 40:
+                if ( c == 0x70 ) {
+                    s = 46;
+                    r79 = p;
+                }
+                else
+                    return false;
+                break;
+            case 41:
+                if ( c == 0x6c ) {
+                    s = 46;
+                    r79 = p;
+                }
+                else
+                    return false;
+                break;
+            case 42:
+                if ( c == 0x78 ) {
+                    s = 46;
+                    r79 = p;
+                }
+                else if ( c == 0x69 ) {
+                    s = 46;
+                    r79 = p;
+                }
+                else
+                    return false;
+                break;
+            case 43:
+                if ( c == 0x78 ) {
+                    s = 46;
+                    r79 = p;
+                }
+                else if ( c == 0x70 ) {
+                    s = 46;
+                    r79 = p;
+                }
+                else
+                    return false;
+                break;
+            case 44:
+                if ( c == 0x78 ) {
+                    s = 46;
+                    r79 = p;
+                }
+                else
+                    return false;
+                break;
+            case 45:
+                if ( c == 0x69 ) {
+                    s = 46;
+                    r79 = p;
+                }
+                else if ( c == 0x70 ) {
+                    s = 46;
+                    r79 = p;
+                }
+                else
+                    return false;
+                break;
+            case 46:
+                if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 47;
+                }
+                else
+                    goto finish46;
+                break;
+            case 47:
+                goto finish47;
+            case 48:
+                if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 52;
+                }
+                else
+                    goto finish48;
+                break;
+            case 49:
+                if ( c >= 0x30 && c <= 0x37 ) {
+                    s = 50;
+                    r80 = p;
+                }
+                else
+                    return false;
+                break;
+            case 50:
+                if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 51;
+                }
+                else
+                    goto finish50;
+                break;
+            case 51:
+                goto finish51;
+            case 52:
+                goto finish52;
+            case 53:
+                if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 54;
+                }
+                else
+                    goto finish53;
+                break;
+            case 54:
+                goto finish54;
+            case 55:
+                if ( c == 0x65 ) {
+                    s = 56;
+                }
+                else
+                    return false;
+                break;
+            case 56:
+                if ( c == 0x66 ) {
+                    s = 57;
+                }
+                else
+                    return false;
+                break;
+            case 57:
+                if ( c == 0x67 ) {
+                    s = 58;
+                }
+                else
+                    return false;
+                break;
+            case 58:
+                if ( c == 0x73 ) {
+                    s = 59;
+                }
+                else
+                    return false;
+                break;
+            case 59:
+                if ( c == 0x73 ) {
+                    s = 48;
+                    r77 = p;
+                }
+                else
+                    return false;
+                break;
+            case 60:
+                if ( c == 0x6d ) {
+                    s = 61;
+                }
+                else
+                    return false;
+                break;
+            case 61:
+                if ( c >= 0x30 && c <= 0x37 ) {
+                    s = 62;
+                    r81 = p;
+                }
+                else
+                    return false;
+                break;
+            case 62:
+                if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 63;
+                }
+                else
+                    goto finish62;
+                break;
+            case 63:
+                goto finish63;
+            case 64:
+                if ( c >= 0x30 && c <= 0x37 ) {
+                    s = 65;
+                    r82 = p;
+                }
+                else
+                    return false;
+                break;
+            case 65:
+                if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 66;
+                }
+                else
+                    goto finish65;
+                break;
+            case 66:
+                goto finish66;
+            case 67:
+                goto finish67;
+            case 68:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x5a || c == 0x5f || c >= 0x61 && c <= 0x7a ) {
+                    s = 68;
+                    r66 = r70;
+                    r70 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 67;
+                    r66 = r70;
+                }
+                else
+                    goto finish68;
+                break;
+            case 69:
+                if ( c == 0x73 ) {
+                    s = 70;
+                    r83 = p;
+                }
+                else if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x5a || c == 0x5f || c >= 0x61 && c <= 0x7a ) {
+                    s = 68;
+                    r66 = r70;
+                    r70 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 67;
+                    r66 = r70;
+                }
+                else
+                    goto finish69;
+                break;
+            case 70:
+                if ( c == 0x74 ) {
+                    s = 71;
+                    r84 = p;
+                }
+                else if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x5a || c == 0x5f || c >= 0x61 && c <= 0x7a ) {
+                    s = 68;
+                    r66 = r83;
+                    r70 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 67;
+                    r66 = r83;
+                }
+                else
+                    goto finish70;
+                break;
+            case 71:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x5a || c == 0x5f || c >= 0x61 && c <= 0x7a ) {
+                    s = 73;
+                    r85 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 72;
+                }
+                else
+                    goto finish71;
+                break;
+            case 72:
+                goto finish72;
+            case 73:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x5a || c == 0x5f || c >= 0x61 && c <= 0x7a ) {
+                    s = 68;
+                    r66 = r85;
+                    r70 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 67;
+                    r66 = r85;
+                }
+                else
+                    goto finish73;
+                break;
+            case 74:
+                goto finish74;
+            case 75:
+                if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 76;
+                }
+                else
+                    goto finish75;
+                break;
+            case 76:
+                goto finish76;
+            case 77:
+                goto finish77;
+            case 78:
+                goto finish78;
+            case 79:
+                if ( c >= 0x30 && c <= 0x39 || c == 0x5f ) {
+                    s = 79;
+                    r62 = r68;
+                    r68 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 20;
+                    r62 = r68;
+                }
+                else
+                    goto finish79;
+                break;
+            case 80:
+                goto finish80;
+            case 81:
+                if ( c == 0x78 ) {
+                    s = 85;
+                }
+                else if ( c == 0x75 ) {
+                    s = 86;
+                }
+                else if ( c == 0x55 ) {
+                    s = 87;
+                }
+                else if ( c == 0x22 || c == 0x27 || c == 0x3f || c == 0x5c || c >= 0x61 && c <= 0x62 || c == 0x66 || c == 0x6e || c == 0x72 || c == 0x74 || c == 0x76 ) {
+                    s = 88;
+                }
+                else
+                    return false;
+                break;
+            case 82:
+                if ( c == 0x27 ) {
+                    s = 83;
+                    r86 = p;
+                }
+                else
+                    return false;
+                break;
+            case 83:
+                if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 84;
+                }
+                else
+                    goto finish83;
+                break;
+            case 84:
+                goto finish84;
+            case 85:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 101;
+                }
+                else
+                    return false;
+                break;
+            case 86:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 97;
+                }
+                else
+                    return false;
+                break;
+            case 87:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 89;
+                }
+                else
+                    return false;
+                break;
+            case 88:
+                if ( c == 0x27 ) {
+                    s = 83;
+                    r86 = p;
+                }
+                else
+                    return false;
+                break;
+            case 89:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 90;
+                }
+                else
+                    return false;
+                break;
+            case 90:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 91;
+                }
+                else
+                    return false;
+                break;
+            case 91:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 92;
+                }
+                else
+                    return false;
+                break;
+            case 92:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 93;
+                }
+                else
+                    return false;
+                break;
+            case 93:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 94;
+                }
+                else
+                    return false;
+                break;
+            case 94:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 95;
+                }
+                else
+                    return false;
+                break;
+            case 95:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 96;
+                }
+                else
+                    return false;
+                break;
+            case 96:
+                if ( c == 0x27 ) {
+                    s = 83;
+                    r86 = p;
+                }
+                else
+                    return false;
+                break;
+            case 97:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 98;
+                }
+                else
+                    return false;
+                break;
+            case 98:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 99;
+                }
+                else
+                    return false;
+                break;
+            case 99:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 100;
+                }
+                else
+                    return false;
+                break;
+            case 100:
+                if ( c == 0x27 ) {
+                    s = 83;
+                    r86 = p;
+                }
+                else
+                    return false;
+                break;
+            case 101:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 102;
+                }
+                else
+                    return false;
+                break;
+            case 102:
+                if ( c == 0x27 ) {
+                    s = 83;
+                    r86 = p;
+                }
+                else
+                    return false;
+                break;
+            case 103:
+                if ( c == 0x78 ) {
+                    s = 108;
+                }
+                else if ( c == 0x75 ) {
+                    s = 109;
+                }
+                else if ( c == 0x55 ) {
+                    s = 110;
+                }
+                else if ( c == 0x22 || c == 0x27 || c == 0x3f || c == 0x5c || c >= 0x61 && c <= 0x62 || c == 0x66 || c == 0x6e || c == 0x72 || c == 0x74 || c == 0x76 ) {
+                    s = 107;
+                }
+                else
+                    return false;
+                break;
+            case 104:
+                if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 106;
+                }
+                else
+                    goto finish104;
+                break;
+            case 105:
+                if ( c == 0x5c ) {
+                    s = 103;
+                }
+                else if ( c == 0x22 ) {
+                    s = 104;
+                    r67 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 105;
+                }
+                else
+                    return false;
+                break;
+            case 106:
+                goto finish106;
+            case 107:
+                if ( c == 0x5c ) {
+                    s = 103;
+                }
+                else if ( c == 0x22 ) {
+                    s = 104;
+                    r67 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 105;
+                }
+                else
+                    return false;
+                break;
+            case 108:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 123;
+                }
+                else
+                    return false;
+                break;
+            case 109:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 119;
+                }
+                else
+                    return false;
+                break;
+            case 110:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 111;
+                }
+                else
+                    return false;
+                break;
+            case 111:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 112;
+                }
+                else
+                    return false;
+                break;
+            case 112:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 113;
+                }
+                else
+                    return false;
+                break;
+            case 113:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 114;
+                }
+                else
+                    return false;
+                break;
+            case 114:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 115;
+                }
+                else
+                    return false;
+                break;
+            case 115:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 116;
+                }
+                else
+                    return false;
+                break;
+            case 116:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 117;
+                }
+                else
+                    return false;
+                break;
+            case 117:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 118;
+                }
+                else
+                    return false;
+                break;
+            case 118:
+                if ( c == 0x5c ) {
+                    s = 103;
+                }
+                else if ( c == 0x22 ) {
+                    s = 104;
+                    r67 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 105;
+                }
+                else
+                    return false;
+                break;
+            case 119:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 120;
+                }
+                else
+                    return false;
+                break;
+            case 120:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 121;
+                }
+                else
+                    return false;
+                break;
+            case 121:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 122;
+                }
+                else
+                    return false;
+                break;
+            case 122:
+                if ( c == 0x5c ) {
+                    s = 103;
+                }
+                else if ( c == 0x22 ) {
+                    s = 104;
+                    r67 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 105;
+                }
+                else
+                    return false;
+                break;
+            case 123:
+                if ( c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x46 || c >= 0x61 && c <= 0x66 ) {
+                    s = 124;
+                }
+                else
+                    return false;
+                break;
+            case 124:
+                if ( c == 0x5c ) {
+                    s = 103;
+                }
+                else if ( c == 0x22 ) {
+                    s = 104;
+                    r67 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 105;
+                }
+                else
+                    return false;
+                break;
+            case 125:
+                goto finish125;
+            case 126:
+                goto finish126;
+            case 127:
+                goto finish127;
+            case 128:
+                goto finish128;
+            case 129:
+                goto finish129;
+            default:
+                assert(0);
+        }
+    }
+
+    switch ( s )
+    {
+        case 1: finish1:
+        case 129: finish129:
+            match = input[0 .. r56];
+            token = 0;
+            break;
+        case 2: finish2:
+        case 128: finish128:
+            match = input[0 .. r57];
+            token = 1;
+            break;
+        case 3: finish3:
+        case 127: finish127:
+            match = input[0 .. r58];
+            token = 2;
+            break;
+        case 4: finish4:
+        case 126: finish126:
+            match = input[0 .. r59];
+            token = 4;
+            break;
+        case 5: finish5:
+        case 125: finish125:
+            match = input[0 .. r60];
+            token = 5;
+            break;
+        case 104: finish104:
+        case 106: finish106:
+            match = input[0 .. r67];
+            token = 16;
+            break;
+        case 8: finish8:
+        case 80: finish80:
+            match = input[0 .. r61];
+            token = 14;
+            break;
+        case 9: finish9:
+        case 19: finish19:
+        case 20: finish20:
+        case 21: finish21:
+        case 22: finish22:
+            match = input[0 .. r62];
+            token = 22;
+            break;
+        case 10: finish10:
+        case 78: finish78:
+            match = input[0 .. r63];
+            token = 15;
+            break;
+        case 11: finish11:
+        case 77: finish77:
+            match = input[0 .. r64];
+            token = 27;
+            break;
+        case 12: finish12:
+        case 74: finish74:
+            match = input[0 .. r65];
+            token = 3;
+            break;
+        case 13: finish13:
+        case 14: finish14:
+        case 15: finish15:
+        case 16: finish16:
+        case 17: finish17:
+        case 67: finish67:
+            match = input[0 .. r66];
+            token = 18;
+            break;
+        case 23: finish23:
+        case 24: finish24:
+            match = input[0 .. r71];
+            token = 21;
+            break;
+        case 25: finish25:
+            match = input[0 .. r74];
+            token = 21;
+            break;
+        case 26: finish26:
+        case 27: finish27:
+            match = input[0 .. r73];
+            token = 20;
+            break;
+        case 28: finish28:
+            match = input[0 .. r75];
+            token = 20;
+            break;
+        case 29: finish29:
+        case 30: finish30:
+            match = input[0 .. r72];
+            token = 19;
+            break;
+        case 31: finish31:
+            match = input[0 .. r76];
+            token = 19;
+            break;
+        case 46: finish46:
+        case 47: finish47:
+            match = input[0 .. r79];
+            token = 7;
+            break;
+        case 48: finish48:
+        case 52: finish52:
+            match = input[0 .. r77];
+            token = 8;
+            break;
+        case 50: finish50:
+        case 51: finish51:
+            match = input[0 .. r80];
+            token = 10;
+            break;
+        case 53: finish53:
+        case 54: finish54:
+            match = input[0 .. r78];
+            token = 9;
+            break;
+        case 62: finish62:
+        case 63: finish63:
+            match = input[0 .. r81];
+            token = 12;
+            break;
+        case 65: finish65:
+        case 66: finish66:
+            match = input[0 .. r82];
+            token = 11;
+            break;
+        case 68: finish68:
+        case 69: finish69:
+            match = input[0 .. r70];
+            token = 18;
+            break;
+        case 70: finish70:
+            match = input[0 .. r83];
+            token = 18;
+            break;
+        case 71: finish71:
+        case 72: finish72:
+            match = input[0 .. r84];
+            token = 13;
+            break;
+        case 73: finish73:
+            match = input[0 .. r85];
+            token = 18;
+            break;
+        case 75: finish75:
+        case 76: finish76:
+            match = input[0 .. r69];
+            token = 6;
+            break;
+        case 79: finish79:
+            match = input[0 .. r68];
+            token = 22;
+            break;
+        case 83: finish83:
+        case 84: finish84:
+            match = input[0 .. r86];
+            token = 17;
+            break;
+        default:
+            return false;
+    }
+    return true;
+}
+// ((?[\t\n\r ]+)).*?
+bool wsLexer(string input, out uint token, out string match)
+{
+    uint s = 0;
+    static int r2=-1, r3=-1;
+
+    for ( size_t p = 0, q = 0, p_end = input.length; p < p_end; q = p )
+    {
+        dchar c = cast(dchar)input[p];
+        if ( c & 0x80 )
+            decode(input, p);
+        else
+            ++p;
+        switch ( s )
+        {
+            case 0:
+                if ( c >= 0x9 && c <= 0xa || c == 0xd || c == 0x20 ) {
+                    s = 1;
+                    r2 = p;
+                }
+                else
+                    return false;
+                break;
+            case 1:
+                if ( c >= 0x9 && c <= 0xa || c == 0xd || c == 0x20 ) {
+                    s = 3;
+                    r3 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 2;
+                }
+                else
+                    goto finish1;
+                break;
+            case 2:
+                goto finish2;
+            case 3:
+                if ( c >= 0x9 && c <= 0xa || c == 0xd || c == 0x20 ) {
+                    s = 3;
+                    r2 = r3;
+                    r3 = p;
+                }
+                else if ( c >= 0x9 && c <= 0x13 || c >= 0x20 && c <= 0x7e || c >= 0xa0 && c <= 0x24f || c >= 0x20a3 && c <= 0x20b5 ) {
+                    s = 2;
+                    r2 = r3;
+                }
+                else
+                    goto finish3;
+                break;
+            default:
+                assert(0);
+        }
+    }
+
+    switch ( s )
+    {
+        case 1: finish1:
+        case 2: finish2:
+            match = input[0 .. r2];
+            token = 0;
+            break;
+        case 3: finish3:
+            match = input[0 .. r3];
+            token = 0;
+            break;
+        default:
+            return false;
+    }
+    return true;
+}
+// generated code end
+
+#line 2996 "D:\src\ddbg_continued\src\expression\expression_apd.d"
+// Written in the D programming language
+
+/*
+ *  This file has been automatically generated by APaGeD v0.4.2 beta - Attributed Parser Generator for D.
+ *
+ *  Sections generated from custom input are marked as "generated code" and
+ *  are subject to the terms and conditions stated in one of these sections.
+ *  The remaining sections are part of the APaGeD package and subject
+ *  to the terms and conditions of the corresponding license.
+ *
+ *  Attributed Parser Generator for D
+ *  Copyright (c) 2007 Jascha Wetzel. All rights reserved
+ *  License: Artistic License 2.0
+ */
+
+
+version(Tango)
+{
+    import tango.text.convert.Layout;
+    import tango.text.Util;
+    import tango.io.Stdout;
+
+    private static Layout!(char) layout;
+
+    static this()
+    {
+        layout = new Layout!(char);
+    }
+
+    string format(string fmt, ...)
+    {
+        return layout.convert(_arguments, _argptr, fmt);
+    }
+
+    alias char[] string;
+}
+else
+{
+    import std.string;
+    import std.utf;
+    debug import std.stdio;
+}
+
+
+
+/**************************************************************************************************
+    Parser
+**************************************************************************************************/
+
+typedef uint Token;
+alias Token Symbol;
+
+const Token     EPSILON         = 1,
+                ALTERN          = 2,
+                EOS             = 3,
+                FIRST_TOKEN     = 4,
+                FIRST_NT        = 0x1000;
+
+// generated code start
+/*  Attributed Parser Generator for D
+ *  Copyright (c) 2007 Jascha Wetzel. All rights reserved
+ *  License: Artistic License 2.0, see license.txt
+ */
+
+const uint  MAX_INPUT_DUMP = 70,
+            LR_STACK_RESERVE = 100,
+            NODE_STACK_RESERVE = 20,
+            BRANCH_STACK_RESERVE = 100;
+
+/*******************************************************************************
+    Stack based on dynamic array
+*******************************************************************************/
+struct Stack(T)
+{
+    size_t  _top;
+    T[]     stack;
+
+    void push(T v)
+    {
+        if ( _top >= stack.length )
+            stack.length = stack.length*2+1;
+        stack[_top] = v;
+        ++_top;
+    }
+
+    void push(T[] vs)
+    {
+        size_t end = _top+vs.length;
+        if ( end > stack.length )
+            stack.length = end*2;
+        stack[_top..end] = vs;
+        _top = end;
+    }
+    alias push opCatAssign;
+
+    void pop(size_t num)
+    {
+        assert(_top>=num);
+        if ( num >= _top )
+            _top = 0;
+        else
+            _top -= num;
+    }
+
+    T pop()
+    {
+        assert(_top>0);
+        return stack[--_top];
+    }
+
+    T* popPtr()
+    {
+        assert(_top>0);
+        return &stack[--_top];
+    }
+
+    T top()
+    {
+        assert(_top>0);
+        return stack[_top-1];
+    }
+
+    T* topPtr()
+    {
+        assert(_top>0);
+        return &stack[_top-1];
+    }
+
+    bool empty()
+    {
+        return _top == 0;
+    }
+
+    void clear()
+    {
+        _top = 0;
+    }
+
+    size_t length()
+    {
+        return _top;
+    }
+
+    T[] array()
+    {
+        return stack[0.._top];
+    }
+
+    Stack dup()
+    {
+        Stack s;
+        s._top = _top;
+        s.stack = stack.dup;
+        return s;
+    }
+}
+
+/**************************************************************************************************
+    Information about rules needed for reduction and error handling
+**************************************************************************************************/
+align(1) struct RuleInfo
+{
+    bool    ast_node;
+    uint    symbol_count,
+            nt_count,
+            nt_index;
+    Symbol[]  symbols;
+}
+
+/**************************************************************************************************
+    Information about LALR(1) entries needed for debugging
+**************************************************************************************************/
+align(1) struct EntryInfo
+{
+    uint    rule_index,
+            pos;
+}
+
+/**************************************************************************************************
+    Exception thrown on parser error
+**************************************************************************************************/
+class ParserException : Exception
+{
+    uint    line,
+            column;
+    string  filename,
+            error_message,
+            detail;
+
+    this(uint line_, uint column_, string fname, string msg, string dtl="detail")
+    {
+        version(Tango)
+            super(format("{}({}:{}): {}{}", fname, line_, column_, msg, dtl !is null?"\n"~dtl:""));
+        else
+            super(format("%s(%d:%d): %s%s", fname, line_, column_, msg, dtl !is null?"\n"~dtl:""));
+        filename = fname;
+        error_message = msg;
+        line = line_;
+        column = column_;
+        detail = dtl;
+    }
+}
+
+/**************************************************************************************************
+    Wraps instantiation of the GLR parser class and the parse call.
+**************************************************************************************************/
+bool parse(string filename, string input, out SyntaxTree* root, bool detailed=false, bool recover=false, uint tab_width=4)
+{
+    GLRParser   g, w;
+    static if ( is(typeof(WhitespaceGrammar) : GLRParser) )
+        w = new WhitespaceGrammar;
+    g = new MainGrammar(w, tab_width);
+    bool succ = g.parse(filename, input, &root, detailed, recover);
+    return succ;
+}
+
+/**************************************************************************************************
+    GLR parser
+**************************************************************************************************/
+abstract class GLRParser
+{
+    struct LRState
+    {
+        uint    index,
+                line,
+                column;
+    }
+    
+    struct Node
+    {
+        SyntaxTree* node;
+        bool        sync;
+    }
+
+    struct LRBranch
+    {
+        Stack!(LRState) stack;
+        Stack!(Node)    node_stack;
+        string          input,
+                        lookahead,
+                        lookahead_ws;
+        uint            line,
+                        column,
+                        symbol;
+        bool            fatal_errors;
+        uint            action;
+        version(ProfileConflicts)
+            uint            last_conflict;
+    }
+    
+    string          filename;
+    uint            tab_width;
+    
+    // operational variables
+    string              match,
+                        match_ws,
+                        lookahead,
+                        lookahead_ws;
+    SyntaxTree*         syntax_root;
+    SyntaxTree[]        syntax_tree_pool;
+    size_t              pool_top;
+    Stack!(LRState)     stack;
+    Stack!(Node)        node_stack;
+    Stack!(LRBranch)    branch_stack;
+    ParserException[]   recovered_errors;
+    bool                recover_from_errors,
+                        detailed_errors;
+
+    version(ProfileConflicts) {
+        uint[uint]      rr_conflict_counts,
+                        sr_conflict_counts,
+                        shift_failed_counts,
+                        reduce_failed_counts;
+        uint            branch_stack_max;
+    }
+
+    // grammar data
+    GLRParser       ws_parser;
+    uint            first_nt;
+    RuleInfo[]      rule_infos;
+    string[][]      error_message_lists;
+    string[]        nt_names,
+                    lexeme_names;
+    EntryInfo[][]   entry_infos;
+
+    this(GLRParser ws, uint tabw)
+    {
+        ws_parser = ws;
+        tab_width = tabw;
+        stack.stack.length = LR_STACK_RESERVE;
+        node_stack.stack.length = NODE_STACK_RESERVE;
+        branch_stack.stack.length = BRANCH_STACK_RESERVE;
+    }
+
+    /**************************************************************************************************
+        Gets overridden with a first-longest-match lexical analizer.
+    **************************************************************************************************/
+    bool function(string, out uint, out string) lexer;
+
+    /**************************************************************************************************
+        Gets overridden with the main parser function.
+    **************************************************************************************************/
+    bool parse(string input) { return false; }
+    bool parseWS(ref string input) { return false; }
+
+    /**************************************************************************************************
+
+    **************************************************************************************************/
+    bool isErrorSynced(uint state);
+
+    /**************************************************************************************************
+
+    **************************************************************************************************/
+    T APDmin(T)(T a, T b) { return a<b?a:b; }
+    uint[] lookaheadForNT(uint nt_index, uint state);
+
+    /**************************************************************************************************
+        Count lines and columns in str
+    **************************************************************************************************/
+    uint countLocation(string str, ref uint col)
+    {
+        uint count;
+        dchar linefeed;
+        foreach ( c; str )
+        {
+            if ( c == 10 || c == 13 )
+            {
+                if ( linefeed == dchar.init || linefeed == c ) {
+                    ++count;
+                    col = 1;
+                    linefeed = c;
+                }
+                else
+                    linefeed = dchar.init;
+            }
+            else if ( c == 9 ) {
+                col += tab_width;
+                linefeed = dchar.init;
+            }
+            else {
+                ++col;
+                linefeed = dchar.init;
+            }
+        }
+        return count;
+    }
+
+    /**************************************************************************************************
+        Initiates the parse call.
+    **************************************************************************************************/
+    final bool parse(string fname, string input, SyntaxTree** root=null, bool detailed=false, bool recover=false)
+    {
+        filename = fname;
+        recover_from_errors = recover;
+        detailed_errors = detailed;
+
+        stack.clear;
+        node_stack.clear;
+        branch_stack.clear;
+        pool_top = 0;
+        syntax_tree_pool = null;
+        recovered_errors = null;
+
+        if ( input.length > 1 )
+        {
+            if ( input[0 .. 2] == "\xfe\xff" ) {
+                // UTF-16BE
+                input = input[2 .. $];
+            }
+            else if ( input[0 .. 2] == "\xff\xfe" )
+            {
+                if ( input.length > 3 && input[2 .. 4] == "\x00\x00" ) {
+                    // UTF-32LE
+                    input = input[4 .. $];
+                }
+                else {
+                    // UTF-16LE
+                    input = input[2 .. $];
+                }
+            }
+            else if ( input.length > 2 && input[0 .. 3] == "\xef\xbb\xbf" ) {
+                // UTF-8
+                input = input[3 .. $];
+            }
+            else if ( input.length > 3 && input[0 .. 4] == "\x00\x00\xfe\xff" ) {
+                // UTF-32BE
+                input = input[4 .. $];
+            }
+            else if ( input[0] > 0x7f )
+                return false;
+        }
+        
+        stack ~= LRState(0, 1, 1);
+        if ( parse(input) )
+        {
+            if ( syntax_root !is null && root !is null )
+            {
+                *root = syntax_root;
+                debug
+                {
+                    Stack!(SyntaxTree*) st;
+                    st.push(*root);
+                    while ( !st.empty )
+                    {
+                        SyntaxTree* pn = st.pop;
+                        foreach ( c; pn._ST_children ) {
+                            c.parent = pn;
+                            st.push(c);
+                        }
+                    }
+                }
+            }
+            return true;
+        }
+        return false;
+    }
+
+    /**************************************************************************************************
+        Create a node for the syntax tree. Used by the main parse function.
+    **************************************************************************************************/
+    debug void createNode(uint line, uint column, uint rule_index, uint nt_count, uint nt_index)
+    {
+        if ( pool_top >= syntax_tree_pool.length )
+            syntax_tree_pool.length = syntax_tree_pool.length*2+1;
+        auto pn = &syntax_tree_pool[pool_top];
+        ++pool_top;
+        pn._ST_rule = rule_index;
+        pn._ST_line_number = line;
+        pn._ST_column_number = column;
+        pn._ST_node_name = nt_names[nt_index];
+
+        if ( nt_count > 0 )
+        {
+            pn._ST_children.length = nt_count;
+            foreach ( i, n; node_stack.array[$-nt_count .. $] )
+                pn._ST_children[i] = n.node;
+            node_stack.pop(nt_count);
+        }
+        else {
+            pn._ST_match = match;
+            pn._ST_match_ws = match_ws;
+        }
+        node_stack ~= Node(pn, false);
+    }
+
+    else void createNode(uint line, uint column, uint rule_index, uint nt_count)
+    {
+        if ( pool_top >= syntax_tree_pool.length )
+            syntax_tree_pool.length = syntax_tree_pool.length*2+1;
+        auto pn = &syntax_tree_pool[pool_top];
+        ++pool_top;
+        pn._ST_rule = rule_index;
+        pn._ST_line_number = line;
+        pn._ST_column_number = column;
+
+        if ( nt_count > 0 )
+        {
+            pn._ST_children.length = nt_count;
+            foreach ( i, n; node_stack.array[$-nt_count .. $] )
+                pn._ST_children[i] = n.node;
+            node_stack.pop(nt_count);
+        }
+        else {
+            pn._ST_match = match;
+            pn._ST_match_ws = match_ws;
+        }
+        node_stack ~= Node(pn, false);
+    }
+
+    /**************************************************************************************************
+
+    **************************************************************************************************/
+    string ruleToString(RuleInfo* ri, int pos)
+    {
+        version(Tango)
+            string str = format("{} ->", nt_names[ri.nt_index]);
+        else
+            string str = format("%s ->", nt_names[ri.nt_index]);
+        
+        foreach ( i, s; ri.symbols )
+        {
+            string name;
+            if ( s == ALTERN )
+                name = "ALTERN";
+            else if ( s < FIRST_NT )
+                name = lexeme_names[s-EOS];
+            else
+                name = nt_names[s-FIRST_NT];
+            if ( i == pos )
+                str ~= " .";
+            version(Tango)
+                str ~= format(" {}", name);
+            else
+                str ~= format(" %s", name);
+        }
+        if ( pos == ri.symbols.length )
+            str ~= " .";
+        return str;
+    }
+
+    /**************************************************************************************************
+        Issue an error. Used by the main parse function.
+    **************************************************************************************************/
+    void error(string input, uint line, uint column, uint error_list, uint symbol, bool fatal=true)
+    {
+        // collect explicit error messages
+        string errors;
+        foreach ( i, err; error_message_lists[error_list] )
+        {
+            if ( i > 0 )
+                errors ~= "\n";
+            errors ~= err;
+        }
+
+        // construct automatic error message
+        // if no explicit error message available
+        if ( errors.length == 0 )
+        {
+            bool[string] expected_symbols;
+            EntryInfo[] eis = entry_infos[stack.top.index];
+            foreach ( ei; eis )
+            {
+                RuleInfo* ri = &rule_infos[ei.rule_index];
+                if ( ei.pos < ri.symbols.length )
+                {
+                    auto s = ri.symbols[ei.pos];
+                    if ( s < FIRST_NT )
+                        expected_symbols["\""~lexeme_names[s-EOS]~"\""] = true;
+                    else
+                        expected_symbols[nt_names[s-FIRST_NT]] = true;
+                }
+                else
+                {
+                    foreach ( token; lookaheadForNT(ri.nt_index, stack.top.index) ) {
+                        assert(token < FIRST_NT);
+                        expected_symbols["\""~lexeme_names[token-EOS]~"\""] = true;
+                    }
+                }
+            }
+
+            string expected_str;
+            auto last = expected_symbols.length-1;
+            foreach ( i, symname; expected_symbols.keys )
+            {
+                if ( i > 0 )
+                {
+                    if ( i == last )
+                        expected_str ~= " or ";
+                    else 
+                        expected_str ~= ", ";
+                }
+                expected_str ~= symname;
+            }
+            version(Tango)
+                errors = format("found \"{}\", expected {}", lookahead, expected_str);
+            else
+                errors = format("found \"%s\", expected %s", lookahead, expected_str);
+        }
+
+        // construct detail message
+        string detail;
+        if ( detailed_errors )
+        {
+            string          lr_stack;
+            foreach ( st; stack.array[1..$] )
+            {
+                version(Tango)
+                    lr_stack ~= format("---- State {}{} ({}:{}) ----\n", st.index, isErrorSynced(st.index)?"*":"", st.line, st.column);
+                else
+                    lr_stack ~= format("---- State %d%s (%d:%d) ----\n", st.index, isErrorSynced(st.index)?"*":"", st.line, st.column);
+                EntryInfo[] eis = entry_infos[st.index];
+                foreach ( ei; eis )
+                    lr_stack ~= ruleToString(&rule_infos[ei.rule_index], ei.pos)~"\n";
+            }
+            
+            string node_stack_str;
+            foreach ( i, n; node_stack.array )
+            {
+                if ( i > 0 )
+                    node_stack_str ~= " ";
+                node_stack_str ~= nt_names[rule_infos[n.node._ST_rule].nt_index];
+                if ( n.sync )
+                    node_stack_str ~= "*";
+            }
+
+            version(Tango)
+                detail = format("input: {}\nlookahead: {}\nlexeme: {}\nAST node stack:\n{}\nLR stack:\n{}",
+                    substitute(substitute(input[0..$>MAX_INPUT_DUMP?MAX_INPUT_DUMP:$], "\r", "\\r"), "\n", "\\n"),
+                    lookahead, lexeme_names[symbol-EOS],
+                    node_stack_str, lr_stack
+                );
+            else
+                detail = format("input: %s\nlookahead: %s\nlexeme: %s\nAST node stack:\n%s\nLR stack:\n%s",
+                    replace(replace(input[0..$>MAX_INPUT_DUMP?MAX_INPUT_DUMP:$], "\r", "\\r"), "\n", "\\n"),
+                    lookahead, lexeme_names[symbol-EOS],
+                    node_stack_str, lr_stack
+                );
+        }
+
+        // throw error
+        if ( fatal ) {
+            version(Tango) Stdout.flush;
+            throw new ParserException(line, column-lookahead.length, filename, errors, detail);
+        }
+        else
+        {
+            version(Tango)
+                debug(nonfatal) Stdout.flush.format("\n{}({}:{}): {}\n{}\n", filename, line, column-lookahead.length, errors, detail);
+            else
+                debug(nonfatal) writefln("\n%s(%d:%d): %s\n%s", filename, line, column-lookahead.length, errors, detail);
+        }
+    }
+}
+
+/**************************************************************************************************
+    Generated parsers
+**************************************************************************************************/
+class MainGrammar : public GLRParser
+{
+    const ushort[]  action_base =
+    [
+        0,23,45,0,67,96,125,154,171,198,222,228,245,273,277,291,305,319,347,375,381,389,7,397,414,
+        443,0,36,45,67,472,198,1,219,221,501,529,535,552,580,279,586,284,595,624,653,236,8,333,682,
+        0,711,9,740,543,769,771,779,781,789,791,799,801,809,811,819,821,829,831,71,839,844,852,142,
+        854,862,864,883,5,891,6,893,901,903
+    ];
+    const ubyte[]  action_check =
+    [
+        3,0,0,26,32,84,50,50,0,0,0,0,0,0,0,52,26,0,0,0,0,0,0,0,1,1,22,47,0,78,80,1,1,1,1,1,1,1,84,
+        27,1,1,1,1,1,1,1,2,28,84,84,1,27,2,2,2,2,2,2,2,84,28,2,2,2,2,2,2,2,4,29,84,84,2,84,4,4,4,4,
+        4,4,4,84,29,4,4,4,4,4,4,4,69,69,69,69,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+        5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,84,7,7,7,7,7,73,73,
+        73,73,84,84,84,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,31,84,84,84,
+        84,9,9,9,9,9,9,84,84,31,9,9,9,9,9,9,9,33,10,34,10,9,10,10,11,84,11,84,11,11,33,46,34,10,46,
+        46,46,46,46,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
+        12,12,12,12,13,84,13,14,13,13,14,84,40,14,14,40,84,42,84,13,42,15,84,14,15,40,84,15,15,84,
+        42,14,14,14,14,16,84,15,16,84,84,16,16,84,84,15,15,15,15,17,84,16,17,84,84,17,17,84,84,16,
+        16,16,16,48,84,17,48,48,48,48,48,84,84,17,17,17,17,18,18,18,18,18,18,18,18,18,18,18,18,18,
+        18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,19,84,19,84,19,19,20,84,20,20,20,20,84,84,
+        21,19,21,21,21,21,20,20,23,84,23,23,23,23,21,21,84,84,84,84,84,84,23,23,24,24,24,24,24,24,
+        24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,
+        25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,30,30,30,30,30,30,30,30,
+        30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,35,35,35,35,35,35,35,35,35,
+        35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,36,84,36,84,36,36,37,84,37,84,
+        37,37,84,54,84,36,54,54,54,54,54,37,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+        38,38,38,38,38,38,38,38,38,38,38,39,84,39,84,39,39,41,84,41,84,41,41,84,84,84,39,43,84,84,
+        84,84,41,43,43,43,43,43,43,84,84,84,43,43,43,43,43,43,43,84,84,84,84,43,44,44,44,44,44,44,
+        44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,45,45,45,45,45,45,45,
+        45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,49,49,49,49,49,49,49,49,
+        49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,51,51,51,51,51,51,51,51,51,
+        51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,53,53,53,53,53,53,53,53,53,53,
+        53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,55,84,56,55,84,56,55,55,56,56,57,
+        84,58,57,84,58,57,57,58,58,59,84,60,59,84,60,59,59,60,60,61,84,62,61,84,62,61,61,62,62,63,
+        84,64,63,84,64,63,63,64,64,65,84,66,65,84,66,65,65,66,66,67,84,68,67,84,68,67,67,68,68,70,
+        84,84,70,84,71,70,70,71,71,71,71,71,72,84,74,72,84,74,72,72,74,74,75,84,76,75,84,76,75,75,
+        76,76,84,84,84,84,84,84,74,74,74,74,84,77,84,84,77,75,75,77,77,79,84,81,79,84,81,79,79,81,
+        81,82,84,83,82,84,83,82,82,83,83
+    ];
+    const ushort[]  action_data =
+    [
+        0,129,258,295,287,384,267,179,258,258,258,258,258,258,258,266,295,258,258,258,258,258,258,
+        258,129,258,135,135,258,207,209,258,258,258,258,258,258,258,384,296,258,258,258,258,258,
+        258,258,257,289,384,384,258,296,257,257,257,257,257,257,257,384,289,257,257,257,257,257,
+        257,257,276,288,384,384,257,384,276,276,276,276,276,276,133,384,158,276,276,276,276,276,
+        276,276,311,311,311,311,276,385,385,134,385,385,385,385,385,385,385,385,385,385,385,385,
+        385,385,385,385,385,385,385,385,385,385,385,385,385,385,386,386,386,386,386,386,386,386,
+        386,386,386,386,386,386,386,386,386,386,386,135,386,386,386,386,386,386,386,386,386,297,
+        297,384,297,297,297,297,297,142,143,144,145,384,384,384,297,297,387,387,387,137,387,387,
+        387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,
+        387,275,288,384,384,384,384,275,275,275,275,275,275,384,384,158,275,275,275,275,275,275,
+        275,290,139,294,280,275,140,280,281,384,281,384,281,281,290,265,294,280,265,175,177,265,
+        265,281,388,388,388,388,388,388,141,388,388,388,388,388,388,388,388,388,388,388,388,135,
+        142,143,144,145,388,388,388,388,388,282,384,282,300,282,282,300,384,277,300,300,277,384,
+        279,384,282,279,301,384,300,301,277,384,301,301,384,279,300,300,300,300,302,384,301,302,
+        384,384,302,302,384,384,301,301,301,301,303,384,302,303,384,384,303,303,384,384,302,302,
+        302,302,265,384,303,265,175,177,265,265,384,384,303,303,303,303,389,389,389,389,389,389,
+        147,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,
+        389,284,384,284,384,284,284,298,384,298,298,298,298,384,384,286,284,286,150,286,286,298,
+        298,299,384,299,299,299,299,152,286,384,384,384,384,384,384,299,299,385,385,153,385,385,
+        385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,385,
+        385,385,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,154,155,135,
+        142,143,144,145,390,390,390,390,390,391,391,391,391,391,391,391,391,391,391,391,391,391,
+        391,391,391,391,154,155,135,142,143,144,145,391,391,391,391,391,387,387,387,164,387,387,
+        387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,
+        387,285,384,285,384,285,285,278,384,278,384,278,278,384,265,384,285,265,175,177,265,265,
+        278,389,389,389,389,389,389,167,389,389,389,389,389,389,389,389,389,389,389,389,389,389,
+        389,389,389,389,389,389,389,389,283,384,283,384,283,283,139,384,280,384,140,280,384,384,
+        384,283,172,384,384,384,384,280,186,187,188,189,190,191,384,384,384,192,193,135,312,312,
+        312,312,384,384,384,384,197,392,129,258,392,392,392,392,392,258,258,258,258,258,258,258,
+        392,392,258,258,258,258,258,258,258,392,392,392,392,258,387,387,387,174,387,387,387,387,
+        387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,393,
+        129,258,393,393,393,393,393,258,258,258,258,258,258,258,393,393,258,258,258,258,258,258,
+        258,393,393,393,393,258,394,129,258,394,394,394,394,394,258,258,258,258,258,258,258,394,
+        394,258,258,258,258,258,258,258,394,394,394,394,258,389,389,389,389,389,389,182,389,389,
+        389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,264,384,
+        263,264,384,263,264,264,263,263,260,384,269,260,384,269,260,260,269,269,270,384,271,270,
+        384,271,270,270,271,271,272,384,273,272,384,273,272,272,273,273,274,384,292,274,384,292,
+        274,274,292,292,293,384,256,293,384,256,293,293,256,256,259,384,268,259,384,268,259,259,
+        268,268,262,384,384,262,384,265,262,262,265,175,177,265,265,261,384,310,261,384,310,261,
+        261,310,310,308,384,304,308,384,304,308,308,304,304,384,384,384,384,384,384,203,206,208,
+        210,384,305,384,384,305,204,205,305,305,306,384,307,306,384,307,306,306,307,307,309,384,
+        291,309,384,291,309,309,291,291
+    ];
+    const ubyte[]  goto_base =
+    [
+        0,1,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,2,2,0,0,16,0,0,0,2,28,3,0,0,0,0,0,0,0,0,0,16,0,46,
+        3,0,2,3,3,39,0,28,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,0,22,29,0,0,0,0,0,0,0,0,0
+    ];
+    const ubyte[]  goto_check =
+    [
+        0,0,1,44,44,46,48,4,6,6,10,10,12,12,21,29,31,6,6,22,47,12,12,12,25,25,41,41,51,51,25,54,25,
+        25,25,25,30,30,71,49,49,73,30,49,30,30,30,30,43,74,84,43,43,84,84,84,84,84,84,84,84,43,84,
+        43,84,84,84,43
+    ];
+    const ubyte[]  goto_data =
+    [
+        3,4,2,45,4,57,56,43,8,10,40,41,18,10,37,35,32,20,21,23,48,20,21,38,28,10,42,41,52,4,29,55,
+        33,20,21,34,28,10,72,50,4,74,31,53,33,20,21,34,66,83,84,67,68,84,84,84,84,84,84,84,84,70,
+        84,71,84,84,84,73
+    ];
+
+    debug(parser) string indent;
+    
+    this(GLRParser ws=null, uint tab_width=4)
+    {
+        super(ws, tab_width);
+        lexer = &mainLexer;
+        first_nt = 32;
+        nt_names =
+        [
+            "Expr","Deref","DotChain","RefExpr","Args","Register","RegName","Cast","Type",
+            "BaseType","QuantList","Quantifier","TplParams","TplParams2","TplParam","Lit","StrLit",
+            "Ident","FQNIdent","Integer","IntegerSuffix","Sign","!LRstart"
+        ];
+        lexeme_names =
+        [
+            "EOS","\\*","\\(","\\)","\\.","\\[","\\]","\\.\\.","#(e[abcd]x|e[ds]i|e[bs]p|eip|efl)",
+            "#([abcd]x|[ds]i|[bs]p|(cdefgs)s)","#[abcd][hl]","#st[0-7]","#mm[0-7]","#xmm[0-7]",
+            "cast","!",",",
+            "\"(([^\"\\\\]*(\\\\(['\"\\?\\\\abfnrtv]|(x[0-9a-fA-F]{2})|(u[0-9a-fA-F]{4})|(U[0-9a-fA-F]{8})))?)*)\"",
+            "'(([^'\\\\]|(\\\\(['\"\\?\\\\abfnrtv]|(x[0-9a-fA-F]{2})|(u[0-9a-fA-F]{4})|(U[0-9a-fA-F]{8})))))'",
+            "[a-zA-Z_][_a-zA-Z0-9]*","0[xX][0-9a-fA-F_]+","0[bB][01_]+","0[0-7_]+",
+            "0|([1-9][0-9_]*)","L","u","U","[uU]","\\-"
+        ];
+        entry_infos =
+        [
+            cast(EntryInfo[])[EntryInfo(2,0)],[EntryInfo(1,1),EntryInfo(2,0)],[EntryInfo(1,2)],[EntryInfo(57,1)],[
+            EntryInfo(0,1),EntryInfo(20,0)],[EntryInfo(19,1)],[EntryInfo(19,2)],[EntryInfo(41,1)],[EntryInfo(19,3)],[
+            EntryInfo(19,4)],[EntryInfo(21,1),EntryInfo(24,0)],[EntryInfo(25,1)],[EntryInfo(26,1),EntryInfo(27,1)
+            ,EntryInfo(28,1)],[EntryInfo(26,2)],[EntryInfo(44,1)],[EntryInfo(45,1)],[EntryInfo(46,1)],[
+            EntryInfo(47,1)],[EntryInfo(28,2)],[EntryInfo(28,3)],[EntryInfo(42,1)],[EntryInfo(22,1),EntryInfo(43,1)
+            ,EntryInfo(30,0)],[EntryInfo(43,2)],[EntryInfo(43,3)],[EntryInfo(29,1)],[EntryInfo(29,2)],[
+            EntryInfo(39,1)],[EntryInfo(40,1)],[EntryInfo(33,1)],[EntryInfo(29,3),EntryInfo(32,0)],[
+            EntryInfo(31,1)],[EntryInfo(31,2),EntryInfo(32,0)],[EntryInfo(31,3)],[EntryInfo(34,1)],[
+            EntryInfo(38,1)],[EntryInfo(29,4)],[EntryInfo(29,5)],[EntryInfo(22,2)],[EntryInfo(27,2)],[
+            EntryInfo(27,3)],[EntryInfo(21,2)],[EntryInfo(23,1),EntryInfo(24,0)],[EntryInfo(23,2)],[
+            EntryInfo(0,2),EntryInfo(56,0)],[EntryInfo(4,1),EntryInfo(2,0)],[EntryInfo(4,2)],[EntryInfo(4,3)
+            ,EntryInfo(9,0)],[EntryInfo(7,1)],[EntryInfo(7,2),EntryInfo(9,0)],[EntryInfo(8,1),EntryInfo(2,0)],[
+            EntryInfo(10,1),EntryInfo(11,1)],[EntryInfo(10,2),EntryInfo(2,0)],[EntryInfo(10,3)],[EntryInfo(8,2)],[
+            EntryInfo(8,3),EntryInfo(9,0)],[EntryInfo(8,4)],[EntryInfo(7,3)],[EntryInfo(4,4)],[EntryInfo(13,1)],[
+            EntryInfo(14,1)],[EntryInfo(15,1)],[EntryInfo(16,1)],[EntryInfo(17,1)],[EntryInfo(18,1)],[
+            EntryInfo(36,1)],[EntryInfo(37,1)],[EntryInfo(0,3)],[EntryInfo(3,1)],[EntryInfo(12,1)],[
+            EntryInfo(55,1)],[EntryInfo(6,1)],[EntryInfo(5,1),EntryInfo(9,0)],[EntryInfo(5,2)],[EntryInfo(35,1)],[
+            EntryInfo(35,2),EntryInfo(54,0)],[EntryInfo(48,1),EntryInfo(49,1),EntryInfo(52,1)],[EntryInfo(48,2)],[
+            EntryInfo(49,2)],[EntryInfo(50,1)],[EntryInfo(50,2)],[EntryInfo(51,1)],[EntryInfo(51,2)],[
+            EntryInfo(53,1)],[EntryInfo(35,3)]
+        ];
+        rule_infos =
+        [
+            RuleInfo(true,3,3,0,[4097,4103,4098]),RuleInfo(true,2,1,1,[4,4097]),
+            RuleInfo(true,0,0,1,[]),RuleInfo(true,1,1,2,[4101]),RuleInfo(true,4,2,2,[5,4096,6,4099]),
+            RuleInfo(true,2,2,2,[4113,4099]),RuleInfo(true,1,1,2,[4111]),RuleInfo(true,3,2,3,[7,4113,4099]),
+            RuleInfo(true,4,2,3,[8,4100,9,4099]),RuleInfo(true,0,0,3,[]),RuleInfo(true,3,2,4,[4096,10,4096]),
+            RuleInfo(true,1,1,4,[4096]),RuleInfo(true,1,1,5,[4102]),RuleInfo(true,1,0,6,[11]),
+            RuleInfo(true,1,0,6,[12]),RuleInfo(true,1,0,6,[13]),RuleInfo(true,1,0,6,[14]),
+            RuleInfo(true,1,0,6,[15]),RuleInfo(true,1,0,6,[16]),RuleInfo(true,4,1,7,[17,5,4104,6]),
+            RuleInfo(true,0,0,7,[]),RuleInfo(true,2,2,8,[4105,4106]),RuleInfo(true,2,2,9,[4114,4108]),
+            RuleInfo(true,2,2,10,[4107,4106]),RuleInfo(true,0,0,10,[]),RuleInfo(true,1,0,11,[4]),
+            RuleInfo(true,2,0,11,[8,9]),RuleInfo(true,3,1,11,[8,4115,9]),RuleInfo(true,3,1,11,[8,4104,9]),
+            RuleInfo(true,5,2,12,[18,5,4110,4109,6]),RuleInfo(true,0,0,12,[]),
+            RuleInfo(true,3,2,13,[19,4110,4109]),RuleInfo(true,0,0,13,[]),RuleInfo(true,1,1,14,[4104]),
+            RuleInfo(true,1,1,14,[4112]),RuleInfo(true,3,3,15,[4117,4115,4116]),RuleInfo(true,1,0,15,[20]),
+            RuleInfo(true,1,0,15,[21]),RuleInfo(true,1,1,16,[4115]),RuleInfo(true,1,0,16,[20]),
+            RuleInfo(true,1,0,16,[21]),RuleInfo(true,1,0,17,[22]),RuleInfo(true,1,1,18,[4113]),
+            RuleInfo(true,3,2,18,[4114,7,4113]),RuleInfo(true,1,0,19,[23]),RuleInfo(true,1,0,19,[24]),
+            RuleInfo(true,1,0,19,[25]),RuleInfo(true,1,0,19,[26]),RuleInfo(true,2,0,20,[27,28]),
+            RuleInfo(true,2,0,20,[27,29]),RuleInfo(true,2,0,20,[28,27]),RuleInfo(true,2,0,20,[29,27]),
+            RuleInfo(true,1,0,20,[27]),RuleInfo(true,1,0,20,[30]),RuleInfo(true,0,0,20,[]),
+            RuleInfo(true,1,0,21,[31]),RuleInfo(true,0,0,21,[]),RuleInfo(true,1,1,22,[4096])
+        ];
+        error_message_lists = [
+            cast(string[])null,
+            ["(%d) ( expected"],
+            ["(%d) Type expected"],
+            ["(%d) ) expected"],
+            ["(%d) ], type or size expected"],
+            ["(%d) ] expected"],
+            ["(%d) Template parameters expected"],
+            ["(%d) Template parameter expected"],
+            ["(%d) Expression expected after ("],
+            ["(%d) Arguments expected after ["],
+            ["(%d) Second slice argument expected"]
+        ];
+    }
+
+    uint[] lookaheadForNT(uint nt_index, uint state)
+    {
+        uint[] tokens;
+        auto b = action_base[state];
+        auto m = APDmin(action_check.length, cast(size_t)b+first_nt);
+        foreach ( i, check; action_check[b .. m] )
+        {
+            if ( check == state && (action_data[b+i] & 384) == 256 )
+                tokens ~= i+EOS;
+        }
+        return tokens;
+    }
+
+    override bool isErrorSynced(uint state)
+    {
+        switch ( state )
+        {
+            case 0:
+                return true;
+            default:
+                break;
+        }
+        return false;
+    }
+
+    override bool parse(string input)
+    {
+        debug(parser) indent ~= " ";
+        scope(exit) debug(parser) indent = indent[0..$-1];
+
+        bool    fatal_errors = true;
+        uint    line = 1,
+                column = 1,
+                symbol;
+
+        void reduce(uint rule)
+        {
+            version(Tango)
+                debug(parser) Stdout.format("{}reduce {} {}\n", indent, rule, ruleToString(&rule_infos[rule], -1));
+            else
+                debug(parser) writefln("%sreduce %d %s", indent, rule, ruleToString(&rule_infos[rule], -1));
+            auto ri = &rule_infos[rule];
+            uint    reduce_line,
+                    reduce_column;
+            if ( ri.symbol_count > 0 ) {
+                reduce_line = stack.array[$-ri.symbol_count].line;
+                reduce_column = stack.array[$-ri.symbol_count].column;
+                stack.pop(ri.symbol_count);
+            }
+            else {
+                reduce_line = stack.top.line;
+                reduce_column = stack.top.column;
+            }
+
+            auto b = goto_base[stack.top.index];
+            b += ri.nt_index;
+            debug(parser)
+            {
+                if ( b < goto_check.length && goto_check[b] == stack.top.index ) {
+                    stack ~= LRState(goto_data[b], reduce_line, reduce_column);
+
+                version(Tango)
+                    Stdout.format("{}goto {}\n", indent, stack.top.index);
+                else
+                    writefln("%sgoto %d", indent, stack.top.index);
+                }
+                else
+                    assert(0);
+            }
+            else
+                stack ~= LRState(goto_data[b], reduce_line, reduce_column);
+            if ( ri.ast_node ) {
+                debug createNode(reduce_line, reduce_column, rule, ri.nt_count, ri.nt_index);
+                else createNode(reduce_line, reduce_column, rule, ri.nt_count);
+            }
+            else if ( ri.nt_count > 0 )
+                node_stack.pop(ri.nt_count);
+        }
+
+        void branch(uint action)
+        {
+            version(ProfileConflicts)
+            {
+                if ( branch_stack.length > branch_stack_max )
+                    branch_stack_max = branch_stack.length;
+            }
+            if ( (action & 128) > 0 )
+            {
+                version(ProfileConflicts)
+                    sr_conflict_counts[stack.top.index]++;
+                version(Tango) debug(parser) Stdout.format("{}branch shift conflict\n", indent);
+                else debug(parser) writefln("%sbranch shift conflict", indent);
+            }
+            else
+            {
+                version(ProfileConflicts)
+                    rr_conflict_counts[stack.top.index]++;
+                version(Tango) debug(parser) Stdout.format("{}branch reduce conflict\n", indent);
+                else debug(parser) writefln("%sbranch reduce conflict", indent);
+            }
+            version(ProfileConflicts)
+                branch_stack ~= LRBranch(
+                    stack.dup, node_stack.dup,
+                    input, lookahead, lookahead_ws,
+                    line, column, symbol, fatal_errors, 
+                    action, stack.top.index | (action & 384)
+                );
+            else
+                branch_stack ~= LRBranch(
+                    stack.dup, node_stack.dup,
+                    input, lookahead, lookahead_ws,
+                    line, column, symbol, fatal_errors, 
+                    action
+                );
+            fatal_errors = false;
+        }
+
+        string prev_input = input;
+        parseLoop: while ( true )
+        {
+            if ( symbol == 0 )
+            {
+            readSymbol:
+                match = lookahead;
+                match_ws = lookahead_ws;
+                lookahead_ws = input;
+                static if ( is(typeof(WhitespaceGrammar) : GLRParser) )
+                    ws_parser.parseWS(input);
+                version(Tango)
+                    debug(lexer) Stdout.format("WS: '{}'\n", lookahead_ws[0 .. $-input.length]);
+                else
+                    debug(lexer) writefln("WS: '%s'", lookahead_ws[0 .. $-input.length]);
+                symbol = EOS;
+                if ( input.length == 0 )
+                    lookahead = null;
+                else if ( lexer(input, symbol, lookahead) ) {
+                    symbol += FIRST_TOKEN;
+                    line += countLocation(lookahead_ws[0 .. $-input.length], column);
+                    lookahead_ws = lookahead_ws[0 .. $-input.length+lookahead.length];
+                }
+                if ( symbol == 0 )
+                    throw new ParserException(line, column, filename, "Invalid token", input[0..$>MAX_INPUT_DUMP?MAX_INPUT_DUMP:$]);
+                prev_input = input;
+                input = input[lookahead.length..$];
+            }
+            debug(parser)
+            {
+                string node_stack_str;
+                foreach ( n; node_stack.array )
+                    node_stack_str ~= " "~n.node._ST_node_name~(n.sync?"*":"");
+                version(Tango)
+                    Stdout.format("\n{}state {}\n{}nodes {}\n{}lkahd ({}) {}\n{}input ({}:{}) {}\n",
+                        indent, stack.top.index,
+                        indent, node_stack_str,
+                        indent, symbol, lookahead,
+                        indent, line, column,
+                        substitute(substitute(input[0..$>MAX_INPUT_DUMP?MAX_INPUT_DUMP:$], "\r", "\\r"), "\n", "\\n")
+                    );
+                else
+                    writefln("\n%sstate %d\n%snodes %s\n%slkahd (%d) %s\n%sinput (%d:%d) %s",
+                        indent, stack.top.index,
+                        indent, node_stack_str,
+                        indent, symbol, lookahead,
+                        indent, line, column,
+                        replace(replace(input[0..$>MAX_INPUT_DUMP?MAX_INPUT_DUMP:$], "\r", "\\r"), "\n", "\\n")
+                    );
+            }
+
+            auto state = stack.top.index;
+            auto b = action_base[state];
+            uint action = 384;
+            b += symbol-EOS;
+            if ( b < action_check.length && action_check[b] == state )
+                action = action_data[b];
+
+            actionSwitch: switch ( action & 384 )
+            {
+                case 128:
+                    action &= 127;
+                    version(Tango) debug(parser) Stdout.format("{}shift {}\n", indent, action);
+                    else debug(parser) writefln("%sshift %d", indent, action);
+                    stack ~= LRState(action, line, column);
+                    symbol = 0;
+                    continue parseLoop;
+                case 256:
+                    action &= 127;
+                    version(Tango) debug(parser) Stdout.format("{}reduce {} {}\n", indent, action, ruleToString(&rule_infos[action], -1));
+                    else debug(parser) writefln("%sreduce %d %s", indent, action, ruleToString(&rule_infos[action], -1));
+                    auto ri = &rule_infos[action];
+                    uint    reduce_line,
+                            reduce_column;
+                    if ( ri.symbol_count > 0 ) {
+                        reduce_line = stack.array[$-ri.symbol_count].line;
+                        reduce_column = stack.array[$-ri.symbol_count].column;
+                        stack.pop(ri.symbol_count);
+                    }
+                    else {
+                        reduce_line = stack.array[$-1].line;
+                        reduce_column = stack.array[$-1].column;
+                    }
+
+                    state = stack.top.index;
+                    b = goto_base[state];
+                    b += ri.nt_index;
+                    debug(parser)
+                    {
+                        if ( b < goto_check.length && goto_check[b] == state ) {
+                            stack ~= LRState(goto_data[b], reduce_line, reduce_column);
+                        version(Tango)
+                            Stdout.format("{}goto {}\n", indent, stack.top.index);
+                        else
+                            writefln("%sgoto %d", indent, stack.top.index);
+                        }
+                        else
+                            assert(0);
+                    }
+                    else
+                        stack ~= LRState(goto_data[b], reduce_line, reduce_column);
+                    if ( ri.ast_node ) {
+                        debug createNode(reduce_line, reduce_column, action, ri.nt_count, ri.nt_index);
+                        else createNode(reduce_line, reduce_column, action, ri.nt_count);
+                    }
+                    else if ( ri.nt_count > 0 )
+                        node_stack.pop(ri.nt_count);
+
+                    continue parseLoop;
+                case 384:
+                    action &= 127;
+                    if ( fatal_errors || action > 0 )
+                    {
+                        if ( recover_from_errors )
+                        {
+                            try error(prev_input, line, column, action, symbol);
+                            catch ( ParserException e )
+                                recovered_errors ~= e;
+                            version(Tango)
+                                debug(nonfatal) Stdout.format("recovering from error:\n{}\n", recovered_errors[$-1]);
+                            else
+                                debug(nonfatal) writefln("recovering from error:\n%s", recovered_errors[$-1]);
+                            while ( !stack.empty && !isErrorSynced(stack.top.index) )
+                                stack.pop;
+                            while ( !node_stack.empty && !node_stack.top.sync )
+                                node_stack.pop;
+                            symbol = 0;
+                            continue parseLoop;
+                        }
+                        else {
+                            input = prev_input;
+                            error(input, line, column, action, symbol);
+                        }
+                    }
+                    else
+                    {
+                        debug(nonfatal) {
+                            input = prev_input;
+                            error(input, line, column, action, symbol, false);
+                        }
+                    }
+                    if ( branch_stack.length == 0 ) {
+                        input = prev_input;
+                        return false;
+                    }
+                    auto prev = branch_stack.popPtr;
+                    stack           = prev.stack;
+                    node_stack      = prev.node_stack;
+                    input           = prev.input;
+                    prev_input      = input;
+                    lookahead       = prev.lookahead;
+                    lookahead_ws    = prev.lookahead_ws;
+                    line            = prev.line;
+                    column          = prev.column;
+                    symbol          = prev.symbol;
+                    fatal_errors    = prev.fatal_errors;
+                    action          = prev.action;
+
+                    version(ProfileConflicts)
+                    {
+                        if ( (prev.last_conflict & 128) > 0 )
+                            shift_failed_counts[prev.last_conflict & 127]++;
+                        else
+                            reduce_failed_counts[prev.last_conflict & 127]++;
+                    }
+                    goto actionSwitch;
+                default:
+                    break;
+            }
+
+            switch ( action )
+            {
+                case 0:
+                    version(Tango)
+                        debug(parser) Stdout.format("{}accept\n", indent);
+                    else
+                        debug(parser) writefln("%saccept", indent);
+                    syntax_root = node_stack.top.node;
+                    input = prev_input;
+                    return true;
+                default:
+                    assert(0);
+            }
+        }
+        assert(0);
+    }
+}
+
+class WhitespaceGrammar : public GLRParser
+{
+    const ubyte[]  action_base =
+    [
+        0,0,2
+    ];
+    const ubyte[]  action_check =
+    [
+        1,0,2
+    ];
+    const ubyte[]  action_data =
+    [
+        4,3,0
+    ];
+    const ubyte[]  goto_base =
+    [
+        0,0,0
+    ];
+    const ubyte[]  goto_check =
+    [
+        0
+    ];
+    const ubyte[]  goto_data =
+    [
+        2
+    ];
+
+    debug(parser) string indent;
+    
+    this(GLRParser ws=null, uint tab_width=4)
+    {
+        super(ws, tab_width);
+        lexer = &wsLexer;
+        first_nt = 5;
+        nt_names =
+        [
+            "Whitespace","!LRstart"
+        ];
+        lexeme_names =
+        [
+            "EOS","[\\t\\n\\r ]+"
+        ];
+        entry_infos =
+        [
+            cast(EntryInfo[])[],[EntryInfo(0,1)],[EntryInfo(1,1)]
+        ];
+        rule_infos =
+        [
+            RuleInfo(true,1,0,0,[4]),RuleInfo(true,1,1,1,[4096])
+        ];
+        error_message_lists = [
+            cast(string[])null
+        ];
+    }
+
+    uint[] lookaheadForNT(uint nt_index, uint state)
+    {
+        uint[] tokens;
+        auto b = action_base[state];
+        auto m = APDmin(action_check.length, cast(size_t)b+first_nt);
+        foreach ( i, check; action_check[b .. m] )
+        {
+            if ( check == state && (action_data[b+i] & 6) == 4 )
+                tokens ~= i+EOS;
+        }
+        return tokens;
+    }
+
+    override bool isErrorSynced(uint state)
+    {
+        switch ( state )
+        {
+            case 0:
+                return true;
+            default:
+                break;
+        }
+        return false;
+    }
+
+    override bool parseWS(ref string input)
+    {
+        stack.clear;
+        stack ~= LRState(0, 1, 1);
+
+        debug(parser) indent ~= " ";
+        scope(exit) debug(parser) indent = indent[0..$-1];
+
+        bool    fatal_errors = true;
+        uint    line = 1,
+                column = 1,
+                symbol;
+
+        void reduce(uint rule)
+        {
+            version(Tango)
+                debug(parser) Stdout.format("{}reduce {} {}\n", indent, rule, ruleToString(&rule_infos[rule], -1));
+            else
+                debug(parser) writefln("%sreduce %d %s", indent, rule, ruleToString(&rule_infos[rule], -1));
+            auto ri = &rule_infos[rule];
+            uint    reduce_line,
+                    reduce_column;
+            if ( ri.symbol_count > 0 ) {
+                reduce_line = stack.array[$-ri.symbol_count].line;
+                reduce_column = stack.array[$-ri.symbol_count].column;
+                stack.pop(ri.symbol_count);
+            }
+            else {
+                reduce_line = stack.top.line;
+                reduce_column = stack.top.column;
+            }
+
+            auto b = goto_base[stack.top.index];
+            b += ri.nt_index;
+            debug(parser)
+            {
+                if ( b < goto_check.length && goto_check[b] == stack.top.index ) {
+                    stack ~= LRState(goto_data[b], reduce_line, reduce_column);
+                }
+                else
+                    assert(0);
+            }
+            else
+                stack ~= LRState(goto_data[b], reduce_line, reduce_column);
+        }
+
+        void branch(uint action)
+        {
+            version(ProfileConflicts)
+            {
+                if ( branch_stack.length > branch_stack_max )
+                    branch_stack_max = branch_stack.length;
+            }
+            if ( (action & 2) > 0 )
+            {
+                version(ProfileConflicts)
+                    sr_conflict_counts[stack.top.index]++;
+            }
+            else
+            {
+                version(ProfileConflicts)
+                    rr_conflict_counts[stack.top.index]++;
+            }
+            version(ProfileConflicts)
+                branch_stack ~= LRBranch(
+                    stack.dup, node_stack.dup,
+                    input, lookahead, lookahead_ws,
+                    line, column, symbol, fatal_errors, 
+                    action, stack.top.index | (action & 6)
+                );
+            else
+                branch_stack ~= LRBranch(
+                    stack.dup, node_stack.dup,
+                    input, lookahead, lookahead_ws,
+                    line, column, symbol, fatal_errors, 
+                    action
+                );
+            fatal_errors = false;
+        }
+
+        string prev_input = input;
+        parseLoop: while ( true )
+        {
+            if ( symbol == 0 )
+            {
+            readSymbol:
+                match = lookahead;
+                match_ws = lookahead_ws;
+                symbol = EOS;
+                if ( input.length == 0 )
+                    lookahead = null;
+                else if ( lexer(input, symbol, lookahead) ) {
+                    symbol += FIRST_TOKEN;
+                }
+                if ( symbol == 0 )
+                    return false;
+                prev_input = input;
+                input = input[lookahead.length..$];
+            }
+
+            auto state = stack.top.index;
+            auto b = action_base[state];
+            uint action = 6;
+            b += symbol-EOS;
+            if ( b < action_check.length && action_check[b] == state )
+                action = action_data[b];
+
+            actionSwitch: switch ( action & 6 )
+            {
+                case 2:
+                    action &= 1;
+                    stack ~= LRState(action, line, column);
+                    symbol = 0;
+                    continue parseLoop;
+                case 4:
+                    action &= 1;
+                    auto ri = &rule_infos[action];
+                    uint    reduce_line,
+                            reduce_column;
+                    if ( ri.symbol_count > 0 ) {
+                        reduce_line = stack.array[$-ri.symbol_count].line;
+                        reduce_column = stack.array[$-ri.symbol_count].column;
+                        stack.pop(ri.symbol_count);
+                    }
+                    else {
+                        reduce_line = stack.array[$-1].line;
+                        reduce_column = stack.array[$-1].column;
+                    }
+
+                    state = stack.top.index;
+                    b = goto_base[state];
+                    b += ri.nt_index;
+                    debug(parser)
+                    {
+                        if ( b < goto_check.length && goto_check[b] == state ) {
+                            stack ~= LRState(goto_data[b], reduce_line, reduce_column);
+                        }
+                        else
+                            assert(0);
+                    }
+                    else
+                        stack ~= LRState(goto_data[b], reduce_line, reduce_column);
+
+                    continue parseLoop;
+                case 6:
+                    action &= 1;
+                    input = prev_input;
+                    if ( branch_stack.length == 0 ) {
+                        input = prev_input;
+                        return false;
+                    }
+                    auto prev = branch_stack.popPtr;
+                    stack           = prev.stack;
+                    node_stack      = prev.node_stack;
+                    input           = prev.input;
+                    prev_input      = input;
+                    lookahead       = prev.lookahead;
+                    lookahead_ws    = prev.lookahead_ws;
+                    line            = prev.line;
+                    column          = prev.column;
+                    symbol          = prev.symbol;
+                    fatal_errors    = prev.fatal_errors;
+                    action          = prev.action;
+
+                    version(ProfileConflicts)
+                    {
+                        if ( (prev.last_conflict & 2) > 0 )
+                            shift_failed_counts[prev.last_conflict & 1]++;
+                        else
+                            reduce_failed_counts[prev.last_conflict & 1]++;
+                    }
+                    goto actionSwitch;
+                default:
+                    break;
+            }
+
+            switch ( action )
+            {
+                case 0:
+                    input = prev_input;
+                    return true;
+                default:
+                    assert(0);
+            }
+        }
+        assert(0);
+    }
+}
+
+
+// generated code end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,117 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+
+import cli.userinterface;
+import cli.ddbgcli;
+import cli.gdbcli;
+import cli.gdbmicli;
+import debugger;
+
+import std.string;
+import std.stdio;
+
+import util;
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+int main(string[] args)
+{
+    debug domain(args);
+    else
+    {
+        try domain(args);
+        catch ( DebuggerException e )
+        {
+            writefln("%s", e.msg);
+            return 1;
+        }
+        catch ( Object o )
+        {
+            writefln("\n\n----------------------------------------\nUnhandled exception in %s:\n"~
+                    "%s\n\nPlease report this problem!\nSee the http://ddbg.mainia.de/releases.html for details.\nThank you!",
+                    VERSION_STRING, o
+            );
+            return 1;
+        }
+    }
+	return 0;
+}
+
+void domain(string[] args)
+{
+    string[string] options = parseArgs(args);
+
+    UserInterface cli;
+    if ( ("cli" in options) !is null )
+    {
+        if ( options["cli"] == "gdb" )
+            cli	= new GDBCLI;
+        else if ( options["cli"] == "gdbmi" )
+            cli	= new GDBMICLI;
+        else {
+            DbgIO.println("Unknown CLI mode \"%s\"", options["cli"]);
+            return;
+        }
+    }
+    else
+        cli	= new DdbgCLI;
+    cli.init(args);
+
+    if ( "cmd" in options )
+    {
+        string cmd_string = strip(options["cmd"]);
+        if ( cmd_string[0] == '"' && cmd_string[$-1] == '"' )
+            cmd_string = cmd_string[1..$-1];
+        cli.runCommands(cmd_string);
+    }
+
+    cli.start();
+}
+
+string[string] parseArgs(inout string[] args)
+{
+    string[string]    options;
+
+    for ( int i=1; i < args.length; )
+    {
+        string arg = args[i];
+
+        uint optend;
+        for ( optend = 1; optend < arg.length; ++optend )
+        {
+            if ( !inPattern(arg[optend], "a-zA-Z0-9") )
+                break;
+        }
+        string option = arg[0..optend];
+        switch ( option )
+        {
+            case "-cli":
+            case "-cmd":
+                string value;
+                if ( optend >= arg.length ) {
+                    args = args[0..i]~args[i+1..$];
+                    value = args[i];
+                }
+                else
+                    value = arg[optend..$];
+                if ( value.length <= 0 ) {
+                    DbgIO.println("ERROR: -%s=<value> or -%s <value> expected", option, option);
+                    break;
+                }
+                if ( value[0] == '=' )
+                    value = value[1..$];
+                options[option[1..$]] = value;
+                args = args[0..i]~args[i+1..$];
+                break;
+            default:
+                ++i;
+                if ( option[0] != '-' )
+                    return options;
+                break;
+        }
+    }
+    return options;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/minidump.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,268 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+
+import win32.dbghelp;
+import win32.windef;
+import win32.winbase;
+
+import std.string;
+
+import dbgprocess;
+import util;
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class MiniDump
+{
+    enum UserStreamType : uint
+    {
+        DExceptionInfo  = 0x10000,
+        ThreadInfo
+    }
+
+    align(1) struct ThreadInfo
+    {
+        uint    mainThreadId,
+                currentThreadId;
+    }
+
+    static typeof(&win32.dbghelp.MiniDumpWriteDump)      MiniDumpWriteDump;
+    static typeof(&win32.dbghelp.MiniDumpReadDumpStream) MiniDumpReadDumpStream;
+
+    private void*   map;
+    private HANDLE  file,
+                    fileMapping;
+
+    MINIDUMP_THREAD[]               threads;
+    uint                            selectedThread;
+    MINIDUMP_MEMORY_DESCRIPTOR[]    memoryDescriptors;
+    EXCEPTION_RECORD*               exceptionRecord;
+
+    ThreadInfo*     threadInfo;
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    static this()
+    {
+        // TODO: load from exe dir if not XP
+        HINSTANCE dll = LoadLibrary(toStringz("dbghelp.dll"));
+        if ( dll !is null ) {
+            MiniDumpWriteDump       = cast(typeof(MiniDumpWriteDump))GetProcAddress(dll, toStringz("MiniDumpWriteDump"));
+            MiniDumpReadDumpStream  = cast(typeof(MiniDumpReadDumpStream))GetProcAddress(dll, toStringz("MiniDumpReadDumpStream"));
+        }
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    this(string filename)
+    {
+        file = CreateFile(toStringz(filename), FILE_ALL_ACCESS, 0, null, OPEN_EXISTING, 0, null);
+        if ( file is null )
+            throw new Exception("Couldn't read \""~filename~"\": "~lastError);
+        fileMapping = CreateFileMapping(file, null, PAGE_READONLY, 0, 0, null);
+        if ( fileMapping is null )
+            throw new Exception("Couldn't create file mapping for \""~filename~"\": "~lastError);
+        map = MapViewOfFile(fileMapping, FILE_MAP_READ, 0, 0, 0);
+        if ( map is null )
+            throw new Exception("Couldn't map view of file \""~filename~"\": "~lastError);
+
+        MINIDUMP_DIRECTORY* mdDir;
+        void *streamPtr;
+        size_t streamSize;
+
+        // load thread info
+        if ( !MiniDumpReadDumpStream(map, MINIDUMP_STREAM_TYPE.ThreadListStream, &mdDir, &streamPtr, &streamSize) )
+            throw new Exception("Error no ThreadList in minidump \""~filename~"\": "~lastError);
+        MINIDUMP_THREAD_LIST* threadList = cast(MINIDUMP_THREAD_LIST*)streamPtr;
+        threads = (cast(MINIDUMP_THREAD*)(cast(ubyte*)streamPtr+4))[0..threadList.NumberOfThreads];
+
+        if ( !MiniDumpReadDumpStream(map, UserStreamType.ThreadInfo, &mdDir, &streamPtr, &streamSize) )
+            throw new Exception("Error no Ddbg ThreadInfo in minidump \""~filename~"\": "~lastError);
+        threadInfo = cast(ThreadInfo*)streamPtr;
+
+        // load memory info
+        if ( MiniDumpReadDumpStream(map, MINIDUMP_STREAM_TYPE.MemoryListStream, &mdDir, &streamPtr, &streamSize) )
+        {
+            MINIDUMP_MEMORY_LIST* mml = cast(MINIDUMP_MEMORY_LIST*)streamPtr;
+            memoryDescriptors = (cast(MINIDUMP_MEMORY_DESCRIPTOR*)(cast(ubyte*)streamPtr+4))[0..mml.NumberOfMemoryRanges];
+        }
+
+        // load exception info
+        if ( MiniDumpReadDumpStream(map, MINIDUMP_STREAM_TYPE.ExceptionStream, &mdDir, &streamPtr, &streamSize) )
+        {
+            MINIDUMP_EXCEPTION_STREAM* mes = cast(MINIDUMP_EXCEPTION_STREAM*)streamPtr;
+            foreach ( i, t; threads )
+            {
+                if ( t.ThreadId == mes.ThreadId ) {
+                    selectedThread = i;
+                    break;
+                }
+            }
+            exceptionRecord = new EXCEPTION_RECORD;
+            exceptionRecord.ExceptionCode = mes.ExceptionRecord.ExceptionCode;
+            exceptionRecord.ExceptionFlags = mes.ExceptionRecord.ExceptionFlags;
+            exceptionRecord.ExceptionAddress = cast(void*)mes.ExceptionRecord.ExceptionAddress;
+            exceptionRecord.NumberParameters = 4;
+            exceptionRecord.ExceptionInformation[0] = 0;
+            exceptionRecord.ExceptionInformation[1] = 0;
+            exceptionRecord.ExceptionInformation[2] = 0;
+            exceptionRecord.ExceptionInformation[3] = 0;
+        }
+
+        if ( exceptionRecord !is null && MiniDumpReadDumpStream(map, UserStreamType.DExceptionInfo, &mdDir, &streamPtr, &streamSize) )
+        {
+            string  className,
+                    message;
+            void*   ptr = streamPtr;
+            className = (cast(char*)(ptr+size_t.sizeof))[0..*cast(size_t*)ptr];
+            ptr += className.length+size_t.sizeof;
+            message = (cast(char*)(ptr+size_t.sizeof))[0..*cast(size_t*)ptr];
+
+            exceptionRecord.NumberParameters = 4;
+            exceptionRecord.ExceptionInformation[0] = className.length;
+            exceptionRecord.ExceptionInformation[1] = cast(size_t)className.ptr;
+            exceptionRecord.ExceptionInformation[2] = message.length;
+            exceptionRecord.ExceptionInformation[3] = cast(size_t)message.ptr;
+        }
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    ~this()
+    {
+        UnmapViewOfFile(map);
+        CloseHandle(fileMapping);
+        CloseHandle(file);
+    }
+
+    static extern(Windows) bool callback(PVOID CallbackParam, PMINIDUMP_CALLBACK_INPUT CallbackInput, PMINIDUMP_CALLBACK_OUTPUT CallbackOutput)
+    {
+        DbgIO.println("MINIDUMP CALLBACK");
+        return true;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    static bool haveMiniDump()
+    {
+        return MiniDumpWriteDump !is null;
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    void* rvaToVa(size_t rva)
+    {
+        return map+rva;
+    }
+
+    ubyte[] getMemory(MINIDUMP_LOCATION_DESCRIPTOR mld)
+    {
+        return (cast(ubyte*)rvaToVa(mld.Rva))[0..mld.DataSize];
+    }
+
+    CONTEXT* getContext()
+    {
+        return cast(CONTEXT*)rvaToVa(threads[selectedThread].ThreadContext.Rva);
+    }
+
+    MINIDUMP_THREAD* thread()
+    {
+        return &threads[selectedThread];
+    }
+
+    ubyte[] readMemory(size_t ptr, size_t size)
+    {
+        foreach ( md; memoryDescriptors )
+        {
+            size_t  mdSize = md.Memory.DataSize,
+                    mdBase = cast(size_t)md.StartOfMemoryRange;
+            debug DbgIO.println("MiniDump: Memory block 0x%x 0x%x", mdBase, mdSize);
+
+            if ( ptr >= mdBase && ptr+size <= mdBase+mdSize )
+                return getMemory(md.Memory)[ptr-mdBase..ptr-mdBase+size];
+        }
+        debug DbgIO.println("Memory block 0x%x - 0x%x not available in minidump", ptr, ptr+size);
+        return null;
+    }
+
+    void selectThread(size_t threadId)
+    {
+        foreach ( i, thread; threads )
+        {
+            if ( threadId == thread.ThreadId ) {
+                selectedThread = i;
+                break;
+            }
+        }
+    }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+    static bool writeMiniDump(string filename, DbgProcess process, uint threadId, EXCEPTION_RECORD* exrec=null, string exClassName=null, string exMsg=null)
+    {
+        if ( !haveMiniDump )
+            return false;
+
+        // create exception information
+        MINIDUMP_EXCEPTION_INFORMATION* eiPtr;
+        MINIDUMP_EXCEPTION_INFORMATION  ei;
+
+        MINIDUMP_USER_STREAM[]              ustreams;
+
+        if ( exrec !is null && (threadId in process.threads) !is null )
+        {
+            EXCEPTION_POINTERS ep;
+            ep.ExceptionRecord  = exrec;
+            CONTEXT ctx;
+            process.threads[threadId].getContext(ctx, CONTEXT_FULL | CONTEXT_FLOATING_POINT | CONTEXT_EXTENDED_REGISTERS);
+            ep.ContextRecord    = &ctx;
+
+            eiPtr = &ei;
+            ei.ExceptionPointers = &ep;
+            ei.ThreadId = threadId;
+            ei.ClientPointers = false;
+
+            ustreams.length = ustreams.length+1;
+            ustreams[$-1].Type = UserStreamType.DExceptionInfo;
+            ubyte[] data;
+            size_t len = exClassName.length;
+            data ~= (cast(ubyte*)&len)[0..size_t.sizeof];
+            data ~= cast(ubyte[])exClassName;
+            len = exMsg.length;
+            data ~= (cast(ubyte*)&len)[0..size_t.sizeof];
+            data ~= cast(ubyte[])exMsg;
+
+            ustreams[$-1].Buffer = data.ptr;
+            ustreams[$-1].BufferSize = data.length;
+        }
+
+        // write custom thread info
+        ustreams.length = ustreams.length+1;
+        ustreams[$-1].Type = UserStreamType.ThreadInfo;
+
+        ThreadInfo ti;
+        ti.mainThreadId = process.mainThreadId;
+        ti.currentThreadId = threadId;
+        ustreams[$-1].Buffer = &ti;
+        ustreams[$-1].BufferSize = ThreadInfo.sizeof;
+
+        // write minidump
+        MINIDUMP_USER_STREAM_INFORMATION    usi;
+        usi.UserStreamCount = ustreams.length;
+        usi.UserStreamArray = ustreams.ptr;
+
+        auto file = CreateFile(toStringz(filename), FILE_ALL_ACCESS, 0, null, CREATE_ALWAYS, 0, null);
+        bool res = cast(bool)MiniDumpWriteDump(process.process_handle, process.processId, file, MINIDUMP_TYPE.MiniDumpNormal, eiPtr, &usi, null);
+        CloseHandle(file);
+        return res;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/udis86.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,956 @@
+/* -----------------------------------------------------------------------------
+ * udis86.h
+ *
+ * converted to D by Jascha Wetzel
+ *
+ * Copyright (c) 2002, 2003, 2004 Vivek Mohan <vivek@sig9.com>
+ * All rights reserved. See (LICENSE)
+ * -----------------------------------------------------------------------------
+ */
+
+extern(C)
+{
+
+struct __nt_context { int esp; int info; int prev; int handler; int stable; int sindex; int ebp; };
+
+/* -----------------------------------------------------------------------------
+ * types.h
+ *
+ * Copyright (c) 2006, Vivek Mohan <vivek@sig9.com>
+ * All rights reserved. See LICENSE
+ * -----------------------------------------------------------------------------
+ */
+
+import std.c.stdio;
+
+extern const char* ud_mnemonics[];
+
+enum ud_mnemonic_code
+{
+  UD_Iaaa,
+  UD_Iaad,
+  UD_Iaam,
+  UD_Iaas,
+  UD_Iadc,
+  UD_Iadd,
+  UD_Iaddpd,
+  UD_Iaddps,
+  UD_Iaddsd,
+  UD_Iaddss,
+  UD_Iand,
+  UD_Iandnpd,
+  UD_Iandnps,
+  UD_Iandpd,
+  UD_Iandps,
+  UD_Iarpl,
+  UD_Ibound,
+  UD_Ibsf,
+  UD_Ibsr,
+  UD_Ibswap,
+  UD_Ibt,
+  UD_Ibtc,
+  UD_Ibtr,
+  UD_Ibts,
+  UD_Icall,
+  UD_Icbw,
+  UD_Icdqe,
+  UD_Iclc,
+  UD_Icld,
+  UD_Iclflush,
+  UD_Icli,
+  UD_Iclts,
+  UD_Icmc,
+  UD_Icmovo,
+  UD_Icmovno,
+  UD_Icmovb,
+  UD_Icmovnb,
+  UD_Icmovz,
+  UD_Icmovnz,
+  UD_Icmovbe,
+  UD_Icmovnbe,
+  UD_Icmovs,
+  UD_Icmovns,
+  UD_Icmovp,
+  UD_Icmovnp,
+  UD_Icmovl,
+  UD_Icmovnl,
+  UD_Icmovle,
+  UD_Icmovnle,
+  UD_Icmp,
+  UD_Icmppd,
+  UD_Icmpps,
+  UD_Icmps,
+  UD_Icmpsb,
+  UD_Icmpsd,
+  UD_Icmpsq,
+  UD_Icmpss,
+  UD_Icmpsw,
+  UD_Icmpxchg,
+  UD_Icmpxchg8b,
+  UD_Icomisd,
+  UD_Icomiss,
+  UD_Icpuid,
+  UD_Icqd,
+  UD_Icqo,
+  UD_Icvtdq2pd,
+  UD_Icvtdq2ps,
+  UD_Icvtpd2dq,
+  UD_Icvtpd2pi,
+  UD_Icvtpd2ps,
+  UD_Icvtpi2pd,
+  UD_Icvtpi2ps,
+  UD_Icvtps2dq,
+  UD_Icvtps2pd,
+  UD_Icvtps2pi,
+  UD_Icvtsd2si,
+  UD_Icvtsd2ss,
+  UD_Icvtsi2sd,
+  UD_Icvtsi2ss,
+  UD_Icvtss2sd,
+  UD_Icvtss2si,
+  UD_Icvttpd2dq,
+  UD_Icvttpd2pi,
+  UD_Icvttps2dq,
+  UD_Icvttps2pi,
+  UD_Icvttsd2si,
+  UD_Icvttsi2sd,
+  UD_Icvttsi2ss,
+  UD_Icvttss2si,
+  UD_Icwd,
+  UD_Icwde,
+  UD_Icdq,
+  UD_Idaa,
+  UD_Idas,
+  UD_Idec,
+  UD_Idiv,
+  UD_Idivpd,
+  UD_Idivps,
+  UD_Idivsd,
+  UD_Idivss,
+  UD_Iemms,
+  UD_Ienter,
+  UD_Iesc,
+  UD_If2xm1,
+  UD_Ifsxm1,
+  UD_Ifabs,
+  UD_Ifadd,
+  UD_Ifaddp,
+  UD_Ifbld,
+  UD_Ifbstp,
+  UD_Ifchs,
+  UD_Ifclex,
+  UD_Ifcmovb,
+  UD_Ifcmovbe,
+  UD_Ifcmove,
+  UD_Ifcmovnb,
+  UD_Ifcmovnbe,
+  UD_Ifcmovne,
+  UD_Ifcmovnu,
+  UD_Ifcmovu,
+  UD_Ifcom,
+  UD_Ifcomi,
+  UD_Ifcomp,
+  UD_Ifcomip,
+  UD_Ifcompp,
+  UD_Ifcos,
+  UD_Ifdecstp,
+  UD_Ifdiv,
+  UD_Ifdivp,
+  UD_Ifdivr,
+  UD_Ifdivrp,
+  UD_Ifemms,
+  UD_Iffree,
+  UD_Ifiadd,
+  UD_Ificom,
+  UD_Ificomp,
+  UD_Ifidiv,
+  UD_Ifidivr,
+  UD_Ifidw,
+  UD_Ifidwr,
+  UD_Ifild,
+  UD_Ifimul,
+  UD_Ifincstp,
+  UD_Ifinit,
+  UD_Ifist,
+  UD_Ifistp,
+  UD_Ifisub,
+  UD_Ifisubr,
+  UD_Ifld,
+  UD_Ifld1,
+  UD_Ifldcw,
+  UD_Ifldenv,
+  UD_Ifldl2e,
+  UD_Ifldl2t,
+  UD_Ifldlg2,
+  UD_Ifldln2,
+  UD_Ifldlpi,
+  UD_Ifldx,
+  UD_Ifldz,
+  UD_Ifmul,
+  UD_Ifmulp,
+  UD_Ifnclex,
+  UD_Ifncstp,
+  UD_Ifninit,
+  UD_Ifnop,
+  UD_Ifnsave,
+  UD_Ifnstcw,
+  UD_Ifnstenv,
+  UD_Ifnstsw,
+  UD_Ifpatan,
+  UD_Ifprem,
+  UD_Ifprem1,
+  UD_Ifptan,
+  UD_Ifpxtract,
+  UD_Ifrndint,
+  UD_Ifrstor,
+  UD_Ifsave,
+  UD_Ifscale,
+  UD_Ifsin,
+  UD_Ifsincos,
+  UD_Ifsqrt,
+  UD_Ifst,
+  UD_Ifstcw,
+  UD_Ifstenv,
+  UD_Ifstp,
+  UD_Ifstsw,
+  UD_Ifsub,
+  UD_Ifsubp,
+  UD_Ifsubr,
+  UD_Ifsubrp,
+  UD_Iftst,
+  UD_Ifucom,
+  UD_Ifucomi,
+  UD_Ifucomip,
+  UD_Ifucomp,
+  UD_Ifucompp,
+  UD_Ifwait,
+  UD_Ifxam,
+  UD_Ifxch,
+  UD_Ifxrstor,
+  UD_Ifxsave,
+  UD_Ifxtract,
+  UD_Ifyl2x,
+  UD_Ifyl2xp1,
+  UD_Ihlt,
+  UD_Iidiv,
+  UD_Iimul,
+  UD_Iin,
+  UD_Iinc,
+  UD_Iins,
+  UD_Iinsb,
+  UD_Iinsd,
+  UD_Iinsw,
+  UD_Iint,
+  UD_Iinto,
+  UD_Iinvd,
+  UD_Iinvlpg,
+  UD_Iiretw,
+  UD_Iiretd,
+  UD_Iiretq,
+  UD_Ijcxz,
+  UD_Ijecxz,
+  UD_Ijmp,
+  UD_Ijrcxz,
+  UD_Ijo,
+  UD_Ijno,
+  UD_Ijb,
+  UD_Ijnb,
+  UD_Ijz,
+  UD_Ijnz,
+  UD_Ijbe,
+  UD_Ijnbe,
+  UD_Ijs,
+  UD_Ijns,
+  UD_Ijp,
+  UD_Ijnp,
+  UD_Ijl,
+  UD_Ijnl,
+  UD_Ijle,
+  UD_Ijnle,
+  UD_Ilahf,
+  UD_Ilar,
+  UD_Ildmxcsr,
+  UD_Ilds,
+  UD_Ilea,
+  UD_Ileave,
+  UD_Iles,
+  UD_Ilfence,
+  UD_Ilfs,
+  UD_Ilgdt,
+  UD_Ilgs,
+  UD_Ilidt,
+  UD_Illdt,
+  UD_Ilmsw,
+  UD_Ilock,
+  UD_Ilods,
+  UD_Ilodsb,
+  UD_Ilodsd,
+  UD_Ilodsq,
+  UD_Ilodsw,
+  UD_Iloop,
+  UD_Iloope,
+  UD_Iloopn,
+  UD_Iloopne,
+  UD_Iloopnz,
+  UD_Iloopz,
+  UD_Ilsl,
+  UD_Ilss,
+  UD_Iltr,
+  UD_Imaskmovdqu,
+  UD_Imaskmovq,
+  UD_Imaxpd,
+  UD_Imaxps,
+  UD_Imaxsd,
+  UD_Imaxss,
+  UD_Imfence,
+  UD_Iminpd,
+  UD_Iminps,
+  UD_Iminsd,
+  UD_Iminss,
+  UD_Imov,
+  UD_Imovapd,
+  UD_Imovaps,
+  UD_Imovd,
+  UD_Imovdq2q,
+  UD_Imovdqa,
+  UD_Imovdqu,
+  UD_Imovhlps,
+  UD_Imovhpd,
+  UD_Imovhps,
+  UD_Imovlhps,
+  UD_Imovlpd,
+  UD_Imovlps,
+  UD_Imovmskpd,
+  UD_Imovmskps,
+  UD_Imovnig,
+  UD_Imovntdq,
+  UD_Imovnti,
+  UD_Imovntpd,
+  UD_Imovntps,
+  UD_Imovntq,
+  UD_Imovq,
+  UD_Imovq2dq,
+  UD_Imovqa,
+  UD_Imovs,
+  UD_Imovsb,
+  UD_Imovsd,
+  UD_Imovsq,
+  UD_Imovss,
+  UD_Imovsw,
+  UD_Imovsx,
+  UD_Imovsxd,
+  UD_Imovupd,
+  UD_Imovups,
+  UD_Imovzx,
+  UD_Imul,
+  UD_Imulpd,
+  UD_Imulps,
+  UD_Imulsd,
+  UD_Imulss,
+  UD_Ineg,
+  UD_Inop,
+  UD_Inot,
+  UD_Ior,
+  UD_Iorpd,
+  UD_Iorps,
+  UD_Iout,
+  UD_Iouts,
+  UD_Ioutsb,
+  UD_Ioutsd,
+  UD_Ioutsw,
+  UD_Ipackssdw,
+  UD_Ipacksswb,
+  UD_Ipackusdw,
+  UD_Ipackuswb,
+  UD_Ipaddb,
+  UD_Ipaddd,
+  UD_Ipaddq,
+  UD_Ipaddsb,
+  UD_Ipaddsw,
+  UD_Ipaddusb,
+  UD_Ipaddusw,
+  UD_Ipaddw,
+  UD_Ipand,
+  UD_Ipandn,
+  UD_Ipavgb,
+  UD_Ipavgusb,
+  UD_Ipavgw,
+  UD_Ipcmpeqb,
+  UD_Ipcmpeqd,
+  UD_Ipcmpeqw,
+  UD_Ipcmpgtb,
+  UD_Ipcmpgtd,
+  UD_Ipcmpgtw,
+  UD_Ipextrw,
+  UD_Ipf2id,
+  UD_Ipf2iw,
+  UD_Ipfacc,
+  UD_Ipfadd,
+  UD_Ipfcmpeq,
+  UD_Ipfcmpge,
+  UD_Ipfcmpgt,
+  UD_Ipfmax,
+  UD_Ipfmin,
+  UD_Ipfmul,
+  UD_Ipfnacc,
+  UD_Ipfpnacc,
+  UD_Ipfrcp,
+  UD_Ipfrcpit1,
+  UD_Ipfrcpit2,
+  UD_Ipfrsqit1,
+  UD_Ipfrsqrt,
+  UD_Ipfsub,
+  UD_Ipfsubr,
+  UD_Ipi2fd,
+  UD_Ipi2fw,
+  UD_Ipinsrw,
+  UD_Ipmaddwd,
+  UD_Ipmaxsw,
+  UD_Ipmaxub,
+  UD_Ipminsw,
+  UD_Ipminub,
+  UD_Ipmovmskb,
+  UD_Ipmulhrw,
+  UD_Ipmulhuw,
+  UD_Ipmulhw,
+  UD_Ipmullw,
+  UD_Ipmuludq,
+  UD_Ipop,
+  UD_Ipopa,
+  UD_Ipopad,
+  UD_Ipopfw,
+  UD_Ipopfd,
+  UD_Ipopfq,
+  UD_Ipor,
+  UD_Iprefetch,
+  UD_Ipsadbw,
+  UD_Ipshufd,
+  UD_Ipshufhw,
+  UD_Ipshuflw,
+  UD_Ipshufw,
+  UD_Ipslld,
+  UD_Ipslldq,
+  UD_Ipsllq,
+  UD_Ipsllw,
+  UD_Ipsrad,
+  UD_Ipsraw,
+  UD_Ipsraq,
+  UD_Ipsrld,
+  UD_Ipsrldq,
+  UD_Ipsrlq,
+  UD_Ipsrlw,
+  UD_Ipsubb,
+  UD_Ipsubd,
+  UD_Ipsubq,
+  UD_Ipsubsb,
+  UD_Ipsubsw,
+  UD_Ipsubusb,
+  UD_Ipsubusw,
+  UD_Ipsubw,
+  UD_Ipswapd,
+  UD_Ipunpckhbw,
+  UD_Ipunpckhdq,
+  UD_Ipunpckhqdq,
+  UD_Ipunpckhwd,
+  UD_Ipunpcklbw,
+  UD_Ipunpckldq,
+  UD_Ipunpcklqdq,
+  UD_Ipunpcklwd,
+  UD_Ipush,
+  UD_Ipusha,
+  UD_Ipushad,
+  UD_Ipushfw,
+  UD_Ipushfd,
+  UD_Ipushfq,
+  UD_Ipxor,
+  UD_Ircl,
+  UD_Ircpps,
+  UD_Ircpss,
+  UD_Ircr,
+  UD_Irdivisr,
+  UD_Irdmsr,
+  UD_Irdpmc,
+  UD_Irdtsc,
+  UD_Irep,
+  UD_Irepne,
+  UD_Iret,
+  UD_Iretf,
+  UD_Irol,
+  UD_Iror,
+  UD_Irsm,
+  UD_Irsqrtps,
+  UD_Irsqrtss,
+  UD_Isahf,
+  UD_Isal,
+  UD_Isalc,
+  UD_Isar,
+  UD_Isbb,
+  UD_Iscas,
+  UD_Iscasb,
+  UD_Iscasd,
+  UD_Iscasq,
+  UD_Iscasw,
+  UD_Iseto,
+  UD_Isetno,
+  UD_Isetb,
+  UD_Isetnb,
+  UD_Isetz,
+  UD_Isetnz,
+  UD_Isetbe,
+  UD_Isetnbe,
+  UD_Isets,
+  UD_Isetns,
+  UD_Isetp,
+  UD_Isetnp,
+  UD_Isetl,
+  UD_Isetnl,
+  UD_Isetle,
+  UD_Isetnle,
+  UD_Isfence,
+  UD_Isgdt,
+  UD_Ishl,
+  UD_Ishld,
+  UD_Ishr,
+  UD_Ishrd,
+  UD_Ishufpd,
+  UD_Ishufps,
+  UD_Isidt,
+  UD_Isldt,
+  UD_Ismsw,
+  UD_Isqrtpd,
+  UD_Isqrtps,
+  UD_Isqrtsd,
+  UD_Isqrtss,
+  UD_Istc,
+  UD_Istd,
+  UD_Isti,
+  UD_Istmxcsr,
+  UD_Istos,
+  UD_Istosb,
+  UD_Istosw,
+  UD_Istosd,
+  UD_Istr,
+  UD_Isub,
+  UD_Isubpd,
+  UD_Isubps,
+  UD_Isubsd,
+  UD_Isubss,
+  UD_Iswapgs,
+  UD_Isyscall,
+  UD_Isysenter,
+  UD_Isysexit,
+  UD_Isysret,
+  UD_Itest,
+  UD_Iucomisd,
+  UD_Iucomiss,
+  UD_Iud2,
+  UD_Iunpckhpd,
+  UD_Iunpckhps,
+  UD_Iunpcklpd,
+  UD_Iunpcklps,
+  UD_Iverr,
+  UD_Iverw,
+  UD_Iwait,
+  UD_Iwbinvd,
+  UD_Iwrmsr,
+  UD_Ixadd,
+  UD_Ixchg,
+  UD_Ixlat,
+  UD_Ixlatb,
+  UD_Ixor,
+  UD_Ixorpd,
+  UD_Ixorps,
+  UD_Iinvalid,
+  UD_Igrp,
+  UD_Ia32,
+  UD_Io32,
+  UD_Ies,
+  UD_Ifs,
+  UD_Igs,
+  UD_Ics,
+  UD_Ids,
+  UD_Iss,
+  UD_Ix87,
+  UD_I3dnow,
+  UD_Idb,
+  UD_Icmpxchg16b,
+  UD_Istosq,
+  UD_Iint3,
+  UD_Imovsldup,
+  UD_Imovshdup,
+  UD_Imovddup,
+  UD_Irdtscp,
+  UD_Ivmrun,
+  UD_Ivmmcall,
+  UD_Ivmload,
+  UD_Ivmsave,
+  UD_Istgi,
+  UD_Iclgi,
+  UD_Iskinit,
+  UD_Iinvlpga,
+  UD_Ija,
+  UD_Ijae,
+  UD_Ijg,
+  UD_Ijge,
+  UD_Ijc,
+  UD_Ijnc,
+  UD_Ifisttp,
+  UD_Iprefetchnta,
+  UD_Iprefetcht0,
+  UD_Iprefetcht1,
+  UD_Iprefetcht2,
+  UD_Icmovae,
+  UD_Icmova,
+  UD_Icmovge,
+  UD_Icmovg,
+  UD_Iseta,
+  UD_Isetge,
+  UD_Isetg,
+  UD_Ipause,
+  UD_Ina,
+  UD_Ihaddpd,
+  UD_Ihsubpd,
+  UD_Iaddsubpd,
+  UD_Ihaddps,
+  UD_Ihsubps,
+  UD_Iaddsubps,
+  UD_Ilddqu,
+  UD_Iint1,
+  UD_Ivmcall,
+  UD_Ivmlaunch,
+  UD_Ivmresume,
+  UD_Ivmxoff,
+  UD_Imonitor,
+  UD_Imwait,
+  UD_Ivmptrld,
+  UD_Ivmptrst,
+  UD_Ivmclear,
+  UD_Ivmxon,
+  UD_Inone,
+  UD_I3vil
+}
+
+
+/* -----------------------------------------------------------------------------
+ * All possible "types" of objects in udis86. Order is Important!
+ * -----------------------------------------------------------------------------
+ */
+enum ud_type
+{
+  UD_NONE,
+
+  /* 8 bit GPRs */
+  UD_R_AL,	UD_R_CL,	UD_R_DL,	UD_R_BL,
+  UD_R_AH,	UD_R_CH,	UD_R_DH,	UD_R_BH,
+  UD_R_SPL,	UD_R_BPL,	UD_R_SIL,	UD_R_DIL,
+  UD_R_R8B,	UD_R_R9B,	UD_R_R10B,	UD_R_R11B,
+  UD_R_R12B,	UD_R_R13B,	UD_R_R14B,	UD_R_R15B,
+
+  /* 16 bit GPRs */
+  UD_R_AX,	UD_R_CX,	UD_R_DX,	UD_R_BX,
+  UD_R_SP,	UD_R_BP,	UD_R_SI,	UD_R_DI,
+  UD_R_R8W,	UD_R_R9W,	UD_R_R10W,	UD_R_R11W,
+  UD_R_R12W,	UD_R_R13W,	UD_R_R14W,	UD_R_R15W,
+
+  /* 32 bit GPRs */
+  UD_R_EAX,	UD_R_ECX,	UD_R_EDX,	UD_R_EBX,
+  UD_R_ESP,	UD_R_EBP,	UD_R_ESI,	UD_R_EDI,
+  UD_R_R8D,	UD_R_R9D,	UD_R_R10D,	UD_R_R11D,
+  UD_R_R12D,	UD_R_R13D,	UD_R_R14D,	UD_R_R15D,
+
+  /* 64 bit GPRs */
+  UD_R_RAX,	UD_R_RCX,	UD_R_RDX,	UD_R_RBX,
+  UD_R_RSP,	UD_R_RBP,	UD_R_RSI,	UD_R_RDI,
+  UD_R_R8,	UD_R_R9,	UD_R_R10,	UD_R_R11,
+  UD_R_R12,	UD_R_R13,	UD_R_R14,	UD_R_R15,
+
+  /* segment registers */
+  UD_R_ES,	UD_R_CS,	UD_R_SS,	UD_R_DS,
+  UD_R_FS,	UD_R_GS,
+
+  /* control registers*/
+  UD_R_CR0,	UD_R_CR1,	UD_R_CR2,	UD_R_CR3,
+  UD_R_CR4,	UD_R_CR5,	UD_R_CR6,	UD_R_CR7,
+  UD_R_CR8,	UD_R_CR9,	UD_R_CR10,	UD_R_CR11,
+  UD_R_CR12,	UD_R_CR13,	UD_R_CR14,	UD_R_CR15,
+
+  /* debug registers */
+  UD_R_DR0,	UD_R_DR1,	UD_R_DR2,	UD_R_DR3,
+  UD_R_DR4,	UD_R_DR5,	UD_R_DR6,	UD_R_DR7,
+  UD_R_DR8,	UD_R_DR9,	UD_R_DR10,	UD_R_DR11,
+  UD_R_DR12,	UD_R_DR13,	UD_R_DR14,	UD_R_DR15,
+
+  /* mmx registers */
+  UD_R_MM0,	UD_R_MM1,	UD_R_MM2,	UD_R_MM3,
+  UD_R_MM4,	UD_R_MM5,	UD_R_MM6,	UD_R_MM7,
+
+  /* x87 registers */
+  UD_R_ST0,	UD_R_ST1,	UD_R_ST2,	UD_R_ST3,
+  UD_R_ST4,	UD_R_ST5,	UD_R_ST6,	UD_R_ST7,
+
+  /* extended multimedia registers */
+  UD_R_XMM0,	UD_R_XMM1,	UD_R_XMM2,	UD_R_XMM3,
+  UD_R_XMM4,	UD_R_XMM5,	UD_R_XMM6,	UD_R_XMM7,
+  UD_R_XMM8,	UD_R_XMM9,	UD_R_XMM10,	UD_R_XMM11,
+  UD_R_XMM12,	UD_R_XMM13,	UD_R_XMM14,	UD_R_XMM15,
+
+  UD_R_RIP,
+
+  /* Operand Types */
+  UD_OP_REG,	UD_OP_MEM,	UD_OP_PTR,	UD_OP_IMM,
+  UD_OP_JIMM,	UD_OP_CONST
+}
+
+/* -----------------------------------------------------------------------------
+ * struct ud_operand - Disassembled instruction Operand.
+ * -----------------------------------------------------------------------------
+ */
+struct ptr_t
+{
+	ushort seg;
+	uint off;
+}
+union lval_t
+{
+	byte		sbyte;
+	ubyte		_ubyte;
+	short		sword;
+	ushort	uword;
+	int		sdword;
+	uint	udword;
+	long		sqword;
+	ulong	uqword;
+
+	ptr_t ptr;
+}
+struct ud_operand
+{
+  ud_type		type;
+  ubyte		size;
+  lval_t lval;
+
+  ud_type		base;
+  ud_type		index;
+  ubyte		offset;
+  ubyte		scale;
+};
+
+/* -----------------------------------------------------------------------------
+ * struct ud - The udis86 object.
+ * -----------------------------------------------------------------------------
+ */
+struct ud
+{
+  int		(*inp_hook) (ud*);
+  ubyte		inp_curr;
+  ubyte		inp_fill;
+  FILE*		inp_file;
+  ubyte		inp_ctr;
+  ubyte*	inp_buff;
+  ubyte*	inp_buff_end;
+  ubyte		inp_end;
+  void		(*translator)(ud*);
+  ulong		insn_offset;
+  char		insn_hexcode[32];
+  char		insn_buffer[64];
+  uint		insn_fill;
+  ubyte		dis_mode;
+  ulong		pc;
+  ubyte		vendor;
+  map_entry*	mapen;
+  ud_mnemonic_code	mnemonic;
+  ud_operand	operand[3];
+  ubyte		error;
+  ubyte	 	pfx_rex;
+  ubyte 		pfx_seg;
+  ubyte 		pfx_opr;
+  ubyte 		pfx_adr;
+  ubyte 		pfx_lock;
+  ubyte 		pfx_rep;
+  ubyte 		pfx_repe;
+  ubyte 		pfx_repne;
+  ubyte 		pfx_insn;
+  ubyte		default64;
+  ubyte		opr_mode;
+  ubyte		adr_mode;
+  ubyte		br_far;
+  ubyte		br_near;
+  ubyte		c1;
+  ubyte		c2;
+  ubyte		c3;
+  ubyte 		inp_cache[256];
+  ubyte		inp_sess[64];
+
+}
+
+enum map_operand_type
+{
+  OP_NONE = 0,
+  OP_A,
+  OP_E,
+  OP_M,
+  OP_G,
+  OP_I,
+  OP_AL,
+  OP_CL,
+  OP_DL,
+  OP_BL,
+  OP_AH,
+  OP_CH,
+  OP_DH,
+  OP_BH,
+  OP_ALr8b,
+  OP_CLr9b,
+  OP_DLr10b,
+  OP_BLr11b,
+  OP_AHr12b,
+  OP_CHr13b,
+  OP_DHr14b,
+  OP_BHr15b,
+  OP_AX,
+  OP_CX,
+  OP_DX,
+  OP_BX,
+  OP_SI,
+  OP_DI,
+  OP_SP,
+  OP_BP,
+  OP_rAX,
+  OP_rCX,
+  OP_rDX,
+  OP_rBX,
+  OP_rSP,
+  OP_rBP,
+  OP_rSI,
+  OP_rDI,
+  OP_rAXr8,
+  OP_rCXr9,
+  OP_rDXr10,
+  OP_rBXr11,
+  OP_rSPr12,
+  OP_rBPr13,
+  OP_rSIr14,
+  OP_rDIr15,
+  OP_eAX,
+  OP_eCX,
+  OP_eDX,
+  OP_eBX,
+  OP_eSP,
+  OP_eBP,
+  OP_eSI,
+  OP_eDI,
+  OP_ES,
+  OP_CS,
+  OP_SS,
+  OP_DS,
+  OP_FS,
+  OP_GS,
+  OP_ST0,
+  OP_ST1,
+  OP_ST2,
+  OP_ST3,
+  OP_ST4,
+  OP_ST5,
+  OP_ST6,
+  OP_ST7,
+  OP_J,
+  OP_S,
+  OP_O,
+  OP_I1,
+  OP_I3,
+  OP_V,
+  OP_W,
+  OP_Q,
+  OP_P,
+  OP_R,
+  OP_C,
+  OP_D,
+  OP_VR,
+  OP_PR
+}
+
+struct map_operand
+{
+  map_operand_type		type;
+  ubyte 			size;
+}
+
+struct map_entry
+{
+  ud_mnemonic_code		mnemonic;
+  map_operand		operand1;
+  map_operand		operand2;
+  map_operand		operand3;
+  uint 			prefix;
+}
+
+/* -----------------------------------------------------------------------------
+ * Type-definitions
+ * -----------------------------------------------------------------------------
+ */
+alias ud_type 		ud_type_t;
+alias ud_mnemonic_code	ud_mnemonic_code_t;
+
+alias ud 		ud_t;
+alias ud_operand 	ud_operand_t;
+
+/*
+#define UD_SYN_INTEL		ud_translate_intel
+#define UD_SYN_ATT		ud_translate_att
+#define UD_EOI			-1
+#define UD_INP_CACHE_SZ		32
+#define UD_VENDOR_AMD		0
+#define UD_VENDOR_INTEL		1
+*/
+
+/* -----------------------------------------------------------------------------
+ * extern.h
+ *
+ * Copyright (c) 2004, 2005, 2006, Vivek Mohan <vivek@sig9.com>
+ * All rights reserved. See LICENSE
+ * -----------------------------------------------------------------------------
+ */
+
+/* ============================= PUBLIC API ================================= */
+
+extern void ud_init(ud*);
+
+extern void ud_set_mode(ud*, ubyte);
+
+extern void ud_set_pc(ud*, ulong);
+
+extern void ud_set_input_hook(ud*, int (*)(ud*));
+
+extern void ud_set_input_buffer(ud*, ubyte*, size_t);
+
+extern void ud_set_input_file(ud*, FILE*);
+
+extern void ud_set_vendor(ud*, ushort);
+
+extern void ud_set_syntax(ud*, void function(ud*));
+
+extern void ud_input_skip(ud*, size_t);
+
+extern int ud_input_end(ud*);
+
+extern uint ud_decode(ud*);
+
+extern uint ud_disassemble(ud*);
+
+extern void ud_translate_intel(ud*);
+
+extern void ud_translate_att(ud*);
+
+extern char* ud_insn_asm(ud* u);
+
+extern ubyte* ud_insn_ptr(ud* u);
+
+extern ulong ud_insn_off(ud*);
+
+extern char* ud_insn_hex(ud*);
+
+extern uint ud_insn_len(ud* u);
+
+extern char* ud_lookup_mnemonic(ud_mnemonic_code c);
+
+} // extern(C)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/util.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,648 @@
+/*  Ddbg - Win32 Debugger for the D programming language
+ *  Copyright (c) 2007 Jascha Wetzel
+ *  All rights reserved. See LICENSE.TXT for details.
+ */
+
+import std.ctype;
+import std.stdio;
+import std.string;
+import std.c.string;
+import std.c.stdio;
+import std.format;
+import std.date : getUTCtime, d_time, TicksPerSecond;
+import std.demangle;
+
+import win32.winbase;
+import win32.windef;
+
+import std.typeinfo.ti_AC;
+import std.typeinfo.ti_Acdouble;
+import std.typeinfo.ti_Acfloat;
+import std.typeinfo.ti_Acreal;
+import std.typeinfo.ti_Adouble;
+import std.typeinfo.ti_Afloat;
+import std.typeinfo.ti_Ag;
+import std.typeinfo.ti_Aint;
+import std.typeinfo.ti_Along;
+import std.typeinfo.ti_Areal;
+import std.typeinfo.ti_Ashort;
+import std.typeinfo.ti_byte;
+import std.typeinfo.ti_C;
+import std.typeinfo.ti_cdouble;
+import std.typeinfo.ti_cfloat;
+import std.typeinfo.ti_char;
+import std.typeinfo.ti_creal;
+import std.typeinfo.ti_dchar;
+import std.typeinfo.ti_delegate;
+import std.typeinfo.ti_double;
+import std.typeinfo.ti_float;
+import std.typeinfo.ti_idouble;
+import std.typeinfo.ti_ifloat;
+import std.typeinfo.ti_int;
+import std.typeinfo.ti_ireal;
+import std.typeinfo.ti_long;
+import std.typeinfo.ti_ptr;
+import std.typeinfo.ti_real;
+import std.typeinfo.ti_short;
+import std.typeinfo.ti_ubyte;
+import std.typeinfo.ti_uint;
+import std.typeinfo.ti_ulong;
+import std.typeinfo.ti_ushort;
+import std.typeinfo.ti_void;
+import std.typeinfo.ti_wchar;
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+T dmax(T)(T a, T b)
+{
+	return a<b?b:a;
+}
+
+T dmin(T)(T a, T b)
+{
+	return a>b?b:a;
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+uint intFromStr(string str)
+{
+	uint i;
+	foreach_reverse ( c; str )
+		i = i<<8 | c;
+	return i;
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+string itoa(uint i)
+{
+    if ( i == 0 )
+        return "0";
+    string str;
+    for ( ; i > 0; i /= 10 )
+        str = "0123456789"[i%10] ~ str;
+    return str;
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+string TODO(string file, uint line, string msg)
+{
+	return "TODO - "~file~"("~itoa(line)~"): "~msg~"";
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+string formatTicks(ulong ticks)
+{
+    SYSTEMTIME stime;
+    if ( !FileTimeToSystemTime(cast(FILETIME*)&ticks, &stime) )
+        return "invalid";
+    string str = format("%02d:%02d:%02d.%03d", stime.wHour, stime.wMinute, stime.wSecond, stime.wMilliseconds);
+    return str;
+}
+
+/**************************************************************************************************
+    Name lookup for win32 DebugEventCodes.
+**************************************************************************************************/
+string getEventName(uint event)
+{
+	switch ( event )
+	{
+		case EXCEPTION_DEBUG_EVENT	: return "EXCEPTION_DEBUG_EVENT";
+		case CREATE_THREAD_DEBUG_EVENT	: return "CREATE_THREAD_DEBUG_EVENT";
+		case CREATE_PROCESS_DEBUG_EVENT	: return "CREATE_PROCESS_DEBUG_EVENT";
+		case EXIT_THREAD_DEBUG_EVENT	: return "EXIT_THREAD_DEBUG_EVENT";
+		case EXIT_PROCESS_DEBUG_EVENT	: return "EXIT_PROCESS_DEBUG_EVENT";
+		case LOAD_DLL_DEBUG_EVENT	: return "LOAD_DLL_DEBUG_EVENT";
+		case UNLOAD_DLL_DEBUG_EVENT	: return "UNLOAD_DLL_DEBUG_EVENT";
+		case OUTPUT_DEBUG_STRING_EVENT	: return "OUTPUT_DEBUG_STRING_EVENT";
+		case RIP_EVENT: return "RIP_EVENT";
+		default : break;
+	}
+	return "";
+}
+
+/**************************************************************************************************
+    Name lookup for win32 ExceptionCodes.
+**************************************************************************************************/
+string getExceptionName(uint excpt)
+{
+	switch ( excpt )
+	{
+		case EXCEPTION_ACCESS_VIOLATION	: return "EXCEPTION_ACCESS_VIOLATION";
+		case EXCEPTION_ARRAY_BOUNDS_EXCEEDED	: return "EXCEPTION_ARRAY_BOUNDS_EXCEEDED";
+		case EXCEPTION_BREAKPOINT	: return "EXCEPTION_BREAKPOINT";
+		case EXCEPTION_DATATYPE_MISALIGNMENT	: return "EXCEPTION_DATATYPE_MISALIGNMENT";
+		case EXCEPTION_FLT_DENORMAL_OPERAND	: return "EXCEPTION_FLT_DENORMAL_OPERAND";
+		case EXCEPTION_FLT_DIVIDE_BY_ZERO	: return "EXCEPTION_FLT_DIVIDE_BY_ZERO";
+		case EXCEPTION_FLT_INEXACT_RESULT	: return "EXCEPTION_FLT_INEXACT_RESULT";
+		case EXCEPTION_FLT_INVALID_OPERATION	: return "EXCEPTION_FLT_INVALID_OPERATION";
+		case EXCEPTION_FLT_OVERFLOW	: return "EXCEPTION_FLT_OVERFLOW";
+		case EXCEPTION_FLT_STACK_CHECK	: return "EXCEPTION_FLT_STACK_CHECK";
+		case EXCEPTION_FLT_UNDERFLOW	: return "EXCEPTION_FLT_UNDERFLOW";
+		case EXCEPTION_ILLEGAL_INSTRUCTION	: return "EXCEPTION_ILLEGAL_INSTRUCTION";
+		case EXCEPTION_IN_PAGE_ERROR	: return "EXCEPTION_IN_PAGE_ERROR";
+		case EXCEPTION_INT_DIVIDE_BY_ZERO	: return "EXCEPTION_INT_DIVIDE_BY_ZERO";
+		case EXCEPTION_INT_OVERFLOW	: return "EXCEPTION_INT_OVERFLOW";
+		case EXCEPTION_INVALID_DISPOSITION	: return "EXCEPTION_INVALID_DISPOSITION";
+		case EXCEPTION_NONCONTINUABLE_EXCEPTION	: return "EXCEPTION_NONCONTINUABLE_EXCEPTION";
+		case EXCEPTION_PRIV_INSTRUCTION	: return "EXCEPTION_PRIV_INSTRUCTION";
+		case EXCEPTION_SINGLE_STEP	: return "EXCEPTION_SINGLE_STEP";
+		case EXCEPTION_STACK_OVERFLOW	: return "EXCEPTION_STACK_OVERFLOW";
+		default : break;
+	}
+	return "";
+}
+
+/**************************************************************************************************
+    Wrapper for Win32 GetLastError.
+**************************************************************************************************/
+string lastError()
+{
+	char[4096] msg;
+	FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, null, GetLastError(), 0, msg.ptr, msg.length, null);
+	return msg[0..strlen(msg.ptr)];
+}
+
+/**************************************************************************************************
+    Simplified number parser for prefixes.
+    Returns: number represented by the prefix of name, 0 else
+**************************************************************************************************/
+uint parseNumber(inout string name)
+{
+	uint res;
+	int i;
+	while ( name.length > 0 )
+	{
+		if ( !isdigit(name[0]) )
+			break;
+		res = res*10+(name[0]-'0');
+		name = name[1..$];
+	}
+	return res;
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+string typeFromMangled(string mangled)
+{
+	if ( mangled is null || mangled.length < 4 || mangled[0..2] != "_D" || !isdigit(mangled[2]) )
+		return null;
+	string type = mangled[1..$];
+	// skip symbol name
+	while ( type.length > 1 && type[0] == 'D' && isdigit(type[1]) ) {
+		type = type[1..$];
+		uint len = parseNumber(type);
+		type = type[len..$];
+	}
+	return type;
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+string mangleName(string name)
+{
+	string		mangled;
+	string[]	idents	= split(name, ".");
+	foreach ( string id; idents )
+		mangled ~= .toString(id.length)~id;
+	return mangled;
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+string demangleType(string mangled)
+{
+	return demangle("_D0"~mangled);
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+string demangleNameSkip(inout string mangled)
+{
+	string name;
+	do {
+		uint len = parseNumber(mangled);
+		if ( len <= 0 || len > mangled.length )
+			return null;
+		if ( name.length > 0 )
+			name ~= ".";
+		name ~= mangled[0..len];
+		mangled = mangled[len..$];
+	} while ( mangled.length > 0 );
+	return name;
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+string demangleName(string mangled)
+{
+	string name;
+	if ( mangled.length > 2 && mangled[0..2] == "_D" && isNumeric(mangled[2]) )
+        mangled = mangled[2..$];
+    else
+        return mangled;
+	do {
+		uint len = parseNumber(mangled);
+        while ( len <= 0 && mangled.length > 0 ) {
+            mangled = mangled[1..$];
+            len = parseNumber(mangled);
+        }
+		if ( len <= 0 || len > mangled.length )
+			return name;
+		if ( name.length > 0 )
+			name ~= ".";
+		name ~= mangled[0..len];
+		mangled = mangled[len..$];
+	} while ( mangled.length > 0 );
+	return name;
+}
+
+/**************************************************************************************************
+    Wraps win32 stdio functions. Respects io redirection into pipes.
+**************************************************************************************************/
+class DbgIO
+{
+	static HANDLE ddb_read, ddb_write;
+	static string buffer;
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	static this()
+	{
+		ddb_read = GetStdHandle(STD_INPUT_HANDLE);
+		ddb_write = GetStdHandle(STD_OUTPUT_HANDLE);
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	static string readln()
+	{
+		char[128] buf;
+		uint read;
+
+		int nl_index;
+		do
+		{
+			ReadFile(ddb_read, buf.ptr, buf.length, &read, null);
+			buffer ~= buf[0..read];
+			nl_index = find(buffer, '\n');
+		} while ( nl_index < 0 );
+		string ret = buffer[0..nl_index];
+		buffer = buffer[nl_index+1..$];
+		return ret;
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	static void print(...)
+	{
+		string str;
+
+		void putc(dchar c)
+		{
+			str ~= c;
+		}
+
+		doFormat(&putc, _arguments, _argptr);
+		uint written;
+		WriteFile(ddb_write, str.ptr, str.length, &written, null);
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	static void println(...)
+	{
+		string str;
+
+		void putc(dchar c)
+		{
+			str ~= c;
+		}
+
+		doFormat(&putc, _arguments, _argptr);
+		uint written;
+		str ~= '\n';
+		WriteFile(ddb_write, str.ptr, str.length, &written, null);
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	static void write(string str)
+	{
+		uint written;
+		WriteFile(ddb_write, str.ptr, str.length, &written, null);
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	static void writeln(string str)
+	{
+		uint written;
+		str ~= "\n";
+		WriteFile(ddb_write, str.ptr, str.length, &written, null);
+	}
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+TypeInfo TypeInfoFromMangled(string mangled)
+{
+	TypeInfo	res;
+	TypeInfo*	ti = &res;
+
+    for ( uint i=0; ti !is null && i < mangled.length; ++i )
+    {
+        switch ( mangled[i] )
+        {
+            case 'C':
+                debug DbgIO.println("TypeInfoFromMangled: classinfos not supported, yet");
+                return null;
+            case 'P':
+                TypeInfo_Pointer tip = new TypeInfo_Pointer;
+                *ti = tip;
+                ti = &tip.m_next;
+                break;
+            case 'G':
+                TypeInfo_StaticArray tia = new TypeInfo_StaticArray;
+                *ti = tia;
+                ti = &tia.value;
+                break;
+            case 'A':
+                switch ( mangled[i+1] )
+                {
+                    case 'v':	*ti = new TypeInfo_Av;	ti = null;	break;
+                    case 'x':
+                    case 'b':	*ti = new TypeInfo_Ab;	ti = null;	break;
+                    case 'g':	*ti = new TypeInfo_Ag;	ti = null;	break;
+                    case 'h':	*ti = new TypeInfo_Ah;	ti = null;	break;
+                    case 's':	*ti = new TypeInfo_As;	ti = null;	break;
+                    case 't':	*ti = new TypeInfo_At;	ti = null;	break;
+                    case 'i':	*ti = new TypeInfo_Ai;	ti = null;	break;
+                    case 'k':	*ti = new TypeInfo_Ak;	ti = null;	break;
+                    case 'l':	*ti = new TypeInfo_Al;	ti = null;	break;
+                    case 'm':	*ti = new TypeInfo_Am;	ti = null;	break;
+                    case 'f':	*ti = new TypeInfo_Af;	ti = null;	break;
+                    case 'd':	*ti = new TypeInfo_Ad;	ti = null;	break;
+                    case 'e':	*ti = new TypeInfo_Ae;	ti = null;	break;
+                    case 'o':	*ti = new TypeInfo_Ao;	ti = null;	break;
+                    case 'p':	*ti = new TypeInfo_Ap;	ti = null;	break;
+                    case 'j':	*ti = new TypeInfo_Aj;	ti = null;	break;
+                    case 'q':	*ti = new TypeInfo_Aq;	ti = null;	break;
+                    case 'r':	*ti = new TypeInfo_Ar;	ti = null;	break;
+                    case 'c':	*ti = new TypeInfo_Ac;	ti = null;	break;
+                    case 'a':	*ti = new TypeInfo_Aa;	ti = null;	break;
+                    case 'u':	*ti = new TypeInfo_Au;	ti = null;	break;
+                    case 'w':	*ti = new TypeInfo_Aw;	ti = null;	break;
+                    default:
+                        TypeInfo_Array tia = new TypeInfo_Array;
+                        *ti = tia;
+                        ti = &tia.value;
+                }
+                break;
+            case 'v':	*ti = new TypeInfo_v;	ti = null;	break;
+            case 'x':
+            case 'b':	*ti = new TypeInfo_b;	ti = null;	break;
+            case 'g':	*ti = new TypeInfo_g;	ti = null;	break;
+            case 'h':	*ti = new TypeInfo_h;	ti = null;	break;
+            case 's':	*ti = new TypeInfo_s;	ti = null;	break;
+            case 't':	*ti = new TypeInfo_t;	ti = null;	break;
+            case 'i':	*ti = new TypeInfo_i;	ti = null;	break;
+            case 'k':	*ti = new TypeInfo_k;	ti = null;	break;
+            case 'l':	*ti = new TypeInfo_l;	ti = null;	break;
+            case 'm':	*ti = new TypeInfo_m;	ti = null;	break;
+            case 'f':	*ti = new TypeInfo_f;	ti = null;	break;
+            case 'd':	*ti = new TypeInfo_d;	ti = null;	break;
+            case 'e':	*ti = new TypeInfo_e;	ti = null;	break;
+            case 'o':	*ti = new TypeInfo_o;	ti = null;	break;
+            case 'p':	*ti = new TypeInfo_p;	ti = null;	break;
+            case 'j':	*ti = new TypeInfo_j;	ti = null;	break;
+            case 'q':	*ti = new TypeInfo_q;	ti = null;	break;
+            case 'r':	*ti = new TypeInfo_r;	ti = null;	break;
+            case 'c':	*ti = new TypeInfo_c;	ti = null;	break;
+            case 'a':	*ti = new TypeInfo_a;	ti = null;	break;
+            case 'u':	*ti = new TypeInfo_u;	ti = null;	break;
+            case 'w':	*ti = new TypeInfo_w;	ti = null;	break;
+            default:
+                debug DbgIO.println("unknown mangled type "~mangled[i]);
+                assert(0);
+        }
+    }
+
+	return res;
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+class DataReader
+{
+	ubyte[] data;
+	uint	cursor;
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	this(ubyte[] d)
+	{
+		data = d;
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void alignCursor(ubyte num)
+	{
+		cursor += (num + cursor) % num;
+		assert(cursor<=data.length);
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	bool available()
+	{
+		return cursor<data.length;
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void seek(uint offset)
+	{
+		cursor=offset;
+		if ( cursor > data.length )
+            throw new Exception("DataReader.seek beyond end of data offset="~.toString(cursor)~", $="~.toString(data.length));
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void relseek(int offset)
+	{
+		cursor+=offset;
+		if ( cursor > data.length )
+            throw new Exception("DataReader.seek beyond end of data offset="~.toString(cursor)~", $="~.toString(data.length));
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void peek(out ubyte val)
+	{
+		assert(cursor<data.length);
+		val = data[cursor];
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void read(out ubyte val)
+	{
+		assert(cursor<data.length);
+		val = data[cursor];
+		++cursor;
+	}
+	void read(out char val) { read(*cast(ubyte*)&val); }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void read(out ushort val)
+	{
+		assert(cursor+1<data.length);
+		val = (cast(ushort[])(data[cursor..cursor+2]))[0];
+		cursor+=2;
+	}
+	void read(out short val) { read(*cast(ushort*)&val); }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void read(out uint val)
+	{
+		assert(cursor+3<data.length);
+		val = (cast(uint[])(data[cursor..cursor+4]))[0];
+		cursor+=4;
+	}
+	void read(out int val) { read(*cast(uint*)&val); }
+	void read(out float val) { read(*cast(uint*)&val); }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void read(out ulong val)
+	{
+		assert(cursor+7<data.length);
+		val = (cast(ulong[])(data[cursor..cursor+8]))[0];
+		cursor+=8;
+	}
+	void read(out long val) { read(*cast(ulong*)&val); }
+	void read(out double val) { read(*cast(ulong*)&val); }
+	void read(out cfloat val) { read(*cast(ulong*)&val); }
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void read(out real val)
+	{
+		assert(cursor+9<data.length);
+		val = (cast(real[])(data[cursor..cursor+10]))[0];
+		cursor+=10;
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void read(out string str)
+	{
+		assert(cursor<data.length);
+		ushort len = data[cursor++];
+		if ( len >= 0xff && data[cursor] == 0 ) {
+		    ++cursor;
+			read(len);
+		}
+
+		assert(cursor+len<=data.length, "dr cursor="~.toString(cursor)~" len="~.toString(len));
+		str = (cast(string)data)[cursor..cursor+len];
+		cursor+=len;
+	}
+
+    /**********************************************************************************************
+
+    **********************************************************************************************/
+	void readA(T)(out T[] array, uint length)
+	{
+		uint size = length*T.sizeof;
+		assert(cursor<=data.length-size);
+		array = cast(T[])(data[cursor..cursor+size]);
+		cursor+=size;
+	}
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+string getFullPath(string filename)
+{
+	char[]	fullpath;
+	char*	filepart;
+	fullpath.length = 4096;
+	int len = GetFullPathName(
+		toStringz(filename),
+		fullpath.length,
+		fullpath.ptr,
+		&filepart
+	);
+	if ( len <= 0 )
+		return null;
+	fullpath.length = len;
+
+	char[]	longfullpath;
+	longfullpath.length = 4096;
+	len = GetLongPathName(
+	  toStringz(fullpath),
+	  longfullpath.ptr,
+	  longfullpath.length
+	);
+	longfullpath.length = len;
+	return longfullpath;
+}
+
+/**************************************************************************************************
+
+**************************************************************************************************/
+struct DbgTimer
+{
+    d_time time;
+
+    void start()
+    {
+        time = getUTCtime;
+    }
+
+    string finish()
+    {
+        time = getUTCtime - time;
+        return format("%d'%03d", time / TicksPerSecond, time % TicksPerSecond);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/win32/dbghelp.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,2698 @@
+/* BUILD Version: 0001     Increment this if a change has global effects
+
+Copyright (c) Microsoft Corporation. All rights reserved.
+
+Module Name:
+
+    dbghelp.h
+
+Abstract:
+
+    This module defines the prototypes and constants required for the image
+    help routines.
+
+    Contains debugging support routines that are redistributable.
+
+Revision History:
+
+--*/
+
+//#ifndef _DBGHELP_
+//#define _DBGHELP_
+module win32.dbghelp;
+
+import win32.windef;
+import win32.winver;
+
+// As a general principal always call the 64 bit version
+// of every API, if a choice exists.  The 64 bit version
+// works great on 32 bit platforms, and is forward
+// compatible to 64 bit platforms.
+
+version(Win64) {
+    version = _IMAGEHLP64;
+}
+
+
+extern(Windows) {
+
+/+
+#ifdef _IMAGEHLP_SOURCE_
+ #define IMAGEAPI __stdcall
+ #define DBHLP_DEPRECIATED
+#else
+ #define IMAGEAPI DECLSPEC_IMPORT __stdcall
+ #if (_MSC_VER >= 1300) && !defined(MIDL_PASS)
+  #define DBHLP_DEPRECIATED   __declspec(deprecated)
+ #else
+  #define DBHLP_DEPRECIATED
+ #endif
+#endif
+
+#define DBHLPAPI IMAGEAPI
+
+#define IMAGE_SEPARATION (64*1024)
+
+typedef struct _LOADED_IMAGE {
+    PSTR                  ModuleName;
+    HANDLE                hFile;
+    PUCHAR                MappedAddress;
+#ifdef _IMAGEHLP64
+    PIMAGE_NT_HEADERS64   FileHeader;
+#else
+    PIMAGE_NT_HEADERS32   FileHeader;
+#endif
+    PIMAGE_SECTION_HEADER LastRvaSection;
+    ULONG                 NumberOfSections;
+    PIMAGE_SECTION_HEADER Sections;
+    ULONG                 Characteristics;
+    BOOLEAN               fSystemImage;
+    BOOLEAN               fDOSImage;
+    LIST_ENTRY            Links;
+    ULONG                 SizeOfImage;
+} LOADED_IMAGE, *PLOADED_IMAGE;
+
+#define MAX_SYM_NAME            2000
+
+
+HANDLE
+IMAGEAPI
+FindDebugInfoFile (
+    PSTR FileName,
+    PSTR SymbolPath,
+    PSTR DebugFilePath
+    );
+
+typedef BOOL
+(CALLBACK *PFIND_DEBUG_FILE_CALLBACK)(
+    HANDLE FileHandle,
+    PSTR FileName,
+    PVOID CallerData
+    );
+
+HANDLE
+IMAGEAPI
+FindDebugInfoFileEx (
+    PSTR FileName,
+    PSTR SymbolPath,
+    PSTR DebugFilePath,
+    PFIND_DEBUG_FILE_CALLBACK Callback,
+    PVOID CallerData
+    );
+
+typedef BOOL
+(CALLBACK *PFINDFILEINPATHCALLBACK)(
+    PSTR  filename,
+    PVOID context
+    );
+
+BOOL
+IMAGEAPI
+SymFindFileInPath(
+    HANDLE hprocess,
+    LPSTR  SearchPath,
+    LPSTR  FileName,
+    PVOID  id,
+    DWORD  two,
+    DWORD  three,
+    DWORD  flags,
+    LPSTR  FoundFile,
+    PFINDFILEINPATHCALLBACK callback,
+    PVOID  context
+    );
+
+HANDLE
+IMAGEAPI
+FindExecutableImage(
+    PSTR FileName,
+    PSTR SymbolPath,
+    PSTR ImageFilePath
+    );
+
+typedef BOOL
+(CALLBACK *PFIND_EXE_FILE_CALLBACK)(
+    HANDLE FileHandle,
+    PSTR FileName,
+    PVOID CallerData
+    );
+
+HANDLE
+IMAGEAPI
+FindExecutableImageEx(
+    PSTR FileName,
+    PSTR SymbolPath,
+    PSTR ImageFilePath,
+    PFIND_EXE_FILE_CALLBACK Callback,
+    PVOID CallerData
+    );
+
+PIMAGE_NT_HEADERS
+IMAGEAPI
+ImageNtHeader (
+    IN PVOID Base
+    );
+
+PVOID
+IMAGEAPI
+ImageDirectoryEntryToDataEx (
+    IN PVOID Base,
+    IN BOOLEAN MappedAsImage,
+    IN USHORT DirectoryEntry,
+    OUT PULONG Size,
+    OUT PIMAGE_SECTION_HEADER *FoundHeader OPTIONAL
+    );
+
+PVOID
+IMAGEAPI
+ImageDirectoryEntryToData (
+    IN PVOID Base,
+    IN BOOLEAN MappedAsImage,
+    IN USHORT DirectoryEntry,
+    OUT PULONG Size
+    );
+
+PIMAGE_SECTION_HEADER
+IMAGEAPI
+ImageRvaToSection(
+    IN PIMAGE_NT_HEADERS NtHeaders,
+    IN PVOID Base,
+    IN ULONG Rva
+    );
+
+PVOID
+IMAGEAPI
+ImageRvaToVa(
+    IN PIMAGE_NT_HEADERS NtHeaders,
+    IN PVOID Base,
+    IN ULONG Rva,
+    IN OUT PIMAGE_SECTION_HEADER *LastRvaSection
+    );
+
+// Symbol server exports
+
+typedef BOOL (WINAPI *PSYMBOLSERVERPROC)(LPCSTR, LPCSTR, PVOID, DWORD, DWORD, LPSTR);
+typedef BOOL (WINAPI *PSYMBOLSERVEROPENPROC)(VOID);
+typedef BOOL (WINAPI *PSYMBOLSERVERCLOSEPROC)(VOID);
+typedef BOOL (WINAPI *PSYMBOLSERVERSETOPTIONSPROC)(UINT_PTR, ULONG64);
+typedef BOOL (CALLBACK WINAPI *PSYMBOLSERVERCALLBACKPROC)(UINT_PTR action, ULONG64 data, ULONG64 context);
+typedef UINT_PTR (WINAPI *PSYMBOLSERVERGETOPTIONSPROC)();
+typedef BOOL (WINAPI *PSYMBOLSERVERPINGPROC)(LPCSTR);
+
+#define SSRVOPT_CALLBACK    0x001
+#define SSRVOPT_DWORD       0x002
+#define SSRVOPT_DWORDPTR    0x004
+#define SSRVOPT_GUIDPTR     0x008
+#define SSRVOPT_OLDGUIDPTR  0x010
+#define SSRVOPT_UNATTENDED  0x020
+#define SSRVOPT_NOCOPY      0x040
+#define SSRVOPT_PARENTWIN   0x080
+#define SSRVOPT_PARAMTYPE   0x100
+#define SSRVOPT_SECURE      0x200
+#define SSRVOPT_TRACE       0x400
+#define SSRVOPT_RESET    ((ULONG_PTR)-1)
+
+#define SSRVACTION_TRACE 1
+
+
+#ifndef _WIN64
+// This api won't be ported to Win64 - Fix your code.
+
+typedef struct _IMAGE_DEBUG_INFORMATION {
+    LIST_ENTRY List;
+    DWORD ReservedSize;
+    PVOID ReservedMappedBase;
+    USHORT ReservedMachine;
+    USHORT ReservedCharacteristics;
+    DWORD ReservedCheckSum;
+    DWORD ImageBase;
+    DWORD SizeOfImage;
+
+    DWORD ReservedNumberOfSections;
+    PIMAGE_SECTION_HEADER ReservedSections;
+
+    DWORD ReservedExportedNamesSize;
+    PSTR ReservedExportedNames;
+
+    DWORD ReservedNumberOfFunctionTableEntries;
+    PIMAGE_FUNCTION_ENTRY ReservedFunctionTableEntries;
+    DWORD ReservedLowestFunctionStartingAddress;
+    DWORD ReservedHighestFunctionEndingAddress;
+
+    DWORD ReservedNumberOfFpoTableEntries;
+    PFPO_DATA ReservedFpoTableEntries;
+
+    DWORD SizeOfCoffSymbols;
+    PIMAGE_COFF_SYMBOLS_HEADER CoffSymbols;
+
+    DWORD ReservedSizeOfCodeViewSymbols;
+    PVOID ReservedCodeViewSymbols;
+
+    PSTR ImageFilePath;
+    PSTR ImageFileName;
+    PSTR ReservedDebugFilePath;
+
+    DWORD ReservedTimeDateStamp;
+
+    BOOL  ReservedRomImage;
+    PIMAGE_DEBUG_DIRECTORY ReservedDebugDirectory;
+    DWORD ReservedNumberOfDebugDirectories;
+
+    DWORD ReservedOriginalFunctionTableBaseAddress;
+
+    DWORD Reserved[ 2 ];
+
+} IMAGE_DEBUG_INFORMATION, *PIMAGE_DEBUG_INFORMATION;
+
+
+PIMAGE_DEBUG_INFORMATION
+IMAGEAPI
+MapDebugInformation(
+    HANDLE FileHandle,
+    PSTR FileName,
+    PSTR SymbolPath,
+    DWORD ImageBase
+    );
+
+BOOL
+IMAGEAPI
+UnmapDebugInformation(
+    PIMAGE_DEBUG_INFORMATION DebugInfo
+    );
+
+#endif
+
+BOOL
+IMAGEAPI
+SearchTreeForFile(
+    PSTR RootPath,
+    PSTR InputPathName,
+    PSTR OutputPathBuffer
+    );
+
+typedef BOOL
+(CALLBACK *PENUMDIRTREE_CALLBACK)(
+    LPCSTR FilePath,
+    PVOID  CallerData
+    );
+
+BOOL
+IMAGEAPI
+EnumDirTree(
+    HANDLE hProcess,
+    PSTR   RootPath,
+    PSTR   InputPathName,
+    PSTR   OutputPathBuffer,
+    PENUMDIRTREE_CALLBACK Callback,
+    PVOID  CallbackData
+    );
+
+BOOL
+IMAGEAPI
+MakeSureDirectoryPathExists(
+    PCSTR DirPath
+    );
+
+//
+// UnDecorateSymbolName Flags
+//
+
+#define UNDNAME_COMPLETE                 (0x0000)  // Enable full undecoration
+#define UNDNAME_NO_LEADING_UNDERSCORES   (0x0001)  // Remove leading underscores from MS extended keywords
+#define UNDNAME_NO_MS_KEYWORDS           (0x0002)  // Disable expansion of MS extended keywords
+#define UNDNAME_NO_FUNCTION_RETURNS      (0x0004)  // Disable expansion of return type for primary declaration
+#define UNDNAME_NO_ALLOCATION_MODEL      (0x0008)  // Disable expansion of the declaration model
+#define UNDNAME_NO_ALLOCATION_LANGUAGE   (0x0010)  // Disable expansion of the declaration language specifier
+#define UNDNAME_NO_MS_THISTYPE           (0x0020)  // NYI Disable expansion of MS keywords on the 'this' type for primary declaration
+#define UNDNAME_NO_CV_THISTYPE           (0x0040)  // NYI Disable expansion of CV modifiers on the 'this' type for primary declaration
+#define UNDNAME_NO_THISTYPE              (0x0060)  // Disable all modifiers on the 'this' type
+#define UNDNAME_NO_ACCESS_SPECIFIERS     (0x0080)  // Disable expansion of access specifiers for members
+#define UNDNAME_NO_THROW_SIGNATURES      (0x0100)  // Disable expansion of 'throw-signatures' for functions and pointers to functions
+#define UNDNAME_NO_MEMBER_TYPE           (0x0200)  // Disable expansion of 'static' or 'virtual'ness of members
+#define UNDNAME_NO_RETURN_UDT_MODEL      (0x0400)  // Disable expansion of MS model for UDT returns
+#define UNDNAME_32_BIT_DECODE            (0x0800)  // Undecorate 32-bit decorated names
+#define UNDNAME_NAME_ONLY                (0x1000)  // Crack only the name for primary declaration;
+                                                                                                   //  return just [scope::]name.  Does expand template params
+#define UNDNAME_NO_ARGUMENTS             (0x2000)  // Don't undecorate arguments to function
+#define UNDNAME_NO_SPECIAL_SYMS          (0x4000)  // Don't undecorate special names (v-table, vcall, vector xxx, metatype, etc)
+
+DWORD
+IMAGEAPI
+WINAPI
+UnDecorateSymbolName(
+    PCSTR   DecoratedName,         // Name to undecorate
+    PSTR    UnDecoratedName,       // If NULL, it will be allocated
+    DWORD    UndecoratedLength,     // The maximym length
+    DWORD    Flags                  // See above.
+    );
+
+
+//
+// these values are used for synthesized file types
+// that can be passed in as image headers instead of
+// the standard ones from ntimage.h
+//
+
+#define DBHHEADER_DEBUGDIRS     0x1
+
+typedef struct _MODLOAD_DATA {
+    DWORD   ssize;                  // size of this struct
+    DWORD   ssig;                   // signature identifying the passed data
+    PVOID   data;                   // pointer to passed data
+    DWORD   size;                   // size of passed data
+    DWORD   flags;                  // options
+} MODLOAD_DATA, *PMODLOAD_DATA;
+
+//
+// StackWalking API
+//
+
+typedef enum {
+    AddrMode1616,
+    AddrMode1632,
+    AddrModeReal,
+    AddrModeFlat
+} ADDRESS_MODE;
+
+typedef struct _tagADDRESS64 {
+    DWORD64       Offset;
+    WORD          Segment;
+    ADDRESS_MODE  Mode;
+} ADDRESS64, *LPADDRESS64;
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define ADDRESS ADDRESS64
+#define LPADDRESS LPADDRESS64
+#else
+typedef struct _tagADDRESS {
+    DWORD         Offset;
+    WORD          Segment;
+    ADDRESS_MODE  Mode;
+} ADDRESS, *LPADDRESS;
+
+__inline
+void
+Address32To64(
+    LPADDRESS a32,
+    LPADDRESS64 a64
+    )
+{
+    a64->Offset = (ULONG64)(LONG64)(LONG)a32->Offset;
+    a64->Segment = a32->Segment;
+    a64->Mode = a32->Mode;
+}
+
+__inline
+void
+Address64To32(
+    LPADDRESS64 a64,
+    LPADDRESS a32
+    )
+{
+    a32->Offset = (ULONG)a64->Offset;
+    a32->Segment = a64->Segment;
+    a32->Mode = a64->Mode;
+}
+#endif
+
+//
+// This structure is included in the STACKFRAME structure,
+// and is used to trace through usermode callbacks in a thread's
+// kernel stack.  The values must be copied by the kernel debugger
+// from the DBGKD_GET_VERSION and WAIT_STATE_CHANGE packets.
+//
+
+//
+// New KDHELP structure for 64 bit system support.
+// This structure is preferred in new code.
+//
+typedef struct _KDHELP64 {
+
+    //
+    // address of kernel thread object, as provided in the
+    // WAIT_STATE_CHANGE packet.
+    //
+    DWORD64   Thread;
+
+    //
+    // offset in thread object to pointer to the current callback frame
+    // in kernel stack.
+    //
+    DWORD   ThCallbackStack;
+
+    //
+    // offset in thread object to pointer to the current callback backing
+    // store frame in kernel stack.
+    //
+    DWORD   ThCallbackBStore;
+
+    //
+    // offsets to values in frame:
+    //
+    // address of next callback frame
+    DWORD   NextCallback;
+
+    // address of saved frame pointer (if applicable)
+    DWORD   FramePointer;
+
+
+    //
+    // Address of the kernel function that calls out to user mode
+    //
+    DWORD64   KiCallUserMode;
+
+    //
+    // Address of the user mode dispatcher function
+    //
+    DWORD64   KeUserCallbackDispatcher;
+
+    //
+    // Lowest kernel mode address
+    //
+    DWORD64   SystemRangeStart;
+
+    DWORD64  Reserved[8];
+
+} KDHELP64, *PKDHELP64;
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define KDHELP KDHELP64
+#define PKDHELP PKDHELP64
+#else
+typedef struct _KDHELP {
+
+    //
+    // address of kernel thread object, as provided in the
+    // WAIT_STATE_CHANGE packet.
+    //
+    DWORD   Thread;
+
+    //
+    // offset in thread object to pointer to the current callback frame
+    // in kernel stack.
+    //
+    DWORD   ThCallbackStack;
+
+    //
+    // offsets to values in frame:
+    //
+    // address of next callback frame
+    DWORD   NextCallback;
+
+    // address of saved frame pointer (if applicable)
+    DWORD   FramePointer;
+
+    //
+    // Address of the kernel function that calls out to user mode
+    //
+    DWORD   KiCallUserMode;
+
+    //
+    // Address of the user mode dispatcher function
+    //
+    DWORD   KeUserCallbackDispatcher;
+
+    //
+    // Lowest kernel mode address
+    //
+    DWORD   SystemRangeStart;
+
+    //
+    // offset in thread object to pointer to the current callback backing
+    // store frame in kernel stack.
+    //
+    DWORD   ThCallbackBStore;
+
+    DWORD  Reserved[8];
+
+} KDHELP, *PKDHELP;
+
+__inline
+void
+KdHelp32To64(
+    PKDHELP p32,
+    PKDHELP64 p64
+    )
+{
+    p64->Thread = p32->Thread;
+    p64->ThCallbackStack = p32->ThCallbackStack;
+    p64->NextCallback = p32->NextCallback;
+    p64->FramePointer = p32->FramePointer;
+    p64->KiCallUserMode = p32->KiCallUserMode;
+    p64->KeUserCallbackDispatcher = p32->KeUserCallbackDispatcher;
+    p64->SystemRangeStart = p32->SystemRangeStart;
+}
+#endif
+
+typedef struct _tagSTACKFRAME64 {
+    ADDRESS64   AddrPC;               // program counter
+    ADDRESS64   AddrReturn;           // return address
+    ADDRESS64   AddrFrame;            // frame pointer
+    ADDRESS64   AddrStack;            // stack pointer
+    ADDRESS64   AddrBStore;           // backing store pointer
+    PVOID       FuncTableEntry;       // pointer to pdata/fpo or NULL
+    DWORD64     Params[4];            // possible arguments to the function
+    BOOL        Far;                  // WOW far call
+    BOOL        Virtual;              // is this a virtual frame?
+    DWORD64     Reserved[3];
+    KDHELP64    KdHelp;
+} STACKFRAME64, *LPSTACKFRAME64;
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define STACKFRAME STACKFRAME64
+#define LPSTACKFRAME LPSTACKFRAME64
+#else
+typedef struct _tagSTACKFRAME {
+    ADDRESS     AddrPC;               // program counter
+    ADDRESS     AddrReturn;           // return address
+    ADDRESS     AddrFrame;            // frame pointer
+    ADDRESS     AddrStack;            // stack pointer
+    PVOID       FuncTableEntry;       // pointer to pdata/fpo or NULL
+    DWORD       Params[4];            // possible arguments to the function
+    BOOL        Far;                  // WOW far call
+    BOOL        Virtual;              // is this a virtual frame?
+    DWORD       Reserved[3];
+    KDHELP      KdHelp;
+    ADDRESS     AddrBStore;           // backing store pointer
+} STACKFRAME, *LPSTACKFRAME;
+#endif
+
+
+typedef
+BOOL
+(__stdcall *PREAD_PROCESS_MEMORY_ROUTINE64)(
+    HANDLE      hProcess,
+    DWORD64     qwBaseAddress,
+    PVOID       lpBuffer,
+    DWORD       nSize,
+    LPDWORD     lpNumberOfBytesRead
+    );
+
+typedef
+PVOID
+(__stdcall *PFUNCTION_TABLE_ACCESS_ROUTINE64)(
+    HANDLE  hProcess,
+    DWORD64 AddrBase
+    );
+
+typedef
+DWORD64
+(__stdcall *PGET_MODULE_BASE_ROUTINE64)(
+    HANDLE  hProcess,
+    DWORD64 Address
+    );
+
+typedef
+DWORD64
+(__stdcall *PTRANSLATE_ADDRESS_ROUTINE64)(
+    HANDLE    hProcess,
+    HANDLE    hThread,
+    LPADDRESS64 lpaddr
+    );
+
+BOOL
+IMAGEAPI
+StackWalk64(
+    DWORD                             MachineType,
+    HANDLE                            hProcess,
+    HANDLE                            hThread,
+    LPSTACKFRAME64                    StackFrame,
+    PVOID                             ContextRecord,
+    PREAD_PROCESS_MEMORY_ROUTINE64    ReadMemoryRoutine,
+    PFUNCTION_TABLE_ACCESS_ROUTINE64  FunctionTableAccessRoutine,
+    PGET_MODULE_BASE_ROUTINE64        GetModuleBaseRoutine,
+    PTRANSLATE_ADDRESS_ROUTINE64      TranslateAddress
+    );
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+
+#define PREAD_PROCESS_MEMORY_ROUTINE PREAD_PROCESS_MEMORY_ROUTINE64
+#define PFUNCTION_TABLE_ACCESS_ROUTINE PFUNCTION_TABLE_ACCESS_ROUTINE64
+#define PGET_MODULE_BASE_ROUTINE PGET_MODULE_BASE_ROUTINE64
+#define PTRANSLATE_ADDRESS_ROUTINE PTRANSLATE_ADDRESS_ROUTINE64
+
+#define StackWalk StackWalk64
+
+#else
+
+typedef
+BOOL
+(__stdcall *PREAD_PROCESS_MEMORY_ROUTINE)(
+    HANDLE  hProcess,
+    DWORD   lpBaseAddress,
+    PVOID   lpBuffer,
+    DWORD   nSize,
+    PDWORD  lpNumberOfBytesRead
+    );
+
+typedef
+PVOID
+(__stdcall *PFUNCTION_TABLE_ACCESS_ROUTINE)(
+    HANDLE  hProcess,
+    DWORD   AddrBase
+    );
+
+typedef
+DWORD
+(__stdcall *PGET_MODULE_BASE_ROUTINE)(
+    HANDLE  hProcess,
+    DWORD   Address
+    );
+
+typedef
+DWORD
+(__stdcall *PTRANSLATE_ADDRESS_ROUTINE)(
+    HANDLE    hProcess,
+    HANDLE    hThread,
+    LPADDRESS lpaddr
+    );
+
+BOOL
+IMAGEAPI
+StackWalk(
+    DWORD                             MachineType,
+    HANDLE                            hProcess,
+    HANDLE                            hThread,
+    LPSTACKFRAME                      StackFrame,
+    PVOID                             ContextRecord,
+    PREAD_PROCESS_MEMORY_ROUTINE      ReadMemoryRoutine,
+    PFUNCTION_TABLE_ACCESS_ROUTINE    FunctionTableAccessRoutine,
+    PGET_MODULE_BASE_ROUTINE          GetModuleBaseRoutine,
+    PTRANSLATE_ADDRESS_ROUTINE        TranslateAddress
+    );
+
+#endif
+
+
+#define API_VERSION_NUMBER 9
+
+typedef struct API_VERSION {
+    USHORT  MajorVersion;
+    USHORT  MinorVersion;
+    USHORT  Revision;
+    USHORT  Reserved;
+} API_VERSION, *LPAPI_VERSION;
+
+LPAPI_VERSION
+IMAGEAPI
+ImagehlpApiVersion(
+    VOID
+    );
+
+LPAPI_VERSION
+IMAGEAPI
+ImagehlpApiVersionEx(
+    LPAPI_VERSION AppVersion
+    );
+
+DWORD
+IMAGEAPI
+GetTimestampForLoadedLibrary(
+    HMODULE Module
+    );
+
+//
+// typedefs for function pointers
+//
+typedef BOOL
+(CALLBACK *PSYM_ENUMMODULES_CALLBACK64)(
+    PSTR ModuleName,
+    DWORD64 BaseOfDll,
+    PVOID UserContext
+    );
+
+typedef BOOL
+(CALLBACK *PSYM_ENUMSYMBOLS_CALLBACK64)(
+    PSTR SymbolName,
+    DWORD64 SymbolAddress,
+    ULONG SymbolSize,
+    PVOID UserContext
+    );
+
+typedef BOOL
+(CALLBACK *PSYM_ENUMSYMBOLS_CALLBACK64W)(
+    PWSTR SymbolName,
+    DWORD64 SymbolAddress,
+    ULONG SymbolSize,
+    PVOID UserContext
+    );
+
+typedef BOOL
+(CALLBACK *PENUMLOADED_MODULES_CALLBACK64)(
+    PSTR ModuleName,
+    DWORD64 ModuleBase,
+    ULONG ModuleSize,
+    PVOID UserContext
+    );
+
+typedef BOOL
+(CALLBACK *PSYMBOL_REGISTERED_CALLBACK64)(
+    HANDLE  hProcess,
+    ULONG   ActionCode,
+    ULONG64 CallbackData,
+    ULONG64 UserContext
+    );
+
+typedef
+PVOID
+(CALLBACK *PSYMBOL_FUNCENTRY_CALLBACK)(
+    HANDLE  hProcess,
+    DWORD   AddrBase,
+    PVOID   UserContext
+    );
+
+typedef
+PVOID
+(CALLBACK *PSYMBOL_FUNCENTRY_CALLBACK64)(
+    HANDLE  hProcess,
+    ULONG64 AddrBase,
+    ULONG64 UserContext
+    );
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+
+#define PSYM_ENUMMODULES_CALLBACK PSYM_ENUMMODULES_CALLBACK64
+#define PSYM_ENUMSYMBOLS_CALLBACK PSYM_ENUMSYMBOLS_CALLBACK64
+#define PSYM_ENUMSYMBOLS_CALLBACKW PSYM_ENUMSYMBOLS_CALLBACK64W
+#define PENUMLOADED_MODULES_CALLBACK PENUMLOADED_MODULES_CALLBACK64
+#define PSYMBOL_REGISTERED_CALLBACK PSYMBOL_REGISTERED_CALLBACK64
+#define PSYMBOL_FUNCENTRY_CALLBACK PSYMBOL_FUNCENTRY_CALLBACK64
+
+#else
+
+typedef BOOL
+(CALLBACK *PSYM_ENUMMODULES_CALLBACK)(
+    PSTR  ModuleName,
+    ULONG BaseOfDll,
+    PVOID UserContext
+    );
+
+typedef BOOL
+(CALLBACK *PSYM_ENUMSYMBOLS_CALLBACK)(
+    PSTR  SymbolName,
+    ULONG SymbolAddress,
+    ULONG SymbolSize,
+    PVOID UserContext
+    );
+
+typedef BOOL
+(CALLBACK *PSYM_ENUMSYMBOLS_CALLBACKW)(
+    PWSTR  SymbolName,
+    ULONG SymbolAddress,
+    ULONG SymbolSize,
+    PVOID UserContext
+    );
+
+typedef BOOL
+(CALLBACK *PENUMLOADED_MODULES_CALLBACK)(
+    PSTR  ModuleName,
+    ULONG ModuleBase,
+    ULONG ModuleSize,
+    PVOID UserContext
+    );
+
+typedef BOOL
+(CALLBACK *PSYMBOL_REGISTERED_CALLBACK)(
+    HANDLE  hProcess,
+    ULONG   ActionCode,
+    PVOID   CallbackData,
+    PVOID   UserContext
+    );
+
+#endif
+
+
+//
+// flags found in SYMBOL_INFO.Flags
+//
+
+#define SYMFLAG_VALUEPRESENT     0x00000001
+#define SYMFLAG_REGISTER         0x00000008
+#define SYMFLAG_REGREL           0x00000010
+#define SYMFLAG_FRAMEREL         0x00000020
+#define SYMFLAG_PARAMETER        0x00000040
+#define SYMFLAG_LOCAL            0x00000080
+#define SYMFLAG_CONSTANT         0x00000100
+#define SYMFLAG_EXPORT           0x00000200
+#define SYMFLAG_FORWARDER        0x00000400
+#define SYMFLAG_FUNCTION         0x00000800
+#define SYMFLAG_VIRTUAL          0x00001000
+#define SYMFLAG_THUNK            0x00002000
+#define SYMFLAG_TLSREL           0x00004000
+
+//
+// symbol type enumeration
+//
+typedef enum {
+    SymNone = 0,
+    SymCoff,
+    SymCv,
+    SymPdb,
+    SymExport,
+    SymDeferred,
+    SymSym,       // .sym file
+    SymDia,
+    SymVirtual,
+    NumSymTypes
+} SYM_TYPE;
+
+//
+// symbol data structure
+//
+
+typedef struct _IMAGEHLP_SYMBOL64 {
+    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_SYMBOL64)
+    DWORD64                     Address;                // virtual address including dll base address
+    DWORD                       Size;                   // estimated size of symbol, can be zero
+    DWORD                       Flags;                  // info about the symbols, see the SYMF defines
+    DWORD                       MaxNameLength;          // maximum size of symbol name in 'Name'
+    CHAR                        Name[1];                // symbol name (null terminated string)
+} IMAGEHLP_SYMBOL64, *PIMAGEHLP_SYMBOL64;
+
+typedef struct _IMAGEHLP_SYMBOL64_PACKAGE {
+    IMAGEHLP_SYMBOL64 sym;
+    CHAR              name[MAX_SYM_NAME + 1];
+} IMAGEHLP_SYMBOL64_PACKAGE, *PIMAGEHLP_SYMBOL64_PACKAGE;
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+
+ #define IMAGEHLP_SYMBOL IMAGEHLP_SYMBOL64
+ #define PIMAGEHLP_SYMBOL PIMAGEHLP_SYMBOL64
+ #define IMAGEHLP_SYMBOL_PACKAGE IMAGEHLP_SYMBOL64_PACKAGE
+ #define PIMAGEHLP_SYMBOL_PACKAGE PIMAGEHLP_SYMBOL64_PACKAGE
+
+#else
+
+ typedef struct _IMAGEHLP_SYMBOL {
+     DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_SYMBOL)
+     DWORD                       Address;                // virtual address including dll base address
+     DWORD                       Size;                   // estimated size of symbol, can be zero
+     DWORD                       Flags;                  // info about the symbols, see the SYMF defines
+     DWORD                       MaxNameLength;          // maximum size of symbol name in 'Name'
+     CHAR                        Name[1];                // symbol name (null terminated string)
+ } IMAGEHLP_SYMBOL, *PIMAGEHLP_SYMBOL;
+
+ typedef struct _IMAGEHLP_SYMBOL_PACKAGE {
+     IMAGEHLP_SYMBOL sym;
+     CHAR            name[MAX_SYM_NAME + 1];
+ } IMAGEHLP_SYMBOL_PACKAGE, *PIMAGEHLP_SYMBOL_PACKAGE;
+
+#endif
+
+//
+// module data structure
+//
+
+typedef struct _IMAGEHLP_MODULE64 {
+    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_MODULE64)
+    DWORD64                     BaseOfImage;            // base load address of module
+    DWORD                       ImageSize;              // virtual size of the loaded module
+    DWORD                       TimeDateStamp;          // date/time stamp from pe header
+    DWORD                       CheckSum;               // checksum from the pe header
+    DWORD                       NumSyms;                // number of symbols in the symbol table
+    SYM_TYPE                    SymType;                // type of symbols loaded
+    CHAR                        ModuleName[32];         // module name
+    CHAR                        ImageName[256];         // image name
+    CHAR                        LoadedImageName[256];   // symbol file name
+} IMAGEHLP_MODULE64, *PIMAGEHLP_MODULE64;
+
+typedef struct _IMAGEHLP_MODULE64W {
+    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_MODULE64)
+    DWORD64                     BaseOfImage;            // base load address of module
+    DWORD                       ImageSize;              // virtual size of the loaded module
+    DWORD                       TimeDateStamp;          // date/time stamp from pe header
+    DWORD                       CheckSum;               // checksum from the pe header
+    DWORD                       NumSyms;                // number of symbols in the symbol table
+    SYM_TYPE                    SymType;                // type of symbols loaded
+    WCHAR                       ModuleName[32];         // module name
+    WCHAR                       ImageName[256];         // image name
+    WCHAR                       LoadedImageName[256];   // symbol file name
+} IMAGEHLP_MODULEW64, *PIMAGEHLP_MODULEW64;
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define IMAGEHLP_MODULE IMAGEHLP_MODULE64
+#define PIMAGEHLP_MODULE PIMAGEHLP_MODULE64
+#define IMAGEHLP_MODULEW IMAGEHLP_MODULEW64
+#define PIMAGEHLP_MODULEW PIMAGEHLP_MODULEW64
+#else
+typedef struct _IMAGEHLP_MODULE {
+    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_MODULE)
+    DWORD                       BaseOfImage;            // base load address of module
+    DWORD                       ImageSize;              // virtual size of the loaded module
+    DWORD                       TimeDateStamp;          // date/time stamp from pe header
+    DWORD                       CheckSum;               // checksum from the pe header
+    DWORD                       NumSyms;                // number of symbols in the symbol table
+    SYM_TYPE                    SymType;                // type of symbols loaded
+    CHAR                        ModuleName[32];         // module name
+    CHAR                        ImageName[256];         // image name
+    CHAR                        LoadedImageName[256];   // symbol file name
+} IMAGEHLP_MODULE, *PIMAGEHLP_MODULE;
+
+typedef struct _IMAGEHLP_MODULEW {
+    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_MODULE)
+    DWORD                       BaseOfImage;            // base load address of module
+    DWORD                       ImageSize;              // virtual size of the loaded module
+    DWORD                       TimeDateStamp;          // date/time stamp from pe header
+    DWORD                       CheckSum;               // checksum from the pe header
+    DWORD                       NumSyms;                // number of symbols in the symbol table
+    SYM_TYPE                    SymType;                // type of symbols loaded
+    WCHAR                       ModuleName[32];         // module name
+    WCHAR                       ImageName[256];         // image name
+    WCHAR                       LoadedImageName[256];   // symbol file name
+} IMAGEHLP_MODULEW, *PIMAGEHLP_MODULEW;
+#endif
+
+//
+// source file line data structure
+//
+
+typedef struct _IMAGEHLP_LINE64 {
+    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_LINE64)
+    PVOID                       Key;                    // internal
+    DWORD                       LineNumber;             // line number in file
+    PCHAR                       FileName;               // full filename
+    DWORD64                     Address;                // first instruction of line
+} IMAGEHLP_LINE64, *PIMAGEHLP_LINE64;
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define IMAGEHLP_LINE IMAGEHLP_LINE64
+#define PIMAGEHLP_LINE PIMAGEHLP_LINE64
+#else
+typedef struct _IMAGEHLP_LINE {
+    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_LINE)
+    PVOID                       Key;                    // internal
+    DWORD                       LineNumber;             // line number in file
+    PCHAR                       FileName;               // full filename
+    DWORD                       Address;                // first instruction of line
+} IMAGEHLP_LINE, *PIMAGEHLP_LINE;
+#endif
+
+//
+// source file structure
+//
+
+typedef struct _SOURCEFILE {
+    DWORD64                     ModBase;                // base address of loaded module
+    PCHAR                       FileName;               // full filename of source
+} SOURCEFILE, *PSOURCEFILE;
+
+//
+// data structures used for registered symbol callbacks
+//
+
+#define CBA_DEFERRED_SYMBOL_LOAD_START          0x00000001
+#define CBA_DEFERRED_SYMBOL_LOAD_COMPLETE       0x00000002
+#define CBA_DEFERRED_SYMBOL_LOAD_FAILURE        0x00000003
+#define CBA_SYMBOLS_UNLOADED                    0x00000004
+#define CBA_DUPLICATE_SYMBOL                    0x00000005
+#define CBA_READ_MEMORY                         0x00000006
+#define CBA_DEFERRED_SYMBOL_LOAD_CANCEL         0x00000007
+#define CBA_SET_OPTIONS                         0x00000008
+#define CBA_EVENT                               0x00000010
+#define CBA_DEFERRED_SYMBOL_LOAD_PARTIAL        0x00000020
+#define CBA_DEBUG_INFO                          0x10000000
+
+typedef struct _IMAGEHLP_CBA_READ_MEMORY {
+    DWORD64   addr;                                     // address to read from
+    PVOID     buf;                                      // buffer to read to
+    DWORD     bytes;                                    // amount of bytes to read
+    DWORD    *bytesread;                                // pointer to store amount of bytes read
+} IMAGEHLP_CBA_READ_MEMORY, *PIMAGEHLP_CBA_READ_MEMORY;
+
+enum {
+    sevInfo = 0,
+    sevProblem,
+    sevAttn,
+    sevFatal,
+    sevMax  // unused
+};
+
+typedef struct _IMAGEHLP_CBA_EVENT {
+    DWORD severity;                                     // values from sevInfo to sevFatal
+    DWORD code;                                         // numerical code IDs the error
+    PCHAR desc;                                         // may contain a text description of the error
+    PVOID object;                                       // value dependant upon the error code
+} IMAGEHLP_CBA_EVENT, *PIMAGEHLP_CBA_EVENT;
+
+typedef struct _IMAGEHLP_DEFERRED_SYMBOL_LOAD64 {
+    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_DEFERRED_SYMBOL_LOAD64)
+    DWORD64                     BaseOfImage;            // base load address of module
+    DWORD                       CheckSum;               // checksum from the pe header
+    DWORD                       TimeDateStamp;          // date/time stamp from pe header
+    CHAR                        FileName[MAX_PATH];     // symbols file or image name
+    BOOLEAN                     Reparse;                // load failure reparse
+    HANDLE                      hFile;                  // file handle, if passed
+    DWORD                       Flags;			//
+} IMAGEHLP_DEFERRED_SYMBOL_LOAD64, *PIMAGEHLP_DEFERRED_SYMBOL_LOAD64;
+
+#define DSLFLAG_MISMATCHED_PDB	0x1
+#define DSLFLAG_MISMATCHED_DBG  0x2
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define IMAGEHLP_DEFERRED_SYMBOL_LOAD IMAGEHLP_DEFERRED_SYMBOL_LOAD64
+#define PIMAGEHLP_DEFERRED_SYMBOL_LOAD PIMAGEHLP_DEFERRED_SYMBOL_LOAD64
+#else
+typedef struct _IMAGEHLP_DEFERRED_SYMBOL_LOAD {
+    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_DEFERRED_SYMBOL_LOAD)
+    DWORD                       BaseOfImage;            // base load address of module
+    DWORD                       CheckSum;               // checksum from the pe header
+    DWORD                       TimeDateStamp;          // date/time stamp from pe header
+    CHAR                        FileName[MAX_PATH];     // symbols file or image name
+    BOOLEAN                     Reparse;                // load failure reparse
+    HANDLE                      hFile;                  // file handle, if passed
+} IMAGEHLP_DEFERRED_SYMBOL_LOAD, *PIMAGEHLP_DEFERRED_SYMBOL_LOAD;
+#endif
+
+typedef struct _IMAGEHLP_DUPLICATE_SYMBOL64 {
+    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_DUPLICATE_SYMBOL64)
+    DWORD                       NumberOfDups;           // number of duplicates in the Symbol array
+    PIMAGEHLP_SYMBOL64          Symbol;                 // array of duplicate symbols
+    DWORD                       SelectedSymbol;         // symbol selected (-1 to start)
+} IMAGEHLP_DUPLICATE_SYMBOL64, *PIMAGEHLP_DUPLICATE_SYMBOL64;
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define IMAGEHLP_DUPLICATE_SYMBOL IMAGEHLP_DUPLICATE_SYMBOL64
+#define PIMAGEHLP_DUPLICATE_SYMBOL PIMAGEHLP_DUPLICATE_SYMBOL64
+#else
+typedef struct _IMAGEHLP_DUPLICATE_SYMBOL {
+    DWORD                       SizeOfStruct;           // set to sizeof(IMAGEHLP_DUPLICATE_SYMBOL)
+    DWORD                       NumberOfDups;           // number of duplicates in the Symbol array
+    PIMAGEHLP_SYMBOL            Symbol;                 // array of duplicate symbols
+    DWORD                       SelectedSymbol;         // symbol selected (-1 to start)
+} IMAGEHLP_DUPLICATE_SYMBOL, *PIMAGEHLP_DUPLICATE_SYMBOL;
+#endif
+
+// If dbghelp ever needs to display graphical UI, it will use this as the parent window.
+
+BOOL
+SymSetParentWindow(
+    HWND hwnd
+    );
+
+//
+// options that are set/returned by SymSetOptions() & SymGetOptions()
+// these are used as a mask
+//
+#define SYMOPT_CASE_INSENSITIVE         0x00000001
+#define SYMOPT_UNDNAME                  0x00000002
+#define SYMOPT_DEFERRED_LOADS           0x00000004
+#define SYMOPT_NO_CPP                   0x00000008
+#define SYMOPT_LOAD_LINES               0x00000010
+#define SYMOPT_OMAP_FIND_NEAREST        0x00000020
+#define SYMOPT_LOAD_ANYTHING            0x00000040
+#define SYMOPT_IGNORE_CVREC             0x00000080
+#define SYMOPT_NO_UNQUALIFIED_LOADS     0x00000100
+#define SYMOPT_FAIL_CRITICAL_ERRORS     0x00000200
+#define SYMOPT_EXACT_SYMBOLS            0x00000400
+#define SYMOPT_ALLOW_ABSOLUTE_SYMBOLS   0x00000800
+#define SYMOPT_IGNORE_NT_SYMPATH        0x00001000
+#define SYMOPT_INCLUDE_32BIT_MODULES    0x00002000
+#define SYMOPT_PUBLICS_ONLY             0x00004000
+#define SYMOPT_NO_PUBLICS               0x00008000
+#define SYMOPT_AUTO_PUBLICS             0x00010000
+#define SYMOPT_NO_IMAGE_SEARCH          0x00020000
+#define SYMOPT_SECURE                   0x00040000
+
+#define SYMOPT_DEBUG                    0x80000000
+
+DWORD
+IMAGEAPI
+SymSetOptions(
+    IN DWORD   SymOptions
+    );
+
+DWORD
+IMAGEAPI
+SymGetOptions(
+    VOID
+    );
+
+BOOL
+IMAGEAPI
+SymCleanup(
+    IN HANDLE hProcess
+    );
+
+BOOL
+IMAGEAPI
+SymMatchString(
+    IN LPSTR string,
+    IN LPSTR expression,
+    IN BOOL  fCase
+    );
+
+typedef BOOL
+(CALLBACK *PSYM_ENUMSOURCFILES_CALLBACK)(
+    PSOURCEFILE pSourceFile,
+    PVOID       UserContext
+    );
+
+BOOL
+IMAGEAPI
+SymEnumSourceFiles(
+    IN HANDLE  hProcess,
+    IN ULONG64 ModBase,
+    IN LPSTR   Mask,
+    IN PSYM_ENUMSOURCFILES_CALLBACK cbSrcFiles,
+    IN PVOID   UserContext
+    );
+
+BOOL
+IMAGEAPI
+SymEnumerateModules64(
+    IN HANDLE                       hProcess,
+    IN PSYM_ENUMMODULES_CALLBACK64  EnumModulesCallback,
+    IN PVOID                        UserContext
+    );
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define SymEnumerateModules SymEnumerateModules64
+#else
+BOOL
+IMAGEAPI
+SymEnumerateModules(
+    IN HANDLE                     hProcess,
+    IN PSYM_ENUMMODULES_CALLBACK  EnumModulesCallback,
+    IN PVOID                      UserContext
+    );
+#endif
+
+BOOL
+IMAGEAPI
+SymEnumerateSymbols64(
+    IN HANDLE                       hProcess,
+    IN DWORD64                      BaseOfDll,
+    IN PSYM_ENUMSYMBOLS_CALLBACK64  EnumSymbolsCallback,
+    IN PVOID                        UserContext
+    );
+
+BOOL
+IMAGEAPI
+SymEnumerateSymbolsW64(
+    IN HANDLE                       hProcess,
+    IN DWORD64                      BaseOfDll,
+    IN PSYM_ENUMSYMBOLS_CALLBACK64W EnumSymbolsCallback,
+    IN PVOID                        UserContext
+    );
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define SymEnumerateSymbols SymEnumerateSymbols64
+#define SymEnumerateSymbolsW SymEnumerateSymbolsW64
+#else
+BOOL
+IMAGEAPI
+SymEnumerateSymbols(
+    IN HANDLE                     hProcess,
+    IN DWORD                      BaseOfDll,
+    IN PSYM_ENUMSYMBOLS_CALLBACK  EnumSymbolsCallback,
+    IN PVOID                      UserContext
+    );
+
+BOOL
+IMAGEAPI
+SymEnumerateSymbolsW(
+    IN HANDLE                       hProcess,
+    IN DWORD                        BaseOfDll,
+    IN PSYM_ENUMSYMBOLS_CALLBACKW   EnumSymbolsCallback,
+    IN PVOID                        UserContext
+    );
+#endif
+
+BOOL
+IMAGEAPI
+EnumerateLoadedModules64(
+    IN HANDLE                           hProcess,
+    IN PENUMLOADED_MODULES_CALLBACK64   EnumLoadedModulesCallback,
+    IN PVOID                            UserContext
+    );
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define EnumerateLoadedModules EnumerateLoadedModules64
+#else
+BOOL
+IMAGEAPI
+EnumerateLoadedModules(
+    IN HANDLE                         hProcess,
+    IN PENUMLOADED_MODULES_CALLBACK   EnumLoadedModulesCallback,
+    IN PVOID                          UserContext
+    );
+#endif
+
+PVOID
+IMAGEAPI
+SymFunctionTableAccess64(
+    HANDLE  hProcess,
+    DWORD64 AddrBase
+    );
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define SymFunctionTableAccess SymFunctionTableAccess64
+#else
+PVOID
+IMAGEAPI
+SymFunctionTableAccess(
+    HANDLE  hProcess,
+    DWORD   AddrBase
+    );
+#endif
+
+BOOL
+IMAGEAPI
+SymGetModuleInfo64(
+    IN  HANDLE                  hProcess,
+    IN  DWORD64                 qwAddr,
+    OUT PIMAGEHLP_MODULE64      ModuleInfo
+    );
+
+BOOL
+IMAGEAPI
+SymGetModuleInfoW64(
+    IN  HANDLE                  hProcess,
+    IN  DWORD64                 qwAddr,
+    OUT PIMAGEHLP_MODULEW64     ModuleInfo
+    );
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define SymGetModuleInfo   SymGetModuleInfo64
+#define SymGetModuleInfoW  SymGetModuleInfoW64
+#else
+BOOL
+IMAGEAPI
+SymGetModuleInfo(
+    IN  HANDLE              hProcess,
+    IN  DWORD               dwAddr,
+    OUT PIMAGEHLP_MODULE  ModuleInfo
+    );
+
+BOOL
+IMAGEAPI
+SymGetModuleInfoW(
+    IN  HANDLE              hProcess,
+    IN  DWORD               dwAddr,
+    OUT PIMAGEHLP_MODULEW  ModuleInfo
+    );
+#endif
+
+DWORD64
+IMAGEAPI
+SymGetModuleBase64(
+    IN  HANDLE              hProcess,
+    IN  DWORD64             qwAddr
+    );
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define SymGetModuleBase SymGetModuleBase64
+#else
+DWORD
+IMAGEAPI
+SymGetModuleBase(
+    IN  HANDLE              hProcess,
+    IN  DWORD               dwAddr
+    );
+#endif
+
+BOOL
+IMAGEAPI
+SymGetSymNext64(
+    IN     HANDLE              hProcess,
+    IN OUT PIMAGEHLP_SYMBOL64  Symbol
+    );
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define SymGetSymNext SymGetSymNext64
+#else
+BOOL
+IMAGEAPI
+SymGetSymNext(
+    IN     HANDLE            hProcess,
+    IN OUT PIMAGEHLP_SYMBOL  Symbol
+    );
+#endif
+
+BOOL
+IMAGEAPI
+SymGetSymPrev64(
+    IN     HANDLE              hProcess,
+    IN OUT PIMAGEHLP_SYMBOL64  Symbol
+    );
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define SymGetSymPrev SymGetSymPrev64
+#else
+BOOL
+IMAGEAPI
+SymGetSymPrev(
+    IN     HANDLE            hProcess,
+    IN OUT PIMAGEHLP_SYMBOL  Symbol
+    );
+#endif
+
+BOOL
+IMAGEAPI
+SymGetLineFromAddr64(
+    IN  HANDLE                  hProcess,
+    IN  DWORD64                 qwAddr,
+    OUT PDWORD                  pdwDisplacement,
+    OUT PIMAGEHLP_LINE64        Line64
+    );
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define SymGetLineFromAddr SymGetLineFromAddr64
+#else
+BOOL
+IMAGEAPI
+SymGetLineFromAddr(
+    IN  HANDLE                hProcess,
+    IN  DWORD                 dwAddr,
+    OUT PDWORD                pdwDisplacement,
+    OUT PIMAGEHLP_LINE        Line
+    );
+#endif
+
+BOOL
+IMAGEAPI
+SymGetLineFromName64(
+    IN     HANDLE               hProcess,
+    IN     PSTR                 ModuleName,
+    IN     PSTR                 FileName,
+    IN     DWORD                dwLineNumber,
+       OUT PLONG                plDisplacement,
+    IN OUT PIMAGEHLP_LINE64     Line
+    );
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define SymGetLineFromName SymGetLineFromName64
+#else
+BOOL
+IMAGEAPI
+SymGetLineFromName(
+    IN     HANDLE             hProcess,
+    IN     PSTR               ModuleName,
+    IN     PSTR               FileName,
+    IN     DWORD              dwLineNumber,
+       OUT PLONG              plDisplacement,
+    IN OUT PIMAGEHLP_LINE     Line
+    );
+#endif
+
+BOOL
+IMAGEAPI
+SymGetLineNext64(
+    IN     HANDLE               hProcess,
+    IN OUT PIMAGEHLP_LINE64     Line
+    );
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define SymGetLineNext SymGetLineNext64
+#else
+BOOL
+IMAGEAPI
+SymGetLineNext(
+    IN     HANDLE             hProcess,
+    IN OUT PIMAGEHLP_LINE     Line
+    );
+#endif
+
+BOOL
+IMAGEAPI
+SymGetLinePrev64(
+    IN     HANDLE               hProcess,
+    IN OUT PIMAGEHLP_LINE64     Line
+    );
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define SymGetLinePrev SymGetLinePrev64
+#else
+BOOL
+IMAGEAPI
+SymGetLinePrev(
+    IN     HANDLE             hProcess,
+    IN OUT PIMAGEHLP_LINE     Line
+    );
+#endif
+
+BOOL
+IMAGEAPI
+SymMatchFileName(
+    IN  PSTR  FileName,
+    IN  PSTR  Match,
+    OUT PSTR *FileNameStop,
+    OUT PSTR *MatchStop
+    );
+
+BOOL
+IMAGEAPI
+SymInitialize(
+    IN HANDLE   hProcess,
+    IN PSTR     UserSearchPath,
+    IN BOOL     fInvadeProcess
+    );
+
+BOOL
+IMAGEAPI
+SymGetSearchPath(
+    IN  HANDLE          hProcess,
+    OUT PSTR            SearchPath,
+    IN  DWORD           SearchPathLength
+    );
+
+BOOL
+IMAGEAPI
+SymSetSearchPath(
+    IN HANDLE           hProcess,
+    IN PSTR             SearchPath
+    );
+
+DWORD64
+IMAGEAPI
+SymLoadModule64(
+    IN  HANDLE          hProcess,
+    IN  HANDLE          hFile,
+    IN  PSTR            ImageName,
+    IN  PSTR            ModuleName,
+    IN  DWORD64         BaseOfDll,
+    IN  DWORD           SizeOfDll
+    );
+
+#define SLMFLAG_VIRTUAL 0x1
+
+DWORD64
+IMAGEAPI
+SymLoadModuleEx(
+    IN  HANDLE         hProcess,
+    IN  HANDLE         hFile,
+    IN  PSTR           ImageName,
+    IN  PSTR           ModuleName,
+    IN  DWORD64        BaseOfDll,
+    IN  DWORD          DllSize,
+    IN  PMODLOAD_DATA  Data,
+    IN  DWORD          Flags
+    );
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define SymLoadModule SymLoadModule64
+#else
+DWORD
+IMAGEAPI
+SymLoadModule(
+    IN  HANDLE          hProcess,
+    IN  HANDLE          hFile,
+    IN  PSTR            ImageName,
+    IN  PSTR            ModuleName,
+    IN  DWORD           BaseOfDll,
+    IN  DWORD           SizeOfDll
+    );
+#endif
+
+BOOL
+IMAGEAPI
+SymUnloadModule64(
+    IN  HANDLE          hProcess,
+    IN  DWORD64         BaseOfDll
+    );
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define SymUnloadModule SymUnloadModule64
+#else
+BOOL
+IMAGEAPI
+SymUnloadModule(
+    IN  HANDLE          hProcess,
+    IN  DWORD           BaseOfDll
+    );
+#endif
+
+BOOL
+IMAGEAPI
+SymUnDName64(
+    IN  PIMAGEHLP_SYMBOL64 sym,               // Symbol to undecorate
+    OUT PSTR               UnDecName,         // Buffer to store undecorated name in
+    IN  DWORD              UnDecNameLength    // Size of the buffer
+    );
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define SymUnDName SymUnDName64
+#else
+BOOL
+IMAGEAPI
+SymUnDName(
+    IN  PIMAGEHLP_SYMBOL sym,               // Symbol to undecorate
+    OUT PSTR             UnDecName,         // Buffer to store undecorated name in
+    IN  DWORD            UnDecNameLength    // Size of the buffer
+    );
+#endif
+
+BOOL
+IMAGEAPI
+SymRegisterCallback64(
+    IN HANDLE                        hProcess,
+    IN PSYMBOL_REGISTERED_CALLBACK64 CallbackFunction,
+    IN ULONG64                       UserContext
+    );
+
+BOOL
+IMAGEAPI
+SymRegisterFunctionEntryCallback64(
+    IN HANDLE                       hProcess,
+    IN PSYMBOL_FUNCENTRY_CALLBACK64 CallbackFunction,
+    IN ULONG64                      UserContext
+    );
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define SymRegisterCallback SymRegisterCallback64
+#define SymRegisterFunctionEntryCallback SymRegisterFunctionEntryCallback64
+#else
+BOOL
+IMAGEAPI
+SymRegisterCallback(
+    IN HANDLE                      hProcess,
+    IN PSYMBOL_REGISTERED_CALLBACK CallbackFunction,
+    IN PVOID                       UserContext
+    );
+
+BOOL
+IMAGEAPI
+SymRegisterFunctionEntryCallback(
+    IN HANDLE                     hProcess,
+    IN PSYMBOL_FUNCENTRY_CALLBACK CallbackFunction,
+    IN PVOID                      UserContext
+    );
+#endif
+
+
+typedef struct _IMAGEHLP_SYMBOL_SRC {
+    DWORD sizeofstruct;
+    DWORD type;
+    char  file[MAX_PATH];
+} IMAGEHLP_SYMBOL_SRC, *PIMAGEHLP_SYMBOL_SRC;
+
+typedef struct _MODULE_TYPE_INFO { // AKA TYPTYP
+    USHORT      dataLength;
+    USHORT      leaf;
+    BYTE        data[1];
+} MODULE_TYPE_INFO, *PMODULE_TYPE_INFO;
+
+typedef struct _SYMBOL_INFO {
+    ULONG       SizeOfStruct;
+    ULONG       TypeIndex;        // Type Index of symbol
+    ULONG64     Reserved[2];
+    ULONG       info;
+    ULONG       Size;
+    ULONG64     ModBase;          // Base Address of module comtaining this symbol
+    ULONG       Flags;
+    ULONG64     Value;            // Value of symbol, ValuePresent should be 1
+    ULONG64     Address;          // Address of symbol including base address of module
+    ULONG       Register;         // register holding value or pointer to value
+    ULONG       Scope;            // scope of the symbol
+    ULONG       Tag;              // pdb classification
+    ULONG       NameLen;          // Actual length of name
+    ULONG       MaxNameLen;
+    CHAR        Name[1];          // Name of symbol
+} SYMBOL_INFO, *PSYMBOL_INFO;
+
+typedef struct _SYMBOL_INFO_PACKAGE {
+    SYMBOL_INFO si;
+    CHAR        name[MAX_SYM_NAME + 1];
+} SYMBOL_INFO_PACKAGE, *PSYMBOL_INFO_PACKAGE;
+
+typedef struct _IMAGEHLP_STACK_FRAME
+{
+    ULONG64 InstructionOffset;
+    ULONG64 ReturnOffset;
+    ULONG64 FrameOffset;
+    ULONG64 StackOffset;
+    ULONG64 BackingStoreOffset;
+    ULONG64 FuncTableEntry;
+    ULONG64 Params[4];
+    ULONG64 Reserved[5];
+    BOOL    Virtual;
+    ULONG   Reserved2;
+} IMAGEHLP_STACK_FRAME, *PIMAGEHLP_STACK_FRAME;
+
+typedef VOID IMAGEHLP_CONTEXT, *PIMAGEHLP_CONTEXT;
+
+
+BOOL
+IMAGEAPI
+SymSetContext(
+    HANDLE hProcess,
+    PIMAGEHLP_STACK_FRAME StackFrame,
+    PIMAGEHLP_CONTEXT Context
+    );
+
+BOOL
+IMAGEAPI
+SymFromAddr(
+    IN  HANDLE              hProcess,
+    IN  DWORD64             Address,
+    OUT PDWORD64            Displacement,
+    IN OUT PSYMBOL_INFO     Symbol
+    );
+
+// While SymFromName will provide a symbol from a name,
+// SymEnumSymbols can provide the same matching information
+// for ALL symbols with a matching name, even regular
+// expressions.  That way you can search across modules
+// and differentiate between identically named symbols.
+
+BOOL
+IMAGEAPI
+SymFromName(
+    IN  HANDLE              hProcess,
+    IN  LPSTR               Name,
+    OUT PSYMBOL_INFO        Symbol
+    );
+
+typedef BOOL
+(CALLBACK *PSYM_ENUMERATESYMBOLS_CALLBACK)(
+    PSYMBOL_INFO  pSymInfo,
+    ULONG         SymbolSize,
+    PVOID         UserContext
+    );
+
+BOOL
+IMAGEAPI
+SymEnumSymbols(
+    IN HANDLE                       hProcess,
+    IN ULONG64                      BaseOfDll,
+    IN PCSTR                        Mask,
+    IN PSYM_ENUMERATESYMBOLS_CALLBACK    EnumSymbolsCallback,
+    IN PVOID                        UserContext
+    );
+
+BOOL
+IMAGEAPI
+SymEnumSymbolsForAddr(
+    IN HANDLE                       hProcess,
+    IN DWORD64                      Address,
+    IN PSYM_ENUMERATESYMBOLS_CALLBACK    EnumSymbolsCallback,
+    IN PVOID                        UserContext
+    );
+
+typedef enum _IMAGEHLP_SYMBOL_TYPE_INFO {
+    TI_GET_SYMTAG,
+    TI_GET_SYMNAME,
+    TI_GET_LENGTH,
+    TI_GET_TYPE,
+    TI_GET_TYPEID,
+    TI_GET_BASETYPE,
+    TI_GET_ARRAYINDEXTYPEID,
+    TI_FINDCHILDREN,
+    TI_GET_DATAKIND,
+    TI_GET_ADDRESSOFFSET,
+    TI_GET_OFFSET,
+    TI_GET_VALUE,
+    TI_GET_COUNT,
+    TI_GET_CHILDRENCOUNT,
+    TI_GET_BITPOSITION,
+    TI_GET_VIRTUALBASECLASS,
+    TI_GET_VIRTUALTABLESHAPEID,
+    TI_GET_VIRTUALBASEPOINTEROFFSET,
+    TI_GET_CLASSPARENTID,
+    TI_GET_NESTED,
+    TI_GET_SYMINDEX,
+    TI_GET_LEXICALPARENT,
+    TI_GET_ADDRESS,
+    TI_GET_THISADJUST,
+    TI_GET_UDTKIND,
+    TI_IS_EQUIV_TO,
+    TI_GET_CALLING_CONVENTION,
+} IMAGEHLP_SYMBOL_TYPE_INFO;
+
+typedef struct _TI_FINDCHILDREN_PARAMS {
+    ULONG Count;
+    ULONG Start;
+    ULONG ChildId[1];
+} TI_FINDCHILDREN_PARAMS;
+
+BOOL
+IMAGEAPI
+SymGetTypeInfo(
+    IN  HANDLE          hProcess,
+    IN  DWORD64         ModBase,
+    IN  ULONG           TypeId,
+    IN  IMAGEHLP_SYMBOL_TYPE_INFO GetType,
+    OUT PVOID           pInfo
+    );
+
+BOOL
+IMAGEAPI
+SymEnumTypes(
+    IN HANDLE                       hProcess,
+    IN ULONG64                      BaseOfDll,
+    IN PSYM_ENUMERATESYMBOLS_CALLBACK    EnumSymbolsCallback,
+    IN PVOID                        UserContext
+    );
+
+BOOL
+IMAGEAPI
+SymGetTypeFromName(
+    IN  HANDLE              hProcess,
+    IN  ULONG64             BaseOfDll,
+    IN  LPSTR               Name,
+    OUT PSYMBOL_INFO        Symbol
+    );
+
+BOOL
+IMAGEAPI
+SymAddSymbol(
+    IN HANDLE                       hProcess,
+    IN ULONG64                      BaseOfDll,
+    IN PCSTR                        Name,
+    IN DWORD64                      Address,
+    IN DWORD                        Size,
+    IN DWORD                        Flags
+    );
+
+BOOL
+IMAGEAPI
+SymDeleteSymbol(
+    IN HANDLE                       hProcess,
+    IN ULONG64                      BaseOfDll,
+    IN PCSTR                        Name,
+    IN DWORD64                      Address,
+    IN DWORD                        Flags
+    );
+
+//
+// Full user-mode dump creation.
+//
+
+typedef BOOL (WINAPI *PDBGHELP_CREATE_USER_DUMP_CALLBACK)(
+    DWORD       DataType,
+    PVOID*      Data,
+    LPDWORD     DataLength,
+    PVOID       UserData
+    );
+
+BOOL
+WINAPI
+DbgHelpCreateUserDump(
+    IN LPSTR                              FileName,
+    IN PDBGHELP_CREATE_USER_DUMP_CALLBACK Callback,
+    IN PVOID                              UserData
+    );
+
+BOOL
+WINAPI
+DbgHelpCreateUserDumpW(
+    IN LPWSTR                             FileName,
+    IN PDBGHELP_CREATE_USER_DUMP_CALLBACK Callback,
+    IN PVOID                              UserData
+    );
+
+// -----------------------------------------------------------------
+// The following 4 legacy APIs are fully supported, but newer
+// ones are recommended.  SymFromName and SymFromAddr provide
+// much more detailed info on the returned symbol.
+
+BOOL
+IMAGEAPI
+SymGetSymFromAddr64(
+    IN  HANDLE              hProcess,
+    IN  DWORD64             qwAddr,
+    OUT PDWORD64            pdwDisplacement,
+    OUT PIMAGEHLP_SYMBOL64  Symbol
+    );
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define SymGetSymFromAddr SymGetSymFromAddr64
+#else
+BOOL
+IMAGEAPI
+SymGetSymFromAddr(
+    IN  HANDLE            hProcess,
+    IN  DWORD             dwAddr,
+    OUT PDWORD            pdwDisplacement,
+    OUT PIMAGEHLP_SYMBOL  Symbol
+    );
+#endif
+
+// While following two APIs will provide a symbol from a name,
+// SymEnumSymbols can provide the same matching information
+// for ALL symbols with a matching name, even regular
+// expressions.  That way you can search across modules
+// and differentiate between identically named symbols.
+
+BOOL
+IMAGEAPI
+SymGetSymFromName64(
+    IN  HANDLE              hProcess,
+    IN  PSTR                Name,
+    OUT PIMAGEHLP_SYMBOL64  Symbol
+    );
+
+#if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
+#define SymGetSymFromName SymGetSymFromName64
+#else
+BOOL
+IMAGEAPI
+SymGetSymFromName(
+    IN  HANDLE            hProcess,
+    IN  PSTR              Name,
+    OUT PIMAGEHLP_SYMBOL  Symbol
+    );
+#endif
+
+
+// -----------------------------------------------------------------
+// The following APIs exist only for backwards compatibility
+// with a pre-release version documented in an MSDN release.
+
+// You should use SymFindFileInPath if you want to maintain
+// future compatibility.
+
+DBHLP_DEPRECIATED
+BOOL
+IMAGEAPI
+FindFileInPath(
+    HANDLE hprocess,
+    LPSTR  SearchPath,
+    LPSTR  FileName,
+    PVOID  id,
+    DWORD  two,
+    DWORD  three,
+    DWORD  flags,
+    LPSTR  FilePath
+    );
+
+// You should use SymFindFileInPath if you want to maintain
+// future compatibility.
+
+DBHLP_DEPRECIATED
+BOOL
+IMAGEAPI
+FindFileInSearchPath(
+    HANDLE hprocess,
+    LPSTR  SearchPath,
+    LPSTR  FileName,
+    DWORD  one,
+    DWORD  two,
+    DWORD  three,
+    LPSTR  FilePath
+    );
+
+DBHLP_DEPRECIATED
+BOOL
+IMAGEAPI
+SymEnumSym(
+    IN HANDLE                       hProcess,
+    IN ULONG64                      BaseOfDll,
+    IN PSYM_ENUMERATESYMBOLS_CALLBACK    EnumSymbolsCallback,
+    IN PVOID                        UserContext
+    );
+
+// These values should not be used.
+// They have been replaced by SYMFLAG_ values.
+
+#define SYMF_OMAP_GENERATED   0x00000001
+#define SYMF_OMAP_MODIFIED    0x00000002
+#define SYMF_REGISTER         0x00000008
+#define SYMF_REGREL           0x00000010
+#define SYMF_FRAMEREL         0x00000020
+#define SYMF_PARAMETER        0x00000040
+#define SYMF_LOCAL            0x00000080
+#define SYMF_CONSTANT         0x00000100
+#define SYMF_EXPORT           0x00000200
+#define SYMF_FORWARDER        0x00000400
+#define SYMF_FUNCTION         0x00000800
+#define SYMF_VIRTUAL          0x00001000
+#define SYMF_THUNK            0x00002000
+#define SYMF_TLSREL           0x00004000
+
+// These values should also not be used.
+// They have been replaced by SYMFLAG_ values.
+
+#define IMAGEHLP_SYMBOL_INFO_VALUEPRESENT          1
+#define IMAGEHLP_SYMBOL_INFO_REGISTER              SYMF_REGISTER        // 0x0008
+#define IMAGEHLP_SYMBOL_INFO_REGRELATIVE           SYMF_REGREL          // 0x0010
+#define IMAGEHLP_SYMBOL_INFO_FRAMERELATIVE         SYMF_FRAMEREL        // 0x0020
+#define IMAGEHLP_SYMBOL_INFO_PARAMETER             SYMF_PARAMETER       // 0x0040
+#define IMAGEHLP_SYMBOL_INFO_LOCAL                 SYMF_LOCAL           // 0x0080
+#define IMAGEHLP_SYMBOL_INFO_CONSTANT              SYMF_CONSTANT        // 0x0100
+#define IMAGEHLP_SYMBOL_FUNCTION                   SYMF_FUNCTION        // 0x0800
+#define IMAGEHLP_SYMBOL_VIRTUAL                    SYMF_VIRTUAL         // 0x1000
+#define IMAGEHLP_SYMBOL_THUNK                      SYMF_THUNK           // 0x2000
+#define IMAGEHLP_SYMBOL_INFO_TLSRELATIVE           SYMF_TLSREL          // 0x4000
+
+
+#include <pshpack4.h>
+
+#pragma warning(disable:4200) // Zero length array
+
+
+#define MINIDUMP_SIGNATURE ('PMDM')
+#define MINIDUMP_VERSION   (42899)
++/
+
+alias DWORD RVA;
+alias ULONG64 RVA64;
+
+struct MINIDUMP_LOCATION_DESCRIPTOR {
+    ULONG32 DataSize;
+    RVA Rva;
+}
+
+struct MINIDUMP_LOCATION_DESCRIPTOR64 {
+    ULONG64 DataSize;
+    RVA64 Rva;
+}
+
+struct MINIDUMP_MEMORY_DESCRIPTOR {
+    ULONG64 StartOfMemoryRange;
+    MINIDUMP_LOCATION_DESCRIPTOR Memory;
+}
+alias MINIDUMP_MEMORY_DESCRIPTOR* PMINIDUMP_MEMORY_DESCRIPTOR;
+
+// DESCRIPTOR64 is used for full-memory minidumps where
+// all of the raw memory is laid out sequentially at the
+// end of the dump.  There is no need for individual RVAs
+// as the RVA is the base RVA plus the sum of the preceeding
+// data blocks.
+struct MINIDUMP_MEMORY_DESCRIPTOR64 {
+    ULONG64 StartOfMemoryRange;
+    ULONG64 DataSize;
+}
+alias MINIDUMP_MEMORY_DESCRIPTOR64* PMINIDUMP_MEMORY_DESCRIPTOR64;
+
+
+struct MINIDUMP_HEADER {
+    ULONG32 Signature;
+    ULONG32 Version;
+    ULONG32 NumberOfStreams;
+    RVA StreamDirectoryRva;
+    ULONG32 CheckSum;
+    union {
+        ULONG32 Reserved;
+        ULONG32 TimeDateStamp;
+    };
+    ULONG64 Flags;
+}
+alias MINIDUMP_HEADER* PMINIDUMP_HEADER;
+
+//
+// The MINIDUMP_HEADER field StreamDirectoryRva points to
+// an array of MINIDUMP_DIRECTORY structures.
+//
+
+struct MINIDUMP_DIRECTORY {
+    ULONG32 StreamType;
+    MINIDUMP_LOCATION_DESCRIPTOR Location;
+}
+alias MINIDUMP_DIRECTORY* PMINIDUMP_DIRECTORY;
+
+
+struct MINIDUMP_STRING {
+    ULONG32 Length;         // Length in bytes of the string
+    WCHAR   Buffer [0];     // Variable size buffer
+}
+alias MINIDUMP_STRING* PMINIDUMP_STRING;
+
+//
+// The MINIDUMP_DIRECTORY field StreamType may be one of the following types.
+// Types will be added in the future, so if a program reading the minidump
+// header encounters a stream type it does not understand it should ignore
+// the data altogether. Any tag above LastReservedStream will not be used by
+// the system and is reserved for program-specific information.
+//
+
+enum MINIDUMP_STREAM_TYPE {
+
+    UnusedStream                = 0,
+    ReservedStream0             = 1,
+    ReservedStream1             = 2,
+    ThreadListStream            = 3,
+    ModuleListStream            = 4,
+    MemoryListStream            = 5,
+    ExceptionStream             = 6,
+    SystemInfoStream            = 7,
+    ThreadExListStream          = 8,
+    Memory64ListStream          = 9,
+    CommentStreamA              = 10,
+    CommentStreamW              = 11,
+    HandleDataStream            = 12,
+    FunctionTableStream         = 13,
+    UnloadedModuleListStream    = 14,
+    MiscInfoStream              = 15,
+
+    LastReservedStream          = 0xffff
+
+}
+
+
+//
+// The minidump system information contains processor and
+// Operating System specific information.
+//
+
+/+
+#if defined(_MSC_VER)
+#if _MSC_VER >= 800
+#if _MSC_VER >= 1200
+#pragma warning(push)
+#endif
+#pragma warning(disable:4201)    /* Nameless struct/union */
+#endif
+#endif
++/
+
+struct MINIDUMP_SYSTEM_INFO {
+
+    //
+    // ProcessorArchitecture, ProcessorLevel and ProcessorRevision are all
+    // taken from the SYSTEM_INFO structure obtained by GetSystemInfo( ).
+    //
+
+    USHORT ProcessorArchitecture;
+    USHORT ProcessorLevel;
+    USHORT ProcessorRevision;
+
+    union {
+        USHORT Reserved0;
+        struct {
+            UCHAR NumberOfProcessors;
+            UCHAR ProductType;
+        };
+    };
+
+    //
+    // MajorVersion, MinorVersion, BuildNumber, PlatformId and
+    // CSDVersion are all taken from the OSVERSIONINFO structure
+    // returned by GetVersionEx( ).
+    //
+
+    ULONG32 MajorVersion;
+    ULONG32 MinorVersion;
+    ULONG32 BuildNumber;
+    ULONG32 PlatformId;
+
+    //
+    // RVA to a CSDVersion string in the string table.
+    //
+
+    RVA CSDVersionRva;
+
+    union {
+        ULONG32 Reserved1;
+        struct {
+            USHORT SuiteMask;
+            USHORT Reserved2;
+        };
+    };
+
+    //
+    // CPU information is obtained from one of two places.
+    //
+    //  1) On x86 computers, CPU_INFORMATION is obtained from the CPUID
+    //     instruction. You must use the X86 portion of the union for X86
+    //     computers.
+    //
+    //  2) On non-x86 architectures, CPU_INFORMATION is obtained by calling
+    //     IsProcessorFeatureSupported().
+    //
+
+    union CPU_INFORMATION {
+
+        //
+        // X86 platforms use CPUID function to obtain processor information.
+        //
+
+        struct _X86CpuInfo_t {
+
+            //
+            // CPUID Subfunction 0, register EAX (VendorId [0]),
+            // EBX (VendorId [1]) and ECX (VendorId [2]).
+            //
+
+            ULONG32 VendorId [ 3 ];
+
+            //
+            // CPUID Subfunction 1, register EAX
+            //
+
+            ULONG32 VersionInformation;
+
+            //
+            // CPUID Subfunction 1, register EDX
+            //
+
+            ULONG32 FeatureInformation;
+
+
+            //
+            // CPUID, Subfunction 80000001, register EBX. This will only
+            // be obtained if the vendor id is "AuthenticAMD".
+            //
+
+            ULONG32 AMDExtendedCpuFeatures;
+
+        }
+        _X86CpuInfo_t X86CpuInfo;
+
+        //
+        // Non-x86 platforms use processor feature flags.
+        //
+
+        struct _OtherCpuInfo_t {
+
+            ULONG64 ProcessorFeatures [ 2 ];
+
+        }
+        _OtherCpuInfo_t OtherCpuInfo;
+
+    }
+    CPU_INFORMATION Cpu;
+
+}
+alias MINIDUMP_SYSTEM_INFO* PMINIDUMP_SYSTEM_INFO;
+alias MINIDUMP_SYSTEM_INFO.CPU_INFORMATION* PCPU_INFORMATION;
+
+/+
+#if defined(_MSC_VER)
+#if _MSC_VER >= 800
+#if _MSC_VER >= 1200
+#pragma warning(pop)
+#else
+#pragma warning(disable:4201)    /* Nameless struct/union */
+#endif
+#endif
+#endif
++/
+
+//
+// The minidump thread contains standard thread
+// information plus an RVA to the memory for this
+// thread and an RVA to the CONTEXT structure for
+// this thread.
+//
+
+
+//
+// ThreadId must be 4 bytes on all architectures.
+//
+
+//C_ASSERT (sizeof ( ((PPROCESS_INFORMATION)0)->dwThreadId ) == 4);
+
+struct MINIDUMP_THREAD {
+    ULONG32 ThreadId;
+    ULONG32 SuspendCount;
+    ULONG32 PriorityClass;
+    ULONG32 Priority;
+    ULONG64 Teb;
+    MINIDUMP_MEMORY_DESCRIPTOR Stack;
+    MINIDUMP_LOCATION_DESCRIPTOR ThreadContext;
+}
+alias MINIDUMP_THREAD* PMINIDUMP_THREAD;
+
+//
+// The thread list is a container of threads.
+//
+
+struct MINIDUMP_THREAD_LIST {
+    ULONG32 NumberOfThreads;
+    MINIDUMP_THREAD Threads [0];
+}
+alias MINIDUMP_THREAD_LIST* PMINIDUMP_THREAD_LIST;
+
+
+struct MINIDUMP_THREAD_EX {
+    ULONG32 ThreadId;
+    ULONG32 SuspendCount;
+    ULONG32 PriorityClass;
+    ULONG32 Priority;
+    ULONG64 Teb;
+    MINIDUMP_MEMORY_DESCRIPTOR Stack;
+    MINIDUMP_LOCATION_DESCRIPTOR ThreadContext;
+    MINIDUMP_MEMORY_DESCRIPTOR BackingStore;
+}
+alias MINIDUMP_THREAD_EX* PMINIDUMP_THREAD_EX;
+
+//
+// The thread list is a container of threads.
+//
+
+struct MINIDUMP_THREAD_EX_LIST {
+    ULONG32 NumberOfThreads;
+    MINIDUMP_THREAD_EX Threads [0];
+}
+alias MINIDUMP_THREAD_EX_LIST* PMINIDUMP_THREAD_EX_LIST;
+
+
+//
+// The MINIDUMP_EXCEPTION is the same as EXCEPTION on Win64.
+//
+
+struct MINIDUMP_EXCEPTION  {
+    ULONG32 ExceptionCode;
+    ULONG32 ExceptionFlags;
+    ULONG64 ExceptionRecord;
+    ULONG64 ExceptionAddress;
+    ULONG32 NumberParameters;
+    ULONG32 __unusedAlignment;
+    ULONG64 ExceptionInformation [ EXCEPTION_MAXIMUM_PARAMETERS ];
+}
+alias MINIDUMP_EXCEPTION* PMINIDUMP_EXCEPTION;
+
+
+//
+// The exception information stream contains the id of the thread that caused
+// the exception (ThreadId), the exception record for the exception
+// (ExceptionRecord) and an RVA to the thread context where the exception
+// occured.
+//
+
+struct MINIDUMP_EXCEPTION_STREAM {
+    ULONG32 ThreadId;
+    ULONG32  __alignment;
+    MINIDUMP_EXCEPTION ExceptionRecord;
+    MINIDUMP_LOCATION_DESCRIPTOR ThreadContext;
+}
+alias MINIDUMP_EXCEPTION_STREAM* PMINIDUMP_EXCEPTION_STREAM;
+
+
+//
+// The MINIDUMP_MODULE contains information about a
+// a specific module. It includes the CheckSum and
+// the TimeDateStamp for the module so the module
+// can be reloaded during the analysis phase.
+//
+
+struct MINIDUMP_MODULE {
+    ULONG64 BaseOfImage;
+    ULONG32 SizeOfImage;
+    ULONG32 CheckSum;
+    ULONG32 TimeDateStamp;
+    RVA ModuleNameRva;
+    VS_FIXEDFILEINFO VersionInfo;
+    MINIDUMP_LOCATION_DESCRIPTOR CvRecord;
+    MINIDUMP_LOCATION_DESCRIPTOR MiscRecord;
+    ULONG64 Reserved0;                          // Reserved for future use.
+    ULONG64 Reserved1;                          // Reserved for future use.
+}
+alias MINIDUMP_MODULE* PMINIDUMP_MODULE;
+
+
+//
+// The minidump module list is a container for modules.
+//
+
+struct MINIDUMP_MODULE_LIST {
+    ULONG32 NumberOfModules;
+    MINIDUMP_MODULE Modules [ 0 ];
+}
+alias MINIDUMP_MODULE_LIST* PMINIDUMP_MODULE_LIST;
+
+
+//
+// Memory Ranges
+//
+
+struct MINIDUMP_MEMORY_LIST {
+    ULONG32 NumberOfMemoryRanges;
+    MINIDUMP_MEMORY_DESCRIPTOR MemoryRanges [0];
+}
+alias MINIDUMP_MEMORY_LIST* PMINIDUMP_MEMORY_LIST;
+
+struct MINIDUMP_MEMORY64_LIST {
+    ULONG64 NumberOfMemoryRanges;
+    RVA64 BaseRva;
+    MINIDUMP_MEMORY_DESCRIPTOR64 MemoryRanges [0];
+}
+alias MINIDUMP_MEMORY64_LIST* PMINIDUMP_MEMORY64_LIST;
+
+
+//
+// Support for user supplied exception information.
+//
+
+struct MINIDUMP_EXCEPTION_INFORMATION {
+    DWORD ThreadId;
+    PEXCEPTION_POINTERS ExceptionPointers;
+    BOOL ClientPointers;
+};
+alias MINIDUMP_EXCEPTION_INFORMATION* PMINIDUMP_EXCEPTION_INFORMATION;
+
+//
+// Support for capturing system handle state at the time of the dump.
+//
+
+struct MINIDUMP_HANDLE_DESCRIPTOR {
+    ULONG64 Handle;
+    RVA TypeNameRva;
+    RVA ObjectNameRva;
+    ULONG32 Attributes;
+    ULONG32 GrantedAccess;
+    ULONG32 HandleCount;
+    ULONG32 PointerCount;
+}
+alias MINIDUMP_HANDLE_DESCRIPTOR* PMINIDUMP_HANDLE_DESCRIPTOR;
+
+struct MINIDUMP_HANDLE_DATA_STREAM {
+    ULONG32 SizeOfHeader;
+    ULONG32 SizeOfDescriptor;
+    ULONG32 NumberOfDescriptors;
+    ULONG32 Reserved;
+}
+alias MINIDUMP_HANDLE_DATA_STREAM* PMINIDUMP_HANDLE_DATA_STREAM;
+
+
+//
+// Support for capturing dynamic function table state at the time of the dump.
+//
+
+struct MINIDUMP_FUNCTION_TABLE_DESCRIPTOR {
+    ULONG64 MinimumAddress;
+    ULONG64 MaximumAddress;
+    ULONG64 BaseAddress;
+    ULONG32 EntryCount;
+    ULONG32 SizeOfAlignPad;
+}
+alias MINIDUMP_FUNCTION_TABLE_DESCRIPTOR* PMINIDUMP_FUNCTION_TABLE_DESCRIPTOR;
+
+struct MINIDUMP_FUNCTION_TABLE_STREAM {
+    ULONG32 SizeOfHeader;
+    ULONG32 SizeOfDescriptor;
+    ULONG32 SizeOfNativeDescriptor;
+    ULONG32 SizeOfFunctionEntry;
+    ULONG32 NumberOfDescriptors;
+    ULONG32 SizeOfAlignPad;
+}
+alias MINIDUMP_FUNCTION_TABLE_STREAM* PMINIDUMP_FUNCTION_TABLE_STREAM;
+
+
+//
+// The MINIDUMP_UNLOADED_MODULE contains information about a
+// a specific module that was previously loaded but no
+// longer is.  This can help with diagnosing problems where
+// callers attempt to call code that is no longer loaded.
+//
+
+struct MINIDUMP_UNLOADED_MODULE {
+    ULONG64 BaseOfImage;
+    ULONG32 SizeOfImage;
+    ULONG32 CheckSum;
+    ULONG32 TimeDateStamp;
+    RVA ModuleNameRva;
+}
+alias MINIDUMP_UNLOADED_MODULE* PMINIDUMP_UNLOADED_MODULE;
+
+
+//
+// The minidump unloaded module list is a container for unloaded modules.
+//
+
+struct MINIDUMP_UNLOADED_MODULE_LIST {
+    ULONG32 SizeOfHeader;
+    ULONG32 SizeOfEntry;
+    ULONG32 NumberOfEntries;
+}
+alias MINIDUMP_UNLOADED_MODULE_LIST* PMINIDUMP_UNLOADED_MODULE_LIST;
+
+
+//
+// The miscellaneous information stream contains a variety
+// of small pieces of information.  A member is valid if
+// it's within the available size and its corresponding
+// bit is set.
+//
+
+enum : uint {
+    MINIDUMP_MISC1_PROCESS_ID = 0x00000001,
+    MINIDUMP_MISC1_PROCESS_TIMES
+}
+
+struct MINIDUMP_MISC_INFO {
+    ULONG32 SizeOfInfo;
+    ULONG32 Flags1;
+    ULONG32 ProcessId;
+    ULONG32 ProcessCreateTime;
+    ULONG32 ProcessUserTime;
+    ULONG32 ProcessKernelTime;
+}
+alias MINIDUMP_MISC_INFO* PMINIDUMP_MISC_INFO;
+
+
+//
+// Support for arbitrary user-defined information.
+//
+
+struct MINIDUMP_USER_RECORD {
+    ULONG32 Type;
+    MINIDUMP_LOCATION_DESCRIPTOR Memory;
+}
+alias MINIDUMP_USER_RECORD* PMINIDUMP_USER_RECORD;
+
+
+struct MINIDUMP_USER_STREAM {
+    ULONG32 Type;
+    ULONG BufferSize;
+    PVOID Buffer;
+}
+alias MINIDUMP_USER_STREAM* PMINIDUMP_USER_STREAM;
+
+struct MINIDUMP_USER_STREAM_INFORMATION {
+    ULONG UserStreamCount;
+    PMINIDUMP_USER_STREAM UserStreamArray;
+}
+alias MINIDUMP_USER_STREAM_INFORMATION* PMINIDUMP_USER_STREAM_INFORMATION;
+
+//
+// Callback support.
+//
+
+enum MINIDUMP_CALLBACK_TYPE {
+    ModuleCallback,
+    ThreadCallback,
+    ThreadExCallback,
+    IncludeThreadCallback,
+    IncludeModuleCallback,
+}
+
+
+struct MINIDUMP_THREAD_CALLBACK {
+    ULONG ThreadId;
+    HANDLE ThreadHandle;
+    CONTEXT Context;
+    ULONG SizeOfContext;
+    ULONG64 StackBase;
+    ULONG64 StackEnd;
+}
+alias MINIDUMP_THREAD_CALLBACK* PMINIDUMP_THREAD_CALLBACK;
+
+struct MINIDUMP_THREAD_EX_CALLBACK {
+    ULONG ThreadId;
+    HANDLE ThreadHandle;
+    CONTEXT Context;
+    ULONG SizeOfContext;
+    ULONG64 StackBase;
+    ULONG64 StackEnd;
+    ULONG64 BackingStoreBase;
+    ULONG64 BackingStoreEnd;
+}
+alias MINIDUMP_THREAD_EX_CALLBACK* PMINIDUMP_THREAD_EX_CALLBACK;
+
+
+struct MINIDUMP_INCLUDE_THREAD_CALLBACK {
+    ULONG ThreadId;
+}
+alias MINIDUMP_INCLUDE_THREAD_CALLBACK* PMINIDUMP_INCLUDE_THREAD_CALLBACK;
+
+
+enum THREAD_WRITE_FLAGS {
+    ThreadWriteThread            = 0x0001,
+    ThreadWriteStack             = 0x0002,
+    ThreadWriteContext           = 0x0004,
+    ThreadWriteBackingStore      = 0x0008,
+    ThreadWriteInstructionWindow = 0x0010,
+    ThreadWriteThreadData        = 0x0020,
+}
+
+struct MINIDUMP_MODULE_CALLBACK {
+    PWCHAR FullPath;
+    ULONG64 BaseOfImage;
+    ULONG SizeOfImage;
+    ULONG CheckSum;
+    ULONG TimeDateStamp;
+    VS_FIXEDFILEINFO VersionInfo;
+    PVOID CvRecord;
+    ULONG SizeOfCvRecord;
+    PVOID MiscRecord;
+    ULONG SizeOfMiscRecord;
+}
+alias MINIDUMP_MODULE_CALLBACK* PMINIDUMP_MODULE_CALLBACK;
+
+
+struct MINIDUMP_INCLUDE_MODULE_CALLBACK {
+    ULONG64 BaseOfImage;
+}
+alias MINIDUMP_INCLUDE_MODULE_CALLBACK* PMINIDUMP_INCLUDE_MODULE_CALLBACK;
+
+
+enum MODULE_WRITE_FLAGS {
+    ModuleWriteModule        = 0x0001,
+    ModuleWriteDataSeg       = 0x0002,
+    ModuleWriteMiscRecord    = 0x0004,
+    ModuleWriteCvRecord      = 0x0008,
+    ModuleReferencedByMemory = 0x0010
+}
+
+struct MINIDUMP_CALLBACK_INPUT {
+    ULONG ProcessId;
+    HANDLE ProcessHandle;
+    ULONG CallbackType;
+    union {
+        MINIDUMP_THREAD_CALLBACK Thread;
+        MINIDUMP_THREAD_EX_CALLBACK ThreadEx;
+        MINIDUMP_MODULE_CALLBACK Module;
+        MINIDUMP_INCLUDE_THREAD_CALLBACK IncludeThread;
+        MINIDUMP_INCLUDE_MODULE_CALLBACK IncludeModule;
+    };
+}
+alias MINIDUMP_CALLBACK_INPUT* PMINIDUMP_CALLBACK_INPUT;
+
+struct MINIDUMP_CALLBACK_OUTPUT {
+    union {
+        ULONG ModuleWriteFlags;
+        ULONG ThreadWriteFlags;
+    };
+}
+alias MINIDUMP_CALLBACK_OUTPUT* PMINIDUMP_CALLBACK_OUTPUT;
+
+
+//
+// A normal minidump contains just the information
+// necessary to capture stack traces for all of the
+// existing threads in a process.
+//
+// A minidump with data segments includes all of the data
+// sections from loaded modules in order to capture
+// global variable contents.  This can make the dump much
+// larger if many modules have global data.
+//
+// A minidump with full memory includes all of the accessible
+// memory in the process and can be very large.  A minidump
+// with full memory always has the raw memory data at the end
+// of the dump so that the initial structures in the dump can
+// be mapped directly without having to include the raw
+// memory information.
+//
+// Stack and backing store memory can be filtered to remove
+// data unnecessary for stack walking.  This can improve
+// compression of stacks and also deletes data that may
+// be private and should not be stored in a dump.
+// Memory can also be scanned to see what modules are
+// referenced by stack and backing store memory to allow
+// omission of other modules to reduce dump size.
+// In either of these modes the ModuleReferencedByMemory flag
+// is set for all modules referenced before the base
+// module callbacks occur.
+//
+// On some operating systems a list of modules that were
+// recently unloaded is kept in addition to the currently
+// loaded module list.  This information can be saved in
+// the dump if desired.
+//
+// Stack and backing store memory can be scanned for referenced
+// pages in order to pick up data referenced by locals or other
+// stack memory.  This can increase the size of a dump significantly.
+//
+// Module paths may contain undesired information such as user names
+// or other important directory names so they can be stripped.  This
+// option reduces the ability to locate the proper image later
+// and should only be used in certain situations.
+//
+// Complete operating system per-process and per-thread information can
+// be gathered and stored in the dump.
+//
+// The virtual address space can be scanned for various types
+// of memory to be included in the dump.
+//
+
+
+enum MINIDUMP_TYPE {
+    MiniDumpNormal                         = 0x0000,
+    MiniDumpWithDataSegs                   = 0x0001,
+    MiniDumpWithFullMemory                 = 0x0002,
+    MiniDumpWithHandleData                 = 0x0004,
+    MiniDumpFilterMemory                   = 0x0008,
+    MiniDumpScanMemory                     = 0x0010,
+    MiniDumpWithUnloadedModules            = 0x0020,
+    MiniDumpWithIndirectlyReferencedMemory = 0x0040,
+    MiniDumpFilterModulePaths              = 0x0080,
+    MiniDumpWithProcessThreadData          = 0x0100,
+    MiniDumpWithPrivateReadWriteMemory     = 0x0200,
+};
+
+
+//
+// The minidump callback should modify the FieldsToWrite parameter to reflect
+// what portions of the specified thread or module should be written to the
+// file.
+//
+
+
+alias BOOL function (
+    PVOID CallbackParam,
+    PMINIDUMP_CALLBACK_INPUT CallbackInput,
+    PMINIDUMP_CALLBACK_OUTPUT CallbackOutput
+)
+MINIDUMP_CALLBACK_ROUTINE;
+
+struct MINIDUMP_CALLBACK_INFORMATION {
+    MINIDUMP_CALLBACK_ROUTINE CallbackRoutine;
+    PVOID CallbackParam;
+}
+alias MINIDUMP_CALLBACK_INFORMATION* PMINIDUMP_CALLBACK_INFORMATION;
+
+//
+//
+// PVOID
+// RVA_TO_ADDR(
+//     PVOID Mapping,
+//     ULONG Rva
+//     )
+//
+// Routine Description:
+//
+//     Map an RVA that is contained within a mapped file to it's associated
+//     flat address.
+//
+// Arguments:
+//
+//     Mapping - Base address of mapped file containing the RVA.
+//
+//     Rva - An Rva to fixup.
+//
+// Return Values:
+//
+//     A pointer to the desired data.
+//
+//--
+
+//#define RVA_TO_ADDR(Mapping,Rva) ((PVOID)(((ULONG_PTR) (Mapping)) + (Rva)))
+
+BOOL
+MiniDumpWriteDump(
+    HANDLE hProcess,
+    DWORD ProcessId,
+    HANDLE hFile,
+    MINIDUMP_TYPE DumpType,
+    PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
+    PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
+    PMINIDUMP_CALLBACK_INFORMATION CallbackParam
+    );
+
+BOOL
+MiniDumpReadDumpStream(
+    PVOID BaseOfDump,
+    ULONG StreamNumber,
+    PMINIDUMP_DIRECTORY * Dir,
+    PVOID * StreamPointer,
+    ULONG * StreamSize
+    );
+
+//#include <poppack.h>
+
+}
+
+
+//#endif // _DBGHELP_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/CHANGES	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,30 @@
+ * [Dec/18/06] Fixed: Printf warnings.
+	       Fixed: set_input_buffered to set_input_buffer in documentation.
+	       Added support for INTEL VMX instructions.
+	       API addition: ud_set_vendor(): UD_VENDOR_{INTEL, AMD}.
+	       Fixed: Handling of invalid combination of bytes. No more input re-syncing.
+	       Added Makefiles for win32 build. (Thanks to Xi Hang).
+	       Added Makefile.standalone for "Standalone Udis86".
+	       Fixed: u->inp_end initialization bug.
+	       Fixed: swapgs only in 64bit mode.
+ * [Oct/27/06] 0xF1 is now int1.
+	       Fixed: cast prefix for Group1_op80/82/C0/D0 instructions.
+	       Fixed: lmsw
+	       Added support for Udis86 Standalone.
+ * [Sep/18/06] Fixed: Missing support for o32 for in/out instructions.
+ * [Jul/26/06] Fixed: Missing REX.W in Group1_op83 instructions.
+ * [Jul/16/06] Fixed: rex.b on [rip+disp]
+ * [Jul/15/06] Fixed: Wrongly printing "loopnz" as "loopn" (Thanks to Sanjay Patel)
+ 	       Fixed: Wrongly decoding "out Ib, AL" ((Thanks to Sanjay Patel)
+ * [Jun/8/06]  Missing instructions added. (As per AMD64 Manual Vol3 Rev 3.11 
+               Dec 2005)
+               Fixed minor decoder issues. (Thanks to Sanjay Patel)
+               Fixed issues with input stream buffer. (Thanks to Sanjay Patel)
+ * [May/18/06] Fixed issues with handling of 64-bit values. 
+               Fixed bug in syntax generation for immediate operands in branch
+               instructions.
+               Fixed decoding of (G, W) operands.
+ * [May/12/06] Added support for data types in MS VC++.
+ * [May/11/06] Fixed portability issues concerning inp_uintXX functions in 
+               input.c and 64-bit casting in syn-intel/syn-att.c (Thanks to 
+               Sanjay Patel)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/COPYING	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,22 @@
+Copyright (c) 2002, 2003, 2004, 2005, 2006 <vivek@sig9.com>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, 
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice, 
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice, 
+      this list of conditions and the following disclaimer in the documentation 
+      and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/LICENSE	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,22 @@
+Copyright (c) 2002, 2003, 2004, 2005, 2006 <vivek@sig9.com>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, 
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice, 
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice, 
+      this list of conditions and the following disclaimer in the documentation 
+      and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/Makefile.in	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,28 @@
+# Makefile
+# udis86 - udis86 disassembler for x86(x86-64)
+#
+
+all:
+	cd libudis86 && $(MAKE)
+	cd udcli && $(MAKE)
+install:
+	cd libudis86 && $(MAKE) install
+	cd udcli && $(MAKE) install
+uninstall:
+	cd libudis86 && $(MAKE) uninstall
+	cd udcli && $(MAKE) uninstall
+standalone:
+	cd libudis86 && $(MAKE) -f Makefile.standalone
+clean:
+	cd libudis86 && $(MAKE) clean
+	cd udcli && $(MAKE) clean
+test:
+	nasm test32.asm -f bin -o test.bin
+	udcli -32 < test.bin
+	@read
+	udcli -32 -att < test.bin
+distclean: clean
+	cd libudis86 && $(MAKE) distclean
+	cd udcli && $(MAKE) distclean
+	$(RM) -f config.h test.bin Makefile *.log *~ docs/*~
+	$(RM) -rf autom4te*.cache
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/Makefile.win32	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,15 @@
+# Makefile
+# udis86 - udis86 disassembler for x86(x86-64)
+#
+
+all:
+	cd libudis86 && $(MAKE) -f Makefile.win32
+	cd udcli && $(MAKE) -f Makefile.win32
+	cd tests && $(MAKE) -f Makefile.win32
+clean:
+	cd libudis86 && $(MAKE) clean -f Makefile.win32
+	cd udcli && $(MAKE) clean -f Makefile.win32
+	cd tests && $(MAKE) clean -f Makefile.win32
+test:
+	cd tests && $(MAKE) test16 -f Makefile.win32 && $(MAKE) test32 -f Makefile.win32 && $(MAKE) test64 -f Makefile.win32
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/README	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,40 @@
+Udis86 Disassembler for x86 and x86-64 (AMD64)
+==============================================
+(http://udis86.sourceforge.net/)
+
+Udis86 is an easy-to-use minimalistic disassembler library (libudis86) for the
+x86 and x86-64 (AMD64) range of instruction set architectures. The primary 
+intent of the design and development of udis86 is to aid software development 
+projects that entail binary code analysis.
+
+Salient features of libudis86:
+
+    * Full support for the x86 and x86-64 (AMD64) ISAs.
+    * Includes support for all MMX, SSE, FPU(x87), and AMD 3Dnow! Instructions
+    * Supports 16/32/64 Bits disassembly modes.
+    * Capable of generating output in AT&T or INTEL assembly language syntax.
+    * Supports different types of inputs - File, Buffered, and Hooks.
+    * Thread-safe and Re-entrant.
+
+You can reach the author at vivek[at]sig9[dot]com.
+
+Building Udis86
+===============
+
+On Unix(-like) Systems:
+
+	$ ./configure
+	$ make
+	$ sudo make install
+
+This will build the library as well as a simple command line front end (udcli).
+
+Using libudis86
+===============
+
+See docs/doc.html
+
+Using udcli
+===========
+
+See docs/doc.html
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/config.h.in	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,61 @@
+/* config.h.in.  Generated from configure.in by autoheader.  */
+
+/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
+#undef HAVE_DOPRNT
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `memset' function. */
+#undef HAVE_MEMSET
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the `vprintf' function. */
+#undef HAVE_VPRINTF
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to `unsigned' if <sys/types.h> does not define. */
+#undef size_t
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/config.status	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,681 @@
+#! /bin/sh
+# Generated by configure.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=${CONFIG_SHELL-/bin/sh}
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.  Logging --version etc. is OK.
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by udis86 $as_me 1.4, which was
+generated by GNU Autoconf 2.57.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+config_files=" Makefile libudis86/Makefile udcli/Makefile"
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to <bug-autoconf@gnu.org>."
+ac_cs_version="\
+udis86 config.status 1.4
+configured by ./configure, generated by GNU Autoconf 2.57,
+  with options \"'--prefix=/home/vthampi/software'\"
+
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=.
+INSTALL="/usr/bin/install -c"
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  -*)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_option=$1
+     ac_need_defaults=false;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+if $ac_cs_recheck; then
+  echo "running /bin/sh ./configure " '--prefix=/home/vthampi/software' $ac_configure_extra_args " --no-create --no-recursion" >&6
+  exec /bin/sh ./configure '--prefix=/home/vthampi/software' $ac_configure_extra_args --no-create --no-recursion
+fi
+
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "libudis86/Makefile" ) CONFIG_FILES="$CONFIG_FILES libudis86/Makefile" ;;
+  "udcli/Makefile" ) CONFIG_FILES="$CONFIG_FILES udcli/Makefile" ;;
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./confstat$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t$/@;t t/; /@;t t$/s/[\\&,]/\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t$/,;t t/' >$tmp/subs.sed <<\CEOF
+s,@SHELL@,/bin/sh,;t t
+s,@PATH_SEPARATOR@,:,;t t
+s,@PACKAGE_NAME@,udis86,;t t
+s,@PACKAGE_TARNAME@,udis86,;t t
+s,@PACKAGE_VERSION@,1.4,;t t
+s,@PACKAGE_STRING@,udis86 1.4,;t t
+s,@PACKAGE_BUGREPORT@,vivek@sig9.com,;t t
+s,@exec_prefix@,${prefix},;t t
+s,@prefix@,/home/vthampi/software,;t t
+s,@program_transform_name@,s,x,x,,;t t
+s,@bindir@,${exec_prefix}/bin,;t t
+s,@sbindir@,${exec_prefix}/sbin,;t t
+s,@libexecdir@,${exec_prefix}/libexec,;t t
+s,@datadir@,${prefix}/share,;t t
+s,@sysconfdir@,${prefix}/etc,;t t
+s,@sharedstatedir@,${prefix}/com,;t t
+s,@localstatedir@,${prefix}/var,;t t
+s,@libdir@,${exec_prefix}/lib,;t t
+s,@includedir@,${prefix}/include,;t t
+s,@oldincludedir@,/usr/include,;t t
+s,@infodir@,${prefix}/info,;t t
+s,@mandir@,${prefix}/man,;t t
+s,@build_alias@,,;t t
+s,@host_alias@,,;t t
+s,@target_alias@,,;t t
+s,@DEFS@,-DPACKAGE_NAME=\"udis86\" -DPACKAGE_TARNAME=\"udis86\" -DPACKAGE_VERSION=\"1.4\" -DPACKAGE_STRING=\"udis86\ 1.4\" -DPACKAGE_BUGREPORT=\"vivek@sig9.com\" ,;t t
+s,@ECHO_C@,,;t t
+s,@ECHO_N@,-n,;t t
+s,@ECHO_T@,,;t t
+s,@LIBS@,,;t t
+s,@CC@,gcc,;t t
+s,@CFLAGS@,-g -O2,;t t
+s,@LDFLAGS@,,;t t
+s,@CPPFLAGS@,,;t t
+s,@ac_ct_CC@,gcc,;t t
+s,@EXEEXT@,,;t t
+s,@OBJEXT@,o,;t t
+s,@INSTALL_PROGRAM@,${INSTALL},;t t
+s,@INSTALL_SCRIPT@,${INSTALL},;t t
+s,@INSTALL_DATA@,${INSTALL} -m 644,;t t
+s,@LIBOBJS@,,;t t
+s,@LTLIBOBJS@,,;t t
+CEOF
+
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while $ac_more_lines; do
+    if test $ac_beg -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    else
+      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    fi
+    if test ! -s $tmp/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+      if test -z "$ac_sed_cmds"; then
+  	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+      else
+  	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr $ac_sed_frag + 1`
+      ac_beg=$ac_end
+      ac_end=`expr $ac_end + $ac_max_sed_lines`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds=cat
+  fi
+fi # test -n "$CONFIG_FILES"
+
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+        cat >$tmp/stdin
+        ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$ac_file" : 'X\(//\)[^/]' \| \
+         X"$ac_file" : 'X\(//\)$' \| \
+         X"$ac_file" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$as_dir" : 'X\(//\)[^/]' \| \
+         X"$as_dir" : 'X\(//\)$' \| \
+         X"$as_dir" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
+# absolute.
+ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
+ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd`
+ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
+ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+  esac
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    configure_input=
+  else
+    configure_input="$ac_file.  "
+  fi
+  configure_input=$configure_input"Generated from `echo $ac_file_in |
+                                     sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+         # Absolute (can't be DOS-style, as IFS=:)
+         test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         echo $f;;
+      *) # Relative
+         if test -f "$f"; then
+           # Build tree
+           echo $f
+         elif test -f "$srcdir/$f"; then
+           # Source tree
+           echo $srcdir/$f
+         else
+           # /dev/null tree
+           { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+  sed "/^[ 	]*VPATH[ 	]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ 	]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ 	]*$//;
+}
+
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+  rm -f $tmp/stdin
+  if test x"$ac_file" != x-; then
+    mv $tmp/out $ac_file
+  else
+    cat $tmp/out
+    rm -f $tmp/out
+  fi
+
+done
+
+{ (exit 0); exit 0; }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/configure	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,3080 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.57 for udis86 1.4.
+#
+# Report bugs to <vivek@sig9.com>.
+#
+# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
+# Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete.  It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME='udis86'
+PACKAGE_TARNAME='udis86'
+PACKAGE_VERSION='1.4'
+PACKAGE_STRING='udis86 1.4'
+PACKAGE_BUGREPORT='vivek@sig9.com'
+
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LIBOBJS LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_option in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    eval "enable_$ac_feature=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_$ac_feature='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_$ac_package='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/-/_/g'`
+    eval "with_$ac_package=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+    eval "$ac_envvar='$ac_optarg'"
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+              localstatedir libdir includedir oldincludedir infodir mandir
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$0" : 'X\(//\)[^/]' \| \
+         X"$0" : 'X\(//\)$' \| \
+         X"$0" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+   { (exit 1); exit 1; }; }
+  else
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+  fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+   { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures udis86 1.4 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+  cat <<_ACEOF
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --infodir=DIR          info documentation [PREFIX/info]
+  --mandir=DIR           man documentation [PREFIX/man]
+_ACEOF
+
+  cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of udis86 1.4:";;
+   esac
+  cat <<\_ACEOF
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
+              headers in a nonstandard directory <include dir>
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <vivek@sig9.com>.
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  ac_popdir=`pwd`
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d $ac_dir || continue
+    ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
+# absolute.
+ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
+ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd`
+ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
+ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+    cd $ac_dir
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f $ac_srcdir/configure.gnu; then
+      echo
+      $SHELL $ac_srcdir/configure.gnu  --help=recursive
+    elif test -f $ac_srcdir/configure; then
+      echo
+      $SHELL $ac_srcdir/configure  --help=recursive
+    elif test -f $ac_srcdir/configure.ac ||
+           test -f $ac_srcdir/configure.in; then
+      echo
+      $ac_configure --help
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi
+    cd $ac_popdir
+  done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+  cat <<\_ACEOF
+udis86 configure 1.4
+generated by GNU Autoconf 2.57
+
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
+Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by udis86 $as_me 1.4, which was
+generated by GNU Autoconf 2.57.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+        ac_must_keep_next=false # Got value, back to normal.
+      else
+        case $ac_arg in
+          *=* | --config-cache | -C | -disable-* | --disable-* \
+          | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+          | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+          | -with-* | --with-* | -without-* | --without-* | --x)
+            case "$ac_configure_args0 " in
+              "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+            esac
+            ;;
+          -* ) ac_must_keep_next=true ;;
+        esac
+      fi
+      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+      # Get rid of the leading space.
+      ac_sep=" "
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+{
+  (set) 2>&1 |
+    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      sed -n \
+        "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+    	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+      ;;
+    *)
+      sed -n \
+        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+}
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=$`echo $ac_var`
+      echo "$ac_var='"'"'$ac_val'"'"'"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=$`echo $ac_var`
+        echo "$ac_var='"'"'$ac_val'"'"'"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      sed "/^$/d" confdefs.h | sort
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core core.* *.core &&
+  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+     ' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . $cache_file;;
+      *)                      . ./$cache_file;;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+               sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+  eval ac_new_val="\$ac_env_${ac_var}_value"
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+        { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+        { echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+        { echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+        ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CC" && break
+done
+
+  CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C compiler default output" >&5
+echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+  (eval $ac_link_default) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Find the output, starting from the most likely.  This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+        ;;
+    conftest.$ac_ext )
+        # This is the source file.
+        ;;
+    [ab].out )
+        # We found the default executable, but exeext='' is most
+        # certainly right.
+        break;;
+    *.* )
+        ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+        # FIXME: I believe we export ac_cv_exeext for Libtool,
+        # but it would be cool to find out if it's true.  Does anybody
+        # maintain Libtool? --akim.
+        export ac_cv_exeext
+        break;;
+    * )
+        break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+          export ac_cv_exeext
+          break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX			-qlanglvl=ansi
+# Ultrix and OSF/1	-std1
+# HP-UX 10.20 and later	-Ae
+# HP-UX older versions	-Aa -D_HPUX_SOURCE
+# SVR4			-Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno)
+    echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+  *)
+    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+    CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C.  Since we use `exit',
+# in C++ we need to declare it.  In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+  choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  for ac_declaration in \
+   ''\
+   '#include <stdlib.h>' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f $ac_dir/shtool; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+          if test $ac_prog = install &&
+            grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+            # AIX install.  It has an incompatible calling convention.
+            :
+          elif test $ac_prog = install &&
+            grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+            # program-specific install script used by HP pwplus--don't use.
+            :
+          else
+            ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+            break 3
+          fi
+        fi
+      done
+    done
+    ;;
+esac
+done
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL=$ac_install_sh
+  fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+                              ac_config_files="$ac_config_files Makefile libudis86/Makefile udcli/Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+  (set) 2>&1 |
+    case `(ac_space=' '; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+        "s/'/'\\\\''/g;
+    	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;;
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n \
+        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} |
+  sed '
+     t clear
+     : clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+  if test -w $cache_file; then
+    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+    cat confcache >$cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[ 	]*VPATH[ 	]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ 	]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ 	]*$//;
+}'
+fi
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then we branch to the quote section.  Otherwise,
+# look for a macro that doesn't take arguments.
+cat >confdef2opt.sed <<\_ACEOF
+t clear
+: clear
+s,^[ 	]*#[ 	]*define[ 	][ 	]*\([^ 	(][^ 	(]*([^)]*)\)[ 	]*\(.*\),-D\1=\2,g
+t quote
+s,^[ 	]*#[ 	]*define[ 	][ 	]*\([^ 	][^ 	]*\)[ 	]*\(.*\),-D\1=\2,g
+t quote
+d
+: quote
+s,[ 	`~#$^&*(){}\\|;'"<>?],\\&,g
+s,\[,\\&,g
+s,\],\\&,g
+s,\$,$$,g
+p
+_ACEOF
+# We use echo to avoid assuming a particular line-breaking character.
+# The extra dot is to prevent the shell from consuming trailing
+# line-breaks from the sub-command output.  A line-break within
+# single-quotes doesn't work because, if this script is created in a
+# platform that uses two characters for line-breaks (e.g., DOS), tr
+# would break.
+ac_LF_and_DOT=`echo; echo .`
+DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'`
+rm -f confdef2opt.sed
+
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_i=`echo "$ac_i" |
+         sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+  # 2. Add them.
+  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.  Logging --version etc. is OK.
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by udis86 $as_me 1.4, which was
+generated by GNU Autoconf 2.57.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+udis86 config.status 1.4
+configured by $0, generated by GNU Autoconf 2.57,
+  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  -*)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_option=$1
+     ac_need_defaults=false;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "libudis86/Makefile" ) CONFIG_FILES="$CONFIG_FILES libudis86/Makefile" ;;
+  "udcli/Makefile" ) CONFIG_FILES="$CONFIG_FILES udcli/Makefile" ;;
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./confstat$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+  cat >>$CONFIG_STATUS <<\_ACEOF
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while $ac_more_lines; do
+    if test $ac_beg -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    else
+      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    fi
+    if test ! -s $tmp/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+      if test -z "$ac_sed_cmds"; then
+  	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+      else
+  	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr $ac_sed_frag + 1`
+      ac_beg=$ac_end
+      ac_end=`expr $ac_end + $ac_max_sed_lines`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds=cat
+  fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+        cat >$tmp/stdin
+        ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$ac_file" : 'X\(//\)[^/]' \| \
+         X"$ac_file" : 'X\(//\)$' \| \
+         X"$ac_file" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$as_dir" : 'X\(//\)[^/]' \| \
+         X"$as_dir" : 'X\(//\)$' \| \
+         X"$as_dir" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
+# absolute.
+ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
+ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd`
+ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
+ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+  esac
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    configure_input=
+  else
+    configure_input="$ac_file.  "
+  fi
+  configure_input=$configure_input"Generated from `echo $ac_file_in |
+                                     sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+         # Absolute (can't be DOS-style, as IFS=:)
+         test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         echo $f;;
+      *) # Relative
+         if test -f "$f"; then
+           # Build tree
+           echo $f
+         elif test -f "$srcdir/$f"; then
+           # Source tree
+           echo $srcdir/$f
+         else
+           # /dev/null tree
+           { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+  rm -f $tmp/stdin
+  if test x"$ac_file" != x-; then
+    mv $tmp/out $ac_file
+  else
+    cat $tmp/out
+    rm -f $tmp/out
+  fi
+
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/configure.in	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,7 @@
+AC_INIT(udis86, 1.4, vivek@sig9.com)
+AC_PROG_CC
+AC_PROG_INSTALL
+AC_CONFIG_FILES([Makefile
+                 libudis86/Makefile
+		 udcli/Makefile])
+AC_OUTPUT
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/docs/doc.html	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,537 @@
+<html>
+<head>
+<title>Documentation: Udis86 - Disassembler Library for x86 and AMD64</title>
+<style type="text/css">@import 'style.css';</style>
+<style>
+#api_tab td {
+	vertical-align: top;
+	padding: .4em;
+}
+#api_tab {
+	width: 100%;
+	padding: 0em;
+}
+.func {
+	text-align: center;
+	font-family: monospace;
+}
+
+</style>
+</head>
+<body>
+<div id="topbar"><h1>Udis86 - Disassembler Library for x86 and AMD64</h1></div>
+<div id="wrapper">
+<div id="content">
+
+<a href="index.html">Home</a>
+
+<h1>Documentation</h1>
+<small><i>Dec 19, 2006</i> - Added new API function and Standalone build mode.</small>
+<hr size="1"/>
+<br/>
+<a href="#sec1">1. Using the library - libudis86</a>
+<blockquote>
+	<a href="#sec11">1.1 Compiling and Installing</a> <br/>
+	<blockquote>
+		<a href="#sec111">1.1.1 Standalone Udis86</a> <br/>
+	</blockquote>
+	<a href="#sec12">1.2 Interfacing With Your Program</a> <br/>
+	<a href="#sec13">1.3 A Quick Example</a><br/>
+	<a href="#sec14">1.4 The Udis86 Object</a><br/>
+	<a href="#sec15">1.5 Functions</a><br/>
+	<a href="#sec16">1.6 Examining an Instruction</a>
+</blockquote>
+<a href="#sec2">2. Using the command-line tool - udcli</a>
+<blockquote>
+	<a href="#sec21">2.1 Usage</a> <br/>
+	<a href="#sec22">2.2 Command-line options</a> <br/>
+	<a href="#sec23">2.3 The hexadecimal input mode</a> <br/>
+</blockquote>
+<br/>
+<hr size="1"/>
+
+<a name="sec1"></a>
+<h2>1. Using the library - libudis86</h2>
+
+<p>libudis86 can be used in a variety of situations, and the extent to which you
+need to know the API depends on the functionality you are looking for. At its
+core, libudis86 is a disassembler engine, which when given an input stream of 
+machine code bytes, disassembles them for you to inspect. You could use it,
+simply, to generate assembly language output of the code, or to inspect
+individual instructions, their operands, etc.</p>
+
+<a name="sec11"></a>
+<h3>1.1 Compiling and installing</h3>
+
+<p>libudis86 is developed for Unix-like environments, and steps to installing
+it is very simple. Get the source tarball, unpack it, and,</p>
+<pre>
+$ ./configure
+$ make
+$ make install
+</pre>
+<p>is all you need to do. Ofcourse, you may need to have root privileges to make 
+install. The install scripts copy the necessary header and library files to 
+appropriate locations of in system.
+</p>
+
+<a name="sec111"></a>
+<h4>1.1.1 Standalone Udis86</h4>
+
+<p>Standalone udis86 is (for now) a simple build hack that lets you build
+a single relocatable object file with all of the libudis86 functionality, that you
+could possibly use in any environment, say, a kernel module. The standalone object 
+assumes the availablity of the following functionality in the environment.</p>
+
+<pre>
+- memset()
+- vprintf()
+- sscanf()
+</pre>
+
+<p> To build udis86 in standalone mode, do the following.</p>
+
+<pre>
+$ ./configure
+$ make standalone
+</pre>
+
+which will generate <code>ud_standalone.o</code> in <code>ud/libudis86</code>. This build
+mode is a little hack'ish in nature and hopefully is replaced with better configure scripts
+in the future. If you have ideas, let me know!
+
+<a name="sec12"></a>
+<h3>1.2 Interfacing with your program</h3>
+
+<p>Once you have installed libudis86, to use it with your program, first,
+include in your program the udis86.h header file,
+</p>
+
+<pre>
+#include &lt;udis86.h&gt;
+</pre>
+
+<p>and then, add the following flag to your GCC command-line options.</p>
+
+<pre>
+-ludis86
+</pre>
+
+<a name="sec13"></a>
+<h3>1.3 A Quick Example</h3>
+
+The following code is an example of a program that interfaces with libudis86 and
+uses the API to generate assembly language output for 64-bit code, input from
+STDIN.
+<pre>
+/* simple_example.c */
+
+#include &lt;stdio.h&gt;
+#include &lt;udis86.h&gt;
+
+int main()
+{
+	ud_t ud_obj;
+
+	ud_init(&ud_obj);
+	ud_set_input_file(&ud_obj, stdin);
+	ud_set_mode(&ud_obj, 64);
+	ud_set_syntax(&ud_obj, UD_SYN_INTEL);
+
+	while (ud_disassemble(&ud_obj)) {
+		printf("\t%s\n", ud_insn_asm(&ud_obj));
+	}
+
+ 	return 0;
+}
+</pre>
+To compile the program:
+<pre>
+$ gcc -ludis86 simple_example.c -o simple_example
+</pre>
+
+<p>This example should give you an idea of how this library can
+be used. The following sections describe, in detail, the complete API of 
+libudis86.</p>
+
+<a name="sec14"></a>
+<h3>1.4 The Udis86 Object</h3>
+
+<p>To maintain reentrancy and thread safety, udis86 does not use static data.
+All data related to the disassembly process are stored in a single object, 
+called the udis86 object. So, to use libudis86 you must create an instance of 
+this object,</p>
+
+<pre>
+ud_t my_ud_obj;
+</pre>
+
+and initialize it,
+
+<pre>
+ud_init(&my_ud_obj);
+</pre>
+
+Ofcourse, you can create multiple instances of libudis86 and spawn multiple 
+threads of disassembly. Thats entirely upto how you want to use the library. 
+libudis86 guarantees reentrancy and thread safety.
+
+<a name="sec15"></a>
+<h3>1.5 Functions</h3>
+
+All functions in libudis86 take a pointer to the udis86 object (ud_t) as the first
+argument. The following is a list of all functions available.
+
+
+<ol>
+	<li>
+	<pre>void ud_init (ud_t* ud_obj)</pre>
+	ud_t object initializer. This function must be called on a udis86 object
+	before it can used anywhere else.
+	</li>
+
+	<li>
+	<pre>void ud_set_input_hook(ud_t* ud_obj, int (*hook)())</pre>
+
+	This function sets the input source for the library. To retrieve each 
+	byte in the stream, libudis86 calls back the function pointed to by 
+	"hook".
+
+	The hook function, defined by the user code, must return a single byte
+	of code each time it is called. To signal end-of-input, it must return the 
+	constant, <code>UD_EOI</code>.
+	</li>
+
+	<li>
+	<pre>void ud_set_input_buffer(ud_t* ud_obj, unsigned char* buffer, size_t size);</pre>
+
+	This function sets the input source for the library to a buffer of fixed
+	size.
+	</li>
+
+	<li>
+	<pre>void ud_set_input_file(ud_t* ud_obj, FILE* filep);</pre>
+
+	This function sets the input source for the library to a file pointed to by
+	the passed FILE pointer. Note that the library does not perform any checks,
+	assuming the file pointer to be properly initialized.
+	</li>
+	
+	<li>
+	<pre>void ud_set_mode(ud_t* ud_obj, uint8_t mode_bits);</pre>
+
+	Sets the mode of disassembly. Possible values are 16, 32, and 64. By
+	default, the library works in 32bit mode.
+	</li>
+
+	<li>
+	<pre>void ud_set_pc(ud_t*, uint64_t pc);</pre>
+
+	Sets the program counter (EIP/RIP). This changes the offset of the 
+	assembly output	generated, with direct effect on branch instructions.
+	</li>
+
+	<li>
+	<pre>void ud_set_syntax(ud_t*, void (*translator)(ud_t*));</pre>
+
+	libudis86 disassembles one instruction at a time into an intermediate
+	form that lets you inspect the instruction and its various aspects
+	individually. But to generate the assembly language output, this 
+	intermediate form must be translated. This function sets the translator.
+	There are two inbuilt translators, 
+	<br/>
+	<ul>
+	<li>UD_SYN_INTEL - for INTEL (NASM-like) syntax.</li>
+	<li>UD_SYN_ATT - for AT&amp;T (GAS-like) syntax.</li>
+	</ul>
+	If you do not want libudis86 to translate, you can pass a NULL to the 
+	function, with no more translations thereafter. This is particularily
+	useful for cases when you only want to identify chunks of code and then
+	create the assembly output if needed.
+	<br/><br/>
+	If you want to create your own translator, you must pass a pointer to 
+	function that accepts a pointer to ud_t. This function will be called
+	by libudis86 after each instruction is decoded.
+	</li>
+
+	<li>
+	<pre>void ud_set_vendor(ud_t*, unsigned vendor);</pre>
+
+	Sets the vendor of whose instruction to choose from. This is only useful for
+	selecting the VMX or SVM instruction sets at which point INTEL and AMD have 
+	diverged significantly. At a later stage, support for a more granular 
+	selection of instruction sets maybe added.
+	<br/>
+	<ul>
+	<li>UD_VENDOR_INTEL - for INTEL instruction set.</li>
+	<li>UD_VEDNOR_ATT - for AMD instruction set.</li>
+	</ul>
+	</li>
+
+	<li>
+	<pre>unsigned int ud_disassemble(ud_t*);</pre>
+
+	This function disassembles the next instruction in the input stream.
+	<i>RETURNS</i>, the number of bytes disassembled. A 0 indicates end of 
+	input. 
+	<i>NOTE</i>, to restart disassembly, after the end of input, you must 
+	call one of the input setting functions with the new input source.
+	</li>
+
+	<li>
+	<pre>unsigned int ud_insn_len(ud_t* u);</pre>
+	Returns the number of bytes disassembled.
+	</li>
+
+	
+	<li>
+	<pre>uint64_t ud_insn_off(ud_t*);</pre>
+	Returns the starting offset of the  disassembled instruction relative
+	to the program counter value specified initially.
+	</li>
+
+	<li>
+	<pre>char* ud_insn_hex(ud_t*);</pre>
+	Returns pointer to character string holding the hexadecimal 
+	representation of the disassembled bytes.
+	</li>
+
+	<li>
+	<pre>uint8_t* ud_insn_ptr(ud_t* u);</pre>
+	Returns pointer to the buffer holding the instruction bytes. Use
+	ud_insn_len(), to determine the length of this buffer.
+	</li>
+
+	<li>
+	<pre>char* ud_insn_asm(ud_t* u);</pre>
+	If the syntax is specified, returns pointer to the character string holding
+	assembly language representation of the disassembled instruction.
+	</li>
+
+	<li>
+	<pre>void ud_input_skip(ud_t*, size_t n);</pre>
+	Skips <code>n</code> number of bytes in the input stream.
+	</li>
+</ol>
+
+<a name="sec16"></a>
+<h3>1.6 Examining an Instruction</h3>
+
+After calling ud_disassembly, instructions can be examined by accessing fields 
+of the ud_t object, as described below.
+
+<ol>
+	<li>
+	<pre>ud_mnemonic_code_t ud_obj->mnemonic</pre>
+
+	The mnemonic code for the disassembled instruction. All codes are
+	prefixed by UD_I, such as, <code>UD_Imov, UD_Icall, UD_Ijmp</code>, etc.
+	See a list of mnemonic codes in mnemonics.h.
+	</li>
+
+	<li>
+	<pre>ud_operand_t ud_obj->operand[n]</pre>
+	
+	The array of operands of the disassembled instruction. A maximum of 
+	three operands are allowed, indexed as 0, 1, and 2. Operands can be
+	examined using the their sub-fields as described below.
+	</li>
+
+	<li>
+	<pre>ud_type_t ud_obj->operand[n].type</pre>
+	This field represents the type of the operand n. Possible values are -
+<pre>
+UD_OP_MEM	-	A Memory Addressing Operand.
+UD_OP_REG	-	A Register Operand.
+UD_OP_PTR	-	A Segment:Offset Pointer Operand.
+UD_OP_IMM	-	An Immediate Operand
+UD_OP_JIMM	-	An Immediate Operand for Branch Instructions.
+UD_OP_CONST	-	A Constant Value Operand.
+UD_NONE		-	No Operand.</pre>
+
+	</li>
+
+	<li>
+	<pre>ud_obj->operand[n].size</pre>
+	This field gives the size of operand n. Possible values are - 8, 16, 32, 48, 64.
+	</li>
+
+	<li>
+	<pre>
+ud_obj->operand[n].base
+ud_obj->operand[n].index
+ud_obj->operand[n].scale
+ud_obj->operand[n].offset
+ud_obj->operand[n].lval</pre>
+
+	For operands of type <code>UD_OP_MEM</code>, 
+	<ul>
+	<li><code>ud_obj->operand[n].base</code> is the base register (if any),</li>
+	<li><code>ud_obj->operand[n].index</code> is the index register (if any),</li>
+	<li><code>ud_obj->operand[n].scale</code> is the scale (if any), </li>
+	<li><code>ud_obj->operand[n].offset</code> is the size of displacement/offset to be added (8,16,32,64),</li>
+	<li><code>ud_obj->operand[n].lval</code> is displacement/offset (if any).</li>
+	</ul>
+
+	For operands of type <code>UD_OP_REG</code>, 
+	<ul>
+	<li><code>ud_obj->operand[n].base</code> field gives the register.</li>
+	</ul>
+
+	For operands of type <code>UD_OP_PTR</code>,
+	<ul> 
+	<li><code>ud_obj->operand[n].lval</code> holds the segment:offset.</li>
+	<li><code>ud_obj->operand[n].size</code> can have two values 32 
+		(for 16:16 seg:off) and 48 (for 16:32 seg:off).</li>
+	</ul>
+
+	For operands of type <code>UD_OP_IMM, UD_OP_JIMM, UD_OP_CONST</code>,
+	<ul> 
+	<li><code>ud_obj->operand[n].lval</code> holds the value.</li>
+	</ul>
+
+	Possible values for <code>ud_obj->operand[n].base</code> and <code>ud_obj->operand[n].index</code>.
+  <pre>
+  /* No register */
+  UD_NONE, 
+
+  /* 8 bit GPRs */
+  UD_R_AL,	UD_R_CL,	UD_R_DL,	UD_R_BL,
+  UD_R_AH,	UD_R_CH,	UD_R_DH,	UD_R_BH,
+  UD_R_SPL,	UD_R_BPL,	UD_R_SIL,	UD_R_DIL,
+  UD_R_R8B,	UD_R_R9B,	UD_R_R10B,	UD_R_R11B,
+  UD_R_R12B,	UD_R_R13B,	UD_R_R14B,	UD_R_R15B,
+
+  /* 16 bit GPRs */
+  UD_R_AX,	UD_R_CX,	UD_R_DX,	UD_R_BX,
+  UD_R_SP,	UD_R_BP,	UD_R_SI,	UD_R_DI,
+  UD_R_R8W,	UD_R_R9W,	UD_R_R10W,	UD_R_R11W,
+  UD_R_R12W,	UD_R_R13W,	UD_R_R14W,	UD_R_R15W,
+	
+  /* 32 bit GPRs */
+  UD_R_EAX,	UD_R_ECX,	UD_R_EDX,	UD_R_EBX,
+  UD_R_ESP,	UD_R_EBP,	UD_R_ESI,	UD_R_EDI,
+  UD_R_R8D,	UD_R_R9D,	UD_R_R10D,	UD_R_R11D,
+  UD_R_R12D,	UD_R_R13D,	UD_R_R14D,	UD_R_R15D,
+	
+  /* 64 bit GPRs */
+  UD_R_RAX,	UD_R_RCX,	UD_R_RDX,	UD_R_RBX,
+  UD_R_RSP,	UD_R_RBP,	UD_R_RSI,	UD_R_RDI,
+  UD_R_R8,	UD_R_R9,	UD_R_R10,	UD_R_R11,
+  UD_R_R12,	UD_R_R13,	UD_R_R14,	UD_R_R15,
+
+  /* segment registers */
+  UD_R_ES,	UD_R_CS,	UD_R_SS,	UD_R_DS,
+  UD_R_FS,	UD_R_GS,	
+
+  /* control registers*/
+  UD_R_CR0,	UD_R_CR1,	UD_R_CR2,	UD_R_CR3,
+  UD_R_CR4,	UD_R_CR5,	UD_R_CR6,	UD_R_CR7,
+  UD_R_CR8,	UD_R_CR9,	UD_R_CR10,	UD_R_CR11,
+  UD_R_CR12,	UD_R_CR13,	UD_R_CR14,	UD_R_CR15,
+	
+  /* debug registers */
+  UD_R_DR0,	UD_R_DR1,	UD_R_DR2,	UD_R_DR3,
+  UD_R_DR4,	UD_R_DR5,	UD_R_DR6,	UD_R_DR7,
+  UD_R_DR8,	UD_R_DR9,	UD_R_DR10,	UD_R_DR11,
+  UD_R_DR12,	UD_R_DR13,	UD_R_DR14,	UD_R_DR15,
+
+  /* mmx registers */
+  UD_R_MM0,	UD_R_MM1,	UD_R_MM2,	UD_R_MM3,
+  UD_R_MM4,	UD_R_MM5,	UD_R_MM6,	UD_R_MM7,
+
+  /* x87 registers */
+  UD_R_ST0,	UD_R_ST1,	UD_R_ST2,	UD_R_ST3,
+  UD_R_ST4,	UD_R_ST5,	UD_R_ST6,	UD_R_ST7, 
+
+  /* extended multimedia registers */
+  UD_R_XMM0,	UD_R_XMM1,	UD_R_XMM2,	UD_R_XMM3,
+  UD_R_XMM4,	UD_R_XMM5,	UD_R_XMM6,	UD_R_XMM7,
+  UD_R_XMM8,	UD_R_XMM9,	UD_R_XMM10,	UD_R_XMM11,
+  UD_R_XMM12,	UD_R_XMM13,	UD_R_XMM14,	UD_R_XMM15,
+
+  UD_R_RIP</pre>
+
+  Possible values for <code>ud_obj->operand[n].lval</code> depend on <code>ud_obj->operand[n].size</code>,
+  based on which you could use its sub-fields to access the integer values.
+
+  <pre>
+ud_obj->operand[n].lval.sbyte		- Signed Byte
+ud_obj->operand[n].lval.ubyte		- Unsigned Byte
+ud_obj->operand[n].lval.sword		- Signed Word
+ud_obj->operand[n].lval.uword		- Unsigned Word
+ud_obj->operand[n].lval.sdword		- Signed Double Word
+ud_obj->operand[n].lval.udword		- Unsined Double Word
+ud_obj->operand[n].lval.sqword		- Signed Quad Word
+ud_obj->operand[n].lval.uqword		- Unsigned Quad Word
+ud_obj->operand[n].lval.ptr.seg		- Pointer Segment in Segment:Offset
+ud_obj->operand[n].lval.ptr.off		- Pointer Offset in Segment:Offset </pre>
+
+	<li>Prefix Fields - These fields store prefixes (if found). If a prefix
+	does not exists then the field corresponding to it has the value <code>UD_NONE</code>.
+	<pre>
+ud_obj->operand[n].pfx_rex		- 64-bit mode REX prefix
+ud_obj->operand[n].pfx_seg		- Segment register prefix
+ud_obj->operand[n].pfx_opr		- Operand-size prefix (66h)
+ud_obj->operand[n].pfx_adr		- Address-size prefix (67h)
+ud_obj->operand[n].pfx_lock		- Lock prefix
+ud_obj->operand[n].pfx_rep		- Rep prefix
+ud_obj->operand[n].pfx_repe		- Repe prefix
+ud_obj->operand[n].pfx_repne		- Repne prefix</pre>
+	</li>
+
+	Possible values for <code>ud_obj->operand[n].pfx_seg</code> are,
+	<pre>
+UD_R_ES,	UD_R_CS,	UD_R_SS,	UD_R_DS,
+UD_R_FS,	UD_R_GS,	UD_NONE</pre>
+	</li>
+
+	<li>
+	<pre>uint4_t ud_obj->pc</pre>
+	The program counter.
+	</li>
+</ol>
+
+<a name="sec2"></a>
+<h2>2. Using the command-line tool - udcli</h2>
+
+A front-end incarnation of this library, udcli is a small command-line tool for 
+your quick disassembly needs.
+
+<a name="sec21"></a>
+<h3>2.1 Usage</h3>
+<pre>$ udcli [-option[s]] file</pre>
+
+<a name="sec22"></a>
+<h3>2.2 Options</h3>
+<pre>
+-16      : Set the disassembly mode to 16 bits.
+-32      : Set the disassembly mode to 32 bits. (default)
+-64      : Set the disassembly mode to 64 bits.
+-intel   : Set the output to INTEL (NASM like) syntax. (default)
+-att     : Set the output to AT&amp;T (GAS like) syntax.
+-v &lt;v&gt;   : Set vendor. &lt;v&gt; = {intel, amd} 
+-o &lt;pc&gt;  : Set the value of program counter to <pc>. (default = 0)
+-s &lt;pc&gt;  : Set the number of bytes to skip before disassembly to <n>.
+-c &lt;pc&gt;  : Set the number of bytes to disassemble to <n>.
+-x       : Set the input mode to whitespace seperated 8-bit numbers in
+           hexadecimal representation. Example: 0f 01 ae 00
+-noff    : Do not display the offset of instructions.
+-nohex   : Do not display the hexadecimal code of instructions.
+-h       : Display help message.</pre>
+
+<a name="sec23"></a>
+<h3>2.3 The hexadecimal input mode</h3>
+
+Noteworthy among the command-line options of the udcli is "-x" which sets the
+input mode to whitespace seperated 8-bit numbers in hexadecimal representation.
+This could come as a handy tool, for quickly disassembling hexadecimal 
+representation of machine code, like those generated during software crashes, etc.
+
+<div style="text-align:center; padding: 1em;">
+<img src="ss.jpg" style="border: 1px double; padding: 2px;"/>
+</div>
+
+<div style="text-align:center"><small>&copy; 2006 Vivek Mohan</small></div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/docs/index.html	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,63 @@
+<html>
+<head>
+<title>Udis86 - Disassembler Library for x86 and AMD64 (x86-64)</title>
+<style type="text/css">@import 'style.css';</style>
+</head>
+<body>
+<div id="topbar"><h1>Udis86 - Disassembler Library for x86 and AMD64</h1></div>
+<div id="wrapper">
+<div id="content">
+
+<a href="doc.html">Documentation</a> &middot;
+<a href="http://sourceforge.net/projects/udis86">Project Page</a> &middot;
+<a href="#author">Author</a>
+
+<p>Udis86 is an easy-to-use minimalistic disassembler library (<i>libudis86</i>) 
+for the x86 and AMD64 (x86-64) range of instruction set architectures. The primary
+intent of the design and development of udis86 is to aid software development 
+projects that entail binary code analysis.</p>
+
+<div class="box">
+<a href="http://sourceforge.net/project/showfiles.php?group_id=96233">Download</a>: <a href="http://prdownloads.sourceforge.net/udis86/udis86-1.4.tar.gz?download">udis86-1.4.tar.gz</a>
+</div>
+
+<h2>libudis86</h2>
+	<ol>
+	<li>Full support for the <i>x86 and x86-64 (AMD64)</i> range of instruction set
+	architectures.</li>
+	<li>Full support  for all <i> AMD-V, INTEL-VMX, MMX, SSE, SSE2, SSE3, FPU(x87), and 
+	AMD 3Dnow! </i>	instructions.</li>
+	<li>Supports 16bit, 32bit, and 64bit disassembly modes.</li>
+	<li>Generates output in <i>AT&T</i> or <i>INTEL</i> assembler language syntaxes.</li>
+	<li>Supports flexbile input methods: File, Buffer, and Hooks.</li>
+	<li>Thread-safe and Reentrant.</li>
+	<li>Clean and very easy-to-use API.</li>
+	<li<b><i>New!</i></b> <a href="doc.html#sec111">The new standalone build system</a> 
+	makes udis86 usable and embeddable in kernel code (or other environments which, say,
+	lack <i>libc</i>).</li>
+	</ol>
+
+	See <a href="doc.html#sec1">Usage</a>.
+
+<h2>udcli</h2>
+
+A front-end incarnation of this library, udcli is a small command-line tool 
+for your quick disassembly needs. 
+<br/>
+<div style="text-align:center; padding: 1em;">
+<img src="ss.jpg" style="border: 1px double; padding: 2px;"/>
+</div>
+See <a href="doc.html#sec2">Usage</a>.
+
+<a name="author"></a>
+<h2>Author</h2>
+
+<p>Udis86 is a creation of <a href="http://sig9.com/vivek/">Vivek Mohan</a>.
+You can reach me at <i>vivek[at]sig9[dot]com</i>. Please let me know if you are
+using udis86, have ideas for it, or would like to comment on it.</p>
+
+<div style="text-align:center"><small>&copy; 2006 Vivek Mohan</small></div>
+</div>
+</div>
+</body>
+</html>
Binary file udis86-1.4/docs/ss.jpg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/docs/style.css	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,65 @@
+body {
+	font: 76%, sans-serif;
+	background-color: #fff;
+	margin: 0;
+	padding: 0;
+}
+
+#topbar {
+	margin-top: 0px;
+	padding: 1em;
+	background-color: skyblue;
+	color: navy;
+}
+#topbar h1 {
+	padding: 0;
+	margin: 0;
+	font: 2em, sans-serif;
+	font-weight: bold;
+}
+
+#wrapper {
+	width: 750px;
+}
+
+#menu {
+}
+#content a {
+	text-decoration: none;
+	color: navy;
+	border-bottom: 1px solid;
+}
+
+#content {
+	margin-left: 10px;
+	font-size: 1.1em;
+	padding: 1em;
+	vertical-align: top;
+	border-left: 1px solid skyblue;
+	border-right: 1px solid skyblue;
+}
+
+.box {
+	background-color: #efefef;
+	border: 1px dotted #aaa;
+	padding: .5em;
+}
+
+li {
+	margin-bottom: .5em;
+}
+
+pre {
+	padding: .5em;	
+	background-color: #f5f5f5;
+	font-size: 1.1em;
+	border: 1px solid #999;
+}
+
+code {
+	font-size: 1.2em;
+}
+
+ul {
+	margin: 1em;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/install-sh	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,251 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission.  M.I.T. makes no representations about the
+# suitability of this software for any purpose.  It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+	-c) instcmd="$cpprog"
+	    shift
+	    continue;;
+
+	-d) dir_arg=true
+	    shift
+	    continue;;
+
+	-m) chmodcmd="$chmodprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-o) chowncmd="$chownprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-g) chgrpcmd="$chgrpprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-s) stripcmd="$stripprog"
+	    shift
+	    continue;;
+
+	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
+	    shift
+	    continue;;
+
+	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+	    shift
+	    continue;;
+
+	*)  if [ x"$src" = x ]
+	    then
+		src=$1
+	    else
+		# this colon is to work around a 386BSD /bin/sh bug
+		:
+		dst=$1
+	    fi
+	    shift
+	    continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+	echo "install:	no input file specified"
+	exit 1
+else
+	true
+fi
+
+if [ x"$dir_arg" != x ]; then
+	dst=$src
+	src=""
+	
+	if [ -d $dst ]; then
+		instcmd=:
+		chmodcmd=""
+	else
+		instcmd=mkdir
+	fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad 
+# if $src (and thus $dsttmp) contains '*'.
+
+	if [ -f $src -o -d $src ]
+	then
+		true
+	else
+		echo "install:  $src does not exist"
+		exit 1
+	fi
+	
+	if [ x"$dst" = x ]
+	then
+		echo "install:	no destination specified"
+		exit 1
+	else
+		true
+	fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+	if [ -d $dst ]
+	then
+		dst="$dst"/`basename $src`
+	else
+		true
+	fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='	
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+	pathcomp="${pathcomp}${1}"
+	shift
+
+	if [ ! -d "${pathcomp}" ] ;
+        then
+		$mkdirprog "${pathcomp}"
+	else
+		true
+	fi
+
+	pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+	$doit $instcmd $dst &&
+
+	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+	if [ x"$transformarg" = x ] 
+	then
+		dstfile=`basename $dst`
+	else
+		dstfile=`basename $dst $transformbasename | 
+			sed $transformarg`$transformbasename
+	fi
+
+# don't allow the sed command to completely eliminate the filename
+
+	if [ x"$dstfile" = x ] 
+	then
+		dstfile=`basename $dst`
+	else
+		true
+	fi
+
+# Make a temp file name in the proper directory.
+
+	dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+	$doit $instcmd $src $dsttmp &&
+
+	trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+	$doit $rmcmd -f $dstdir/$dstfile &&
+	$doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/libudis86/Makefile.in	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,68 @@
+# Makefile - libudis86
+#
+#
+
+SHELL		= @SHELL@
+top_srcdir	= @top_srcdir@
+srcdir		= @srcdir@
+CC		= @CC@
+CFLAGS		= @CFLAGS@ -Wall -O2
+LIBS		= @LIBS@
+INSTALL		= @INSTALL@
+INSTALL_PROGRAM	= @INSTALL_PROGRAM@
+INSTALL_DATA	= @INSTALL_DATA@
+prefix		= @prefix@
+exec_prefix	= ${prefix}
+bindir		= $(exec_prefix)/bin
+libdir		= $(prefix)/lib
+mandir		= @mandir@
+includedir	= @includedir@
+AR		= ar
+RM		= rm
+PERL		= perl
+
+.SUFFIXES: .c .o
+.c.o:
+	$(CC) -c $(CFLAGS) -o $@ $<
+
+OBJS =	mnemonics.o \
+	opcmap.o \
+	input.o \
+	decode.o \
+	syn.o \
+	syn-intel.o \
+	syn-att.o \
+	udis86.o
+
+libudis86.a: $(OBJS)
+	$(AR) -r libudis86.a $(OBJS)
+mnemonics.c: mnemonics.dat
+	$(PERL) mnemonics.pl < mnemonics.dat
+mnemonics.h: mnemonics.dat
+	$(PERL) mnemonics.pl < mnemonics.dat
+input.c: input.h types.h
+opcmap.c: opcmap.h input.h types.h
+decode.c: opcmap.h input.h types.h extern.h
+syn-intel.c: syn.h input.h types.h opcmap.h 
+syn-att.c: syn.h input.h types.h opcmap.h 
+syn.c: syn.h types.h opcmap.h 
+udis86.c: input.h syn.h types.h extern.h
+
+install: libudis86.a
+	$(INSTALL_PROGRAM) $(srcdir)/libudis86.a $(INSTALLROOT)$(libdir)/libudis86.a
+	$(srcdir)/../mkinstalldirs $(INSTALLROOT)$(includedir)/libudis86
+	$(INSTALL_DATA) $(srcdir)/../udis86.h $(INSTALLROOT)$(includedir)/udis86.h
+	$(INSTALL_DATA) $(srcdir)/types.h $(INSTALLROOT)$(includedir)/libudis86/types.h
+	$(INSTALL_DATA) $(srcdir)/extern.h $(INSTALLROOT)$(includedir)/libudis86/extern.h
+	$(INSTALL_DATA) $(srcdir)/mnemonics.h $(INSTALLROOT)$(includedir)/libudis86/mnemonics.h
+
+uninstall:
+	$(RM) -f $(INSTALLROOT)$(libdir)/libudis86.a
+	$(RM) -frd $(INSTALLROOT)$(includedir)/libudis86
+	$(RM) -f $(INSTALLROOT)$(includedir)/udis86.h
+clean:
+	$(MAKE) clean -f Makefile.standalone
+	$(RM) -f core $(srcdir)/*.o $(srcdir)/*.a *~
+
+distclean: clean
+	$(RM) -f config.h Makefile *~ *.log
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/libudis86/Makefile.standalone	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,26 @@
+# Udis86 Standalone
+#
+#
+
+LDFLAGS += -r
+CFLAGS += -Wall -O2
+UD_STANDALONE ?= ud_standalone.o
+
+.PHONY: clean
+.SUFFIXES: .c .o
+.c.o:
+	$(CC) -c $(CFLAGS) -D__UD_STANDALONE__ -o $@ $<
+
+OBJS =	mnemonics.o \
+	opcmap.o \
+	input.o \
+	decode.o \
+	syn.o \
+	syn-intel.o \
+	syn-att.o \
+	udis86.o
+
+$(UD_STANDALONE): clean $(OBJS)
+	$(LD) $(LDFLAGS) $(OBJS) -o $@
+clean:
+	$(RM) -f $(OBJS) $(UD_STANDALONE)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/libudis86/Makefile.win32	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,44 @@
+# Makefile - libudis86
+#
+#
+
+SHELL		= @SHELL@
+top_srcdir	= @top_srcdir@
+srcdir		= @srcdir@
+CC		= cl
+CFLAGS		= /O2
+AR		= lib
+RM		= del
+PERL		= perl
+
+.SUFFIXES: .c .obj
+.c.obj:
+	$(CC) -c $(CFLAGS) -o $@ $<
+
+OBJS =	mnemonics.obj \
+	opcmap.obj \
+	input.obj \
+	decode.obj \
+	syn.obj \
+	syn-intel.obj \
+	syn-att.obj \
+	udis86.obj
+
+libudis86.a: $(OBJS)
+	$(AR) /out:udis86.lib $(OBJS)
+
+mnemonics.c: mnemonics.dat
+	$(PERL) mnemonics.pl < mnemonics.dat
+mnemonics.h: mnemonics.dat
+	$(PERL) mnemonics.pl < mnemonics.dat
+input.c: input.h types.h
+opcmap.c: opcmap.h input.h types.h
+decode.c: opcmap.h input.h types.h extern.h
+syn-intel.c: syn.h input.h types.h opcmap.h 
+syn-att.c: syn.h input.h types.h opcmap.h 
+syn.c: syn.h types.h opcmap.h 
+udis86.c: input.h syn.h types.h extern.h
+
+clean:
+	$(RM) *.obj *.lib
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/libudis86/decode.c	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,933 @@
+/* -----------------------------------------------------------------------------
+ * decode.c
+ *
+ * Copyright (c) 2005, 2006, Vivek Mohan <vivek@sig9.com>
+ * All rights reserved. See LICENSE
+ * -----------------------------------------------------------------------------
+ */
+
+#include <string.h>
+#include "types.h"
+#include "input.h"
+#include "opcmap.h"
+#include "mnemonics.h"
+
+/* The max number of prefixes to an instruction */
+#define MAX_PREFIXES	15
+
+/* register types */
+#define T_NONE	0
+#define T_GPR	1
+#define T_MMX	2
+#define T_CRG	3
+#define T_DBG	4
+#define T_SEG	5
+#define T_XMM	6
+
+struct map_entry* ud_me_db();
+struct map_entry* ud_me_invalid();
+
+/* -----------------------------------------------------------------------------
+ * resolve_oprsize()- Resolves the size of operand depending on the current
+ * disassembly mode, effective operand sizes, etc.
+ * -----------------------------------------------------------------------------
+ */
+static unsigned int 
+resolve_oprsize(register struct ud* u, unsigned int s)
+{
+  switch (s) {
+	case SZ_V:	return (u->opr_mode);
+	case SZ_Z:	return (u->opr_mode == 16) ? 16 : 32;
+	case SZ_P:	return (u->opr_mode == 16) ? SZ_WP : SZ_DP;
+	case SZ_MDQ:	return (u->opr_mode == 16) ? 32 : u->opr_mode;
+	case SZ_RDQ:	return (u->dis_mode == 64) ? 64 : 32;
+	default:	return s;
+  }
+}
+
+/* -----------------------------------------------------------------------------
+ * resolve_mnemonic()- Resolves the correct mnemonic that depends on the 
+ * current effective operand or address mode.
+ * -----------------------------------------------------------------------------
+ */
+static enum ud_mnemonic_code 
+resolve_mnemonic(register struct ud* u)
+{
+
+  if (u->opr_mode == 32) {
+	switch(u->mnemonic) {
+		case UD_Icbw: 		return UD_Icwde;
+		case UD_Icwd: 		return UD_Icdq;
+		case UD_Ilodsw: 	return UD_Ilodsd;
+		case UD_Imovsw: 	return UD_Imovsd;
+		case UD_Icmpsw: 	return UD_Icmpsd;
+		case UD_Iinsw: 		return UD_Iinsd;
+		case UD_Ioutsw: 	return UD_Ioutsd;
+		case UD_Ipushfw:	return UD_Ipushfd;
+		case UD_Ipopfw: 	return UD_Ipopfd;
+		case UD_Istosw: 	return UD_Istosd;
+		case UD_Iscasw: 	return UD_Iscasd;
+		case UD_Iiretw: 	return UD_Iiretd;
+		case UD_Ipusha:		return UD_Ipushad;
+		case UD_Ipopa:		return UD_Ipopad;
+		default: 		break;
+	}
+  }
+
+  if (u->opr_mode == 64) {
+	switch(u->mnemonic) {
+		case UD_Icbw:		return UD_Icdqe;
+		case UD_Icwd:		return UD_Icqo;
+		case UD_Ilodsw: 	return UD_Ilodsq;
+		case UD_Imovsw: 	return UD_Imovsq;
+		case UD_Icmpsw: 	return UD_Icmpsq;
+		case UD_Iinsw:		return UD_Iinsd;
+		case UD_Ioutsw:		return UD_Ioutsd;
+		case UD_Icmpxchg8b:	return UD_Icmpxchg16b;		
+		case UD_Istosw:		return UD_Istosq;
+		case UD_Iscasw:		return UD_Iscasq;
+		case UD_Iiretw:		return UD_Iiretq;
+		case UD_Ipushfw:	return UD_Ipushfq;
+		case UD_Ipopfw:		return UD_Ipopfq;
+		default: 		break; 
+	} 
+  } 
+  
+  if (u->mnemonic == UD_Iswapgs && u->dis_mode != 64) {
+		u->error = 1;
+  }
+  
+  if (u->adr_mode == 32) {
+	switch(u->mnemonic) {
+		case UD_Ijcxz:		return UD_Ijecxz;
+		default:		break; 
+	} 
+  }
+
+  if (u->adr_mode == 64) {
+	switch(u->mnemonic) {
+		case UD_Ijcxz:		return UD_Ijrcxz;
+		default:		break; 
+	} 
+  }
+
+  return u->mnemonic;
+}
+
+
+/* -----------------------------------------------------------------------------
+ * decode_a()- Decodes operands of the type seg:offset
+ * -----------------------------------------------------------------------------
+ */
+static void 
+decode_a(struct ud* u, struct ud_operand *op)
+{
+  if (u->opr_mode == 16) {	
+	/* seg16:off16 */
+	op->type = UD_OP_PTR;
+	op->size = 32;
+	op->lval.ptr.off = inp_uint16(u);
+	op->lval.ptr.seg = inp_uint16(u);
+  } else {
+	/* seg16:off32 */
+	op->type = UD_OP_PTR;
+	op->size = 48;
+	op->lval.ptr.off = inp_uint32(u);
+	op->lval.ptr.seg = inp_uint16(u);
+  }
+}
+
+/* -----------------------------------------------------------------------------
+ * decode_gpr() - Returns decoded General Purpose Register 
+ * -----------------------------------------------------------------------------
+ */
+static enum ud_type 
+decode_gpr(register struct ud* u, unsigned int s, unsigned char rm)
+{
+  s = resolve_oprsize(u, s);
+		
+  switch (s) {
+	case 64:
+		return UD_R_RAX + rm;
+	case SZ_DP:
+	case 32:
+		return UD_R_EAX + rm;
+	case SZ_WP:
+	case 16:
+		return UD_R_AX  + rm;
+	case  8:
+		if (u->dis_mode == 64 && u->pfx_rex) {
+			if (rm >= 4)
+				return UD_R_SPL + (rm-4);
+			return UD_R_AL + rm;
+		} else return UD_R_AL + rm;
+	default:
+		return 0;
+  }
+}
+
+/* -----------------------------------------------------------------------------
+ * resolve_gpr64() - 64bit General Purpose Register-Selection. 
+ * -----------------------------------------------------------------------------
+ */
+static enum ud_type 
+resolve_gpr64(struct ud* u, enum map_operand_type gpr_op)
+{
+  if (gpr_op >= OP_rAXr8 && gpr_op <= OP_rDIr15)
+	gpr_op = (gpr_op - OP_rAXr8) | (P_REX_B(u->pfx_rex) << 3);			
+  else	gpr_op = (gpr_op - OP_rAX);
+
+  if (u->opr_mode == 16)
+	return gpr_op + UD_R_AX;
+  if (u->dis_mode == 32 || 
+	(u->opr_mode == 32 && ! (P_REX_W(u->pfx_rex) || u->default64))) {
+	return gpr_op + UD_R_EAX;
+  }
+
+  return gpr_op + UD_R_RAX;
+}
+
+/* -----------------------------------------------------------------------------
+ * resolve_gpr32 () - 32bit General Purpose Register-Selection. 
+ * -----------------------------------------------------------------------------
+ */
+static enum ud_type 
+resolve_gpr32(struct ud* u, enum map_operand_type gpr_op)
+{
+  gpr_op = gpr_op - OP_eAX;
+
+  if (u->opr_mode == 16) 
+	return gpr_op + UD_R_AX;
+
+  return gpr_op +  UD_R_EAX;
+}
+
+/* -----------------------------------------------------------------------------
+ * resolve_reg() - Resolves the register type 
+ * -----------------------------------------------------------------------------
+ */
+static enum ud_type 
+resolve_reg(struct ud* u, unsigned int type, unsigned char i)
+{
+  switch (type) {
+	case T_MMX :	return UD_R_MM0  + (i & 7);
+	case T_XMM :	return UD_R_XMM0 + i;
+	case T_CRG :	return UD_R_CR0  + i;
+	case T_DBG :	return UD_R_DR0  + i;
+	case T_SEG :	return UD_R_ES   + (i & 7);
+	case T_NONE:
+	default:	return UD_NONE;
+  }
+}
+
+/* -----------------------------------------------------------------------------
+ * decode_imm() - Decodes Immediate values.
+ * -----------------------------------------------------------------------------
+ */
+static void 
+decode_imm(struct ud* u, unsigned int s, struct ud_operand *op)
+{
+  op->size = resolve_oprsize(u, s);
+  op->type = UD_OP_IMM;
+
+  switch (op->size) {
+	case  8: op->lval.sbyte = inp_uint8(u);	  break;
+	case 16: op->lval.uword = inp_uint16(u);  break;
+	case 32: op->lval.udword = inp_uint32(u); break;
+	case 64: op->lval.uqword = inp_uint64(u); break;
+	default: return;
+  }
+}
+
+/* -----------------------------------------------------------------------------
+ * decode_modrm() - Decodes ModRM Byte
+ * -----------------------------------------------------------------------------
+ */
+static void 
+decode_modrm(struct ud* u, struct ud_operand *op, unsigned int s, 
+	     unsigned char rm_type, struct ud_operand *opreg, 
+	     unsigned char reg_size, unsigned char reg_type)
+{
+  unsigned char mod, rm, reg;
+
+  inp_next(u);
+
+  /* get mod, r/m and reg fields */
+  mod = MODRM_MOD(inp_curr(u));
+  rm  = (P_REX_B(u->pfx_rex) << 3) | MODRM_RM(inp_curr(u));
+  reg = (P_REX_R(u->pfx_rex) << 3) | MODRM_REG(inp_curr(u));
+
+  op->size = resolve_oprsize(u, s);
+
+  /* if mod is 11b, then the UD_R_m specifies a gpr/mmx/sse/control/debug */
+  if (mod == 3) {
+	op->type = UD_OP_REG;
+	if (rm_type == 	T_GPR)
+		op->base = decode_gpr(u, op->size, rm);
+	else	op->base = resolve_reg(u, rm_type, (P_REX_R(u->pfx_rex) << 3) | (rm&7));
+  } 
+  /* else its memory addressing */  
+  else {
+	op->type = UD_OP_MEM;
+
+	/* 64bit addressing */
+	if (u->adr_mode == 64) {
+
+		op->base = UD_R_RAX + rm;
+
+		/* get offset type */
+		if (mod == 1)
+			op->offset = 8;
+		else if (mod == 2)
+			op->offset = 32;
+		else if (mod == 0 && (rm & 7) == 5) {			
+			op->base = UD_R_RIP;
+			op->offset = 32;
+		} else  op->offset = 0;
+
+		/* Scale-Index-Base (SIB) */
+		if ((rm & 7) == 4) {
+			inp_next(u);
+			
+			op->scale = (1 << SIB_S(inp_curr(u))) & ~1;
+			op->index = UD_R_RAX + (SIB_I(inp_curr(u)) | (P_REX_X(u->pfx_rex) << 3));
+			op->base  = UD_R_RAX + (SIB_B(inp_curr(u)) | (P_REX_B(u->pfx_rex) << 3));
+
+			/* special conditions for base reference */
+			if (op->index == UD_R_RSP) {
+				op->index = UD_NONE;
+				op->scale = UD_NONE;
+			}
+
+			if (op->base == UD_R_RBP || op->base == UD_R_R13) {
+				if (mod == 0) 
+					op->base = UD_NONE;
+				if (mod == 1)
+					op->offset = 8;
+				else op->offset = 32;
+			}
+		}
+	} 
+
+	/* 32-Bit addressing mode */
+	else if (u->adr_mode == 32) {
+
+		/* get base */
+		op->base = UD_R_EAX + rm;
+
+		/* get offset type */
+		if (mod == 1)
+			op->offset = 8;
+		else if (mod == 2)
+			op->offset = 32;
+		else if (mod == 0 && rm == 5) {
+			op->base = UD_NONE;
+			op->offset = 32;
+		} else  op->offset = 0;
+
+		/* Scale-Index-Base (SIB) */
+		if ((rm & 7) == 4) {
+			inp_next(u);
+
+			op->scale = (1 << SIB_S(inp_curr(u))) & ~1;
+			op->index = UD_R_EAX + (SIB_I(inp_curr(u)) | (P_REX_X(u->pfx_rex) << 3));
+			op->base  = UD_R_EAX + (SIB_B(inp_curr(u)) | (P_REX_B(u->pfx_rex) << 3));
+
+			if (op->index == UD_R_ESP) {
+				op->index = UD_NONE;
+				op->scale = UD_NONE;
+			}
+
+			/* special condition for base reference */
+			if (op->base == UD_R_EBP) {
+				if (mod == 0)
+					op->base = UD_NONE;
+				if (mod == 1)
+					op->offset = 8;
+				else op->offset = 32;
+			}
+		}
+	} 
+
+	/* 16bit addressing mode */
+	else  {
+		switch (rm) {
+			case 0:	op->base = UD_R_BX; op->index = UD_R_SI; break;
+			case 1: op->base = UD_R_BX; op->index = UD_R_DI; break;
+			case 2: op->base = UD_R_BP; op->index = UD_R_SI; break;
+			case 3: op->base = UD_R_BP; op->index = UD_R_DI; break;
+			case 4:	op->base = UD_R_SI; break;
+			case 5: op->base = UD_R_DI; break;
+			case 6: op->base = UD_R_BP; break;
+			case 7: op->base = UD_R_BX; break;
+		}
+
+		if (mod == 0 && rm == 6) {
+			op->offset= 16;
+			op->base = UD_NONE;
+		}
+		else if (mod == 1)
+			op->offset = 8;
+		else if (mod == 2) 
+			op->offset = 16;
+	}
+  }  
+
+  /* extract offset, if any */
+  switch(op->offset) {
+	case 8 : op->lval.ubyte  = inp_uint8(u);  break;
+	case 16: op->lval.uword  = inp_uint16(u);  break;
+	case 32: op->lval.udword = inp_uint32(u); break;
+	case 64: op->lval.uqword = inp_uint64(u); break;
+	default: break;
+  }
+
+  /* resolve register encoded in reg field */
+  if (opreg) {
+	opreg->type = UD_OP_REG;
+	opreg->size = resolve_oprsize(u, reg_size);
+	if (reg_type == T_GPR) 
+		opreg->base = decode_gpr(u, opreg->size, reg);
+	else opreg->base = resolve_reg(u, reg_type, reg);
+  }
+}
+
+/* -----------------------------------------------------------------------------
+ * decode_o() - Decodes offset
+ * -----------------------------------------------------------------------------
+ */
+static void 
+decode_o(struct ud* u, unsigned int s, struct ud_operand *op)
+{
+  switch (u->adr_mode) {
+	case 64:
+		op->offset = 64; 
+		op->lval.uqword = inp_uint64(u); 
+		break;
+	case 32:
+		op->offset = 32; 
+		op->lval.udword = inp_uint32(u); 
+		break;
+	case 16:
+		op->offset = 16; 
+		op->lval.uword  = inp_uint16(u); 
+		break;
+	default:
+		return;
+  }
+  op->type = UD_OP_MEM;
+  op->size = resolve_oprsize(u, s);
+}
+
+/* -----------------------------------------------------------------------------
+ * disasm_operands() - Disassembles Operands.
+ * -----------------------------------------------------------------------------
+ */
+static void 
+disasm_operands(register struct ud* u)
+{
+
+
+  /* mopXt = map entry, operand X, type; */
+  enum map_operand_type mop1t = u->mapen->operand1.type;
+  enum map_operand_type mop2t = u->mapen->operand2.type;
+  enum map_operand_type mop3t = u->mapen->operand3.type;
+
+  /* mopXs = map entry, operand X, size */
+  unsigned int mop1s = u->mapen->operand1.size;
+  unsigned int mop2s = u->mapen->operand2.size;
+  unsigned int mop3s = u->mapen->operand3.size;
+
+  /* iop = instruction operand */
+  register struct ud_operand* iop = u->operand;
+	
+  switch(mop1t) {
+	
+	case OP_A :
+		decode_a(u, &(iop[0]));
+		break;
+	
+	/* M[b] ... */
+	case OP_M :
+		if (MODRM_MOD(inp_peek(u)) == 3)
+			u->error= 1;
+	/* E, G/P/V/I/CL/1/S */
+	case OP_E :
+		if (mop2t == OP_G) {
+			decode_modrm(u, &(iop[0]), mop1s, T_GPR, &(iop[1]), mop2s, T_GPR);
+			if (mop3t == OP_I)
+				decode_imm(u, mop3s, &(iop[2]));
+			else if (mop3t == OP_CL) {
+				iop[2].type = UD_OP_REG;
+				iop[2].base = UD_R_CL;
+				iop[2].size = 8;
+			}
+		}
+		else if (mop2t == OP_P)
+			decode_modrm(u, &(iop[0]), mop1s, T_GPR, &(iop[1]), mop2s, T_MMX);
+		else if (mop2t == OP_V)
+			decode_modrm(u, &(iop[0]), mop1s, T_GPR, &(iop[1]), mop2s, T_XMM);
+		else if (mop2t == OP_S)
+			decode_modrm(u, &(iop[0]), mop1s, T_GPR, &(iop[1]), mop2s, T_SEG);
+		else {
+			decode_modrm(u, &(iop[0]), mop1s, T_GPR, NULL, 0, T_NONE);
+			if (mop2t == OP_CL) {
+				iop[1].type = UD_OP_REG;
+				iop[1].base = UD_R_CL;
+				iop[1].size = 8;
+			} else if (mop2t == OP_I1) {
+				iop[1].type = UD_OP_CONST;
+				u->operand[1].lval.udword = 1;
+			} else if (mop2t == OP_I)
+				decode_imm(u, mop2s, &(iop[1]));
+		}
+		break;
+
+	/* G, E/PR[,I]/VR */
+	case OP_G :
+
+		if (mop2t == OP_M) {
+			if (MODRM_MOD(inp_peek(u)) == 3)
+				u->error= 1;
+			decode_modrm(u, &(iop[1]), mop2s, T_GPR, &(iop[0]), mop1s, T_GPR);
+		} else if (mop2t == OP_E) {
+			decode_modrm(u, &(iop[1]), mop2s, T_GPR, &(iop[0]), mop1s, T_GPR);
+			if (mop3t == OP_I)
+				decode_imm(u, mop3s, &(iop[2]));
+		} else if (mop2t == OP_PR) {
+			decode_modrm(u, &(iop[1]), mop2s, T_MMX, &(iop[0]), mop1s, T_GPR);
+			if (mop3t == OP_I)
+				decode_imm(u, mop3s, &(iop[2]));
+		} else if (mop2t == OP_VR) {
+			if (MODRM_MOD(inp_peek(u)) != 3)
+				u->error = 1;
+			decode_modrm(u, &(iop[1]), mop2s, T_XMM, &(iop[0]), mop1s, T_GPR);
+		} else if (mop2t == OP_W)
+			decode_modrm(u, &(iop[1]), mop2s, T_XMM, &(iop[0]), mop1s, T_GPR);
+		break;
+
+	/* AL..BH, I/O/DX */
+	case OP_AL : case OP_CL : case OP_DL : case OP_BL :
+	case OP_AH : case OP_CH : case OP_DH : case OP_BH :
+
+		iop[0].type = UD_OP_REG;
+		iop[0].base = UD_R_AL + (mop1t - OP_AL);
+		iop[0].size = 8;
+
+		if (mop2t == OP_I)
+			decode_imm(u, mop2s, &(iop[1]));
+		else if (mop2t == OP_DX) {
+			iop[1].type = UD_OP_REG;
+			iop[1].base = UD_R_DX;
+			iop[1].size = 16;
+		}
+		else if (mop2t == OP_O)
+			decode_o(u, mop2s, &(iop[1]));
+		break;
+
+	/* rAX[r8]..rDI[r15], I/rAX..rDI/O */
+	case OP_rAXr8 : case OP_rCXr9 : case OP_rDXr10 : case OP_rBXr11 :
+	case OP_rSPr12: case OP_rBPr13: case OP_rSIr14 : case OP_rDIr15 :
+	case OP_rAX : case OP_rCX : case OP_rDX : case OP_rBX :
+	case OP_rSP : case OP_rBP : case OP_rSI : case OP_rDI :
+
+		iop[0].type = UD_OP_REG;
+		iop[0].base = resolve_gpr64(u, mop1t);
+
+		if (mop2t == OP_I)
+			decode_imm(u, mop2s, &(iop[1]));
+		else if (mop2t >= OP_rAX && mop2t <= OP_rDI) {
+			iop[1].type = UD_OP_REG;
+			iop[1].base = resolve_gpr64(u, mop2t);
+		}
+		else if (mop2t == OP_O) {
+			decode_o(u, mop2s, &(iop[1]));	
+			iop[0].size = resolve_oprsize(u, mop2s);
+		}
+		break;
+
+	/* AL[r8b]..BH[r15b], I */
+	case OP_ALr8b : case OP_CLr9b : case OP_DLr10b : case OP_BLr11b :
+	case OP_AHr12b: case OP_CHr13b: case OP_DHr14b : case OP_BHr15b :
+	{
+		ud_type_t gpr = (mop1t - OP_ALr8b) + UD_R_AL + 
+						(P_REX_B(u->pfx_rex) << 3);
+		if (UD_R_AH <= gpr && u->pfx_rex)
+			gpr = gpr + 4;
+		iop[0].type = UD_OP_REG;
+		iop[0].base = gpr;
+		if (mop2t == OP_I)
+			decode_imm(u, mop2s, &(iop[1]));
+		break;
+	}
+
+	/* eAX..eDX, DX/I */
+	case OP_eAX : case OP_eCX : case OP_eDX : case OP_eBX :
+	case OP_eSP : case OP_eBP : case OP_eSI : case OP_eDI :
+
+		iop[0].type = UD_OP_REG;
+		iop[0].base = resolve_gpr32(u, mop1t);
+		if (mop2t == OP_DX) {
+			iop[1].type = UD_OP_REG;
+			iop[1].base = UD_R_DX;
+			iop[1].size = 16;
+		} else if (mop2t == OP_I)
+			decode_imm(u, mop2s, &(iop[1]));
+		break;
+
+	/* ES..GS */
+	case OP_ES : case OP_CS : case OP_DS :
+	case OP_SS : case OP_FS : case OP_GS :
+
+		/* in 64bits mode, only fs and gs are allowed */
+		if (u->dis_mode == 64)
+			if (mop1t != OP_FS && mop1t != OP_GS)
+				u->error= 1;
+		iop[0].type = UD_OP_REG;
+		iop[0].base = (mop1t - OP_ES) + UD_R_ES;
+		iop[0].size = 16;
+
+		break;
+
+	/* J */
+	case OP_J :
+		decode_imm(u, mop1s, &(iop[0]));		
+		iop[0].type = UD_OP_JIMM;
+		break ;
+
+	/* PR, I */
+	case OP_PR:
+		if (MODRM_MOD(inp_peek(u)) != 3)
+			u->error = 1;
+		decode_modrm(u, &(iop[0]), mop1s, T_MMX, NULL, 0, T_NONE);
+		if (mop2t == OP_I)
+			decode_imm(u, mop2s, &(iop[1]));
+		break; 
+
+	/* VR, I */
+	case OP_VR:
+		if (MODRM_MOD(inp_peek(u)) != 3)
+			u->error = 1;
+		decode_modrm(u, &(iop[0]), mop1s, T_XMM, NULL, 0, T_NONE);
+		if (mop2t == OP_I)
+			decode_imm(u, mop2s, &(iop[1]));
+		break; 
+
+	/* P, Q[,I]/W/E[,I] */
+	case OP_P :
+		if (mop2t == OP_Q) {
+			decode_modrm(u, &(iop[1]), mop2s, T_MMX, &(iop[0]), mop1s, T_MMX);
+			if (mop3t == OP_I)
+				decode_imm(u, mop3s, &(iop[2]));
+		} else if (mop2t == OP_W)
+			decode_modrm(u, &(iop[1]), mop2s, T_XMM, &(iop[0]), mop1s, T_MMX);
+		else if (mop2t == OP_E) {
+			decode_modrm(u, &(iop[1]), mop2s, T_GPR, &(iop[0]), mop1s, T_MMX);
+			if (mop3t == OP_I)
+				decode_imm(u, mop3s, &(iop[2]));
+		}
+		break;
+
+	/* R, C/D */
+	case OP_R :
+		if (mop2t == OP_C)
+			decode_modrm(u, &(iop[0]), mop1s, T_GPR, &(iop[1]), mop2s, T_CRG);
+		else if (mop2t == OP_D)
+			decode_modrm(u, &(iop[0]), mop1s, T_GPR, &(iop[1]), mop2s, T_DBG);
+		break;
+
+	/* C, R */
+	case OP_C :
+		decode_modrm(u, &(iop[1]), mop2s, T_GPR, &(iop[0]), mop1s, T_CRG);
+		break;
+
+	/* D, R */
+	case OP_D :
+		decode_modrm(u, &(iop[1]), mop2s, T_GPR, &(iop[0]), mop1s, T_DBG);
+		break;
+
+	/* Q, P */
+	case OP_Q :
+		decode_modrm(u, &(iop[0]), mop1s, T_MMX, &(iop[1]), mop2s, T_MMX);
+		break;
+
+	/* S, E */
+	case OP_S :
+		decode_modrm(u, &(iop[1]), mop2s, T_GPR, &(iop[0]), mop1s, T_SEG);
+		break;
+
+	/* W, V */
+	case OP_W :
+		decode_modrm(u, &(iop[0]), mop1s, T_XMM, &(iop[1]), mop2s, T_XMM);
+		break;
+
+	/* V, W[,I]/Q/M/E */
+	case OP_V :
+		if (mop2t == OP_W) {
+			/* special cases for movlps and movhps */
+			if (MODRM_MOD(inp_peek(u)) == 3) {
+				if (u->mnemonic == UD_Imovlps)
+					u->mnemonic = UD_Imovhlps;
+				else
+				if (u->mnemonic == UD_Imovhps)
+					u->mnemonic = UD_Imovlhps;
+			}
+			decode_modrm(u, &(iop[1]), mop2s, T_XMM, &(iop[0]), mop1s, T_XMM);
+			if (mop3t == OP_I)
+				decode_imm(u, mop3s, &(iop[2]));
+		} else if (mop2t == OP_Q)
+			decode_modrm(u, &(iop[1]), mop2s, T_MMX, &(iop[0]), mop1s, T_XMM);
+		else if (mop2t == OP_M) {
+			if (MODRM_MOD(inp_peek(u)) == 3)
+				u->error= 1;
+			decode_modrm(u, &(iop[1]), mop2s, T_GPR, &(iop[0]), mop1s, T_XMM);
+		} else if (mop2t == OP_E) {
+			decode_modrm(u, &(iop[1]), mop2s, T_GPR, &(iop[0]), mop1s, T_XMM);
+		}
+		break;
+
+	/* DX, eAX/AL */
+	case OP_DX :
+		iop[0].type = UD_OP_REG;
+		iop[0].base = UD_R_DX;
+		iop[0].size = 16;
+
+		if (mop2t == OP_eAX) {
+			iop[1].type = UD_OP_REG;	
+			iop[1].base = resolve_gpr32(u, mop2t);
+		} else if (mop2t == OP_AL) {
+			iop[1].type = UD_OP_REG;
+			iop[1].base = UD_R_AL;
+			iop[1].size = 8;
+		}
+
+		break;
+
+	/* I, I/AL/eAX */
+	case OP_I :
+		decode_imm(u, mop1s, &(iop[0]));
+		if (mop2t == OP_I)
+			decode_imm(u, mop2s, &(iop[1]));
+		else if (mop2t == OP_AL) {
+			iop[1].type = UD_OP_REG;
+			iop[1].base = UD_R_AL;
+			iop[1].size = 16;
+		} else if (mop2t == OP_eAX) {
+			iop[1].type = UD_OP_REG;	
+			iop[1].base = resolve_gpr32(u, mop2t);
+		}
+		break;
+
+	/* O, AL/eAX */
+	case OP_O :
+		decode_o(u, mop1s, &(iop[0]));
+		iop[1].type = UD_OP_REG;
+		iop[1].size = resolve_oprsize(u, mop1s);
+		if (mop2t == OP_AL)
+			iop[1].base = UD_R_AL;
+		else if (mop2t == OP_eAX)
+			iop[1].base = resolve_gpr32(u, mop2t);
+		else if (mop2t == OP_rAX)
+			iop[1].base = resolve_gpr64(u, mop2t);		
+		break;
+
+	/* 3 */
+	case OP_I3 :
+		iop[0].type = UD_OP_CONST;
+		iop[0].lval.sbyte = 3;
+		break;
+
+	/* ST(n), ST(n) */
+	case OP_ST0 : case OP_ST1 : case OP_ST2 : case OP_ST3 :
+	case OP_ST4 : case OP_ST5 : case OP_ST6 : case OP_ST7 :
+
+		iop[0].type = UD_OP_REG;
+		iop[0].base = (mop1t-OP_ST0) + UD_R_ST0;
+		iop[0].size = 0;
+
+		if (mop2t >= OP_ST0 && mop2t <= OP_ST7) {
+			iop[1].type = UD_OP_REG;
+			iop[1].base = (mop2t-OP_ST0) + UD_R_ST0;
+			iop[1].size = 0;
+		}
+		break;
+
+	/* AX */
+	case OP_AX:
+		iop[0].type = UD_OP_REG;
+		iop[0].base = UD_R_AX;
+		iop[0].size = 16;
+		break;
+
+	/* none */
+	default :
+		iop[0].type = iop[1].type = iop[2].type = UD_NONE;
+  }
+}
+
+/* -----------------------------------------------------------------------------
+ * clear_insn() - clear instruction pointer 
+ * -----------------------------------------------------------------------------
+ */
+void clear_insn(register struct ud* u)
+{
+  u->error = 0;
+  u->pfx_seg = 0;
+  u->pfx_opr = 0;
+  u->pfx_adr = 0;
+  u->pfx_lock = 0;
+  u->pfx_repne = 0;
+  u->pfx_rep = 0;
+  u->pfx_seg = 0;
+  u->pfx_rex = 0;
+  u->pfx_insn= 0;
+  u->mnemonic = UD_Inone;
+  u->mapen = NULL;
+
+  memset(&u->operand[0], 0, sizeof(struct ud_operand));
+  memset(&u->operand[1], 0, sizeof(struct ud_operand));
+  memset(&u->operand[2], 0, sizeof(struct ud_operand));
+}
+
+/* =============================================================================
+ * ud_decode() - Instruction decoder. Returns the number of bytes decoded.
+ * =============================================================================
+ */
+extern unsigned int ud_decode(register struct ud* u)
+{
+  unsigned int p;	/* (bool) denotes end of prefixes */
+  unsigned int i;	/* prefix counter */
+  char* src_hex;
+  unsigned char *src_ptr;
+
+  inp_start(u);
+
+  /* [1] Clear the decode/output fields */
+
+  clear_insn(u);
+
+  /* [2] Extract Prefixes */
+
+  inp_next(u);
+
+  for (i = 0, p = 0; p == 0; ++i) {	
+	if ((inp_curr(u) & 0xF0) == 0x40) { /* REX */
+		if (u->dis_mode == 64) {
+			u->pfx_rex = inp_curr(u);
+			inp_next(u); 
+		} else p = 1; /* Bail out, its an inc/dec */
+	} 
+	else switch(inp_curr(u)) {
+		case 0x2E : u->pfx_seg = UD_R_CS; inp_next(u); break;
+		case 0x36 : u->pfx_seg = UD_R_SS; inp_next(u); break;
+		case 0x3E : u->pfx_seg = UD_R_DS; inp_next(u); break;
+		case 0x26 : u->pfx_seg = UD_R_ES; inp_next(u); break;
+		case 0x64 : u->pfx_seg = UD_R_FS; inp_next(u); break;
+		case 0x65 : u->pfx_seg = UD_R_GS; inp_next(u); break;
+		case 0x66 : u->pfx_insn = u->pfx_opr = 0x66; inp_next(u); break;
+		case 0x67 : u->pfx_adr = 0x67; inp_next(u); break;
+		case 0xF0 : u->pfx_lock= 0xF0; inp_next(u); break;
+		case 0xF2 : u->pfx_insn = u->pfx_repne=0xF2; inp_next(u); break;
+		case 0xF3 : u->pfx_insn = u->pfx_rep = 0xF3; inp_next(u); break;
+		default   : p = 1;
+	}
+
+	/* if >= MAX_PREFIXES, disintegrate */
+	if (i >= MAX_PREFIXES) {
+		u->error= 1;
+		break;
+	}
+  }
+
+  /* rewind back one byte in stream */
+  inp_back(u);
+
+  /* [3] Search opcode map */
+
+  ud_search_map(u);
+
+  /* [4] Set mode flags */
+
+  if (u->dis_mode == 64) {  /* set 64bit-mode flags */
+	u->pfx_rex = u->pfx_rex & P_REX_MASK(u->mapen->prefix); 
+	u->default64 = P_DEF64(u->mapen->prefix); 
+	u->error = P_INV64(u->mapen->prefix);
+
+	if (P_REX(u->mapen->prefix) && P_REX_W(u->pfx_rex))
+		u->opr_mode = 64;
+	else if (u->pfx_opr)
+		u->opr_mode = 16;
+	else u->opr_mode = (u->default64) ? 64 : 32;
+
+	u->adr_mode = (u->pfx_adr) ? 32 : 64;
+  }
+  else if (u->dis_mode == 32) { /* set 32bit-mode flags */
+	u->opr_mode = (u->pfx_opr) ? 16 : 32;
+	u->adr_mode = (u->pfx_adr) ? 16 : 32;
+  } 
+  else if (u->dis_mode == 16) { /* set 16bit-mode flags */
+	u->opr_mode = (u->pfx_opr) ? 32 : 16;
+	u->adr_mode = (u->pfx_adr) ? 32 : 16;
+  }
+
+  u->c1 = (P_C1(u->mapen->prefix)) ? 1 : 0;
+  u->c2 = (P_C2(u->mapen->prefix)) ? 1 : 0;
+  u->c3 = (P_C3(u->mapen->prefix)) ? 1 : 0;
+
+  /* [5] Disassembled operands */
+
+  disasm_operands(u);
+
+  /* [6] Resolve mode related and other mnemonic issues */
+
+  if (P_DEPM(u->mapen->prefix))
+	u->mnemonic = resolve_mnemonic(u);
+	
+  u->br_far = 0;
+  u->br_near = 0;
+
+  if (u->mnemonic == UD_Icall || u->mnemonic == UD_Ijmp) {
+	if (u->operand[0].size == SZ_WP) {
+		u->operand[0].size = 16;
+		u->br_far = 1;
+		u->br_near= 0;
+	} else if (u->operand[0].size == SZ_DP) {
+		u->operand[0].size = 32;
+		u->br_far = 1;
+		u->br_near= 0;
+	} else {
+		u->br_far = 0;
+		u->br_near= 1;
+	}
+  } else if (u->mnemonic == UD_I3dnow)
+	u->mnemonic = ud_map_get_3dnow(inp_curr(u));
+
+  /* [7] Check for errors  */
+
+  if (u->error) {
+	clear_insn(u);
+	u->mapen = ud_me_invalid();
+	u->mnemonic = u->mapen->mnemonic;
+ }
+
+  /* [8] Generate hexadecimal code  */
+
+  u->insn_offset = u->pc;
+  u->insn_fill = 0;  
+  src_ptr = inp_sess(u);
+
+  src_hex = (char*) u->insn_hexcode;
+
+  for (i = 0; i < u->inp_ctr; ++i, ++src_ptr) {
+	sprintf(src_hex, "%02x", *src_ptr & 0xFF);
+	src_hex += 2;
+  }
+
+  /* [9] Update program counter */
+
+  u->pc += u->inp_ctr;
+
+  /* [10] Return the number of bytes disassemled */
+
+  return u->inp_ctr;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/libudis86/extern.h	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,67 @@
+/* -----------------------------------------------------------------------------
+ * extern.h
+ *
+ * Copyright (c) 2004, 2005, 2006, Vivek Mohan <vivek@sig9.com>
+ * All rights reserved. See LICENSE
+ * -----------------------------------------------------------------------------
+ */
+#ifndef UD_EXTERN_H
+#define UD_EXTERN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdio.h>
+#include "types.h"
+
+/* ============================= PUBLIC API ================================= */
+
+extern void ud_init(struct ud*);
+
+extern void ud_set_mode(struct ud*, uint8_t);
+
+extern void ud_set_pc(struct ud*, uint64_t);
+
+extern void ud_set_input_hook(struct ud*, int (*)(struct ud*));
+
+extern void ud_set_input_buffer(struct ud*, uint8_t*, size_t);
+
+#ifndef __UD_STANDALONE__
+extern void ud_set_input_file(struct ud*, FILE*);
+#endif /* __UD_STANDALONE__ */
+
+extern void ud_set_vendor(struct ud*, unsigned);
+
+extern void ud_set_syntax(struct ud*, void (*)(struct ud*));
+
+extern void ud_input_skip(struct ud*, size_t);
+
+extern int ud_input_end(struct ud*);
+
+extern unsigned int ud_decode(struct ud*);
+
+extern unsigned int ud_disassemble(struct ud*);
+
+extern void ud_translate_intel(struct ud*);
+
+extern void ud_translate_att(struct ud*);
+
+extern char* ud_insn_asm(struct ud* u);
+
+extern uint8_t* ud_insn_ptr(struct ud* u);
+
+extern uint64_t ud_insn_off(struct ud*);
+
+extern char* ud_insn_hex(struct ud*);
+
+extern unsigned int ud_insn_len(struct ud* u);
+
+extern const char* ud_lookup_mnemonic(enum ud_mnemonic_code c);
+
+/* ========================================================================== */
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/libudis86/input.c	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,218 @@
+/* -----------------------------------------------------------------------------
+ * input.c
+ *
+ * Copyright (c) 2004, 2005, 2006, Vivek Mohan <vivek@sig9.com>
+ * All rights reserved. See LICENSE
+ * -----------------------------------------------------------------------------
+ */
+#include "extern.h"
+#include "types.h"
+#include "input.h"
+
+/* -----------------------------------------------------------------------------
+ * inp_buff_hook() - Hook for buffered inputs.
+ * -----------------------------------------------------------------------------
+ */
+static int 
+inp_buff_hook(struct ud* u)
+{
+  if (u->inp_buff < u->inp_buff_end)
+	return *u->inp_buff++;
+  else	return -1;
+}
+
+#ifndef __UD_STANDALONE__
+/* -----------------------------------------------------------------------------
+ * inp_file_hook() - Hook for FILE inputs.
+ * -----------------------------------------------------------------------------
+ */
+static int 
+inp_file_hook(struct ud* u)
+{
+  return fgetc(u->inp_file);
+}
+#endif /* __UD_STANDALONE__*/
+
+/* =============================================================================
+ * ud_inp_set_hook() - Sets input hook.
+ * =============================================================================
+ */
+extern void 
+ud_set_input_hook(register struct ud* u, int (*hook)(struct ud*))
+{
+  u->inp_hook = hook;
+  inp_init(u);
+}
+
+/* =============================================================================
+ * ud_inp_set_buffer() - Set buffer as input.
+ * =============================================================================
+ */
+extern void 
+ud_set_input_buffer(register struct ud* u, uint8_t* buf, size_t len)
+{
+  u->inp_hook = inp_buff_hook;
+  u->inp_buff = buf;
+  u->inp_buff_end = buf + len;
+  inp_init(u);
+}
+
+#ifndef __UD_STANDALONE__
+/* =============================================================================
+ * ud_input_set_file() - Set buffer as input.
+ * =============================================================================
+ */
+extern void 
+ud_set_input_file(register struct ud* u, FILE* f)
+{
+  u->inp_hook = inp_file_hook;
+  u->inp_file = f;
+  inp_init(u);
+}
+#endif /* __UD_STANDALONE__ */
+
+/* =============================================================================
+ * ud_input_skip() - Skip n input bytes.
+ * =============================================================================
+ */
+extern void 
+ud_input_skip(struct ud* u, size_t n)
+{
+  while (n--) {
+	u->inp_hook(u);
+  }
+}
+
+/* =============================================================================
+ * ud_input_end() - Test for end of input.
+ * =============================================================================
+ */
+extern int 
+ud_input_end(struct ud* u)
+{
+  return (u->inp_curr == u->inp_fill) && u->inp_end;
+}
+
+/* -----------------------------------------------------------------------------
+ * inp_next() - Loads and returns the next byte from input.
+ *
+ * inp_curr and inp_fill are pointers to the cache. The program is written based
+ * on the property that they are 8-bits in size, and will eventually wrap around
+ * forminh a circular buffer. So, the size of the cache is 256 in size, kind of
+ * unnecessary yet optimized.
+ *
+ * A buffer inp_sess stores the bytes disassembled for a single session.
+ * -----------------------------------------------------------------------------
+ */
+extern uint8_t 
+inp_next(struct ud* u) 
+{
+  int c;
+
+  if (u->inp_curr != u->inp_fill)
+	c = u->inp_cache[++u->inp_curr];
+  else if (u->inp_end || (c = u->inp_hook(u)) == -1) {
+	u->error = 1;
+	u->inp_end = 1;
+	return 0;
+  } else {
+	u->inp_curr = ++u->inp_fill;
+	u->inp_cache[u->inp_fill] = c;
+  }
+
+  u->inp_sess[u->inp_ctr++] = c;
+
+  return (uint8_t)c;
+}
+
+/* -----------------------------------------------------------------------------
+ * inp_back() - Move back a single byte in the stream.
+ * -----------------------------------------------------------------------------
+ */
+extern void
+inp_back(struct ud* u) 
+{
+  if (u->inp_ctr > 0) {
+	--u->inp_curr;
+	--u->inp_ctr;
+  }
+}
+
+/* -----------------------------------------------------------------------------
+ * inp_peek() - Peek into the next byte in source. 
+ * -----------------------------------------------------------------------------
+ */
+extern uint8_t
+inp_peek(struct ud* u) 
+{
+  uint8_t r = inp_next(u);
+  inp_back(u);
+  return r;
+}
+
+/* -----------------------------------------------------------------------------
+ * inp_move() - Move ahead n input bytes.
+ * -----------------------------------------------------------------------------
+ */
+extern void
+inp_move(struct ud* u, size_t n) 
+{
+  while (n--)
+	inp_next(u);
+}
+
+/*------------------------------------------------------------------------------
+ *  inp_uintN() - return uintN from source.
+ *------------------------------------------------------------------------------
+ */
+extern uint8_t 
+inp_uint8(struct ud* u)
+{
+  return inp_next(u);
+}
+
+extern uint16_t 
+inp_uint16(struct ud* u)
+{
+  uint16_t r, ret;
+
+  ret = inp_next(u);
+  r = inp_next(u);
+  return ret | (r << 8);
+}
+
+extern uint32_t 
+inp_uint32(struct ud* u)
+{
+  uint32_t r, ret;
+
+  ret = inp_next(u);
+  r = inp_next(u);
+  ret = ret | (r << 8);
+  r = inp_next(u);
+  ret = ret | (r << 16);
+  r = inp_next(u);
+  return ret | (r << 24);
+}
+
+extern uint64_t 
+inp_uint64(struct ud* u)
+{
+  uint64_t r, ret;
+
+  ret = inp_next(u);
+  r = inp_next(u);
+  ret = ret | (r << 8);
+  r = inp_next(u);
+  ret = ret | (r << 16);
+  r = inp_next(u);
+  ret = ret | (r << 24);
+  r = inp_next(u);
+  ret = ret | (r << 32);
+  r = inp_next(u);
+  ret = ret | (r << 40);
+  r = inp_next(u);
+  ret = ret | (r << 48);
+  r = inp_next(u);
+  return ret | (r << 56);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/libudis86/input.h	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,49 @@
+/* -----------------------------------------------------------------------------
+ * input.h
+ *
+ * Copyright (c) 2006, Vivek Mohan <vivek@sig9.com>
+ * All rights reserved. See LICENSE
+ * -----------------------------------------------------------------------------
+ */
+#ifndef UD_INPUT_H
+#define UD_INPUT_H
+
+#include "types.h"
+
+uint8_t inp_next(struct ud*);
+uint8_t inp_peek(struct ud*);
+uint8_t inp_uint8(struct ud*);
+uint16_t inp_uint16(struct ud*);
+uint32_t inp_uint32(struct ud*);
+uint64_t inp_uint64(struct ud*);
+void inp_move(struct ud*, size_t);
+void inp_back(struct ud*);
+
+/* inp_init() - Initializes the input system. */
+#define inp_init(u) \
+do { \
+  u->inp_curr = 0; \
+  u->inp_fill = 0; \
+  u->inp_ctr  = 0; \
+  u->inp_end  = 0; \
+} while (0)
+
+/* inp_start() - Should be called before each de-code operation. */
+#define inp_start(u) u->inp_ctr = 0
+
+/* inp_back() - Resets the current pointer to its position before the current
+ * instruction disassembly was started.
+ */
+#define inp_reset(u) \
+do { \
+  u->inp_curr -= u->inp_ctr; \
+  u->inp_ctr = 0; \
+} while (0)
+
+/* inp_sess() - Returns the pointer to current session. */
+#define inp_sess(u) (u->inp_sess)
+
+/* inp_cur() - Returns the current input byte. */
+#define inp_curr(u) ((u)->inp_cache[(u)->inp_curr])
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/libudis86/mnemonics.c	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,605 @@
+/* Do not edit, generated by mnemonics.pl */ 
+const char* ud_mnemonics[] = 
+{
+  "aaa",
+  "aad",
+  "aam",
+  "aas",
+  "adc",
+  "add",
+  "addpd",
+  "addps",
+  "addsd",
+  "addss",
+  "and",
+  "andnpd",
+  "andnps",
+  "andpd",
+  "andps",
+  "arpl",
+  "bound",
+  "bsf",
+  "bsr",
+  "bswap",
+  "bt",
+  "btc",
+  "btr",
+  "bts",
+  "call",
+  "cbw",
+  "cdqe",
+  "clc",
+  "cld",
+  "clflush",
+  "cli",
+  "clts",
+  "cmc",
+  "cmovo",
+  "cmovno",
+  "cmovb",
+  "cmovnb",
+  "cmovz",
+  "cmovnz",
+  "cmovbe",
+  "cmovnbe",
+  "cmovs",
+  "cmovns",
+  "cmovp",
+  "cmovnp",
+  "cmovl",
+  "cmovnl",
+  "cmovle",
+  "cmovnle",
+  "cmp",
+  "cmppd",
+  "cmpps",
+  "cmps",
+  "cmpsb",
+  "cmpsd",
+  "cmpsq",
+  "cmpss",
+  "cmpsw",
+  "cmpxchg",
+  "cmpxchg8b",
+  "comisd",
+  "comiss",
+  "cpuid",
+  "cqd",
+  "cqo",
+  "cvtdq2pd",
+  "cvtdq2ps",
+  "cvtpd2dq",
+  "cvtpd2pi",
+  "cvtpd2ps",
+  "cvtpi2pd",
+  "cvtpi2ps",
+  "cvtps2dq",
+  "cvtps2pd",
+  "cvtps2pi",
+  "cvtsd2si",
+  "cvtsd2ss",
+  "cvtsi2sd",
+  "cvtsi2ss",
+  "cvtss2sd",
+  "cvtss2si",
+  "cvttpd2dq",
+  "cvttpd2pi",
+  "cvttps2dq",
+  "cvttps2pi",
+  "cvttsd2si",
+  "cvttsi2sd",
+  "cvttsi2ss",
+  "cvttss2si",
+  "cwd",
+  "cwde",
+  "cdq",
+  "daa",
+  "das",
+  "dec",
+  "div",
+  "divpd",
+  "divps",
+  "divsd",
+  "divss",
+  "emms",
+  "enter",
+  "esc",
+  "f2xm1",
+  "fsxm1",
+  "fabs",
+  "fadd",
+  "faddp",
+  "fbld",
+  "fbstp",
+  "fchs",
+  "fclex",
+  "fcmovb",
+  "fcmovbe",
+  "fcmove",
+  "fcmovnb",
+  "fcmovnbe",
+  "fcmovne",
+  "fcmovnu",
+  "fcmovu",
+  "fcom",
+  "fcomi",
+  "fcomp",
+  "fcomip",
+  "fcompp",
+  "fcos",
+  "fdecstp",
+  "fdiv",
+  "fdivp",
+  "fdivr",
+  "fdivrp",
+  "femms",
+  "ffree",
+  "fiadd",
+  "ficom",
+  "ficomp",
+  "fidiv",
+  "fidivr",
+  "fidw",
+  "fidwr",
+  "fild",
+  "fimul",
+  "fincstp",
+  "finit",
+  "fist",
+  "fistp",
+  "fisub",
+  "fisubr",
+  "fld",
+  "fld1",
+  "fldcw",
+  "fldenv",
+  "fldl2e",
+  "fldl2t",
+  "fldlg2",
+  "fldln2",
+  "fldlpi",
+  "fldx",
+  "fldz",
+  "fmul",
+  "fmulp",
+  "fnclex",
+  "fncstp",
+  "fninit",
+  "fnop",
+  "fnsave",
+  "fnstcw",
+  "fnstenv",
+  "fnstsw",
+  "fpatan",
+  "fprem",
+  "fprem1",
+  "fptan",
+  "fpxtract",
+  "frndint",
+  "frstor",
+  "fsave",
+  "fscale",
+  "fsin",
+  "fsincos",
+  "fsqrt",
+  "fst",
+  "fstcw",
+  "fstenv",
+  "fstp",
+  "fstsw",
+  "fsub",
+  "fsubp",
+  "fsubr",
+  "fsubrp",
+  "ftst",
+  "fucom",
+  "fucomi",
+  "fucomip",
+  "fucomp",
+  "fucompp",
+  "fwait",
+  "fxam",
+  "fxch",
+  "fxrstor",
+  "fxsave",
+  "fxtract",
+  "fyl2x",
+  "fyl2xp1",
+  "hlt",
+  "idiv",
+  "imul",
+  "in",
+  "inc",
+  "ins",
+  "insb",
+  "insd",
+  "insw",
+  "int",
+  "into",
+  "invd",
+  "invlpg",
+  "iretw",
+  "iretd",
+  "iretq",
+  "jcxz",
+  "jecxz",
+  "jmp",
+  "jrcxz",
+  "jo",
+  "jno",
+  "jb",
+  "jnb",
+  "jz",
+  "jnz",
+  "jbe",
+  "jnbe",
+  "js",
+  "jns",
+  "jp",
+  "jnp",
+  "jl",
+  "jnl",
+  "jle",
+  "jnle",
+  "lahf",
+  "lar",
+  "ldmxcsr",
+  "lds",
+  "lea",
+  "leave",
+  "les",
+  "lfence",
+  "lfs",
+  "lgdt",
+  "lgs",
+  "lidt",
+  "lldt",
+  "lmsw",
+  "lock",
+  "lods",
+  "lodsb",
+  "lodsd",
+  "lodsq",
+  "lodsw",
+  "loop",
+  "loope",
+  "loopn",
+  "loopne",
+  "loopnz",
+  "loopz",
+  "lsl",
+  "lss",
+  "ltr",
+  "maskmovdqu",
+  "maskmovq",
+  "maxpd",
+  "maxps",
+  "maxsd",
+  "maxss",
+  "mfence",
+  "minpd",
+  "minps",
+  "minsd",
+  "minss",
+  "mov",
+  "movapd",
+  "movaps",
+  "movd",
+  "movdq2q",
+  "movdqa",
+  "movdqu",
+  "movhlps",
+  "movhpd",
+  "movhps",
+  "movlhps",
+  "movlpd",
+  "movlps",
+  "movmskpd",
+  "movmskps",
+  "movnig",
+  "movntdq",
+  "movnti",
+  "movntpd",
+  "movntps",
+  "movntq",
+  "movq",
+  "movq2dq",
+  "movqa",
+  "movs",
+  "movsb",
+  "movsd",
+  "movsq",
+  "movss",
+  "movsw",
+  "movsx",
+  "movsxd",
+  "movupd",
+  "movups",
+  "movzx",
+  "mul",
+  "mulpd",
+  "mulps",
+  "mulsd",
+  "mulss",
+  "neg",
+  "nop",
+  "not",
+  "or",
+  "orpd",
+  "orps",
+  "out",
+  "outs",
+  "outsb",
+  "outsd",
+  "outsw",
+  "packssdw",
+  "packsswb",
+  "packusdw",
+  "packuswb",
+  "paddb",
+  "paddd",
+  "paddq",
+  "paddsb",
+  "paddsw",
+  "paddusb",
+  "paddusw",
+  "paddw",
+  "pand",
+  "pandn",
+  "pavgb",
+  "pavgusb",
+  "pavgw",
+  "pcmpeqb",
+  "pcmpeqd",
+  "pcmpeqw",
+  "pcmpgtb",
+  "pcmpgtd",
+  "pcmpgtw",
+  "pextrw",
+  "pf2id",
+  "pf2iw",
+  "pfacc",
+  "pfadd",
+  "pfcmpeq",
+  "pfcmpge",
+  "pfcmpgt",
+  "pfmax",
+  "pfmin",
+  "pfmul",
+  "pfnacc",
+  "pfpnacc",
+  "pfrcp",
+  "pfrcpit1",
+  "pfrcpit2",
+  "pfrsqit1",
+  "pfrsqrt",
+  "pfsub",
+  "pfsubr",
+  "pi2fd",
+  "pi2fw",
+  "pinsrw",
+  "pmaddwd",
+  "pmaxsw",
+  "pmaxub",
+  "pminsw",
+  "pminub",
+  "pmovmskb",
+  "pmulhrw",
+  "pmulhuw",
+  "pmulhw",
+  "pmullw",
+  "pmuludq",
+  "pop",
+  "popa",
+  "popad",
+  "popfw",
+  "popfd",
+  "popfq",
+  "por",
+  "prefetch",
+  "psadbw",
+  "pshufd",
+  "pshufhw",
+  "pshuflw",
+  "pshufw",
+  "pslld",
+  "pslldq",
+  "psllq",
+  "psllw",
+  "psrad",
+  "psraw",
+  "psraq",
+  "psrld",
+  "psrldq",
+  "psrlq",
+  "psrlw",
+  "psubb",
+  "psubd",
+  "psubq",
+  "psubsb",
+  "psubsw",
+  "psubusb",
+  "psubusw",
+  "psubw",
+  "pswapd",
+  "punpckhbw",
+  "punpckhdq",
+  "punpckhqdq",
+  "punpckhwd",
+  "punpcklbw",
+  "punpckldq",
+  "punpcklqdq",
+  "punpcklwd",
+  "push",
+  "pusha",
+  "pushad",
+  "pushfw",
+  "pushfd",
+  "pushfq",
+  "pxor",
+  "rcl",
+  "rcpps",
+  "rcpss",
+  "rcr",
+  "rdivisr",
+  "rdmsr",
+  "rdpmc",
+  "rdtsc",
+  "rep",
+  "repne",
+  "ret",
+  "retf",
+  "rol",
+  "ror",
+  "rsm",
+  "rsqrtps",
+  "rsqrtss",
+  "sahf",
+  "sal",
+  "salc",
+  "sar",
+  "sbb",
+  "scas",
+  "scasb",
+  "scasd",
+  "scasq",
+  "scasw",
+  "seto",
+  "setno",
+  "setb",
+  "setnb",
+  "setz",
+  "setnz",
+  "setbe",
+  "setnbe",
+  "sets",
+  "setns",
+  "setp",
+  "setnp",
+  "setl",
+  "setnl",
+  "setle",
+  "setnle",
+  "sfence",
+  "sgdt",
+  "shl",
+  "shld",
+  "shr",
+  "shrd",
+  "shufpd",
+  "shufps",
+  "sidt",
+  "sldt",
+  "smsw",
+  "sqrtpd",
+  "sqrtps",
+  "sqrtsd",
+  "sqrtss",
+  "stc",
+  "std",
+  "sti",
+  "stmxcsr",
+  "stos",
+  "stosb",
+  "stosw",
+  "stosd",
+  "str",
+  "sub",
+  "subpd",
+  "subps",
+  "subsd",
+  "subss",
+  "swapgs",
+  "syscall",
+  "sysenter",
+  "sysexit",
+  "sysret",
+  "test",
+  "ucomisd",
+  "ucomiss",
+  "ud2",
+  "unpckhpd",
+  "unpckhps",
+  "unpcklpd",
+  "unpcklps",
+  "verr",
+  "verw",
+  "wait",
+  "wbinvd",
+  "wrmsr",
+  "xadd",
+  "xchg",
+  "xlat",
+  "xlatb",
+  "xor",
+  "xorpd",
+  "xorps",
+  "invalid",
+  "grp",
+  "a32",
+  "o32",
+  "es",
+  "fs",
+  "gs",
+  "cs",
+  "ds",
+  "ss",
+  "x87",
+  "3dnow",
+  "db",
+  "cmpxchg16b",
+  "stosq",
+  "int3",
+  "movsldup",
+  "movshdup",
+  "movddup",
+  "rdtscp",
+  "vmrun",
+  "vmmcall",
+  "vmload",
+  "vmsave",
+  "stgi",
+  "clgi",
+  "skinit",
+  "invlpga",
+  "ja",
+  "jae",
+  "jg",
+  "jge",
+  "jc",
+  "jnc",
+  "fisttp",
+  "prefetchnta",
+  "prefetcht0",
+  "prefetcht1",
+  "prefetcht2",
+  "cmovae",
+  "cmova",
+  "cmovge",
+  "cmovg",
+  "seta",
+  "setge",
+  "setg",
+  "pause",
+  "na",
+  "haddpd",
+  "hsubpd",
+  "addsubpd",
+  "haddps",
+  "hsubps",
+  "addsubps",
+  "lddqu",
+  "int1",
+  "vmcall",
+  "vmlaunch",
+  "vmresume",
+  "vmxoff",
+  "monitor",
+  "mwait",
+  "vmptrld",
+  "vmptrst",
+  "vmclear",
+  "vmxon",
+  "none",
+  "I3vil",
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/libudis86/mnemonics.dat	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,600 @@
+aaa
+aad
+aam
+aas
+adc
+add
+addpd
+addps
+addsd
+addss
+and
+andnpd
+andnps
+andpd
+andps
+arpl
+bound
+bsf
+bsr
+bswap
+bt
+btc
+btr
+bts
+call
+cbw
+cdqe
+clc
+cld
+clflush
+cli
+clts
+cmc
+cmovo
+cmovno
+cmovb
+cmovnb
+cmovz
+cmovnz
+cmovbe
+cmovnbe
+cmovs
+cmovns
+cmovp
+cmovnp
+cmovl
+cmovnl
+cmovle
+cmovnle
+cmp
+cmppd
+cmpps
+cmps
+cmpsb
+cmpsd
+cmpsq
+cmpss
+cmpsw
+cmpxchg
+cmpxchg8b
+comisd
+comiss
+cpuid
+cqd
+cqo
+cvtdq2pd
+cvtdq2ps
+cvtpd2dq
+cvtpd2pi
+cvtpd2ps
+cvtpi2pd
+cvtpi2ps
+cvtps2dq
+cvtps2pd
+cvtps2pi
+cvtsd2si
+cvtsd2ss
+cvtsi2sd
+cvtsi2ss
+cvtss2sd
+cvtss2si
+cvttpd2dq
+cvttpd2pi
+cvttps2dq
+cvttps2pi
+cvttsd2si
+cvttsi2sd
+cvttsi2ss
+cvttss2si
+cwd
+cwde
+cdq
+daa
+das
+dec
+div
+divpd
+divps
+divsd
+divss
+emms
+enter
+esc
+f2xm1
+fsxm1
+fabs
+fadd
+faddp
+fbld
+fbstp
+fchs
+fclex
+fcmovb
+fcmovbe
+fcmove
+fcmovnb
+fcmovnbe
+fcmovne
+fcmovnu
+fcmovu
+fcom
+fcomi
+fcomp
+fcomip
+fcompp
+fcos
+fdecstp
+fdiv
+fdivp
+fdivr
+fdivrp
+femms
+ffree
+fiadd
+ficom
+ficomp
+fidiv
+fidivr
+fidw
+fidwr
+fild
+fimul
+fincstp
+finit
+fist
+fistp
+fisub
+fisubr
+fld
+fld1
+fldcw
+fldenv
+fldl2e
+fldl2t
+fldlg2
+fldln2
+fldlpi
+fldx
+fldz
+fmul
+fmulp
+fnclex
+fncstp
+fninit
+fnop
+fnsave
+fnstcw
+fnstenv
+fnstsw
+fpatan
+fprem
+fprem1
+fptan
+fpxtract
+frndint
+frstor
+fsave
+fscale
+fsin
+fsincos
+fsqrt
+fst
+fstcw
+fstenv
+fstp
+fstsw
+fsub
+fsubp
+fsubr
+fsubrp
+ftst
+fucom
+fucomi
+fucomip
+fucomp
+fucompp
+fwait
+fxam
+fxch
+fxrstor
+fxsave
+fxtract
+fyl2x
+fyl2xp1
+hlt
+idiv
+imul
+in
+inc
+ins
+insb
+insd
+insw
+int
+into
+invd
+invlpg
+iretw
+iretd
+iretq
+jcxz
+jecxz
+jmp
+jrcxz
+jo
+jno
+jb
+jnb
+jz
+jnz
+jbe
+jnbe
+js
+jns
+jp
+jnp
+jl
+jnl
+jle
+jnle
+lahf
+lar
+ldmxcsr
+lds
+lea
+leave
+les
+lfence
+lfs
+lgdt
+lgs
+lidt
+lldt
+lmsw
+lock
+lods
+lodsb
+lodsd
+lodsq
+lodsw
+loop
+loope
+loopn
+loopne
+loopnz
+loopz
+lsl
+lss
+ltr
+maskmovdqu
+maskmovq
+maxpd
+maxps
+maxsd
+maxss
+mfence
+minpd
+minps
+minsd
+minss
+mov
+movapd
+movaps
+movd
+movdq2q
+movdqa
+movdqu
+movhlps
+movhpd
+movhps
+movlhps
+movlpd
+movlps
+movmskpd
+movmskps
+movnig
+movntdq
+movnti
+movntpd
+movntps
+movntq
+movq
+movq2dq
+movqa
+movs
+movsb
+movsd
+movsq
+movss
+movsw
+movsx
+movsxd
+movupd
+movups
+movzx
+mul
+mulpd
+mulps
+mulsd
+mulss
+neg
+nop
+not
+or
+orpd
+orps
+out
+outs
+outsb
+outsd
+outsw
+packssdw
+packsswb
+packusdw
+packuswb
+paddb
+paddd
+paddq
+paddsb
+paddsw
+paddusb
+paddusw
+paddw
+pand
+pandn
+pavgb
+pavgusb
+pavgw
+pcmpeqb
+pcmpeqd
+pcmpeqw
+pcmpgtb
+pcmpgtd
+pcmpgtw
+pextrw
+pf2id
+pf2iw
+pfacc
+pfadd
+pfcmpeq
+pfcmpge
+pfcmpgt
+pfmax
+pfmin
+pfmul
+pfnacc
+pfpnacc
+pfrcp
+pfrcpit1
+pfrcpit2
+pfrsqit1
+pfrsqrt
+pfsub
+pfsubr
+pi2fd
+pi2fw
+pinsrw
+pmaddwd
+pmaxsw
+pmaxub
+pminsw
+pminub
+pmovmskb
+pmulhrw
+pmulhuw
+pmulhw
+pmullw
+pmuludq
+pop
+popa
+popad
+popfw
+popfd
+popfq
+por
+prefetch
+psadbw
+pshufd
+pshufhw
+pshuflw
+pshufw
+pslld
+pslldq
+psllq
+psllw
+psrad
+psraw
+psraq
+psrld
+psrldq
+psrlq
+psrlw
+psubb
+psubd
+psubq
+psubsb
+psubsw
+psubusb
+psubusw
+psubw
+pswapd
+punpckhbw
+punpckhdq
+punpckhqdq
+punpckhwd
+punpcklbw
+punpckldq
+punpcklqdq
+punpcklwd
+push
+pusha
+pushad
+pushfw
+pushfd
+pushfq
+pxor
+rcl
+rcpps
+rcpss
+rcr
+rdivisr
+rdmsr
+rdpmc
+rdtsc
+rep
+repne
+ret
+retf
+rol
+ror
+rsm
+rsqrtps
+rsqrtss
+sahf
+sal
+salc
+sar
+sbb
+scas
+scasb
+scasd
+scasq
+scasw
+seto
+setno
+setb
+setnb
+setz
+setnz
+setbe
+setnbe
+sets
+setns
+setp
+setnp
+setl
+setnl
+setle
+setnle
+sfence
+sgdt
+shl
+shld
+shr
+shrd
+shufpd
+shufps
+sidt
+sldt
+smsw
+sqrtpd
+sqrtps
+sqrtsd
+sqrtss
+stc
+std
+sti
+stmxcsr
+stos
+stosb
+stosw
+stosd
+str
+sub
+subpd
+subps
+subsd
+subss
+swapgs
+syscall
+sysenter
+sysexit
+sysret
+test
+ucomisd
+ucomiss
+ud2
+unpckhpd
+unpckhps
+unpcklpd
+unpcklps
+verr
+verw
+wait
+wbinvd
+wrmsr
+xadd
+xchg
+xlat
+xlatb
+xor
+xorpd
+xorps
+invalid
+grp
+a32
+o32
+es
+fs
+gs
+cs
+ds
+ss
+x87
+3dnow
+db
+cmpxchg16b
+stosq
+int3
+movsldup
+movshdup
+movddup
+rdtscp
+vmrun
+vmmcall
+vmload
+vmsave
+stgi
+clgi
+skinit
+invlpga
+ja
+jae
+jg
+jge
+jc
+jnc
+fisttp
+prefetchnta
+prefetcht0
+prefetcht1
+prefetcht2
+cmovae
+cmova
+cmovge
+cmovg
+seta
+setge
+setg
+pause
+na
+haddpd
+hsubpd
+addsubpd
+haddps
+hsubps
+addsubps
+lddqu
+int1
+vmcall
+vmlaunch
+vmresume
+vmxoff
+monitor
+mwait
+vmptrld
+vmptrst
+vmclear
+vmxon
+none
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/libudis86/mnemonics.h	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,612 @@
+/* Do not edit, Generated by mnemonics.pl */ 
+
+#ifndef UD_MNEMONICS_H
+#define UD_MNEMONICS_H
+
+extern const char* ud_mnemonics[];
+
+enum ud_mnemonic_code 
+{ 
+  UD_Iaaa,
+  UD_Iaad,
+  UD_Iaam,
+  UD_Iaas,
+  UD_Iadc,
+  UD_Iadd,
+  UD_Iaddpd,
+  UD_Iaddps,
+  UD_Iaddsd,
+  UD_Iaddss,
+  UD_Iand,
+  UD_Iandnpd,
+  UD_Iandnps,
+  UD_Iandpd,
+  UD_Iandps,
+  UD_Iarpl,
+  UD_Ibound,
+  UD_Ibsf,
+  UD_Ibsr,
+  UD_Ibswap,
+  UD_Ibt,
+  UD_Ibtc,
+  UD_Ibtr,
+  UD_Ibts,
+  UD_Icall,
+  UD_Icbw,
+  UD_Icdqe,
+  UD_Iclc,
+  UD_Icld,
+  UD_Iclflush,
+  UD_Icli,
+  UD_Iclts,
+  UD_Icmc,
+  UD_Icmovo,
+  UD_Icmovno,
+  UD_Icmovb,
+  UD_Icmovnb,
+  UD_Icmovz,
+  UD_Icmovnz,
+  UD_Icmovbe,
+  UD_Icmovnbe,
+  UD_Icmovs,
+  UD_Icmovns,
+  UD_Icmovp,
+  UD_Icmovnp,
+  UD_Icmovl,
+  UD_Icmovnl,
+  UD_Icmovle,
+  UD_Icmovnle,
+  UD_Icmp,
+  UD_Icmppd,
+  UD_Icmpps,
+  UD_Icmps,
+  UD_Icmpsb,
+  UD_Icmpsd,
+  UD_Icmpsq,
+  UD_Icmpss,
+  UD_Icmpsw,
+  UD_Icmpxchg,
+  UD_Icmpxchg8b,
+  UD_Icomisd,
+  UD_Icomiss,
+  UD_Icpuid,
+  UD_Icqd,
+  UD_Icqo,
+  UD_Icvtdq2pd,
+  UD_Icvtdq2ps,
+  UD_Icvtpd2dq,
+  UD_Icvtpd2pi,
+  UD_Icvtpd2ps,
+  UD_Icvtpi2pd,
+  UD_Icvtpi2ps,
+  UD_Icvtps2dq,
+  UD_Icvtps2pd,
+  UD_Icvtps2pi,
+  UD_Icvtsd2si,
+  UD_Icvtsd2ss,
+  UD_Icvtsi2sd,
+  UD_Icvtsi2ss,
+  UD_Icvtss2sd,
+  UD_Icvtss2si,
+  UD_Icvttpd2dq,
+  UD_Icvttpd2pi,
+  UD_Icvttps2dq,
+  UD_Icvttps2pi,
+  UD_Icvttsd2si,
+  UD_Icvttsi2sd,
+  UD_Icvttsi2ss,
+  UD_Icvttss2si,
+  UD_Icwd,
+  UD_Icwde,
+  UD_Icdq,
+  UD_Idaa,
+  UD_Idas,
+  UD_Idec,
+  UD_Idiv,
+  UD_Idivpd,
+  UD_Idivps,
+  UD_Idivsd,
+  UD_Idivss,
+  UD_Iemms,
+  UD_Ienter,
+  UD_Iesc,
+  UD_If2xm1,
+  UD_Ifsxm1,
+  UD_Ifabs,
+  UD_Ifadd,
+  UD_Ifaddp,
+  UD_Ifbld,
+  UD_Ifbstp,
+  UD_Ifchs,
+  UD_Ifclex,
+  UD_Ifcmovb,
+  UD_Ifcmovbe,
+  UD_Ifcmove,
+  UD_Ifcmovnb,
+  UD_Ifcmovnbe,
+  UD_Ifcmovne,
+  UD_Ifcmovnu,
+  UD_Ifcmovu,
+  UD_Ifcom,
+  UD_Ifcomi,
+  UD_Ifcomp,
+  UD_Ifcomip,
+  UD_Ifcompp,
+  UD_Ifcos,
+  UD_Ifdecstp,
+  UD_Ifdiv,
+  UD_Ifdivp,
+  UD_Ifdivr,
+  UD_Ifdivrp,
+  UD_Ifemms,
+  UD_Iffree,
+  UD_Ifiadd,
+  UD_Ificom,
+  UD_Ificomp,
+  UD_Ifidiv,
+  UD_Ifidivr,
+  UD_Ifidw,
+  UD_Ifidwr,
+  UD_Ifild,
+  UD_Ifimul,
+  UD_Ifincstp,
+  UD_Ifinit,
+  UD_Ifist,
+  UD_Ifistp,
+  UD_Ifisub,
+  UD_Ifisubr,
+  UD_Ifld,
+  UD_Ifld1,
+  UD_Ifldcw,
+  UD_Ifldenv,
+  UD_Ifldl2e,
+  UD_Ifldl2t,
+  UD_Ifldlg2,
+  UD_Ifldln2,
+  UD_Ifldlpi,
+  UD_Ifldx,
+  UD_Ifldz,
+  UD_Ifmul,
+  UD_Ifmulp,
+  UD_Ifnclex,
+  UD_Ifncstp,
+  UD_Ifninit,
+  UD_Ifnop,
+  UD_Ifnsave,
+  UD_Ifnstcw,
+  UD_Ifnstenv,
+  UD_Ifnstsw,
+  UD_Ifpatan,
+  UD_Ifprem,
+  UD_Ifprem1,
+  UD_Ifptan,
+  UD_Ifpxtract,
+  UD_Ifrndint,
+  UD_Ifrstor,
+  UD_Ifsave,
+  UD_Ifscale,
+  UD_Ifsin,
+  UD_Ifsincos,
+  UD_Ifsqrt,
+  UD_Ifst,
+  UD_Ifstcw,
+  UD_Ifstenv,
+  UD_Ifstp,
+  UD_Ifstsw,
+  UD_Ifsub,
+  UD_Ifsubp,
+  UD_Ifsubr,
+  UD_Ifsubrp,
+  UD_Iftst,
+  UD_Ifucom,
+  UD_Ifucomi,
+  UD_Ifucomip,
+  UD_Ifucomp,
+  UD_Ifucompp,
+  UD_Ifwait,
+  UD_Ifxam,
+  UD_Ifxch,
+  UD_Ifxrstor,
+  UD_Ifxsave,
+  UD_Ifxtract,
+  UD_Ifyl2x,
+  UD_Ifyl2xp1,
+  UD_Ihlt,
+  UD_Iidiv,
+  UD_Iimul,
+  UD_Iin,
+  UD_Iinc,
+  UD_Iins,
+  UD_Iinsb,
+  UD_Iinsd,
+  UD_Iinsw,
+  UD_Iint,
+  UD_Iinto,
+  UD_Iinvd,
+  UD_Iinvlpg,
+  UD_Iiretw,
+  UD_Iiretd,
+  UD_Iiretq,
+  UD_Ijcxz,
+  UD_Ijecxz,
+  UD_Ijmp,
+  UD_Ijrcxz,
+  UD_Ijo,
+  UD_Ijno,
+  UD_Ijb,
+  UD_Ijnb,
+  UD_Ijz,
+  UD_Ijnz,
+  UD_Ijbe,
+  UD_Ijnbe,
+  UD_Ijs,
+  UD_Ijns,
+  UD_Ijp,
+  UD_Ijnp,
+  UD_Ijl,
+  UD_Ijnl,
+  UD_Ijle,
+  UD_Ijnle,
+  UD_Ilahf,
+  UD_Ilar,
+  UD_Ildmxcsr,
+  UD_Ilds,
+  UD_Ilea,
+  UD_Ileave,
+  UD_Iles,
+  UD_Ilfence,
+  UD_Ilfs,
+  UD_Ilgdt,
+  UD_Ilgs,
+  UD_Ilidt,
+  UD_Illdt,
+  UD_Ilmsw,
+  UD_Ilock,
+  UD_Ilods,
+  UD_Ilodsb,
+  UD_Ilodsd,
+  UD_Ilodsq,
+  UD_Ilodsw,
+  UD_Iloop,
+  UD_Iloope,
+  UD_Iloopn,
+  UD_Iloopne,
+  UD_Iloopnz,
+  UD_Iloopz,
+  UD_Ilsl,
+  UD_Ilss,
+  UD_Iltr,
+  UD_Imaskmovdqu,
+  UD_Imaskmovq,
+  UD_Imaxpd,
+  UD_Imaxps,
+  UD_Imaxsd,
+  UD_Imaxss,
+  UD_Imfence,
+  UD_Iminpd,
+  UD_Iminps,
+  UD_Iminsd,
+  UD_Iminss,
+  UD_Imov,
+  UD_Imovapd,
+  UD_Imovaps,
+  UD_Imovd,
+  UD_Imovdq2q,
+  UD_Imovdqa,
+  UD_Imovdqu,
+  UD_Imovhlps,
+  UD_Imovhpd,
+  UD_Imovhps,
+  UD_Imovlhps,
+  UD_Imovlpd,
+  UD_Imovlps,
+  UD_Imovmskpd,
+  UD_Imovmskps,
+  UD_Imovnig,
+  UD_Imovntdq,
+  UD_Imovnti,
+  UD_Imovntpd,
+  UD_Imovntps,
+  UD_Imovntq,
+  UD_Imovq,
+  UD_Imovq2dq,
+  UD_Imovqa,
+  UD_Imovs,
+  UD_Imovsb,
+  UD_Imovsd,
+  UD_Imovsq,
+  UD_Imovss,
+  UD_Imovsw,
+  UD_Imovsx,
+  UD_Imovsxd,
+  UD_Imovupd,
+  UD_Imovups,
+  UD_Imovzx,
+  UD_Imul,
+  UD_Imulpd,
+  UD_Imulps,
+  UD_Imulsd,
+  UD_Imulss,
+  UD_Ineg,
+  UD_Inop,
+  UD_Inot,
+  UD_Ior,
+  UD_Iorpd,
+  UD_Iorps,
+  UD_Iout,
+  UD_Iouts,
+  UD_Ioutsb,
+  UD_Ioutsd,
+  UD_Ioutsw,
+  UD_Ipackssdw,
+  UD_Ipacksswb,
+  UD_Ipackusdw,
+  UD_Ipackuswb,
+  UD_Ipaddb,
+  UD_Ipaddd,
+  UD_Ipaddq,
+  UD_Ipaddsb,
+  UD_Ipaddsw,
+  UD_Ipaddusb,
+  UD_Ipaddusw,
+  UD_Ipaddw,
+  UD_Ipand,
+  UD_Ipandn,
+  UD_Ipavgb,
+  UD_Ipavgusb,
+  UD_Ipavgw,
+  UD_Ipcmpeqb,
+  UD_Ipcmpeqd,
+  UD_Ipcmpeqw,
+  UD_Ipcmpgtb,
+  UD_Ipcmpgtd,
+  UD_Ipcmpgtw,
+  UD_Ipextrw,
+  UD_Ipf2id,
+  UD_Ipf2iw,
+  UD_Ipfacc,
+  UD_Ipfadd,
+  UD_Ipfcmpeq,
+  UD_Ipfcmpge,
+  UD_Ipfcmpgt,
+  UD_Ipfmax,
+  UD_Ipfmin,
+  UD_Ipfmul,
+  UD_Ipfnacc,
+  UD_Ipfpnacc,
+  UD_Ipfrcp,
+  UD_Ipfrcpit1,
+  UD_Ipfrcpit2,
+  UD_Ipfrsqit1,
+  UD_Ipfrsqrt,
+  UD_Ipfsub,
+  UD_Ipfsubr,
+  UD_Ipi2fd,
+  UD_Ipi2fw,
+  UD_Ipinsrw,
+  UD_Ipmaddwd,
+  UD_Ipmaxsw,
+  UD_Ipmaxub,
+  UD_Ipminsw,
+  UD_Ipminub,
+  UD_Ipmovmskb,
+  UD_Ipmulhrw,
+  UD_Ipmulhuw,
+  UD_Ipmulhw,
+  UD_Ipmullw,
+  UD_Ipmuludq,
+  UD_Ipop,
+  UD_Ipopa,
+  UD_Ipopad,
+  UD_Ipopfw,
+  UD_Ipopfd,
+  UD_Ipopfq,
+  UD_Ipor,
+  UD_Iprefetch,
+  UD_Ipsadbw,
+  UD_Ipshufd,
+  UD_Ipshufhw,
+  UD_Ipshuflw,
+  UD_Ipshufw,
+  UD_Ipslld,
+  UD_Ipslldq,
+  UD_Ipsllq,
+  UD_Ipsllw,
+  UD_Ipsrad,
+  UD_Ipsraw,
+  UD_Ipsraq,
+  UD_Ipsrld,
+  UD_Ipsrldq,
+  UD_Ipsrlq,
+  UD_Ipsrlw,
+  UD_Ipsubb,
+  UD_Ipsubd,
+  UD_Ipsubq,
+  UD_Ipsubsb,
+  UD_Ipsubsw,
+  UD_Ipsubusb,
+  UD_Ipsubusw,
+  UD_Ipsubw,
+  UD_Ipswapd,
+  UD_Ipunpckhbw,
+  UD_Ipunpckhdq,
+  UD_Ipunpckhqdq,
+  UD_Ipunpckhwd,
+  UD_Ipunpcklbw,
+  UD_Ipunpckldq,
+  UD_Ipunpcklqdq,
+  UD_Ipunpcklwd,
+  UD_Ipush,
+  UD_Ipusha,
+  UD_Ipushad,
+  UD_Ipushfw,
+  UD_Ipushfd,
+  UD_Ipushfq,
+  UD_Ipxor,
+  UD_Ircl,
+  UD_Ircpps,
+  UD_Ircpss,
+  UD_Ircr,
+  UD_Irdivisr,
+  UD_Irdmsr,
+  UD_Irdpmc,
+  UD_Irdtsc,
+  UD_Irep,
+  UD_Irepne,
+  UD_Iret,
+  UD_Iretf,
+  UD_Irol,
+  UD_Iror,
+  UD_Irsm,
+  UD_Irsqrtps,
+  UD_Irsqrtss,
+  UD_Isahf,
+  UD_Isal,
+  UD_Isalc,
+  UD_Isar,
+  UD_Isbb,
+  UD_Iscas,
+  UD_Iscasb,
+  UD_Iscasd,
+  UD_Iscasq,
+  UD_Iscasw,
+  UD_Iseto,
+  UD_Isetno,
+  UD_Isetb,
+  UD_Isetnb,
+  UD_Isetz,
+  UD_Isetnz,
+  UD_Isetbe,
+  UD_Isetnbe,
+  UD_Isets,
+  UD_Isetns,
+  UD_Isetp,
+  UD_Isetnp,
+  UD_Isetl,
+  UD_Isetnl,
+  UD_Isetle,
+  UD_Isetnle,
+  UD_Isfence,
+  UD_Isgdt,
+  UD_Ishl,
+  UD_Ishld,
+  UD_Ishr,
+  UD_Ishrd,
+  UD_Ishufpd,
+  UD_Ishufps,
+  UD_Isidt,
+  UD_Isldt,
+  UD_Ismsw,
+  UD_Isqrtpd,
+  UD_Isqrtps,
+  UD_Isqrtsd,
+  UD_Isqrtss,
+  UD_Istc,
+  UD_Istd,
+  UD_Isti,
+  UD_Istmxcsr,
+  UD_Istos,
+  UD_Istosb,
+  UD_Istosw,
+  UD_Istosd,
+  UD_Istr,
+  UD_Isub,
+  UD_Isubpd,
+  UD_Isubps,
+  UD_Isubsd,
+  UD_Isubss,
+  UD_Iswapgs,
+  UD_Isyscall,
+  UD_Isysenter,
+  UD_Isysexit,
+  UD_Isysret,
+  UD_Itest,
+  UD_Iucomisd,
+  UD_Iucomiss,
+  UD_Iud2,
+  UD_Iunpckhpd,
+  UD_Iunpckhps,
+  UD_Iunpcklpd,
+  UD_Iunpcklps,
+  UD_Iverr,
+  UD_Iverw,
+  UD_Iwait,
+  UD_Iwbinvd,
+  UD_Iwrmsr,
+  UD_Ixadd,
+  UD_Ixchg,
+  UD_Ixlat,
+  UD_Ixlatb,
+  UD_Ixor,
+  UD_Ixorpd,
+  UD_Ixorps,
+  UD_Iinvalid,
+  UD_Igrp,
+  UD_Ia32,
+  UD_Io32,
+  UD_Ies,
+  UD_Ifs,
+  UD_Igs,
+  UD_Ics,
+  UD_Ids,
+  UD_Iss,
+  UD_Ix87,
+  UD_I3dnow,
+  UD_Idb,
+  UD_Icmpxchg16b,
+  UD_Istosq,
+  UD_Iint3,
+  UD_Imovsldup,
+  UD_Imovshdup,
+  UD_Imovddup,
+  UD_Irdtscp,
+  UD_Ivmrun,
+  UD_Ivmmcall,
+  UD_Ivmload,
+  UD_Ivmsave,
+  UD_Istgi,
+  UD_Iclgi,
+  UD_Iskinit,
+  UD_Iinvlpga,
+  UD_Ija,
+  UD_Ijae,
+  UD_Ijg,
+  UD_Ijge,
+  UD_Ijc,
+  UD_Ijnc,
+  UD_Ifisttp,
+  UD_Iprefetchnta,
+  UD_Iprefetcht0,
+  UD_Iprefetcht1,
+  UD_Iprefetcht2,
+  UD_Icmovae,
+  UD_Icmova,
+  UD_Icmovge,
+  UD_Icmovg,
+  UD_Iseta,
+  UD_Isetge,
+  UD_Isetg,
+  UD_Ipause,
+  UD_Ina,
+  UD_Ihaddpd,
+  UD_Ihsubpd,
+  UD_Iaddsubpd,
+  UD_Ihaddps,
+  UD_Ihsubps,
+  UD_Iaddsubps,
+  UD_Ilddqu,
+  UD_Iint1,
+  UD_Ivmcall,
+  UD_Ivmlaunch,
+  UD_Ivmresume,
+  UD_Ivmxoff,
+  UD_Imonitor,
+  UD_Imwait,
+  UD_Ivmptrld,
+  UD_Ivmptrst,
+  UD_Ivmclear,
+  UD_Ivmxon,
+  UD_Inone,
+  UD_I3vil
+};
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/libudis86/mnemonics.pl	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,38 @@
+#!/usr/bin/perl
+#
+# mnemonics.pl - generates mnemonic{.h,.c} from mnemonics.dat
+#
+# Copyright (c) 2002, 2003, 2004 Vivek Mohan <vivek@sig9.com>
+# All rights reserved.
+# See (LICENSE)
+#
+#
+
+
+open(mnm_c,">mnemonics.c") || die "Couldn't create mnemonics.c.";
+open(mnm_h,">mnemonics.h") || die "Couldn't create mnemonics.h.";
+
+print mnm_c "/* Do not edit, generated by mnemonics.pl */ \n";
+print mnm_c "const char* ud_mnemonics[] = \n{\n";
+
+print mnm_h "/* Do not edit, Generated by mnemonics.pl */ \n\n";
+print mnm_h "#ifndef UD_MNEMONICS_H\n";
+print mnm_h "#define UD_MNEMONICS_H\n\n";
+print mnm_h "extern const char* ud_mnemonics[];\n\n";
+print mnm_h "enum ud_mnemonic_code \n{ \n";
+
+while($mnm = <STDIN>) {
+	chop($mnm);
+	print mnm_c "  \"$mnm\",\n";
+	print mnm_h "  UD_I$mnm,\n";
+}
+
+print mnm_c "  \"I3vil\",\n";
+print mnm_h "  UD_I3vil\n";
+
+print mnm_c "};\n";
+print mnm_h "};\n";
+print mnm_h "#endif\n";
+
+close(mnm_c);
+close(mnm_h);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/libudis86/opcmap.c	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,3013 @@
+/* -----------------------------------------------------------------------------
+ * opcmap.c
+ *
+ * Copyright (c) 2006, Vivek Mohan <vivek@sig9.com>
+ * All rights reserved. See LICENSE
+ * -----------------------------------------------------------------------------
+ */
+
+#include "types.h"
+#include "mnemonics.h"
+#include "opcmap.h"
+#include "input.h"
+
+/* operand types - check out the intel/amd manuals */
+#define Ap	{ OP_A, SZ_P 	}
+#define E	{ OP_E, 0 	}
+#define Eb	{ OP_E, SZ_B 	}
+#define Ew	{ OP_E, SZ_W 	}
+#define Ev	{ OP_E, SZ_V 	}
+#define Ed	{ OP_E, SZ_D 	}
+#define Ez	{ OP_E, SZ_Z 	}
+#define Ex	{ OP_E, SZ_MDQ 	}
+#define Ep	{ OP_E, SZ_P 	}
+#define G	{ OP_G, 0 	}
+#define Gb	{ OP_G, SZ_B 	}
+#define Gw	{ OP_G, SZ_W 	}
+#define Gv	{ OP_G, SZ_V 	}
+#define Gvw	{ OP_G, SZ_MDQ 	}
+#define Gd	{ OP_G, SZ_D 	}
+#define Gx	{ OP_G, SZ_MDQ 	}
+#define Gz	{ OP_G, SZ_Z 	}
+#define M	{ OP_M, 0 	}
+#define Mb	{ OP_M, SZ_B 	}
+#define Mw	{ OP_M, SZ_W 	}
+#define Ms	{ OP_M, SZ_W 	}
+#define Md	{ OP_M, SZ_D 	}
+#define Mq	{ OP_M, SZ_Q 	}
+#define Mt	{ OP_M, SZ_T 	}
+#define	I1	{ OP_I1, 0 	}
+#define	I3	{ OP_I3, 0 	}
+#define Ib	{ OP_I, SZ_B 	}
+#define Iw	{ OP_I, SZ_W	}
+#define Iv	{ OP_I, SZ_V	}
+#define Iz	{ OP_I, SZ_Z	}
+#define Jv	{ OP_J, SZ_V	}
+#define Jz	{ OP_J, SZ_Z	}
+#define Jb	{ OP_J, SZ_B	}
+#define R	{ OP_R, SZ_RDQ	}
+#define C	{ OP_C, 0	} 
+#define D	{ OP_D, 0	}
+#define S	{ OP_S, 0	}
+#define Ob	{ OP_O, SZ_B	}
+#define Ow	{ OP_O, SZ_W	}
+#define Ov	{ OP_O, SZ_V	}
+#define V	{ OP_V, 0	}
+#define W	{ OP_W, 0	}
+#define P	{ OP_P, 0	}
+#define Q	{ OP_Q, 0	}
+#define VR	{ OP_VR, 0	}
+#define PR	{ OP_PR, 0	}
+#define AL	{ OP_AL, 0	}
+#define CL	{ OP_CL, 0	}
+#define DL	{ OP_DL, 0	}
+#define BL	{ OP_BL, 0	}
+#define AH	{ OP_AH, 0	}
+#define CH	{ OP_CH, 0	}
+#define DH	{ OP_DH, 0	}
+#define BH	{ OP_BH, 0	}
+#define AX	{ OP_AX, 0	}
+#define CX	{ OP_CX, 0	}
+#define DX	{ OP_DX, 0	}
+#define BX	{ OP_BX, 0	}
+#define SI	{ OP_SI, 0	}
+#define DI	{ OP_DI, 0	}
+#define SP	{ OP_SP, 0	}
+#define BP	{ OP_BP, 0	}
+#define eAX	{ OP_eAX, 0	}
+#define eCX	{ OP_eCX, 0	}
+#define eDX	{ OP_eDX, 0	}
+#define eBX	{ OP_eBX, 0	}
+#define eSI	{ OP_eSI, 0	}
+#define eDI	{ OP_eDI, 0	}
+#define eSP	{ OP_eSP, 0	}
+#define eBP	{ OP_eBP, 0	}
+#define rAX	{ OP_rAX, 0	}
+#define rCX	{ OP_rCX, 0	}
+#define rBX	{ OP_rDX, 0	}
+#define rDX	{ OP_rDX, 0	}
+#define rSI	{ OP_rSI, 0	}
+#define rDI	{ OP_rDI, 0	}
+#define rSP	{ OP_rSP, 0	}
+#define rBP	{ OP_rBP, 0	}
+#define ES	{ OP_ES, 0	}
+#define CS	{ OP_CS, 0	}
+#define DS	{ OP_DS, 0	}
+#define SS	{ OP_SS, 0	}
+#define GS	{ OP_GS, 0	}
+#define FS	{ OP_FS, 0	}
+#define ST0	{ OP_ST0, 0	}
+#define ST1	{ OP_ST1, 0	}
+#define ST2	{ OP_ST2, 0	}
+#define ST3	{ OP_ST3, 0	}
+#define ST4	{ OP_ST4, 0	}
+#define ST5	{ OP_ST5, 0	}
+#define ST6	{ OP_ST6, 0	}
+#define ST7	{ OP_ST7, 0	}
+#define NOARG	{ 0, 0 		}
+#define ALr8b	{ OP_ALr8b,0 	}
+#define CLr9b	{ OP_CLr9b,0 	}
+#define DLr10b	{ OP_DLr10b,0 	}
+#define BLr11b	{ OP_BLr11b,0 	}
+#define AHr12b	{ OP_AHr12b,0 	}
+#define CHr13b	{ OP_CHr13b,0 	}
+#define DHr14b	{ OP_DHr14b,0 	}
+#define BHr15b	{ OP_BHr15b,0 	}
+#define rAXr8	{ OP_rAXr8,0 	}
+#define rCXr9	{ OP_rCXr9,0 	}
+#define rDXr10	{ OP_rDXr10,0 	}
+#define rBXr11	{ OP_rBXr11,0 	}
+#define rSPr12	{ OP_rSPr12,0 	}
+#define rBPr13	{ OP_rBPr13,0 	}
+#define rSIr14	{ OP_rSIr14,0 	}
+#define rDIr15	{ OP_rDIr15,0 	}
+
+enum INSN_GROUPS
+{
+  GRP_80, 
+  GRP_81, 
+  GRP_82,
+  GRP_83,
+  GRP_8F,
+  GRP_C0,
+  GRP_C1,
+  GRP_C6,
+  GRP_C7,
+  GRP_D0,
+  GRP_D1,
+  GRP_D2,
+  GRP_D3,
+  GRP_F6,
+  GRP_F7,
+  GRP_FE,
+  GRP_FF,
+  GRP_0F00,
+  GRP_0F01,
+  GRP_0F0D,
+  GRP_0F18,
+  GRP_0F71,
+  GRP_0F72,
+  GRP_0F73,
+  GRP_0FAE,
+  GRP_0FBA,
+  GRP_0FB9,
+  GRP_0FC7
+};
+
+/* 1 byte opcode */
+struct map_entry itab_1byte[0x100] = 
+{
+	/* Instruction, op1, op2, op3, Valid Prefixes */
+
+/* 00 */ { UD_Iadd,	Eb,	Gb,	NOARG,	Pa32 | REX(_X|_B|_R) },
+/* 01 */ { UD_Iadd,	Ev,	Gv,	NOARG,	Pa32 | Po32 | REX(_W|_R|_X|_B) },
+/* 02 */ { UD_Iadd,	Gb,	Eb,	NOARG,	Pa32 | REX(_X|_B|_R) },
+/* 03 */ { UD_Iadd,	Gv,	Ev,	NOARG,	Pa32 | Po32 | REX(_W|_R|_X|_B) },
+/* 04 */ { UD_Iadd,	AL,	Ib,	NOARG,	Pnone },
+/* 05 */ { UD_Iadd,	rAX,	Iz,	NOARG,	Po32 | REX(_W) },
+/* 06 */ { UD_Ipush,	ES,	NOARG,	NOARG,	Pinv64 },
+/* 07 */ { UD_Ipop,	ES,	NOARG,	NOARG,	Pinv64 },
+/* 08 */ { UD_Ior,	Eb,	Gb,	NOARG,	Pa32 | REX(_X|_B|_R) },
+/* 09 */ { UD_Ior,	Ev,	Gv,	NOARG,	Pa32 | Po32 | REX(_W|_R|_X|_B) },
+/* 0A */ { UD_Ior,	Gb,	Eb,	NOARG,	Pa32 | REX(_X|_B|_R)},
+/* 0B */ { UD_Ior,	Gv,	Ev,	NOARG,	Pa32 | Po32 | REX(_W|_R|_X|_B) },
+/* 0C */ { UD_Ior,	AL,	Ib,	NOARG,	Pnone },
+/* 0D */ { UD_Ior,	rAX,	Iz,	NOARG,	Po32 | REX(_W) },
+/* 0E */ { UD_Ipush,	CS,	NOARG,	NOARG,	Pinv64 },
+/* 0F */ { UD_Iesc,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 10 */ { UD_Iadc,	Eb,	Gb,	NOARG,	Pa32 | REX(_X|_B|_R)  },
+/* 11 */ { UD_Iadc,	Ev,	Gv,	NOARG,	Pa32 | Po32 | REX(_W|_R|_X|_B) },
+/* 12 */ { UD_Iadc,	Gb,	Eb,	NOARG,	Pa32 | REX(_X|_B|_R)  },
+/* 13 */ { UD_Iadc,	Gv,	Ev,	NOARG,	Pa32 | Po32 | REX(_W|_R|_X|_B) },
+/* 14 */ { UD_Iadc,	AL,	Ib,	NOARG,	Pnone },
+/* 15 */ { UD_Iadc,	rAX,	Iz,	NOARG,	Po32 | REX(_W) },
+/* 16 */ { UD_Ipush,	SS,	NOARG,	NOARG,	Pinv64 },
+/* 17 */ { UD_Ipop,	SS,	NOARG,	NOARG,	Pinv64 },
+/* 18 */ { UD_Isbb,	Eb,	Gb,	NOARG,	Pa32 | REX(_X|_B|_R)  },
+/* 19 */ { UD_Isbb,	Ev,	Gv,	NOARG,	Pa32 | Po32 | REX(_W|_R|_X|_B) },
+/* 1A */ { UD_Isbb,	Gb,	Eb,	NOARG,	Pa32 | REX(_X|_B|_R)  },
+/* 1B */ { UD_Isbb,	Gv,	Ev,	NOARG,	Pa32 | Po32 | REX(_W|_R|_X|_B) },
+/* 1C */ { UD_Isbb,	AL,	Ib,	NOARG,	Pnone },
+/* 1D */ { UD_Isbb,	rAX,	Iz,	NOARG,	Po32 | REX(_W) },
+/* 1E */ { UD_Ipush,	DS,	NOARG,	NOARG,	Pinv64 },
+/* 1F */ { UD_Ipop,	DS,	NOARG,	NOARG,	Pinv64 },
+/* 20 */ { UD_Iand,	Eb,	Gb,	NOARG,	Pa32 | REX(_X|_B|_R)  },
+/* 21 */ { UD_Iand,	Ev,	Gv,	NOARG,	Pa32 | Po32 | REX(_W|_R|_X|_B) },
+/* 22 */ { UD_Iand,	Gb,	Eb,	NOARG,	Pa32 | REX(_X|_B|_R)  },
+/* 23 */ { UD_Iand,	Gv,	Ev,	NOARG,	Pa32 | Po32 | REX(_W|_R|_X|_B) },
+/* 24 */ { UD_Iand,	AL,	Ib,	NOARG,	Pnone },
+/* 25 */ { UD_Iand,	rAX,	Iz,	NOARG,	Po32 | REX(_W) },
+/* 26 */ { UD_Ies,	ES,	NOARG,	NOARG,	Pnone },
+/* 27 */ { UD_Idaa,	NOARG,	NOARG,	NOARG,	Pinv64 },
+/* 28 */ { UD_Isub,	Eb,	Gb,	NOARG,	Pa32 | REX(_X|_B|_R)  },
+/* 29 */ { UD_Isub,	Ev,	Gv,	NOARG,	Pa32 | Po32 | REX(_W|_R|_X|_B) },
+/* 2A */ { UD_Isub,	Gb,	Eb,	NOARG,	Pa32 | REX(_X|_B|_R)  },
+/* 2B */ { UD_Isub,	Gv,	Ev,	NOARG,	Pa32 | Po32 | REX(_W|_R|_X|_B) },
+/* 2C */ { UD_Isub,	AL,	Ib,	NOARG,	Pnone },
+/* 2D */ { UD_Isub,	rAX,	Iz,	NOARG,	Po32 | REX(_W) },
+/* 2E */ { UD_Ics,	CS,	NOARG,	NOARG,	Pnone },
+/* 2F */ { UD_Idas,	NOARG,	NOARG,	NOARG,	Pinv64 },
+/* 30 */ { UD_Ixor,	Eb,	Gb,	NOARG,	Pa32 | REX(_X|_B|_R)  },
+/* 31 */ { UD_Ixor,	Ev,	Gv,	NOARG,	Pa32 | Po32 | REX(_W|_R|_X|_B) },
+/* 32 */ { UD_Ixor,	Gb,	Eb,	NOARG,	Pa32 | REX(_X|_B|_R)  },
+/* 33 */ { UD_Ixor,	Gv,	Ev,	NOARG,	Pa32 | Po32 | REX(_W|_R|_X|_B) },
+/* 34 */ { UD_Ixor,	AL,	Ib,	NOARG,	Pnone },
+/* 35 */ { UD_Ixor,	rAX,	Iz,	NOARG,	Po32 | REX(_W) },
+/* 36 */ { UD_Iss,	ES,	NOARG,	NOARG,	Pinv64 },
+/* 37 */ { UD_Iaaa,	NOARG,	NOARG,	NOARG,	Pinv64 },
+/* 38 */ { UD_Icmp,	Eb,	Gb,	NOARG,	Pa32 | REX(_X|_B|_R)  },
+/* 39 */ { UD_Icmp,	Ev,	Gv,	NOARG,	Pa32 | Po32 | REX(_W|_R|_X|_B) },
+/* 3A */ { UD_Icmp,	Gb,	Eb,	NOARG,	Pa32 | REX(_X|_B|_R)  },
+/* 3B */ { UD_Icmp,	Gv,	Ev,	NOARG,	Pa32 | Po32 | REX(_W|_R|_X|_B) },
+/* 3C */ { UD_Icmp,	AL,	Ib,	NOARG,	Pnone },
+/* 3D */ { UD_Icmp,	rAX,	Iz,	NOARG,	Po32 | REX(_W) },
+/* 3E */ { UD_Ids,	ES,	NOARG,	NOARG,	Pnone },
+/* 3F */ { UD_Iaas,	NOARG,	NOARG,	NOARG,	Pinv64 },
+/* 40 */ { UD_Iinc,	eAX,	NOARG,	NOARG,	Po32 },
+/* 41 */ { UD_Iinc,	eCX,	NOARG,	NOARG,	Po32 },
+/* 42 */ { UD_Iinc,	eDX,	NOARG,	NOARG,	Po32 },
+/* 43 */ { UD_Iinc,	eBX,	NOARG,	NOARG,	Po32 },
+/* 44 */ { UD_Iinc,	eSP,	NOARG,	NOARG,	Po32 },
+/* 45 */ { UD_Iinc,	eBP,	NOARG,	NOARG,	Po32 },
+/* 46 */ { UD_Iinc,	eSI,	NOARG,	NOARG,	Po32 },
+/* 47 */ { UD_Iinc,	eDI,	NOARG,	NOARG,	Po32 },
+/* 48 */ { UD_Idec,	eAX,	NOARG,	NOARG,	Po32 },
+/* 49 */ { UD_Idec,	eCX,	NOARG,	NOARG,	Po32 },
+/* 4A */ { UD_Idec,	eDX,	NOARG,	NOARG,	Po32 },
+/* 4B */ { UD_Idec,	eBX,	NOARG,	NOARG,	Po32 },
+/* 4C */ { UD_Idec,	eSP,	NOARG,	NOARG,	Po32 },
+/* 4D */ { UD_Idec,	eBP,	NOARG,	NOARG,	Po32 },
+/* 4E */ { UD_Idec,	eSI,	NOARG,	NOARG,	Po32 },
+/* 4F */ { UD_Idec,	eDI,	NOARG,	NOARG,	Po32 },
+/* 50 */ { UD_Ipush,	rAXr8,	NOARG,	NOARG,	Po32 | Pdef64 | REX(_B) },
+/* 51 */ { UD_Ipush,	rCXr9,	NOARG,	NOARG,	Po32 | Pdef64 | REX(_B) },
+/* 52 */ { UD_Ipush,	rDXr10,	NOARG,	NOARG,	Po32 | Pdef64 | REX(_B) },
+/* 53 */ { UD_Ipush,	rBXr11,	NOARG,	NOARG,	Po32 | Pdef64 | REX(_B) },
+/* 54 */ { UD_Ipush,	rSPr12,	NOARG,	NOARG,	Po32 | Pdef64 | REX(_B) },
+/* 55 */ { UD_Ipush,	rBPr13,	NOARG,	NOARG,	Po32 | Pdef64 | REX(_B) },
+/* 56 */ { UD_Ipush,	rSIr14,	NOARG,	NOARG,	Po32 | Pdef64 | REX(_B) },
+/* 57 */ { UD_Ipush,	rDIr15,	NOARG,	NOARG,	Po32 | Pdef64 | REX(_B) },
+/* 58 */ { UD_Ipop,	rAXr8,	NOARG,	NOARG,	Po32 | Pdef64 | REX(_B) },
+/* 59 */ { UD_Ipop,	rCXr9,	NOARG,	NOARG,	Po32 | Pdef64 | REX(_B) },
+/* 5A */ { UD_Ipop,	rDXr10,	NOARG,	NOARG,	Po32 | Pdef64 | REX(_B) },
+/* 5B */ { UD_Ipop,	rBXr11,	NOARG,	NOARG,	Po32 | Pdef64 | REX(_B) },
+/* 5C */ { UD_Ipop,	rSPr12,	NOARG,	NOARG,	Po32 | Pdef64 | REX(_B) },
+/* 5D */ { UD_Ipop,	rBPr13,	NOARG,	NOARG,	Po32 | Pdef64 | REX(_B) },
+/* 5E */ { UD_Ipop,	rSIr14,	NOARG,	NOARG,	Po32 | Pdef64 | REX(_B) },
+/* 5F */ { UD_Ipop,	rDIr15,	NOARG,	NOARG,	Po32 | Pdef64 | REX(_B) },
+/* 60 */ { UD_Ipusha,	NOARG,	NOARG,	NOARG,	Po32 | Pinv64 | PdepM },
+/* 61 */ { UD_Ipopa,	NOARG,	NOARG,	NOARG,	Po32 | Pinv64 | PdepM },
+/* 62 */ { UD_Ibound,	Gv,	M,	NOARG,	Po32 | Pa32 | Pinv64 },
+/* 63 */ { UD_Iarpl,	Ew,	Gw,	NOARG,	Pa32 | Pinv64 },
+/* 64 */ { UD_Ifs,	ES,	NOARG,	NOARG,	Pnone },
+/* 65 */ { UD_Igs,	GS,	NOARG,	NOARG,	Pnone },
+/* 66 */ { UD_Ia32,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 67 */ { UD_Io32,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 68 */ { UD_Ipush,	Iz,	NOARG,	NOARG,	Pc1 | Po32 },
+/* 69 */ { UD_Iimul,	Gv,	Ev,	Iz,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 6A */ { UD_Ipush,	Ib,	NOARG,	NOARG,	Pnone },
+/* 6B */ { UD_Iimul,	Gv,	Ev,	Ib,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 6C */ { UD_Iinsb,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 6D */ { UD_Iinsw,	NOARG,	NOARG,	NOARG,	Po32 | PdepM },
+/* 6E */ { UD_Ioutsb,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 6F */ { UD_Ioutsw,	NOARG,	NOARG,	NOARG,	Po32 | PdepM },
+/* 70 */ { UD_Ijo,	Jb,	NOARG,	NOARG,	Pnone },
+/* 71 */ { UD_Ijno,	Jb,	NOARG,	NOARG,	Pnone },
+/* 72 */ { UD_Ijb,	Jb,	NOARG,	NOARG,	Pnone },
+/* 73 */ { UD_Ijae,	Jb,	NOARG,	NOARG,	Pnone },
+/* 74 */ { UD_Ijz,	Jb,	NOARG,	NOARG,	Pnone },
+/* 75 */ { UD_Ijnz,	Jb,	NOARG,	NOARG,	Pnone },
+/* 76 */ { UD_Ijbe,	Jb,	NOARG,	NOARG,	Pnone },
+/* 77 */ { UD_Ija,	Jb,	NOARG,	NOARG,	Pnone },
+/* 78 */ { UD_Ijs,	Jb,	NOARG,	NOARG,	Pnone },
+/* 79 */ { UD_Ijns,	Jb,	NOARG,	NOARG,	Pnone },
+/* 7A */ { UD_Ijp,	Jb,	NOARG,	NOARG,	Pnone },
+/* 7B */ { UD_Ijnp,	Jb,	NOARG,	NOARG,	Pnone },
+/* 7C */ { UD_Ijl,	Jb,	NOARG,	NOARG,	Pnone },
+/* 7D */ { UD_Ijge,	Jb,	NOARG,	NOARG,	Pnone },
+/* 7E */ { UD_Ijle,	Jb,	NOARG,	NOARG,	Pnone },
+/* 7F */ { UD_Ijg,	Jb,	NOARG,	NOARG,	Pnone },
+/* 80 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_80 },
+/* 81 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_81 },
+/* 82 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_82 },
+/* 83 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_83 },
+/* 84 */ { UD_Itest,	Eb,	Gb,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 85 */ { UD_Itest,	Ev,	Gv,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 86 */ { UD_Ixchg,	Eb,	Gb,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 87 */ { UD_Ixchg,	Ev,	Gv,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 88 */ { UD_Imov,	Eb,	Gb,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 89 */ { UD_Imov,	Ev,	Gv,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 8A */ { UD_Imov,	Gb,	Eb,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 8B */ { UD_Imov,	Gv,	Ev,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 8C */ { UD_Imov,	Ev,	S,	NOARG,	Po32 | Pa32 | REX(_R|_X|_B) },
+/* 8D */ { UD_Ilea,	Gv,	M,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 8E */ { UD_Imov,	S,	Ev,	NOARG,	Po32 | Pa32 | REX(_R|_X|_B) },
+/* 8F */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_8F },
+/* 90 */ { UD_Ixchg,	rAXr8,	rAX,	NOARG,	Po32 | REX(_W|_B) },
+/* 91 */ { UD_Ixchg,	rCXr9,	rAX,	NOARG,	Po32 | REX(_W|_B) },
+/* 92 */ { UD_Ixchg,	rDXr10,	rAX,	NOARG,	Po32 | REX(_W|_B) },
+/* 93 */ { UD_Ixchg,	rBXr11,	rAX,	NOARG,	Po32 | REX(_W|_B) },
+/* 94 */ { UD_Ixchg,	rSPr12,	rAX,	NOARG,	Po32 | REX(_W|_B) },
+/* 95 */ { UD_Ixchg,	rBPr13,	rAX,	NOARG,	Po32 | REX(_W|_B) },
+/* 96 */ { UD_Ixchg,	rSIr14,	rAX,	NOARG,	Po32 | REX(_W|_B) },
+/* 97 */ { UD_Ixchg,	rDIr15,	rAX,	NOARG,	Po32 | REX(_W|_B) },
+/* 98 */ { UD_Icbw,	NOARG,	NOARG,	NOARG,	Po32 | PdepM | REX(_W) },
+/* 99 */ { UD_Icwd,	NOARG,	NOARG,	NOARG,	Po32 | PdepM | REX(_W) },
+/* 9A */ { UD_Icall,	Ap,	NOARG,	NOARG,	Pc1 | Po32 | Pinv64 },
+/* 9B */ { UD_Iwait,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 9C */ { UD_Ipushfw,	NOARG,	NOARG,	NOARG,	Po32 | PdepM | Pdef64 },
+/* 9D */ { UD_Ipopfw,	NOARG,	NOARG,	NOARG,	Po32 | PdepM | Pdef64 },
+/* 9E */ { UD_Isahf,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 9F */ { UD_Ilahf,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A0 */ { UD_Imov,	AL,	Ob,	NOARG,	Pnone },
+/* A1 */ { UD_Imov,	rAX,	Ov,	NOARG,	Po32 | Pa32 | REX(_W) },
+/* A2 */ { UD_Imov,	Ob,	AL,	NOARG,	Pnone },
+/* A3 */ { UD_Imov,	Ov,	rAX, 	NOARG,	Po32 | Pa32 | REX(_W) },
+/* A4 */ { UD_Imovsb,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A5 */ { UD_Imovsw,	NOARG,	NOARG,	NOARG,	Po32 | PdepM | REX(_W) },
+/* A6 */ { UD_Icmpsb,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A7 */ { UD_Icmpsw,	NOARG,	NOARG,	NOARG,	Po32 | PdepM | REX(_W) },
+/* A8 */ { UD_Itest,	AL,	Ib,	NOARG,	Pnone },
+/* A9 */ { UD_Itest,	rAX,	Iz,	NOARG,	Po32 | REX(_W) },
+/* AA */ { UD_Istosb,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AB */ { UD_Istosw,	NOARG,	NOARG,	NOARG,	Po32 | PdepM | REX(_W) },
+/* AC */ { UD_Ilodsb,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AD */ { UD_Ilodsw,	NOARG,	NOARG,	NOARG,	Po32 | PdepM | REX(_W) },
+/* AE */ { UD_Iscasb,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AF */ { UD_Iscasw,	NOARG,	NOARG,	NOARG,	Po32 | PdepM | REX(_W) },
+/* B0 */ { UD_Imov,	ALr8b,	Ib,	NOARG,	REX(_B) },
+/* B1 */ { UD_Imov,	CLr9b,	Ib,	NOARG,	REX(_B) },
+/* B2 */ { UD_Imov,	DLr10b,	Ib,	NOARG,	REX(_B) },
+/* B3 */ { UD_Imov,	BLr11b,	Ib,	NOARG,	REX(_B) },
+/* B4 */ { UD_Imov,	AHr12b,	Ib,	NOARG,	REX(_B) },
+/* B5 */ { UD_Imov,	CHr13b,	Ib,	NOARG,	REX(_B) },
+/* B6 */ { UD_Imov,	DHr14b,	Ib,	NOARG,	REX(_B) },
+/* B7 */ { UD_Imov,	BHr15b,	Ib,	NOARG,	REX(_B) },
+/* B8 */ { UD_Imov,	rAXr8,	Iv,	NOARG,	Po32 | REX(_W|_B) },
+/* B9 */ { UD_Imov,	rCXr9,	Iv,	NOARG,	Po32 | REX(_W|_B) },
+/* BA */ { UD_Imov,	rDXr10,	Iv,	NOARG,	Po32 | REX(_W|_B) },
+/* BB */ { UD_Imov,	rBXr11,	Iv,	NOARG,	Po32 | REX(_W|_B) },
+/* BC */ { UD_Imov,	rSPr12,	Iv,	NOARG,	Po32 | REX(_W|_B) },
+/* BD */ { UD_Imov,	rBPr13,	Iv,	NOARG,	Po32 | REX(_W|_B) },
+/* BE */ { UD_Imov,	rSIr14,	Iv,	NOARG,	Po32 | REX(_W|_B) },
+/* BF */ { UD_Imov,	rDIr15,	Iv,	NOARG,	Po32 | REX(_W|_B) },
+/* C0 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_C0 },
+/* C1 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_C1 },
+/* C2 */ { UD_Iret,	Iw,	NOARG,	NOARG,	Pnone },
+/* C3 */ { UD_Iret,	NOARG,	NOARG,	NOARG,	Pnone },
+/* C4 */ { UD_Iles,	Gv,	M,	NOARG,	Po32 | Pa32 | Pinv64 },
+/* C5 */ { UD_Ilds,	Gv,	M,	NOARG,	Po32 | Pa32 | Pinv64 },
+/* C6 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_C6 },
+/* C7 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_C7 },
+/* C8 */ { UD_Ienter,	Iw,	Ib,	NOARG,	Pnone | Pdef64 },
+/* C9 */ { UD_Ileave,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CA */ { UD_Iretf,	Iw,	NOARG,	NOARG,	Pnone },
+/* CB */ { UD_Iretf,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CC */ { UD_Iint3,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CD */ { UD_Iint,	Ib,	NOARG,	NOARG,	Pnone },
+/* CE */ { UD_Iinto,	NOARG,	NOARG,	NOARG,	Pinv64 },
+/* CF */ { UD_Iiretw,	NOARG,	NOARG,	NOARG,	Po32 | PdepM | REX(_W) },
+/* D0 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_D0 },
+/* D1 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_D1 },
+/* D2 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_D2 },
+/* D3 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_D3 },
+/* D4 */ { UD_Iaam,	Ib,	NOARG,	NOARG,	Pinv64 },
+/* D5 */ { UD_Iaad,	Ib,	NOARG,	NOARG,	Pinv64 },
+/* D6 */ { UD_Isalc,	NOARG,	NOARG,	NOARG,	Pinv64 },
+/* D7 */ { UD_Ixlatb,	NOARG,	NOARG,	NOARG,	REX(_W) },
+/* D8 */ { UD_Ix87,	NOARG,	NOARG,	NOARG,	Pnone },
+/* D9 */ { UD_Ix87,	NOARG,	NOARG,	NOARG,	Pnone },
+/* DA */ { UD_Ix87,	NOARG,	NOARG,	NOARG,	Pnone },
+/* DB */ { UD_Ix87,	NOARG,	NOARG,	NOARG,	Pnone },
+/* DC */ { UD_Ix87,	NOARG,	NOARG,	NOARG,	Pnone },
+/* DD */ { UD_Ix87,	NOARG,	NOARG,	NOARG,	Pnone },
+/* DE */ { UD_Ix87,	NOARG,	NOARG,	NOARG,	Pnone },
+/* DF */ { UD_Ix87,	NOARG,	NOARG,	NOARG,	Pnone },
+/* E0 */ { UD_Iloopnz,	Jb,	NOARG,	NOARG,	Pnone },
+/* E1 */ { UD_Iloope,	Jb,	NOARG,	NOARG,	Pnone },
+/* E2 */ { UD_Iloop,	Jb,	NOARG,	NOARG,	Pdef64 },
+/* E3 */ { UD_Ijcxz,	Jb,	NOARG,	NOARG,	Pa32 | PdepM  },
+/* E4 */ { UD_Iin,	AL,	Ib,	NOARG,	Pnone },
+/* E5 */ { UD_Iin,	eAX,	Ib,	NOARG,	Pnone | Po32 },
+/* E6 */ { UD_Iout,	Ib,	AL,	NOARG,	Pnone },
+/* E7 */ { UD_Iout,	Ib,	eAX,	NOARG,	Po32 | Pnone },
+/* E8 */ { UD_Icall,	Jz,	NOARG,	NOARG,	Po32 | Pdef64 },
+/* E9 */ { UD_Ijmp,	Jz,	NOARG,	NOARG,	Po32 | Pdef64 },
+/* EA */ { UD_Ijmp,	Ap,	NOARG,	NOARG,	Pinv64 },
+/* EB */ { UD_Ijmp,	Jb,	NOARG,	NOARG,	Pnone },
+/* EC */ { UD_Iin,	AL,	DX,	NOARG,	Pnone },
+/* ED */ { UD_Iin,	eAX,	DX,	NOARG,	Po32 | Pnone },
+/* EE */ { UD_Iout,	DX,	AL,	NOARG,	Pnone },
+/* EF */ { UD_Iout,	DX,	eAX,	NOARG,	Po32 | Pnone },
+/* F0 */ { UD_Ilock,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F1 */ { UD_Iint1,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F2 */ { UD_Irepne,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F3 */ { UD_Irep,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F4 */ { UD_Ihlt,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F5 */ { UD_Icmc,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F6 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_F6 },
+/* F7 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_F7 },
+/* F8 */ { UD_Iclc,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F9 */ { UD_Istc,	NOARG,	NOARG,	NOARG,	Pnone },
+/* FA */ { UD_Icli,	NOARG,	NOARG,	NOARG,	Pnone },
+/* FB */ { UD_Isti,	NOARG,	NOARG,	NOARG,	Pnone },
+/* FC */ { UD_Icld,	NOARG,	NOARG,	NOARG,	Pnone },
+/* FD */ { UD_Istd,	NOARG,	NOARG,	NOARG,	Pnone },
+/* FE */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_FE },
+/* FF */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_FF }
+
+};
+
+
+/* 2byte no-prefix opcodes */
+struct map_entry itab_2byte[0x100] = 
+{
+/* 00 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_0F00 },
+/* 01 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_0F01 },
+/* 02 */ { UD_Ilar,	Gv,	Ew,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 03 */ { UD_Ilsl,	Gv,	Ew,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 04 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 05 */ { UD_Isyscall,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 06 */ { UD_Iclts,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 07 */ { UD_Isysret,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 08 */ { UD_Iinvd,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 09 */ { UD_Iwbinvd,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0A */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0B */ { UD_Iud2,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0C */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0D */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_0F0D },
+/* 0E */ { UD_Ifemms,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0F */ { UD_I3dnow,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 10 */ { UD_Imovups,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 11 */ { UD_Imovups,	W,	V,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 12 */ { UD_Imovlps,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 13 */ { UD_Imovlps,	M,	V,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 14 */ { UD_Iunpcklps,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 15 */ { UD_Iunpckhps,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 16 */ { UD_Imovhps,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 17 */ { UD_Imovhps,	M,	V,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 18 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_0F18  },
+/* 19 */ { UD_Inop,	M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 1A */ { UD_Inop,	M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 1B */ { UD_Inop,	M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 1C */ { UD_Inop,	M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 1D */ { UD_Inop,	M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 1E */ { UD_Inop,	M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 1F */ { UD_Inop,	M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 20 */ { UD_Imov,	R,	C,	NOARG,	REX(_R) },
+/* 21 */ { UD_Imov,	R,	D,	NOARG,	REX(_R) },
+/* 22 */ { UD_Imov,	C,	R,	NOARG,	REX(_R) },
+/* 23 */ { UD_Imov,	D,	R,	NOARG,	REX(_R) },
+/* 24 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 25 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 26 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 27 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 28 */ { UD_Imovaps,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 29 */ { UD_Imovaps,	W,	V,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 2A */ { UD_Icvtpi2ps,V,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 2B */ { UD_Imovntps,	M,	V,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 2C */ { UD_Icvttps2pi,P,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 2D */ { UD_Icvtps2pi,P,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 2E */ { UD_Iucomiss,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 2F */ { UD_Icomiss,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 30 */ { UD_Iwrmsr,	NOARG,	NOARG,	NOARG,	},
+/* 31 */ { UD_Irdtsc,	NOARG,	NOARG,	NOARG,	},
+/* 32 */ { UD_Irdmsr,	NOARG,	NOARG,	NOARG,	},
+/* 33 */ { UD_Irdpmc,	NOARG,	NOARG,	NOARG,	},
+/* 34 */ { UD_Isysenter, NOARG,	NOARG,	NOARG,	Pinv64 },
+/* 35 */ { UD_Isysexit,	NOARG,	NOARG,	NOARG,	Pinv64 },
+/* 36 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 37 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 38 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 39 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3A */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3B */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3C */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3D */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3E */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3F */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 40 */ { UD_Icmovo,	Gv,	Ev,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 41 */ { UD_Icmovno,	Gv,	Ev,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 42 */ { UD_Icmovb,	Gv,	Ev,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 43 */ { UD_Icmovae,	Gv,	Ev,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 44 */ { UD_Icmovz,	Gv,	Ev,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 45 */ { UD_Icmovnz,	Gv,	Ev,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 46 */ { UD_Icmovbe,	Gv,	Ev,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 47 */ { UD_Icmova,	Gv,	Ev,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 48 */ { UD_Icmovs,	Gv,	Ev,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 49 */ { UD_Icmovns,	Gv,	Ev,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 4A */ { UD_Icmovp,	Gv,	Ev,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 4B */ { UD_Icmovnp,	Gv,	Ev,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 4C */ { UD_Icmovl,	Gv,	Ev,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 4D */ { UD_Icmovge,	Gv,	Ev,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 4E */ { UD_Icmovle,	Gv,	Ev,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 4F */ { UD_Icmovg,	Gv,	Ev,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* 50 */ { UD_Imovmskps,Gd,	VR,	NOARG,	Po32 | REX(_W|_R|_B) },
+/* 51 */ { UD_Isqrtps,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 52 */ { UD_Irsqrtps,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 53 */ { UD_Ircpps,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 54 */ { UD_Iandps,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 55 */ { UD_Iandnps,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 56 */ { UD_Iorps,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 57 */ { UD_Ixorps,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 58 */ { UD_Iaddps,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 59 */ { UD_Imulps,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5A */ { UD_Icvtps2pd,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5B */ { UD_Icvtdq2ps,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5C */ { UD_Isubps,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5D */ { UD_Iminps,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5E */ { UD_Idivps,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5F */ { UD_Imaxps,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 60 */ { UD_Ipunpcklbw,P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 61 */ { UD_Ipunpcklwd,P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 62 */ { UD_Ipunpckldq,P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 63 */ { UD_Ipacksswb, P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 64 */ { UD_Ipcmpgtb,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 65 */ { UD_Ipcmpgtw,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 66 */ { UD_Ipcmpgtd,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 67 */ { UD_Ipackuswb,P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 68 */ { UD_Ipunpckhbw,P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 69 */ { UD_Ipunpckhwd,P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 6A */ { UD_Ipunpckhdq,P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 6B */ { UD_Ipackssdw,P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 6C */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 6D */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 6E */ { UD_Imovd,	P,	Ex,	NOARG,	Pc2 | Pa32 | REX(_R|_X|_B) },
+/* 6F */ { UD_Imovq,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 70 */ { UD_Ipshufw,	P,	Q,	Ib,	Pa32 | REX(_R|_X|_B) },
+/* 71 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_0F71 },
+/* 72 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_0F72 },
+/* 73 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_0F73 },
+/* 74 */ { UD_Ipcmpeqb,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 75 */ { UD_Ipcmpeqw,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 76 */ { UD_Ipcmpeqd,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 77 */ { UD_Iemms,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 78 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 79 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 7A */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 7B */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 7C */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 7D */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 7E */ { UD_Imovd,	Ex,	P,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+/* 7F */ { UD_Imovq,	Q,	P,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 80 */ { UD_Ijo,	Jz,	NOARG,	NOARG,	Pc1 | Po32 | Pdef64},
+/* 81 */ { UD_Ijno,	Jz,	NOARG,	NOARG,	Pc1 | Po32 | Pdef64 },
+/* 82 */ { UD_Ijb,	Jz,	NOARG,	NOARG,	Pc1 | Po32 | Pdef64 },
+/* 83 */ { UD_Ijae,	Jz,	NOARG,	NOARG,	Pc1 | Po32 | Pdef64 },
+/* 84 */ { UD_Ijz,	Jz,	NOARG,	NOARG,	Pc1 | Po32 | Pdef64 },
+/* 85 */ { UD_Ijnz,	Jz,	NOARG,	NOARG,	Pc1 | Po32 | Pdef64 },
+/* 86 */ { UD_Ijbe,	Jz,	NOARG,	NOARG,	Pc1 | Po32 | Pdef64 },
+/* 87 */ { UD_Ija,	Jz,	NOARG,	NOARG,	Pc1 | Po32 | Pdef64 },
+/* 88 */ { UD_Ijs,	Jz,	NOARG,	NOARG,	Pc1 | Po32 | Pdef64 },
+/* 89 */ { UD_Ijns,	Jz,	NOARG,	NOARG,	Pc1 | Po32 | Pdef64},
+/* 8A */ { UD_Ijp,	Jz,	NOARG,	NOARG,	Pc1 | Po32 | Pdef64 },
+/* 8B */ { UD_Ijnp,	Jz,	NOARG,	NOARG,	Pc1 | Po32 | Pdef64 },
+/* 8C */ { UD_Ijl,	Jz,	NOARG,	NOARG,	Pc1 | Po32 | Pdef64 },
+/* 8D */ { UD_Ijge,	Jz,	NOARG,	NOARG,	Pc1 | Po32 | Pdef64 },
+/* 8E */ { UD_Ijle,	Jz,	NOARG,	NOARG,	Pc1 | Po32 | Pdef64 },
+/* 8F */ { UD_Ijg,	Jz,	NOARG,	NOARG,	Pc1 | Po32 | Pdef64 },
+/* 90 */ { UD_Iseto,	Eb,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 91 */ { UD_Isetno,	Eb,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 92 */ { UD_Isetb,	Eb,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 93 */ { UD_Isetnb,	Eb,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 94 */ { UD_Isetz,	Eb,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 95 */ { UD_Isetnz,	Eb,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 96 */ { UD_Isetbe,	Eb,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 97 */ { UD_Iseta,	Eb,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 98 */ { UD_Isets,	Eb,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 99 */ { UD_Isetns,	Eb,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 9A */ { UD_Isetp,	Eb,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 9B */ { UD_Isetnp,	Eb,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 9C */ { UD_Isetl,	Eb,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 9D */ { UD_Isetge,	Eb,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 9E */ { UD_Isetle,	Eb,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 9F */ { UD_Isetg,	Eb,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* A0 */ { UD_Ipush,	FS,	NOARG,	NOARG,	Pnone },
+/* A1 */ { UD_Ipop,	FS,	NOARG,	NOARG,	Pnone },
+/* A2 */ { UD_Icpuid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A3 */ { UD_Ibt,	Ev,	Gv,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* A4 */ { UD_Ishld,	Ev,	Gv,	Ib,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* A5 */ { UD_Ishld,	Ev,	Gv,	CL,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* A6 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A7 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A8 */ { UD_Ipush,	GS,	NOARG,	NOARG,	Pnone },
+/* A9 */ { UD_Ipop,	GS,	NOARG,	NOARG,	Pnone },
+/* AA */ { UD_Irsm,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AB */ { UD_Ibts,	Ev,	Gv,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* AC */ { UD_Ishrd,	Ev,	Gv,	Ib,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* AD */ { UD_Ishrd,	Ev,	Gv,	CL,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* AE */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_0FAE },
+/* AF */ { UD_Iimul,	Gv,	Ev,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* B0 */ { UD_Icmpxchg,	Eb,	Gb,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* B1 */ { UD_Icmpxchg,	Ev,	Gv,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* B2 */ { UD_Ilss,	Gz,	M,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* B3 */ { UD_Ibtr,	Ev,	Gv,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* B4 */ { UD_Ilfs,	Gz,	M,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* B5 */ { UD_Ilgs,	Gz,	M,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* B6 */ { UD_Imovzx,	Gv,	Eb,	NOARG,	Pc2 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* B7 */ { UD_Imovzx,	Gv,	Ew,	NOARG,	Pc2 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* B8 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B9 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_0FB9 },
+/* BA */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_0FBA },
+/* BB */ { UD_Ibtc,	Ev,	Gv,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* BC */ { UD_Ibsf,	Gv,	Ev,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* BD */ { UD_Ibsr,	Gv,	Ev,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* BE */ { UD_Imovsx,	Gv,	Eb,	NOARG,	Pc2 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* BF */ { UD_Imovsx,	Gv,	Ew,	NOARG,	Pc2 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* C0 */ { UD_Ixadd,	Eb,	Gb,	NOARG,	Po32 | Pa32 | REX(_R|_X|_B) },
+/* C1 */ { UD_Ixadd,	Ev,	Gv,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* C2 */ { UD_Icmpps,	V,	W,	Ib,	Pa32 | REX(_R|_X|_B) },
+/* C3 */ { UD_Imovnti,	M,	Gx,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+/* C4 */ { UD_Ipinsrw,	P,	Ew,	Ib,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* C5 */ { UD_Ipextrw,	Gd,	PR,	Ib,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* C6 */ { UD_Ishufps,	V,	W,	Ib,	Pa32 | REX(_R|_X|_B) },
+/* C7 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_0FC7 },
+/* C8 */ { UD_Ibswap,	rAXr8,	NOARG,	NOARG,	Po32 | REX(_W|_B) },
+/* C9 */ { UD_Ibswap,	rCXr9,	NOARG,	NOARG,	Po32 | REX(_W|_B) },
+/* CA */ { UD_Ibswap,	rDXr10,	NOARG,	NOARG,	Po32 | REX(_W|_B) },
+/* CB */ { UD_Ibswap,	rBXr11,	NOARG,	NOARG,	Po32 | REX(_W|_B) },
+/* CC */ { UD_Ibswap,	rSPr12,	NOARG,	NOARG,	Po32 | REX(_W|_B) },
+/* CD */ { UD_Ibswap,	rBPr13,	NOARG,	NOARG,	Po32 | REX(_W|_B) },
+/* CE */ { UD_Ibswap,	rSIr14,	NOARG,	NOARG,	Po32 | REX(_W|_B) },
+/* CF */ { UD_Ibswap,	rDIr15,	NOARG,	NOARG,	Po32 | REX(_W|_B) },
+/* D0 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* D1 */ { UD_Ipsrlw,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* D2 */ { UD_Ipsrld,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* D3 */ { UD_Ipsrlq,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* D4 */ { UD_Ipaddq,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* D5 */ { UD_Ipmullw,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* D6 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* D7 */ { UD_Ipmovmskb,Gd,	PR,	NOARG,	Pnone },
+/* D8 */ { UD_Ipsubusb,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* D9 */ { UD_Ipsubusw,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* DA */ { UD_Ipminub,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* DB */ { UD_Ipand,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* DC */ { UD_Ipaddusb,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* DD */ { UD_Ipaddusw,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* DE */ { UD_Ipmaxub,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* DF */ { UD_Ipandn,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* E0 */ { UD_Ipavgb,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* E1 */ { UD_Ipsraw,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* E2 */ { UD_Ipsrad,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* E3 */ { UD_Ipavgw,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* E4 */ { UD_Ipmulhuw,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* E5 */ { UD_Ipmulhw,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* E6 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* E7 */ { UD_Imovntq,	M,	P,	NOARG,	Pnone },
+/* E8 */ { UD_Ipsubsb,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* E9 */ { UD_Ipsubsw,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* EA */ { UD_Ipminsw,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* EB */ { UD_Ipor,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* EC */ { UD_Ipaddsb,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* ED */ { UD_Ipaddsw,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* EE */ { UD_Ipmaxsw,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* EF */ { UD_Ipxor,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* F0 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F1 */ { UD_Ipsllw,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* F2 */ { UD_Ipslld,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* F3 */ { UD_Ipsllq,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* F4 */ { UD_Ipmuludq,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* F5 */ { UD_Ipmaddwd,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* F6 */ { UD_Ipsadbw,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* F7 */ { UD_Imaskmovq,P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* F8 */ { UD_Ipsubb,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* F9 */ { UD_Ipsubw,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* FA */ { UD_Ipsubd,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* FB */ { UD_Ipsubq,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* FC */ { UD_Ipaddb,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* FD */ { UD_Ipaddw,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* FE */ { UD_Ipaddd,	P,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* FF */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+struct map_entry itab_2byte_prefixF3[0x100] = 
+{
+/* 00 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 01 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 02 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 03 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 04 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 05 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 06 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 07 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 08 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 09 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0A */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0B */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0C */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0D */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0E */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0F */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 10 */ { UD_Imovss,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 11 */ { UD_Imovss,	W,	V,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 12 */ { UD_Imovsldup,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 13 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 14 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 15 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 16 */ { UD_Imovshdup,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 17 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 18 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 19 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 1A */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 1B */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 1C */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 1D */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 1E */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 1F */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 20 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 21 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 22 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 23 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 24 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 25 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 26 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 27 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 28 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 29 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 2A */ { UD_Icvtsi2ss,V,	Ex,	NOARG,	Pc2 | Pa32 | REX(_R|_X|_B) },
+/* 2B */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 2C */ { UD_Icvttss2si,Gvw,	W,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+/* 2D */ { UD_Icvtss2si,Gvw,	W,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+/* 2E */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 2F */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 30 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 31 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 32 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 33 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 34 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 35 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 36 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 37 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 38 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 39 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3A */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3B */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3C */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3D */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3E */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3F */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 40 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 41 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 42 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 43 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 44 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 45 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 46 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 47 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 48 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 49 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 4A */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 4B */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 4C */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 4D */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 4E */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 4F */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 50 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 51 */ { UD_Isqrtss,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 52 */ { UD_Irsqrtss,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 53 */ { UD_Ircpss,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 54 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 55 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 56 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 57 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 58 */ { UD_Iaddss,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 59 */ { UD_Imulss,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5A */ { UD_Icvtss2sd,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5B */ { UD_Icvttps2dq,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5C */ { UD_Isubss,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5D */ { UD_Iminss,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5E */ { UD_Idivss,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5F */ { UD_Imaxss,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 60 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 61 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 62 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 63 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 64 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 65 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 66 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 67 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 68 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 69 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 6A */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 6B */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 6C */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 6D */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 6E */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 6F */ { UD_Imovdqu,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 70 */ { UD_Ipshufhw,	V,	W,	Ib,	Pa32 | REX(_R|_X|_B) },
+/* 71 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 72 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 73 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 74 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 75 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 76 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 77 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 78 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 79 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 7A */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 7B */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 7C */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 7D */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 7E */ { UD_Imovq,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 7F */ { UD_Imovdqu,	W,	V,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 80 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 81 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 82 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 83 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 84 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 85 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 86 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 87 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 88 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 89 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 8A */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 8B */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 8C */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 8D */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 8E */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 8F */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 90 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 91 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 92 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 93 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 94 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 95 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 96 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 97 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 98 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 99 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 9A */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 9B */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 9C */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 9D */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 9E */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 9F */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A0 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A1 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A2 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A3 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A4 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A5 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A6 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A7 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A8 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A9 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AA */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AB */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AC */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AD */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AE */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AF */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B0 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B1 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B2 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B3 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B4 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B5 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B6 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B7 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B8 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B9 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* BA */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* BB */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* BC */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* BD */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* BE */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* BF */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* C0 */ { UD_Ixadd,	Eb,	Gb,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+/* C1 */ { UD_Ixadd,	Ev,	Gv,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+/* C2 */ { UD_Icmpss,	V,	W,	Ib,	Pa32 | REX(_R|_X|_B) },
+/* C3 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* C4 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* C5 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* C6 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* C7 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_0FC7 },
+/* C8 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* C9 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CA */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CB */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CC */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CD */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CE */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CF */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* D0 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* D1 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* D2 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* D3 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* D4 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* D5 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* D6 */ { UD_Imovq2dq,	V,	PR,	NOARG,	Pa32  },
+/* D7 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* D8 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* D9 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* DA */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* DB */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* DC */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* DD */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* DE */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CF */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* E0 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* E1 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* E2 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* E3 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* E4 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* E5 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* E6 */ { UD_Icvtdq2pd,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* E7 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* E8 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* E9 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* EA */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* EB */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* EC */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* ED */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* EE */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* EF */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F0 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F1 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F2 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F3 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F4 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F5 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F6 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F7 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F8 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F9 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* FA */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* FB */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* FC */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* FD */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* FE */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* FF */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+struct map_entry itab_2byte_prefix66[0x100] = 
+{
+/* 00 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 01 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 02 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 03 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 04 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 05 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 06 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 07 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 08 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 09 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0A */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0B */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0C */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0D */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0E */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0F */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 10 */ { UD_Imovupd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 11 */ { UD_Imovupd,	W,	V,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 12 */ { UD_Imovlpd,	V,	M,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 13 */ { UD_Imovlpd,	M,	V,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 14 */ { UD_Iunpcklpd,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 15 */ { UD_Iunpckhpd,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 16 */ { UD_Imovhpd,	V,	M,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 17 */ { UD_Imovhpd,	M,	V,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 18 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 19 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 1A */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 1B */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 1C */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 1D */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 1E */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 1F */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 20 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 21 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 22 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 23 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 24 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 25 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 26 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 27 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 28 */ { UD_Imovapd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 29 */ { UD_Imovapd,	W,	V,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 2A */ { UD_Icvtpi2pd,V,	Q,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 2B */ { UD_Imovntpd,	M,	V,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 2C */ { UD_Icvttpd2pi,P,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 2D */ { UD_Icvtpd2pi,P,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 2E */ { UD_Iucomisd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 2F */ { UD_Icomisd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 30 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 31 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 32 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 33 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 34 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 35 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 36 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 37 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 38 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 39 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3A */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3B */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3C */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3D */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3E */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3F */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 40 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 41 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 42 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 43 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 44 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 45 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 46 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 47 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 48 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 49 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 4A */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 4B */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 4C */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 4D */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 4E */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 4F */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 50 */ { UD_Imovmskpd,Gd,	VR,	NOARG,	Po32 | REX(_W|_R|_B) },
+/* 51 */ { UD_Isqrtpd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 52 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 53 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 54 */ { UD_Iandpd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 55 */ { UD_Iandnpd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 56 */ { UD_Iorpd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 57 */ { UD_Ixorpd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 58 */ { UD_Iaddpd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 59 */ { UD_Imulpd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5A */ { UD_Icvtpd2ps,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5B */ { UD_Icvtps2dq,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5C */ { UD_Isubpd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5D */ { UD_Iminpd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5E */ { UD_Idivpd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5F */ { UD_Imaxpd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 60 */ { UD_Ipunpcklbw,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 61 */ { UD_Ipunpcklwd,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 62 */ { UD_Ipunpckldq,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 63 */ { UD_Ipacksswb,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 64 */ { UD_Ipcmpgtb,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 65 */ { UD_Ipcmpgtw,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 66 */ { UD_Ipcmpgtd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 67 */ { UD_Ipackuswb,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 68 */ { UD_Ipunpckhbw,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 69 */ { UD_Ipunpckhwd,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 6A */ { UD_Ipunpckhdq,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 6B */ { UD_Ipackssdw,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 6C */ { UD_Ipunpcklqdq,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 6D */ { UD_Ipunpckhqdq,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 6E */ { UD_Imovd,	V,	Ex,	NOARG,	Pc2 | Pa32 | REX(_W|_R|_X|_B) },
+/* 6F */ { UD_Imovqa,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 70 */ { UD_Ipshufd,	V,	W,	Ib,	Pa32 | REX(_R|_X|_B) },
+/* 71 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_0F71 },
+/* 72 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_0F72 },
+/* 73 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_0F73 },
+/* 74 */ { UD_Ipcmpeqb,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 75 */ { UD_Ipcmpeqw,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 76 */ { UD_Ipcmpeqd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 77 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 78 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 79 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 7A */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 7B */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 7C */ { UD_Ihaddpd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 7D */ { UD_Ihsubpd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 7E */ { UD_Imovd,	Ex,	V,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+/* 7F */ { UD_Imovdqa,	W,	V,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 80 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 81 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 82 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 83 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 84 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 85 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 86 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 87 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 88 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 89 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 8A */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 8B */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 8C */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 8D */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 8E */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 8F */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 90 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 91 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 92 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 93 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 94 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 95 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 96 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 97 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 98 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 99 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 9A */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 9B */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 9C */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 9D */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 9E */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 9F */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A0 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A1 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A2 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A3 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A4 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A5 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A6 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A7 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A8 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A9 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AA */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AB */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AC */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AD */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AE */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AF */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B0 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B1 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B2 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B3 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B4 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B5 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B6 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B7 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B8 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B9 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* BA */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* BB */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* BC */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* BD */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* BE */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* BF */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* C0 */ { UD_Ixadd,	Eb,	Gb,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+/* C1 */ { UD_Ixadd,	Ev,	Gv,	NOARG,	Po32 | Pa32 | REX(_W|_R|_X|_B) },
+/* C2 */ { UD_Icmppd,	V,	W,	Ib,	Pa32 | REX(_R|_X|_B) },
+/* C3 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* C4 */ { UD_Ipinsrw,	V,	Ew,	Ib,	Pa32 | REX(_W|_R|_X|_B) },
+/* C5 */ { UD_Ipextrw,	Gd,	VR,	Ib,	Pa32  },
+/* C6 */ { UD_Ishufpd,	V,	W,	Ib,	Pa32 | REX(_R|_X|_B) },
+/* C7 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_0FC7 },
+/* C8 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* C9 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CA */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CB */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CC */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CD */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CE */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CF */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* D0 */ { UD_Iaddsubpd,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* D1 */ { UD_Ipsrlw,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* D2 */ { UD_Ipsrld,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* D3 */ { UD_Ipsrlq,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* D4 */ { UD_Ipaddq,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* D5 */ { UD_Ipmullw,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* D6 */ { UD_Imovq,	W,	V,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* D7 */ { UD_Ipmovmskb,Gd,	VR,	NOARG,	Pnone },
+/* D8 */ { UD_Ipsubusb,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* D9 */ { UD_Ipsubusw,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* DA */ { UD_Ipminub,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* DB */ { UD_Ipand,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* DC */ { UD_Ipaddusb,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* DD */ { UD_Ipaddusw,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* DE */ { UD_Ipmaxub,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* DF */ { UD_Ipandn,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* E0 */ { UD_Ipavgb,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* E1 */ { UD_Ipsraw,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* E2 */ { UD_Ipsrad,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* E3 */ { UD_Ipavgw,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* E4 */ { UD_Ipmulhuw,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* E5 */ { UD_Ipmulhw,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* E6 */ { UD_Icvttpd2dq,V,	W,	NOARG,	Pnone },
+/* E7 */ { UD_Imovntdq,	M,	V,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* E8 */ { UD_Ipsubsb,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* E9 */ { UD_Ipsubsw,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* EA */ { UD_Ipminsw,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* EB */ { UD_Ipor,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* EC */ { UD_Ipaddsb,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* ED */ { UD_Ipaddsw,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* EE */ { UD_Ipmaxsw,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* EF */ { UD_Ipxor,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* F0 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F1 */ { UD_Ipsllw,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* F2 */ { UD_Ipslld,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* F3 */ { UD_Ipsllq,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* F4 */ { UD_Ipmuludq,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* F5 */ { UD_Ipmaddwd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* F6 */ { UD_Ipsadbw,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* F7 */ { UD_Imaskmovq,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* F8 */ { UD_Ipsubb,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* F9 */ { UD_Ipsubw,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* FA */ { UD_Ipsubd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* FB */ { UD_Ipsubq,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* FC */ { UD_Ipaddb,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* FD */ { UD_Ipaddw,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* FE */ { UD_Ipaddd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* FF */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+struct map_entry itab_2byte_prefixF2[0x100] = 
+{
+/* 00 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 01 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 02 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 03 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 04 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 05 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 06 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 07 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 08 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 09 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0A */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0B */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0C */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0D */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0E */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 0F */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 10 */ { UD_Imovsd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 11 */ { UD_Imovsd,	W,	V,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 12 */ { UD_Imovddup,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 13 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 14 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 15 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 16 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 17 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 18 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 19 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 1A */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 1B */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 1C */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 1D */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 1E */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 1F */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 20 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 21 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 22 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 23 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 24 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 25 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 26 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 27 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 28 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 29 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 2A */ { UD_Icvtsi2sd,V,	Ex,	NOARG,	Pc2 | Pa32 | REX(_W|_R|_X|_B) },
+/* 2B */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 2C */ { UD_Icvttsd2si,Gvw,	W,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+/* 2D */ { UD_Icvtsd2si,Gvw,	W,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+/* 2E */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 2F */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 30 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 31 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 32 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 33 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 34 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 35 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 36 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 37 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 38 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 39 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3A */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3B */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3C */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3D */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3E */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 3F */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 40 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 41 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 42 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 43 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 44 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 45 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 46 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 47 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 48 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 49 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 4A */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 4B */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 4C */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 4D */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 4E */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 4F */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 50 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 51 */ { UD_Isqrtsd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 52 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 53 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 54 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 55 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 56 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 57 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 58 */ { UD_Iaddsd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 59 */ { UD_Imulsd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5A */ { UD_Icvtsd2ss,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5B */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 5C */ { UD_Isubsd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5D */ { UD_Iminsd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5E */ { UD_Idivsd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 5F */ { UD_Imaxsd,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 60 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 61 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 62 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 63 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 64 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 65 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 66 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 67 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 68 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 69 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 6A */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 6B */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 6C */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 6D */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 6E */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 6F */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 70 */ { UD_Ipshuflw,	V,	W,	Ib,	Pa32 | REX(_R|_X|_B) },
+/* 71 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 72 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 73 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 74 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 75 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 76 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 77 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 78 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 79 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 7A */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 7B */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 7C */ { UD_Ihaddps,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 7D */ { UD_Ihsubps,	V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* 7E */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 7F */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 80 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 81 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 82 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 83 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 84 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 85 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 86 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 87 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 88 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 89 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 8A */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 8B */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 8C */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 8D */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 8E */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 8F */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 90 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 91 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 92 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 93 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 94 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 95 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 96 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 97 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 98 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 99 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 9A */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 9B */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 9C */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 9D */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 9E */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* 9F */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A0 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A1 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A2 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A3 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A4 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A5 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A6 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A7 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A8 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* A9 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AA */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AB */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AC */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AD */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AE */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* AF */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B0 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B1 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B2 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B3 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B4 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B5 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B6 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B7 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B8 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* B9 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* BA */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* BB */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* BC */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* BD */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* BE */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* BF */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* C0 */ { UD_Ixadd,	Eb,	Gb,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+/* C1 */ { UD_Ixadd,	Ev,	Gv,	NOARG,	Po32 | Pa32 | REX(_R|_X|_B) },
+/* C2 */ { UD_Icmpsd,	V,	W,	Ib,	Pa32 | REX(_R|_X|_B) },
+/* C3 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* C4 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* C5 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* C6 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* C7 */ { UD_Igrp,	NOARG,	NOARG,	NOARG,	GRP_0FC7 },
+/* C8 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* C9 */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CA */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CB */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CC */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CD */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CE */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* CF */ { UD_Ina,	NOARG,	NOARG,	NOARG,	Pnone },
+/* D0 */ { UD_Iaddsubps,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* D1 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* D2 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* D3 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* D4 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* D5 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* D6 */ { UD_Imovdq2q,	P,	VR,	NOARG,	Pa32  },
+/* D7 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* D8 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* D9 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* DA */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* DB */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* DC */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* DD */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* DE */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* DF */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* E0 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* E1 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* E2 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* E3 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* E4 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* E5 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* E6 */ { UD_Icvtpd2dq,V,	W,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* E7 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* E8 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* E9 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* EA */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* EB */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* EC */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* ED */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* EE */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* EF */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F0 */ { UD_Ilddqu,	V,	M,	NOARG,	Pa32 | REX(_R|_X|_B) },
+/* F1 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F2 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F3 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F4 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F5 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F6 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F7 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F8 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* F9 */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* FA */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* FB */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* FC */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* FD */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* FE */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+/* FF */ { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+struct map_entry itab_g1_op80[0x8] = 
+{
+  { UD_Iadd,	Eb,	Ib,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ior,	Eb,	Ib,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iadc,	Eb,	Ib,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Isbb,	Eb,	Ib,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iand,	Eb,	Ib,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Isub,	Eb,	Ib,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ixor,	Eb,	Ib,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Icmp,	Eb,	Ib,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) }
+};
+
+struct map_entry itab_g1_op81[0x8] = 
+{
+  { UD_Iadd,	Ev,	Iz,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ior,	Ev,	Iz,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iadc,	Ev,	Iz,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Isbb,	Ev,	Iz,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iand,	Ev,	Iz,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Isub,	Ev,	Iz,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ixor,	Ev,	Iz,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Icmp,	Ev,	Iz,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) }
+};
+
+struct map_entry itab_g1_op82[0x8] = {
+  { UD_Iadd,	Eb,	Ib,	NOARG,	Pc1 | Pinv64 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ior,	Eb,	Ib,	NOARG,	Pc1 | Pinv64 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iadc,	Eb,	Ib,	NOARG,	Pc1 | Pinv64 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Isbb,	Eb,	Ib,	NOARG,	Pc1 | Pinv64 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iand,	Eb,	Ib,	NOARG,	Pc1 | Pinv64 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Isub,	Eb,	Ib,	NOARG,	Pc1 | Pinv64 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ixor,	Eb,	Ib,	NOARG,	Pc1 | Pinv64 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Icmp,	Eb,	Ib,	NOARG,	Pc1 | Pinv64 | Pa32 | REX(_W|_R|_X|_B) }
+};
+
+struct map_entry itab_g1_op83[0x8] = {
+  { UD_Iadd,	Ev,	Ib,	NOARG,	Pc1 | Po32 | Pa32 | REX(_R|_X|_B|_W) },
+  { UD_Ior,	Ev,	Ib,	NOARG,	Pc1 | Po32 | Pa32 | REX(_R|_X|_B|_W) },
+  { UD_Iadc,	Ev,	Ib,	NOARG,	Pc1 | Po32 | Pa32 | REX(_R|_X|_B|_W) },
+  { UD_Isbb,	Ev,	Ib,	NOARG,	Pc1 | Po32 | Pa32 | REX(_R|_X|_B|_W) },
+  { UD_Iand,	Ev,	Ib,	NOARG,	Pc1 | Po32 | Pa32 | REX(_R|_X|_B|_W) },
+  { UD_Isub,	Ev,	Ib,	NOARG,	Pc1 | Po32 | Pa32 | REX(_R|_X|_B|_W) },
+  { UD_Ixor,	Ev,	Ib,	NOARG,	Pc1 | Po32 | Pa32 | REX(_R|_X|_B|_W) },
+  { UD_Icmp,	Ev,	Ib,	NOARG,	Pc1 | Po32 | Pa32 | REX(_R|_X|_B|_W) }
+};
+
+struct map_entry itab_g1A_op8F[0x8] = {
+  { UD_Ipop,		Ev,	NOARG,	NOARG,	Pc1 | Po32 | Pa32 | Pdef64 | REX(_W|_R|_X|_B) },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+struct map_entry itab_g2_opC0[0x8] = {
+  { UD_Irol,	Eb,	Ib,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iror,	Eb,	Ib,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ircl,	Eb,	Ib,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ircr,	Eb,	Ib,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ishl,	Eb,	Ib,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ishr,	Eb,	Ib,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Isal,	Eb,	Ib,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Isar,	Eb,	Ib,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) }
+};
+
+struct map_entry itab_g2_opC1[0x8] = {
+  { UD_Irol,	Ev,	Ib,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iror,	Ev,	Ib,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ircl,	Ev,	Ib,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ircr,	Ev,	Ib,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ishl,	Ev,	Ib,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ishr,	Ev,	Ib,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Isal,	Ev,	Ib,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Isar,	Ev,	Ib,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) }
+};
+
+struct map_entry itab_g2_opD0[0x8] = {
+  { UD_Irol,	Eb,	I1,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iror,	Eb,	I1,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ircl,	Eb,	I1,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ircr,	Eb,	I1,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ishl,	Eb,	I1,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ishr,	Eb,	I1,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Isal,	Eb,	I1,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Isar,	Eb,	I1,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) }
+};
+
+struct map_entry itab_g2_opD1[0x8] = {
+  { UD_Irol,	Ev,	I1,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iror,	Ev,	I1,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ircl,	Ev,	I1,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ircr,	Ev,	I1,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ishl,	Ev,	I1,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ishr,	Ev,	I1,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iinvalid,Ev,	I1,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Isar,	Ev,	I1,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) }
+};
+
+struct map_entry itab_g2_opD2[0x8] = {
+  { UD_Irol,	Eb,	CL,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iror,	Eb,	CL,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ircl,	Eb,	CL,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ircr,	Eb,	CL,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ishl,	Eb,	CL,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ishr,	Eb,	CL,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Isal,	Eb,	CL,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Isar,	Eb,	CL,	NOARG,	Pa32 | REX(_W|_R|_X|_B) }
+};
+
+struct map_entry itab_g2_opD3[0x8] = {
+  { UD_Irol,	Ev,	CL,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iror,	Ev,	CL,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ircl,	Ev,	CL,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ircr,	Ev,	CL,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ishl,	Ev,	CL,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ishr,	Ev,	CL,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Isal,	Ev,	CL,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Isar,	Ev,	CL,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) }
+};
+
+struct map_entry itab_g3_opF6[0x8] = {
+  { UD_Itest,	Eb,	Ib,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Itest,	Eb,	Ib,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Inot,	Eb,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ineg,	Eb,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Imul,	Eb,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iimul,	Eb,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Idiv,	Eb,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iidiv,	Eb,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) }
+};
+
+struct map_entry itab_g3_opF7[0x8] = {
+  { UD_Itest,	Ev,	Iz,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Itest,	Ev,	Iz,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Inot,	Ev,	NOARG,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ineg,	Ev,	NOARG,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Imul,	Ev,	NOARG,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iimul,	Ev,	NOARG,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Idiv,	Ev,	NOARG,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iidiv,	Ev,	NOARG,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) }
+};
+
+struct map_entry itab_g4_opFE[0x8] = {
+  { UD_Iinc,		Eb,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Idec,		Eb,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+struct map_entry itab_g5_opFF[0x8] = {
+  { UD_Iinc,		Ev,	NOARG,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Idec,		Ev,	NOARG,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Icall,		Ev,	NOARG,	NOARG,	Pc1 | Po32 | Pa32 | Pdef64 | REX(_W|_R|_X|_B) },
+  { UD_Icall,		Ep,	NOARG,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ijmp,		Ev,	NOARG,	NOARG,	Pc1 | Po32 | Pa32 | Pdef64 | REX(_W|_R|_X|_B) },
+  { UD_Ijmp,		Ep,	NOARG,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ipush,		Ev,	NOARG,	NOARG,	Pc1 | Pdef64 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iinvalid,	NOARG, 	NOARG,	NOARG,	Pnone }
+};
+
+/* group 6 */
+struct map_entry itab_g6_op0F00[0x8] = {
+  { UD_Isldt,		M,	NOARG,	NOARG,	Po32 | Pa32 | REX(_R|_X|_B) },
+  { UD_Istr,		M,	NOARG,	NOARG,	Po32 | Pa32 | REX(_R|_X|_B) },
+  { UD_Illdt,		M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+  { UD_Iltr,		M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+  { UD_Iverr,		M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+  { UD_Iverw,		M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+
+/* group 7  */
+struct map_entry itab_g7_op0F01[0x8] = {
+  { UD_Isgdt,		M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+  { UD_Isidt,		M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+  { UD_Ilgdt,		M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+  { UD_Ilidt,		M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+  { UD_Ismsw,		M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ilmsw,		Ew,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+  { UD_Iinvlpg,		M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) }
+};
+
+/* group 7 -- Reg7 */
+struct map_entry itab_g7_op0F01_Reg7[0x8] = {
+  { UD_Iswapgs, 	NOARG,	NOARG,	NOARG,	PdepM },
+  { UD_Irdtscp,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+/* group 7 -- Reg7 */
+struct map_entry itab_g7_op0F01_Reg7_intel[0x8] = {
+  { UD_Iswapgs, 	NOARG,	NOARG,	NOARG,	PdepM },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+/* group 7 -- Reg3 */
+struct map_entry itab_g7_op0F01_Reg3[0x8] = {
+  { UD_Ivmrun,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ivmmcall,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ivmload, 	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ivmsave, 	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Istgi,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iclgi,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iskinit, 	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvlpga,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+/* group 7 -- Reg0: Intel */
+struct map_entry itab_g7_op0F01_Reg0_intel[0x8] = {
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ivmcall,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ivmlaunch, 	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ivmresume, 	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ivmxoff,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+};
+
+/* group 7 -- Reg1: Intel */
+struct map_entry itab_g7_op0F01_Reg1_intel[0x8] = {
+  { UD_Imonitor,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Imwait,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+};
+
+/* group 8  */
+struct map_entry itab_g8_op0FBA[0x8] = {
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ibt,		Ev,	Ib,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ibts,		Ev,	Ib,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ibtr,		Ev,	Ib,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ibtc,		Ev,	Ib,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+};
+
+/* group 9  */
+struct map_entry itab_g9_op0FC7[0x8] = {
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Icmpxchg8b,	M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) | PdepM },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+};
+
+/* group 9 - Intel */
+struct map_entry itab_g9_op0FC7_intel[0x8] = {
+  { UD_Ivmptrld,	Mq,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+  { UD_Icmpxchg8b,	M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) | PdepM },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ivmptrst,	Mq,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+};
+
+/* group 9 - Intel */
+struct map_entry itab_g9_op0FC7_prefix66_intel[0x8] = {
+  { UD_Ivmclear,	Mq,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+};
+
+/* group 9 - Intel */
+struct map_entry itab_g9_op0FC7_prefixF3_intel[0x8] = {
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ivmxon,		Mq,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+};
+
+/* group A  */
+struct map_entry itab_gA_op0FB9[0x8] = {
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+};
+
+/* group B  */
+struct map_entry itab_gB_opC6[0x8] = {
+  { UD_Imov,		Eb,	Ib,	NOARG,	Pc1 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+};
+
+/* group B  */
+struct map_entry itab_gB_opC7[0x8] = {
+  { UD_Imov,		Ev,	Iz,	NOARG,	Pc1 | Po32 | Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+};
+
+/* group C  */
+struct map_entry itab_gC_op0F71[0x8] = {
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ipsrlw,		PR,	Ib,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ipsraw,		PR,	Ib,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ipsllw,		PR,	Ib,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+};
+
+struct map_entry itab_gC_op0F71_prefix66[0x8] = {
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ipsrlw,		VR,	Ib,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ipsraw,		VR,	Ib,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ipsllw,		VR,	Ib,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+};
+
+struct map_entry itab_gC_op0F71_prefixF3[0x8] = {
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+struct map_entry itab_gC_op0F71_prefixF2[0x8] = {
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+/* group D  */
+struct map_entry itab_gD_op0F72[0x8] = 
+{
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ipsrld,		PR,	Ib,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ipsrad,		PR,	Ib,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ipslld,		PR,	Ib,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+};
+
+/* group D, prefixed by 0x66  */
+struct map_entry itab_gD_op0F72_prefix66[0x8] = 
+{
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ipsrld,		VR,	Ib,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ipsrad,		VR,	Ib,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ipslld,		VR,	Ib,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+};
+
+struct map_entry itab_gD_op0F72_prefixF3[0x8] = {
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+struct map_entry itab_gD_op0F72_prefixF2[0x8] = {
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+/* group E  */
+struct map_entry itab_gE_op0F73[0x8] = 
+{
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ipsrlq,		PR,	Ib,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ipsllq,		PR,	Ib,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+struct map_entry itab_gE_op0F73_prefix66[0x8] = 
+{
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ipsrlq,		VR,	Ib,	NOARG,	Pnone },
+  { UD_Ipsrldq,		VR,	Ib,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ipsllq,		VR,	Ib,	NOARG,	Pnone },
+  { UD_Ipslldq,		VR,	Ib,	NOARG,	Pnone }
+};
+
+struct map_entry itab_gE_op0F73_prefixF3[0x8] = {
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+struct map_entry itab_gE_op0F73_prefixF2[0x8] = {
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+/* group F  */
+struct map_entry itab_gF_op0FAE[0x8] = 
+{
+  { UD_Ifxsave,		M,	NOARG,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ifxrstor,	M,	NOARG,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Ildmxcsr,	Md,	NOARG,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Istmxcsr,	Md,	NOARG,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iclflush,	M,	NOARG,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+};
+
+struct map_entry itab_gF_op0FAE_prefix66[0x8] = {
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+struct map_entry itab_gF_op0FAE_prefixF3[0x8] = {
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+struct map_entry itab_gF_op0FAE_prefixF2[0x8] = {
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+/* group F -- Extensions */
+struct map_entry itab_gF_op0FAE_Reg5 = { 
+	UD_Ilfence,	NOARG,	NOARG,	NOARG,	Pnone
+};
+struct map_entry itab_gF_op0FAE_Reg6 = {
+	UD_Imfence,	NOARG,	NOARG,	NOARG,	Pnone
+};
+struct map_entry itab_gF_op0FAE_Reg7 = {
+	UD_Isfence,	NOARG,	NOARG,	NOARG,	Pnone
+};
+
+/* group 10  */
+struct map_entry itab_g10_op0F18[0x8] = {
+  { UD_Iprefetchnta,	M,	NOARG,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iprefetcht0,	M,	NOARG,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iprefetcht1,	M,	NOARG,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iprefetcht2,	M,	NOARG,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+/* group P  */
+struct map_entry itab_gP_op0F0D[0x8] = {
+  { UD_Iprefetch,	M,	NOARG,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iprefetch,	M,	NOARG,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iprefetch,	M,	NOARG,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iprefetch,	M,	NOARG,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iprefetch,	M,	NOARG,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iprefetch,	M,	NOARG,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iprefetch,	M,	NOARG,	NOARG,	Pa32 | REX(_W|_R|_X|_B) },
+  { UD_Iprefetch,	M,	NOARG,	NOARG,	Pa32 | REX(_W|_R|_X|_B) }
+};
+
+struct
+{
+  struct map_entry *me_pfx_none;
+  struct map_entry *me_pfx_66;
+  struct map_entry *me_pfx_f2;
+  struct map_entry *me_pfx_f3;
+} itab_groups[] =  {
+  { itab_g1_op80,	0, 0, 0 },
+  { itab_g1_op81,	0, 0, 0 },
+  { itab_g1_op82,	0, 0, 0 },
+  { itab_g1_op83,	0, 0, 0 },
+  { itab_g1A_op8F,	0, 0, 0 },
+  { itab_g2_opC0,	0, 0, 0 },
+  { itab_g2_opC1,	0, 0, 0 },
+  { itab_gB_opC6,	0, 0, 0 },
+  { itab_gB_opC7,	0, 0, 0 },
+  { itab_g2_opD0,	0, 0, 0 },
+  { itab_g2_opD1,	0, 0, 0 },
+  { itab_g2_opD2,	0, 0, 0 },
+  { itab_g2_opD3,	0, 0, 0 },
+  { itab_g3_opF6,	0, 0, 0 },
+  { itab_g3_opF7,	0, 0, 0 },
+  { itab_g4_opFE,	0, 0, 0 },
+  { itab_g5_opFF,	0, 0, 0 },
+  { itab_g6_op0F00,	0, 0, 0 },
+  { itab_g7_op0F01,	0, 0, 0 },
+  { itab_gP_op0F0D,	0, 0, 0 },
+  { itab_g10_op0F18,	0, 0, 0 },
+  { itab_gC_op0F71,	itab_gC_op0F71_prefix66, itab_gC_op0F71_prefixF3, itab_gC_op0F71_prefixF2 },
+  { itab_gD_op0F72,	itab_gD_op0F72_prefix66, itab_gD_op0F72_prefixF3, itab_gD_op0F72_prefixF2 },
+  { itab_gE_op0F73,	itab_gE_op0F73_prefix66, itab_gE_op0F73_prefixF3, itab_gE_op0F73_prefixF2 },
+  { itab_gF_op0FAE,	itab_gF_op0FAE_prefix66, itab_gF_op0FAE_prefixF3, itab_gF_op0FAE_prefixF2 },
+  { itab_g8_op0FBA,	0, 0, 0 },
+  { itab_gA_op0FB9,	0, 0, 0 },
+  { itab_g9_op0FC7,	0, 0, 0 },
+
+#define ITAB_GROUPS_START_INTEL 28
+
+  { itab_g1_op80,	0, 0, 0 },
+  { itab_g1_op81,	0, 0, 0 },
+  { itab_g1_op82,	0, 0, 0 },
+  { itab_g1_op83,	0, 0, 0 },
+  { itab_g1A_op8F,	0, 0, 0 },
+  { itab_g2_opC0,	0, 0, 0 },
+  { itab_g2_opC1,	0, 0, 0 },
+  { itab_gB_opC6,	0, 0, 0 },
+  { itab_gB_opC7,	0, 0, 0 },
+  { itab_g2_opD0,	0, 0, 0 },
+  { itab_g2_opD1,	0, 0, 0 },
+  { itab_g2_opD2,	0, 0, 0 },
+  { itab_g2_opD3,	0, 0, 0 },
+  { itab_g3_opF6,	0, 0, 0 },
+  { itab_g3_opF7,	0, 0, 0 },
+  { itab_g4_opFE,	0, 0, 0 },
+  { itab_g5_opFF,	0, 0, 0 },
+  { itab_g6_op0F00,	0, 0, 0 },
+  { itab_g7_op0F01,	0, 0, 0 },
+  { itab_gP_op0F0D,	0, 0, 0 },
+  { itab_g10_op0F18,	0, 0, 0 },
+  { itab_gC_op0F71,	itab_gC_op0F71_prefix66, itab_gC_op0F71_prefixF3, itab_gC_op0F71_prefixF2 },
+  { itab_gD_op0F72,	itab_gD_op0F72_prefix66, itab_gD_op0F72_prefixF3, itab_gD_op0F72_prefixF2 },
+  { itab_gE_op0F73,	itab_gE_op0F73_prefix66, itab_gE_op0F73_prefixF3, itab_gE_op0F73_prefixF2 },
+  { itab_gF_op0FAE,	itab_gF_op0FAE_prefix66, itab_gF_op0FAE_prefixF3, itab_gF_op0FAE_prefixF2 },
+  { itab_g8_op0FBA,	0, 0, 0 },
+  { itab_gA_op0FB9,	0, 0, 0 },
+  { itab_g9_op0FC7_intel,	itab_g9_op0FC7_prefix66_intel, itab_g9_op0FC7_prefixF3_intel, 0 },
+};
+
+/* D8 Opcode Map */
+struct map_entry itab_x87_opD8reg[0x8] = 
+{
+  { UD_Ifadd,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifmul,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifcom,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifcomp,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifsub,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifsubr,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifdiv,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifdivr,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) }
+};
+
+/* D9 Opcode Map */
+struct map_entry itab_x87_opD9reg[0x8] = 
+{
+  { UD_Ifld,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Iinvalid,NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifst,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifstp,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifldenv,	M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+  { UD_Ifldcw,	Mw,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifnstenv,M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+  { UD_Ifnstcw,	Mw,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) }
+};
+
+/* DA Opcode Map */
+struct map_entry itab_x87_opDAreg[0x8] = 
+{
+  { UD_Ifiadd,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifimul,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ificom,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ificomp,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifisub,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifisubr,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifidiv,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifidivr,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) }
+};
+
+/* DB Opcode Map */
+struct map_entry itab_x87_opDBreg[0x8] = 
+{
+  { UD_Ifild,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifisttp,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifist,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifistp,	Md,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Iinvalid,NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifld,	Mt,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Iinvalid,NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifstp,	Mt,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) }
+};
+
+/* DC Opcode Map */
+struct map_entry itab_x87_opDCreg[0x8] = 
+{
+  { UD_Ifadd,	Mq,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifmul,	Mq,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifcom,	Mq,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifcomp,	Mq,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifsub,	Mq,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifsubr,	Mq,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifdiv,	Mq,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifdivr,	Mq,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) }
+};
+
+/* DD Opcode Map */
+struct map_entry itab_x87_opDDreg[0x8] = 
+{
+  { UD_Ifld,	Mq,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifisttp,	Mq,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifst,	Mq,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifstp,	Mq,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifrstor,	M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+  { UD_Iinvalid,NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifnsave,	M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+  { UD_Ifnstsw,	M,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) }
+};
+
+/* DE Opcode Map */
+struct map_entry itab_x87_opDEreg[0x8] = 
+{
+  { UD_Ifiadd,	Mw,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifimul,	Mw,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ificom,	Mw,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ificomp,	Mw,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifisub,	Mw,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifisubr,	Mw,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifidiv,	Mw,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifidivr,	Mw,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) }
+};
+
+/* DF Opcode Map */
+struct map_entry itab_x87_opDFreg[0x8] = 
+{
+  { UD_Ifild,	Mw,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifisttp, Mw,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifist,	Mw,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifistp,	Mw,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifbld,	Mt,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+  { UD_Ifild,	Mq,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) },
+  { UD_Ifbstp,	Mt,	NOARG,	NOARG,	Pa32 | REX(_R|_X|_B) },
+  { UD_Ifistp,	Mq,	NOARG,	NOARG,	Pc1 | Pa32 | REX(_R|_X|_B) }
+};
+
+struct map_entry itab_g_invalid[0x8] = 
+{
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+};
+
+/* D8 Opcode Map */
+struct map_entry itab_x87_opD8[0x8*0x8] = 
+{
+  { UD_Ifadd,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifadd,		ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifadd,		ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifadd,		ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifadd,		ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifadd,		ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifadd,		ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifadd,		ST0,	ST7,	NOARG,	Pnone },
+  { UD_Ifmul,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifmul,		ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifmul,		ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifmul,		ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifmul,		ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifmul,		ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifmul,		ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifmul,		ST0,	ST7,	NOARG,	Pnone },
+  { UD_Ifcom,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifcom,		ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifcom,		ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifcom,		ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifcom,		ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifcom,		ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifcom,		ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifcom,		ST0,	ST7,	NOARG,	Pnone },
+  { UD_Ifcomp,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifcomp,		ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifcomp,		ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifcomp,		ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifcomp,		ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifcomp,		ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifcomp,		ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifcomp,		ST0,	ST7,	NOARG,	Pnone },
+  { UD_Ifsub,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifsub,		ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifsub,		ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifsub,		ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifsub,		ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifsub,		ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifsub,		ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifsub,		ST0,	ST7,	NOARG,	Pnone },
+  { UD_Ifsubr,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubr,		ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifsubr,		ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifsubr,		ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifsubr,		ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifsubr,		ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifsubr,		ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifsubr,		ST0,	ST7,	NOARG,	Pnone },
+  { UD_Ifdiv,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifdiv,		ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifdiv,		ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifdiv,		ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifdiv,		ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifdiv,		ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifdiv,		ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifdiv,		ST0,	ST7,	NOARG,	Pnone },
+  { UD_Ifdivr,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivr,		ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifdivr,		ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifdivr,		ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifdivr,		ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifdivr,		ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifdivr,		ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifdivr,		ST0,	ST7,	NOARG,	Pnone }
+};
+
+/* D9 Opcode Map */
+struct map_entry itab_x87_opD9[0x8*0x8] = 
+{
+  { UD_Ifld,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifld,		ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifld,		ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifld,		ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifld,		ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifld,		ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifld,		ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifld,		ST0,	ST7,	NOARG,	Pnone },
+  { UD_Ifxch,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifxch,		ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifxch,		ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifxch,		ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifxch,		ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifxch,		ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifxch,		ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifxch,		ST0,	ST7,	NOARG,	Pnone },
+  { UD_Ifnop,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Inone,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Inone,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Inone,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Inone,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Inone,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Inone,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Inone,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Inone,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifchs,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifabs,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iftst,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifxam,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifld1,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifldl2t,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifldl2e,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifldlpi,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifldlg2,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifldln2,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifldz,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_If2xm1,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifyl2x,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifptan,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifpatan,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifpxtract,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifprem1,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifdecstp,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifncstp,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifprem,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifyl2xp1,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifsqrt,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifsincos,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifrndint,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifscale,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifsin,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifcos,		NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+/* DA Opcode Map */
+struct map_entry itab_x87_opDA[0x8*0x8] = {
+  { UD_Ifcmovb,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifcmovb,		ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifcmovb,		ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifcmovb,		ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifcmovb,		ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifcmovb,		ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifcmovb,		ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifcmovb,		ST0,	ST7,	NOARG,	Pnone },
+  { UD_Ifcmove,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifcmove,		ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifcmove,		ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifcmove,		ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifcmove,		ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifcmove,		ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifcmove,		ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifcmove,		ST0,	ST7,	NOARG,	Pnone },
+  { UD_Ifcmovbe,	ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifcmovbe,	ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifcmovbe,	ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifcmovbe,	ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifcmovbe,	ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifcmovbe,	ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifcmovbe,	ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifcmovbe,	ST0,	ST7,	NOARG,	Pnone },
+  { UD_Ifcmovu,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifcmovu,		ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifcmovu,		ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifcmovu,		ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifcmovu,		ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifcmovu,		ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifcmovu,		ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifcmovu,		ST0,	ST7,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifucompp,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+/* DB Opcode Map */
+struct map_entry itab_x87_opDB[0x8*0x8] = 
+{
+  { UD_Ifcmovnb,	ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifcmovnb,	ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifcmovnb,	ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifcmovnb,	ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifcmovnb,	ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifcmovnb,	ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifcmovnb,	ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifcmovnb,	ST0,	ST7,	NOARG,	Pnone },
+  { UD_Ifcmovne,	ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifcmovne,	ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifcmovne,	ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifcmovne,	ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifcmovne,	ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifcmovne,	ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifcmovne,	ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifcmovne,	ST0,	ST7,	NOARG,	Pnone },
+  { UD_Ifcmovnbe,	ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifcmovnbe,	ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifcmovnbe,	ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifcmovnbe,	ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifcmovnbe,	ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifcmovnbe,	ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifcmovnbe,	ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifcmovnbe,	ST0,	ST7,	NOARG,	Pnone },
+  { UD_Ifcmovnu,	ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifcmovnu,	ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifcmovnu,	ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifcmovnu,	ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifcmovnu,	ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifcmovnu,	ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifcmovnu,	ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifcmovnu,	ST0,	ST7,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifclex,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifninit,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifucomi,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifucomi,		ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifucomi,		ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifucomi,		ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifucomi,		ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifucomi,		ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifucomi,		ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifucomi,		ST0,	ST7,	NOARG,	Pnone },
+  { UD_Ifcomi,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifcomi,		ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifcomi,		ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifcomi,		ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifcomi,		ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifcomi,		ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifcomi,		ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifcomi,		ST0,	ST7,	NOARG,	Pnone },
+  { UD_Iinvalid, 	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid, 	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid, 	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid, 	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid, 	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid, 	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid, 	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid, 	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+/* DC Opcode Map */
+struct map_entry itab_x87_opDC[0x8*0x8] = 
+{
+  { UD_Ifadd,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifadd,		ST1,	ST0,	NOARG,	Pnone },
+  { UD_Ifadd,		ST2,	ST0,	NOARG,	Pnone },
+  { UD_Ifadd,		ST3,	ST0,	NOARG,	Pnone },
+  { UD_Ifadd,		ST4,	ST0,	NOARG,	Pnone },
+  { UD_Ifadd,		ST5,	ST0,	NOARG,	Pnone },
+  { UD_Ifadd,		ST6,	ST0,	NOARG,	Pnone },
+  { UD_Ifadd,		ST7,	ST0,	NOARG,	Pnone },
+  { UD_Ifmul,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifmul,		ST1,	ST0,	NOARG,	Pnone },
+  { UD_Ifmul,		ST2,	ST0,	NOARG,	Pnone },
+  { UD_Ifmul,		ST3,	ST0,	NOARG,	Pnone },
+  { UD_Ifmul,		ST4,	ST0,	NOARG,	Pnone },
+  { UD_Ifmul,		ST5,	ST0,	NOARG,	Pnone },
+  { UD_Ifmul,		ST6,	ST0,	NOARG,	Pnone },
+  { UD_Ifmul,		ST7,	ST0,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifsubr,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubr,		ST1,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubr,		ST2,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubr,		ST3,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubr,		ST4,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubr,		ST5,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubr,		ST6,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubr,		ST7,	ST0,	NOARG,	Pnone },
+  { UD_Ifsub,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifsub,		ST1,	ST0,	NOARG,	Pnone },
+  { UD_Ifsub,		ST2,	ST0,	NOARG,	Pnone },
+  { UD_Ifsub,		ST3,	ST0,	NOARG,	Pnone },
+  { UD_Ifsub,		ST4,	ST0,	NOARG,	Pnone },
+  { UD_Ifsub,		ST5,	ST0,	NOARG,	Pnone },
+  { UD_Ifsub,		ST6,	ST0,	NOARG,	Pnone },
+  { UD_Ifsub,		ST7,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivr,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivr,		ST1,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivr,		ST2,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivr,		ST3,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivr,		ST4,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivr,		ST5,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivr,		ST6,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivr,		ST7,	ST0,	NOARG,	Pnone },
+  { UD_Ifdiv,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifdiv,		ST1,	ST0,	NOARG,	Pnone },
+  { UD_Ifdiv,		ST2,	ST0,	NOARG,	Pnone },
+  { UD_Ifdiv,		ST3,	ST0,	NOARG,	Pnone },
+  { UD_Ifdiv,		ST4,	ST0,	NOARG,	Pnone },
+  { UD_Ifdiv,		ST5,	ST0,	NOARG,	Pnone },
+  { UD_Ifdiv,		ST6,	ST0,	NOARG,	Pnone },
+  { UD_Ifdiv,		ST7,	ST0,	NOARG,	Pnone }
+};	
+
+/* DD Opcode Map */
+struct map_entry itab_x87_opDD[0x8*0x8] = 
+{
+  { UD_Iffree,		ST0,	NOARG,	NOARG,	Pnone },
+  { UD_Iffree,		ST1,	NOARG,	NOARG,	Pnone },
+  { UD_Iffree,		ST2,	NOARG,	NOARG,	Pnone },
+  { UD_Iffree,		ST3,	NOARG,	NOARG,	Pnone },
+  { UD_Iffree,		ST4,	NOARG,	NOARG,	Pnone },
+  { UD_Iffree,		ST5,	NOARG,	NOARG,	Pnone },
+  { UD_Iffree,		ST6,	NOARG,	NOARG,	Pnone },
+  { UD_Iffree,		ST7,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifst,		ST0,	NOARG,	NOARG,	Pnone },
+  { UD_Ifst,		ST1,	NOARG,	NOARG,	Pnone },
+  { UD_Ifst,		ST2,	NOARG,	NOARG,	Pnone },
+  { UD_Ifst,		ST3,	NOARG,	NOARG,	Pnone },
+  { UD_Ifst,		ST4,	NOARG,	NOARG,	Pnone },
+  { UD_Ifst,		ST5,	NOARG,	NOARG,	Pnone },
+  { UD_Ifst,		ST6,	NOARG,	NOARG,	Pnone },
+  { UD_Ifst,		ST7,	NOARG,	NOARG,	Pnone },
+  { UD_Ifstp,		ST0,	NOARG,	NOARG,	Pnone },
+  { UD_Ifstp,		ST1,	NOARG,	NOARG,	Pnone },
+  { UD_Ifstp,		ST2,	NOARG,	NOARG,	Pnone },
+  { UD_Ifstp,		ST3,	NOARG,	NOARG,	Pnone },
+  { UD_Ifstp,		ST4,	NOARG,	NOARG,	Pnone },
+  { UD_Ifstp,		ST5,	NOARG,	NOARG,	Pnone },
+  { UD_Ifstp,		ST6,	NOARG,	NOARG,	Pnone },
+  { UD_Ifstp,		ST7,	NOARG,	NOARG,	Pnone },
+  { UD_Ifucom,		ST0,	NOARG,	NOARG,	Pnone },
+  { UD_Ifucom,		ST1,	NOARG,	NOARG,	Pnone },
+  { UD_Ifucom,		ST2,	NOARG,	NOARG,	Pnone },
+  { UD_Ifucom,		ST3,	NOARG,	NOARG,	Pnone },
+  { UD_Ifucom,		ST4,	NOARG,	NOARG,	Pnone },
+  { UD_Ifucom,		ST5,	NOARG,	NOARG,	Pnone },
+  { UD_Ifucom,		ST6,	NOARG,	NOARG,	Pnone },
+  { UD_Ifucom,		ST7,	NOARG,	NOARG,	Pnone },
+  { UD_Ifucomp,		ST0,	NOARG,	NOARG,	Pnone },
+  { UD_Ifucomp,		ST1,	NOARG,	NOARG,	Pnone },
+  { UD_Ifucomp,		ST2,	NOARG,	NOARG,	Pnone },
+  { UD_Ifucomp,		ST3,	NOARG,	NOARG,	Pnone },
+  { UD_Ifucomp,		ST4,	NOARG,	NOARG,	Pnone },
+  { UD_Ifucomp,		ST5,	NOARG,	NOARG,	Pnone },
+  { UD_Ifucomp,		ST6,	NOARG,	NOARG,	Pnone },
+  { UD_Ifucomp,		ST7,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+/* DE Opcode Map */
+struct map_entry itab_x87_opDE[0x8*0x8] = 
+{
+  { UD_Ifaddp,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifaddp,		ST1,	ST0,	NOARG,	Pnone },
+  { UD_Ifaddp,		ST2,	ST0,	NOARG,	Pnone },
+  { UD_Ifaddp,		ST3,	ST0,	NOARG,	Pnone },
+  { UD_Ifaddp,		ST4,	ST0,	NOARG,	Pnone },
+  { UD_Ifaddp,		ST5,	ST0,	NOARG,	Pnone },
+  { UD_Ifaddp,		ST6,	ST0,	NOARG,	Pnone },
+  { UD_Ifaddp,		ST7,	ST0,	NOARG,	Pnone },
+  { UD_Ifmulp,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifmulp,		ST1,	ST0,	NOARG,	Pnone },
+  { UD_Ifmulp,		ST2,	ST0,	NOARG,	Pnone },
+  { UD_Ifmulp,		ST3,	ST0,	NOARG,	Pnone },
+  { UD_Ifmulp,		ST4,	ST0,	NOARG,	Pnone },
+  { UD_Ifmulp,		ST5,	ST0,	NOARG,	Pnone },
+  { UD_Ifmulp,		ST6,	ST0,	NOARG,	Pnone },
+  { UD_Ifmulp,		ST7,	ST0,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifcompp,		NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifsubrp,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubrp,		ST1,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubrp,		ST2,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubrp,		ST3,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubrp,		ST4,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubrp,		ST5,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubrp,		ST6,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubrp,		ST7,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubp,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubp,		ST1,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubp,		ST2,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubp,		ST3,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubp,		ST4,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubp,		ST5,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubp,		ST6,	ST0,	NOARG,	Pnone },
+  { UD_Ifsubp,		ST7,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivrp,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivrp,		ST1,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivrp,		ST2,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivrp,		ST3,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivrp,		ST4,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivrp,		ST5,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivrp,		ST6,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivrp,		ST7,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivp,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivp,		ST1,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivp,		ST2,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivp,		ST3,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivp,		ST4,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivp,		ST5,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivp,		ST6,	ST0,	NOARG,	Pnone },
+  { UD_Ifdivp,		ST7,	ST0,	NOARG,	Pnone }
+};
+
+/* DF Opcode Map */
+struct map_entry itab_x87_opDF[0x8*0x8] = 
+{
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifnstsw,		AX,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Ifucomip,	ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifucomip,	ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifucomip,	ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifucomip,	ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifucomip,	ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifucomip,	ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifucomip,	ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifucomip,	ST0,	ST7,	NOARG,	Pnone },
+  { UD_Ifcomip,		ST0,	ST0,	NOARG,	Pnone },
+  { UD_Ifcomip,		ST0,	ST1,	NOARG,	Pnone },
+  { UD_Ifcomip,		ST0,	ST2,	NOARG,	Pnone },
+  { UD_Ifcomip,		ST0,	ST3,	NOARG,	Pnone },
+  { UD_Ifcomip,		ST0,	ST4,	NOARG,	Pnone },
+  { UD_Ifcomip,		ST0,	ST5,	NOARG,	Pnone },
+  { UD_Ifcomip,		ST0,	ST6,	NOARG,	Pnone },
+  { UD_Ifcomip,		ST0,	ST7,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone },
+  { UD_Iinvalid,	NOARG,	NOARG,	NOARG,	Pnone }
+};
+
+struct map_entry *itab_x87_reg[] = 
+{
+  itab_x87_opD8reg,
+  itab_x87_opD9reg,
+  itab_x87_opDAreg,
+  itab_x87_opDBreg,
+  itab_x87_opDCreg,
+  itab_x87_opDDreg,
+  itab_x87_opDEreg,
+  itab_x87_opDFreg
+};
+
+struct map_entry *itab_x87[] = 
+{
+  itab_x87_opD8,
+  itab_x87_opD9,
+  itab_x87_opDA,
+  itab_x87_opDB,
+  itab_x87_opDC,
+  itab_x87_opDD,
+  itab_x87_opDE,
+  itab_x87_opDF
+};
+
+/* AMD 3DNow! Instructions */
+struct map_entry itab_3DNow =  
+  { UD_I3dnow,	P,	Q,	NOARG };
+struct map_entry nop = 
+  { UD_Inop,	NOARG,	NOARG,	NOARG, Pnone };
+struct map_entry pause = 
+  { UD_Ipause,	NOARG,	NOARG,	NOARG, Pnone };
+struct map_entry movsxd = 
+  { UD_Imovsxd,	Gv,	Ed,	NOARG,	Pc2 | Po32 | Pa32 | REX(_X|_W|_B|_R) };
+struct map_entry db = 
+  { UD_Idb, Ib, NOARG, NOARG, Pnone };
+struct map_entry invalid = 
+  { UD_Iinvalid, NOARG, NOARG, NOARG, Pnone };
+
+struct map_entry* ud_me_db() {
+	return &db;
+}
+
+struct map_entry* ud_me_invalid() {
+	return &invalid;
+}
+
+/* 3D Now instructions with suffix */
+extern enum ud_mnemonic_code 
+ud_map_get_3dnow(uint8_t suffix)
+{
+  switch(suffix) {
+	case 0x0C: return UD_Ipi2fw;
+	case 0x0D: return UD_Ipi2fd;
+	case 0x1C: return UD_Ipf2iw;
+	case 0x1D: return UD_Ipf2id;
+	case 0x8A: return UD_Ipfnacc;
+	case 0x8E: return UD_Ipfpnacc;
+	case 0x90: return UD_Ipfcmpge;
+	case 0x94: return UD_Ipfmin;
+	case 0x96: return UD_Ipfrcp;
+	case 0x97: return UD_Ipfrsqrt;
+	case 0x9A: return UD_Ipfsub;
+	case 0x9E: return UD_Ipfadd;
+	case 0xA0: return UD_Ipfcmpgt;
+	case 0xA4: return UD_Ipfmax;
+	case 0xA6: return UD_Ipfrcpit1;
+	case 0xA7: return UD_Ipfrsqit1;
+	case 0xAA: return UD_Ipfsubr;
+	case 0xAE: return UD_Ipfacc;
+	case 0xB0: return UD_Ipfcmpeq;
+	case 0xB4: return UD_Ipfmul;
+	case 0xB6: return UD_Ipfrcpit2;
+	case 0xB7: return UD_Ipmulhrw;
+	case 0xBB: return UD_Ipswapd;
+	case 0xBF: return UD_Ipavgusb;
+  }
+  return(0);
+}
+
+/* -----------------------------------------------------------------------------
+ * search_1byte_insn() - Searches for 1-byte instructions.
+ * -----------------------------------------------------------------------------
+ */
+static void
+search_1byte_insn(register struct ud* u)
+{
+  u->mapen = &itab_1byte[inp_curr(u)];
+
+  if (inp_curr(u) == 0x90) {
+	if (!(u->dis_mode == 64 && P_REX_B(u->pfx_rex))) {
+		if (u->pfx_rep) {
+			u->mapen = &pause;
+			u->pfx_rep = 0;
+		} else  u->mapen = &nop;
+	}
+  } else if (u->dis_mode == 64 && (u->mapen)->mnemonic == UD_Iarpl)
+	u->mapen = &movsxd;
+
+  else if (u->mapen->mnemonic == UD_Igrp)
+	u->mapen = &itab_groups[u->mapen->prefix].me_pfx_none[MODRM_REG(inp_peek(u))];
+
+  else if ((u->mapen)->mnemonic == UD_Ix87) {
+	if (inp_peek(u) <= 0xBF) {
+		u->mapen = &itab_x87_reg[(inp_curr(u))-0xD8][MODRM_REG(inp_peek(u))];		
+	}
+	else {
+		u->mapen = &itab_x87[inp_curr(u)-0xD8][inp_peek(u)-0xC0];
+		inp_next(u);
+	}
+  }  
+}
+
+/* -----------------------------------------------------------------------------
+ * search_2byte_insn() - Searches for 2-byte instructions.
+ * -----------------------------------------------------------------------------
+ */
+static void
+search_2byte_insn(register struct ud* u)
+{
+  uint32_t gindex;
+
+  inp_next(u);
+
+  if (u->pfx_insn == 0x66) {
+	u->mapen = &itab_2byte_prefix66[inp_curr(u)];
+	if (u->mapen != NULL && u->mapen->mnemonic != UD_Ina)
+		u->pfx_opr = 0;
+  } else if (u->pfx_insn == 0xF2) {
+	u->mapen = &itab_2byte_prefixF2[inp_curr(u)];
+	if (u->mapen != NULL && u->mapen->mnemonic != UD_Ina)
+		u->pfx_repne = 0;
+  } else if (u->pfx_insn == 0xF3) {
+	u->mapen = &itab_2byte_prefixF3[inp_curr(u)];
+	if (u->mapen != NULL && u->mapen->mnemonic != UD_Ina)
+		u->pfx_rep = 0;
+  }
+
+  if (u->mapen == NULL || u->mapen->mnemonic == UD_Ina)
+	u->mapen = &itab_2byte[inp_curr(u)];
+
+  if (u->mapen->mnemonic == UD_I3dnow)
+	u->mapen = &itab_3DNow;
+
+  if (u->mapen->mnemonic != UD_Igrp)
+	return;
+
+  /* If instruction is in a Group */
+  gindex = u->mapen->prefix + ((u->vendor == UD_VENDOR_INTEL) ? 
+				ITAB_GROUPS_START_INTEL : 0);
+
+  if (u->pfx_insn == 0x66 && itab_groups[gindex].me_pfx_66) {
+	u->mapen = &itab_groups[gindex].me_pfx_66[MODRM_REG(inp_peek(u))];
+	if (u->mapen != NULL && u->mapen->mnemonic != UD_Ina) {
+		u->pfx_opr = 0;
+		return;
+	}
+  }
+  else if (u->pfx_insn == 0xF2 && itab_groups[gindex].me_pfx_f2) {
+	u->mapen = &itab_groups[gindex].me_pfx_f2[MODRM_REG(inp_peek(u))];
+	if (u->mapen != NULL && u->mapen->mnemonic != UD_Ina) {
+		u->pfx_repne = 0;
+		return;
+	}
+  }
+  else if (u->pfx_insn == 0xF3 && itab_groups[gindex].me_pfx_f3) {
+	u->mapen = &itab_groups[gindex].me_pfx_f3[MODRM_REG(inp_peek(u))];
+	if (u->mapen != NULL && u->mapen->mnemonic != UD_Ina) {
+		u->pfx_rep = 0;
+		return;
+	}
+  }
+
+  if (! u->pfx_insn || u->mapen->mnemonic == UD_Igrp)
+	u->mapen = &itab_groups[gindex].me_pfx_none[MODRM_REG(inp_peek(u))];
+
+  /* 0F01 - opcode extensions */
+  if (inp_curr(u) == 0x01) {
+	uint8_t reg = MODRM_REG(inp_peek(u));
+	uint8_t mod = MODRM_MOD(inp_peek(u));
+	uint8_t rm  = MODRM_RM(inp_peek(u));
+
+	if (u->vendor == UD_VENDOR_INTEL) {
+		if (reg == 0 && mod == 3) {
+			u->mapen = &itab_g7_op0F01_Reg0_intel[rm];
+			inp_next(u);
+		} else if (reg == 1 && mod == 3) {
+			u->mapen = &itab_g7_op0F01_Reg1_intel[rm];
+			inp_next(u);
+		} else if (reg == 7 && mod == 3) {
+			u->mapen = &itab_g7_op0F01_Reg7_intel[rm];
+			inp_next(u);
+		}
+	}
+	else {
+		if (reg == 3 && mod == 3) {
+			u->mapen = &itab_g7_op0F01_Reg3[rm];
+			inp_next(u);
+		} else if (reg == 7 && mod == 3) {
+			u->mapen = &itab_g7_op0F01_Reg7[rm];
+			inp_next(u);
+		} else u->mapen = &itab_g7_op0F01[reg];
+	}	
+  } 
+  /* 0FAE - opcode extensions */
+  else if (inp_curr(u) == 0xAE) {
+	uint8_t reg = MODRM_REG(inp_peek(u));
+	uint8_t mod = MODRM_MOD(inp_peek(u));
+
+	if (reg == 5 && mod == 3) {
+		u->mapen = &itab_gF_op0FAE_Reg5;
+		inp_next(u);
+	} else if (reg == 6 && mod == 3) {
+		u->mapen = &itab_gF_op0FAE_Reg6;
+		inp_next(u);
+	} else if (reg == 7 && mod == 3) {
+		u->mapen = &itab_gF_op0FAE_Reg7;
+		inp_next(u);
+	} else u->mapen = &itab_gF_op0FAE[reg];
+  }
+}
+
+/* =============================================================================
+ * ud_search_map() - Searches the x86 opcode table for the instruction
+ * corresponding to the opcode given by next byte in the byte stream.
+ * =============================================================================
+ */
+void ud_search_map(register struct ud* u) 
+{
+  inp_next(u);
+
+  if (0x0F == inp_curr(u))
+	search_2byte_insn(u);
+  else	search_1byte_insn(u);
+
+  u->mnemonic = u->mapen->mnemonic;
+}
+
+/* =============================================================================
+ * ud_lookup_mnemonic() - Looks-up the mnemonic code.
+ * =============================================================================
+ */
+const char* ud_lookup_mnemonic(ud_mnemonic_code_t c) 
+{
+  if (c < UD_I3vil) 
+	return ud_mnemonics[c];
+  return NULL;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/libudis86/opcmap.h	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,173 @@
+/* -----------------------------------------------------------------------------
+ * opcmap.h
+ *
+ * Copyright (c) 2005, 2006, Vivek Mohan <vivek@sig9.com>
+ * All rights reserved. See LICENSE
+ * -----------------------------------------------------------------------------
+ */
+#ifndef UD_OPCMAP_H
+#define UD_OPCMAP_H
+
+#include "types.h"
+
+	/* Prefixes/Macros */
+
+#define Pnone		0x00
+#define Pa32		0x01
+#define P_A32(n)	((n) & 0x01)
+#define Po32		0x04
+#define P_O32(n)	((n) & 0x04)
+#define Pdef64		0x08
+#define P_DEF64(n)	((n) & 0x08)
+#define Pinv64		0x10
+#define P_INV64(n)	((n) & 0x10)
+#define Pc1		0x20
+#define P_C1(n)		((n) & 0x20)
+#define Pc2		0x40
+#define P_C2(n)		((n) & 0x40)
+#define Pc3		0x80
+#define P_C3(n)		((n) & 0x80)
+#define PdepM		0x100
+#define P_DEPM(n)	((n) & 0x100)
+#define REX(c)		((0x40 | c) << 16)
+#define P_REX(c)	(c & 0xFF0000)
+#define P_REX_MASK(n)	(0x40 | (0xF & ((n) >> 16)))
+#define _W		8
+#define _R		4
+#define _X		2
+#define _B		1
+#define P_REX_W(r) 	((0xF & (r))  >> 3)
+#define P_REX_R(r) 	((0x7 & (r))  >> 2)
+#define P_REX_X(r) 	((0x3 & (r))  >> 1)
+#define P_REX_B(r) 	((0x1 & (r))  >> 0)
+#define SIB_S(b)	((b) >> 6)
+#define SIB_I(b)	(((b) >> 3) & 7)
+#define SIB_B(b)	((b) & 7)
+#define MODRM_REG(b)	(((b) >> 3) & 7)
+#define MODRM_NNN(b)	(((b) >> 3) & 7)
+#define MODRM_MOD(b)	(((b) >> 6) & 3)
+#define MODRM_RM(b)	((b) & 7)
+
+#define SZ_Z		1
+#define SZ_V		2
+#define SZ_P		3
+#define	SZ_WP		4
+#define SZ_DP		5
+#define	SZ_MDQ		6
+#define SZ_RDQ		7
+#define SZ_B 		8
+#define SZ_W 		16
+#define SZ_D		32
+#define SZ_Q 		64
+#define SZ_T 		80
+
+/* -----------------------------------------------------------------------------
+ * Enumeration of types of the operands in the opcode map. The naming was 
+ * inspired by the AMD manuals. To understand the specifics, read the manuals.
+ * -----------------------------------------------------------------------------
+ */
+enum map_operand_type 
+{
+  OP_NONE = 0,
+  OP_A,
+  OP_E,
+  OP_M,
+  OP_G,
+  OP_I,
+  OP_AL,
+  OP_CL,
+  OP_DL,
+  OP_BL,
+  OP_AH,
+  OP_CH,
+  OP_DH,
+  OP_BH,
+  OP_ALr8b,
+  OP_CLr9b,
+  OP_DLr10b,
+  OP_BLr11b,
+  OP_AHr12b, 
+  OP_CHr13b,
+  OP_DHr14b,
+  OP_BHr15b,
+  OP_AX,
+  OP_CX,
+  OP_DX, 
+  OP_BX,
+  OP_SI,
+  OP_DI,
+  OP_SP,
+  OP_BP,
+  OP_rAX,
+  OP_rCX,
+  OP_rDX,
+  OP_rBX,
+  OP_rSP,
+  OP_rBP,
+  OP_rSI,
+  OP_rDI,
+  OP_rAXr8,
+  OP_rCXr9,
+  OP_rDXr10,
+  OP_rBXr11,
+  OP_rSPr12,
+  OP_rBPr13, 
+  OP_rSIr14,
+  OP_rDIr15,
+  OP_eAX,
+  OP_eCX,
+  OP_eDX,
+  OP_eBX,
+  OP_eSP, 
+  OP_eBP,
+  OP_eSI,
+  OP_eDI,
+  OP_ES,
+  OP_CS,
+  OP_SS,
+  OP_DS,
+  OP_FS,
+  OP_GS,
+  OP_ST0,
+  OP_ST1,
+  OP_ST2,
+  OP_ST3,
+  OP_ST4,
+  OP_ST5,
+  OP_ST6,
+  OP_ST7,
+  OP_J,
+  OP_S,
+  OP_O,
+  OP_I1,
+  OP_I3,
+  OP_V,
+  OP_W,
+  OP_Q,
+  OP_P, 
+  OP_R,
+  OP_C,
+  OP_D,
+  OP_VR,
+  OP_PR
+};
+
+struct map_operand 
+{
+  enum map_operand_type		type;
+  uint8_t 			size;
+};
+
+struct map_entry 
+{
+  enum ud_mnemonic_code		mnemonic;	
+  struct map_operand		operand1;
+  struct map_operand		operand2;	
+  struct map_operand		operand3;		
+  uint32_t 			prefix;
+};
+
+void ud_search_map(struct ud*);
+enum ud_mnemonic_code ud_map_get_3dnow(uint8_t);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/libudis86/syn-att.c	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,210 @@
+/* -----------------------------------------------------------------------------
+ * syn-att.c
+ *
+ * Copyright (c) 2004, 2005, 2006 Vivek Mohan <vivek@sig9.com>
+ * All rights reserved. See (LICENSE)
+ * -----------------------------------------------------------------------------
+ */
+
+#include "types.h"
+#include "extern.h"
+#include "opcmap.h"
+#include "syn.h"
+
+/* -----------------------------------------------------------------------------
+ * opr_cast() - Prints an operand cast.
+ * -----------------------------------------------------------------------------
+ */
+static void 
+opr_cast(struct ud* u, struct ud_operand* op)
+{
+  switch(op->size) {
+	case 16 : case 32 :
+		mkasm(u, "*");   break;
+	default: break;
+  }
+}
+
+/* -----------------------------------------------------------------------------
+ * gen_operand() - Generates assembly output for each operand.
+ * -----------------------------------------------------------------------------
+ */
+static void 
+gen_operand(struct ud* u, struct ud_operand* op)
+{
+  switch(op->type) {
+	case UD_OP_REG:
+		mkasm(u, "%%%s", ud_reg_tab[op->base - UD_R_AL]);
+		break;
+
+	case UD_OP_MEM:
+		if (u->br_far) opr_cast(u, op);
+		if (u->pfx_seg)
+			mkasm(u, "%%%s:", ud_reg_tab[u->pfx_seg - UD_R_AL]);
+		if (op->offset == 8) {
+			if (op->lval.sbyte < 0)
+				mkasm(u, "-0x%x", (-op->lval.sbyte) & 0xff);
+			else	mkasm(u, "0x%x", op->lval.sbyte);
+		} 
+		else if (op->offset == 16) 
+			mkasm(u, "0x%x", op->lval.uword);
+		else if (op->offset == 32) 
+			mkasm(u, "0x%lx", op->lval.udword);
+		else if (op->offset == 64) 
+			mkasm(u, "0x" FMT64 "x", op->lval.uqword);
+
+		if (op->base)
+			mkasm(u, "(%%%s", ud_reg_tab[op->base - UD_R_AL]);
+		if (op->index) {
+			if (op->base)
+				mkasm(u, ",");
+			else mkasm(u, "(");
+			mkasm(u, "%%%s", ud_reg_tab[op->index - UD_R_AL]);
+		}
+		if (op->scale)
+			mkasm(u, ",%d", op->scale);
+		if (op->base || op->index)
+			mkasm(u, ")");
+		break;
+
+	case UD_OP_IMM:
+		switch (op->size) {
+			case  8: mkasm(u, "$0x%x", op->lval.ubyte);    break;
+			case 16: mkasm(u, "$0x%x", op->lval.uword);    break;
+			case 32: mkasm(u, "$0x%lx", op->lval.udword);  break;
+			case 64: mkasm(u, "$0x" FMT64 "x", op->lval.uqword); break;
+			default: break;
+		}
+		break;
+
+	case UD_OP_JIMM:
+		switch (op->size) {
+			case  8:
+				mkasm(u, "0x" FMT64 "x", u->pc + op->lval.sbyte); 
+				break;
+			case 16:
+				mkasm(u, "0x" FMT64 "x", u->pc + op->lval.sword);
+				break;
+			case 32:
+				mkasm(u, "0x" FMT64 "x", u->pc + op->lval.sdword);
+				break;
+			default:break;
+		}
+		break;
+
+	case UD_OP_PTR:
+		switch (op->size) {
+			case 32:
+				mkasm(u, "$0x%x, $0x%x", op->lval.ptr.seg, 
+					op->lval.ptr.off & 0xFFFF);
+				break;
+			case 48:
+				mkasm(u, "$0x%x, $0x%lx", op->lval.ptr.seg, 
+					op->lval.ptr.off);
+				break;
+		}
+		break;
+			
+	default: return;
+  }
+}
+
+/* =============================================================================
+ * translates to AT&T syntax 
+ * =============================================================================
+ */
+extern void 
+ud_translate_att(struct ud *u)
+{
+  int size = 0;
+
+  /* check if P_O32 prefix is used */
+  if (! P_O32(u->mapen->prefix) && u->pfx_opr) {
+	switch (u->dis_mode) {
+		case 16: 
+			mkasm(u, "o32 ");
+			break;
+		case 32:
+		case 64:
+ 			mkasm(u, "o16 ");
+			break;
+	}
+  }
+
+  /* check if P_A32 prefix was used */
+  if (! P_A32(u->mapen->prefix) && u->pfx_adr) {
+	switch (u->dis_mode) {
+		case 16: 
+			mkasm(u, "a32 ");
+			break;
+		case 32:
+ 			mkasm(u, "a16 ");
+			break;
+		case 64:
+ 			mkasm(u, "a32 ");
+			break;
+	}
+  }
+
+  if (u->pfx_lock)
+  	mkasm(u,  "lock ");
+  if (u->pfx_rep)
+	mkasm(u,  "rep ");
+  if (u->pfx_repne)
+		mkasm(u,  "repne ");
+
+  /* special instructions */
+  switch (u->mnemonic) {
+	case UD_Iretf: 
+		mkasm(u, "lret "); 
+		break;
+	case UD_Idb:
+		mkasm(u, ".byte 0x%x", u->operand[0].lval.ubyte);
+		return;
+	case UD_Ijmp:
+	case UD_Icall:
+		if (u->br_far) mkasm(u,  "l");
+		mkasm(u, "%s", ud_lookup_mnemonic(u->mnemonic));
+		break;
+	case UD_Ibound:
+	case UD_Ienter:
+		if (u->operand[0].type != UD_NONE)
+			gen_operand(u, &u->operand[0]);
+		if (u->operand[1].type != UD_NONE) {
+			mkasm(u, ",");
+			gen_operand(u, &u->operand[1]);
+		}
+		return;
+	default:
+		mkasm(u, "%s", ud_lookup_mnemonic(u->mnemonic));
+  }
+
+  if (u->c1)
+	size = u->operand[0].size;
+  else if (u->c2)
+	size = u->operand[1].size;
+  else if (u->c3)
+	size = u->operand[2].size;
+
+  if (size == 8)
+	mkasm(u, "b");
+  else if (size == 16)
+	mkasm(u, "w");
+  else if (size == 64)
+ 	mkasm(u, "q");
+
+  mkasm(u, " ");
+
+  if (u->operand[2].type != UD_NONE) {
+	gen_operand(u, &u->operand[2]);
+	mkasm(u, ", ");
+  }
+
+  if (u->operand[1].type != UD_NONE) {
+	gen_operand(u, &u->operand[1]);
+	mkasm(u, ", ");
+  }
+
+  if (u->operand[0].type != UD_NONE)
+	gen_operand(u, &u->operand[0]);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/libudis86/syn-intel.c	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,205 @@
+/* -----------------------------------------------------------------------------
+ * syn-intel.c
+ *
+ * Copyright (c) 2002, 2003, 2004 Vivek Mohan <vivek@sig9.com>
+ * All rights reserved. See (LICENSE)
+ * -----------------------------------------------------------------------------
+ */
+
+#include "types.h"
+#include "extern.h"
+#include "opcmap.h"
+#include "syn.h"
+
+/* -----------------------------------------------------------------------------
+ * opr_cast() - Prints an operand cast.
+ * -----------------------------------------------------------------------------
+ */
+static void 
+opr_cast(struct ud* u, struct ud_operand* op)
+{
+  switch(op->size) {
+	case  8: mkasm(u, "byte " ); break;
+	case 16: mkasm(u, "word " ); break;
+	case 32: mkasm(u, "dword "); break;
+	case 64: mkasm(u, "qword "); break;
+	case 80: mkasm(u, "tbyte "); break;
+	default: break;
+  }
+  if (u->br_far)
+	mkasm(u, "far "); 
+  else if (u->br_near)
+	mkasm(u, "near ");
+}
+
+/* -----------------------------------------------------------------------------
+ * gen_operand() - Generates assembly output for each operand.
+ * -----------------------------------------------------------------------------
+ */
+static void gen_operand(struct ud* u, struct ud_operand* op, int syn_cast)
+{
+  switch(op->type) {
+	case UD_OP_REG:
+		mkasm(u, ud_reg_tab[op->base - UD_R_AL]);
+		break;
+
+	case UD_OP_MEM: {
+
+		int op_f = 0;
+
+		if (syn_cast) 
+			opr_cast(u, op);
+
+		mkasm(u, "[");
+
+		if (u->pfx_seg)
+			mkasm(u, "%s:", ud_reg_tab[u->pfx_seg - UD_R_AL]);
+
+		if (op->base) {
+			mkasm(u, "%s", ud_reg_tab[op->base - UD_R_AL]);
+			op_f = 1;
+		}
+
+		if (op->index) {
+			if (op_f)
+				mkasm(u, "+");
+			mkasm(u, "%s", ud_reg_tab[op->index - UD_R_AL]);
+			op_f = 1;
+		}
+
+		if (op->scale)
+			mkasm(u, "*%d", op->scale);
+
+		if (op->offset == 8) {
+			if (op->lval.sbyte < 0)
+				mkasm(u, "-0x%x", -op->lval.sbyte);
+			else	mkasm(u, "%s0x%x", (op_f) ? "+" : "", op->lval.sbyte);
+		}
+		else if (op->offset == 16)
+			mkasm(u, "%s0x%x", (op_f) ? "+" : "", op->lval.uword);
+		else if (op->offset == 32) {
+			if (u->adr_mode == 64) {
+				if (op->lval.sdword < 0)
+					mkasm(u, "-0x%x", -op->lval.sdword);
+				else	mkasm(u, "%s0x%x", (op_f) ? "+" : "", op->lval.sdword);
+			} 
+			else	mkasm(u, "%s0x%lx", (op_f) ? "+" : "", op->lval.udword);
+		}
+		else if (op->offset == 64) 
+			mkasm(u, "%s0x" FMT64 "x", (op_f) ? "+" : "", op->lval.uqword);
+
+		mkasm(u, "]");
+		break;
+	}
+			
+	case UD_OP_IMM:
+		if (syn_cast) opr_cast(u, op);
+		switch (op->size) {
+			case  8: mkasm(u, "0x%x", op->lval.ubyte);    break;
+			case 16: mkasm(u, "0x%x", op->lval.uword);    break;
+			case 32: mkasm(u, "0x%lx", op->lval.udword);  break;
+			case 64: mkasm(u, "0x" FMT64 "x", op->lval.uqword); break;
+			default: break;
+		}
+		break;
+
+	case UD_OP_JIMM:
+		if (syn_cast) opr_cast(u, op);
+		switch (op->size) {
+			case  8:
+				mkasm(u, "0x" FMT64 "x", u->pc + op->lval.sbyte); 
+				break;
+			case 16:
+				mkasm(u, "0x" FMT64 "x", u->pc + op->lval.sword);
+				break;
+			case 32:
+				mkasm(u, "0x" FMT64 "x", u->pc + op->lval.sdword);
+				break;
+			default:break;
+		}
+		break;
+
+	case UD_OP_PTR:
+		switch (op->size) {
+			case 32:
+				mkasm(u, "word 0x%x:0x%x", op->lval.ptr.seg, 
+					op->lval.ptr.off & 0xFFFF);
+				break;
+			case 48:
+				mkasm(u, "dword 0x%x:0x%lx", op->lval.ptr.seg, 
+					op->lval.ptr.off);
+				break;
+		}
+		break;
+
+	case UD_OP_CONST:
+		if (syn_cast) opr_cast(u, op);
+		mkasm(u, "%d", op->lval.udword);
+		break;
+
+	default: return;
+  }
+}
+
+/* =============================================================================
+ * translates to intel syntax 
+ * =============================================================================
+ */
+extern void ud_translate_intel(struct ud* u)
+{
+  /* -- prefixes -- */
+
+  /* check if P_O32 prefix is used */
+  if (! P_O32(u->mapen->prefix) && u->pfx_opr) {
+	switch (u->dis_mode) {
+		case 16: 
+			mkasm(u, "o32 ");
+			break;
+		case 32:
+		case 64:
+ 			mkasm(u, "o16 ");
+			break;
+	}
+  }
+
+  /* check if P_A32 prefix was used */
+  if (! P_A32(u->mapen->prefix) && u->pfx_adr) {
+	switch (u->dis_mode) {
+		case 16: 
+			mkasm(u, "a32 ");
+			break;
+		case 32:
+ 			mkasm(u, "a16 ");
+			break;
+		case 64:
+ 			mkasm(u, "a32 ");
+			break;
+	}
+  }
+
+  if (u->pfx_lock)
+	mkasm(u, "lock ");
+  if (u->pfx_rep)
+	mkasm(u, "rep ");
+  if (u->pfx_repne)
+	mkasm(u, "repne ");
+
+  /* print the instruction mnemonic */
+  mkasm(u, "%s ", ud_lookup_mnemonic(u->mnemonic));
+
+  /* operand 1 */
+  if (u->operand[0].type != UD_NONE) {
+	gen_operand(u, &u->operand[0], u->c1);
+  }
+  /* operand 2 */
+  if (u->operand[1].type != UD_NONE) {
+	mkasm(u, ", ");
+	gen_operand(u, &u->operand[1], u->c2);
+  }
+
+  /* operand 3 */
+  if (u->operand[2].type != UD_NONE) {
+	mkasm(u, ", ");
+	gen_operand(u, &u->operand[2], u->c3);
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/libudis86/syn.c	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,61 @@
+/* -----------------------------------------------------------------------------
+ * syn.c
+ *
+ * Copyright (c) 2002, 2003, 2004 Vivek Mohan <vivek@sig9.com>
+ * All rights reserved. See (LICENSE)
+ * -----------------------------------------------------------------------------
+ */
+
+/* -----------------------------------------------------------------------------
+ * Intel Register Table - Order Matters (types.h)!
+ * -----------------------------------------------------------------------------
+ */
+const char* ud_reg_tab[] = 
+{
+  "al",		"cl",		"dl",		"bl",
+  "ah",		"ch",		"dh",		"bh",
+  "spl",	"bpl",		"sil",		"dil",
+  "r8b",	"r9b",		"r10b",		"r11b",
+  "r12b",	"r13b",		"r14b",		"r15b",
+
+  "ax",		"cx",		"dx",		"bx",
+  "sp",		"bp",		"si",		"di",
+  "r8w",	"r9w",		"r10w",		"r11w",
+  "r12w",	"r13W"	,	"r14w",		"r15w",
+	
+  "eax",	"ecx",		"edx",		"ebx",
+  "esp",	"ebp",		"esi",		"edi",
+  "r8d",	"r9d",		"r10d",		"r11d",
+  "r12d",	"r13d",		"r14d",		"r15d",
+	
+  "rax",	"rcx",		"rdx",		"rbx",
+  "rsp",	"rbp",		"rsi",		"rdi",
+  "r8",		"r9",		"r10",		"r11",
+  "r12",	"r13",		"r14",		"r15",
+
+  "es",		"cs",		"ss",		"ds",
+  "fs",		"gs",	
+
+  "cr0",	"cr1",		"cr2",		"cr3",
+  "cr4",	"cr5",		"cr6",		"cr7",
+  "cr8",	"cr9",		"cr10",		"cr11",
+  "cr12",	"cr13",		"cr14",		"cr15",
+	
+  "dr0",	"dr1",		"dr2",		"dr3",
+  "dr4",	"dr5",		"dr6",		"dr7",
+  "dr8",	"dr9",		"dr10",		"dr11",
+  "dr12",	"dr13",		"dr14",		"dr15",
+
+  "mm0",	"mm1",		"mm2",		"mm3",
+  "mm4",	"mm5",		"mm6",		"mm7",
+
+  "st0",	"st1",		"st2",		"st3",
+  "st4",	"st5",		"st6",		"st7", 
+
+  "xmm0",	"xmm1",		"xmm2",		"xmm3",
+  "xmm4",	"xmm5",		"xmm6",		"xmm7",
+  "xmm8",	"xmm9",		"xmm10",	"xmm11",
+  "xmm12",	"xmm13",	"xmm14",	"xmm15",
+
+  "rip"
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/libudis86/syn.h	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,25 @@
+/* -----------------------------------------------------------------------------
+ * syn.h
+ *
+ * Copyright (c) 2006, Vivek Mohan <vivek@sig9.com>
+ * All rights reserved. See LICENSE
+ * -----------------------------------------------------------------------------
+ */
+#ifndef UD_SYN_H
+#define UD_SYN_H
+
+#include <stdio.h>
+#include <stdarg.h>
+#include "types.h"
+
+extern const char* ud_reg_tab[];
+
+static void mkasm(struct ud* u, const char* fmt, ...)
+{
+  va_list ap;
+  va_start(ap, fmt);
+  u->insn_fill += vsprintf((char*) u->insn_buffer + u->insn_fill, fmt, ap);
+  va_end(ap);
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/libudis86/types.h	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,194 @@
+/* -----------------------------------------------------------------------------
+ * types.h
+ *
+ * Copyright (c) 2006, Vivek Mohan <vivek@sig9.com>
+ * All rights reserved. See LICENSE
+ * -----------------------------------------------------------------------------
+ */
+#ifndef UD_TYPES_H
+#define UD_TYPES_H
+
+#include <stdio.h>
+
+#ifdef _MSC_VER
+# define FMT64 "%I64"
+  typedef unsigned __int8 uint8_t;
+  typedef unsigned __int16 uint16_t;
+  typedef unsigned __int32 uint32_t;
+  typedef unsigned __int64 uint64_t;
+  typedef __int8 int8_t;
+  typedef __int16 int16_t;
+  typedef __int32 int32_t;
+  typedef __int64 int64_t;
+#else
+# define FMT64 "%ll"
+# include <inttypes.h>
+#endif
+
+#include "mnemonics.h"
+
+/* -----------------------------------------------------------------------------
+ * All possible "types" of objects in udis86. Order is Important!
+ * -----------------------------------------------------------------------------
+ */
+enum ud_type
+{
+  UD_NONE,
+
+  /* 8 bit GPRs */
+  UD_R_AL,	UD_R_CL,	UD_R_DL,	UD_R_BL,
+  UD_R_AH,	UD_R_CH,	UD_R_DH,	UD_R_BH,
+  UD_R_SPL,	UD_R_BPL,	UD_R_SIL,	UD_R_DIL,
+  UD_R_R8B,	UD_R_R9B,	UD_R_R10B,	UD_R_R11B,
+  UD_R_R12B,	UD_R_R13B,	UD_R_R14B,	UD_R_R15B,
+
+  /* 16 bit GPRs */
+  UD_R_AX,	UD_R_CX,	UD_R_DX,	UD_R_BX,
+  UD_R_SP,	UD_R_BP,	UD_R_SI,	UD_R_DI,
+  UD_R_R8W,	UD_R_R9W,	UD_R_R10W,	UD_R_R11W,
+  UD_R_R12W,	UD_R_R13W,	UD_R_R14W,	UD_R_R15W,
+	
+  /* 32 bit GPRs */
+  UD_R_EAX,	UD_R_ECX,	UD_R_EDX,	UD_R_EBX,
+  UD_R_ESP,	UD_R_EBP,	UD_R_ESI,	UD_R_EDI,
+  UD_R_R8D,	UD_R_R9D,	UD_R_R10D,	UD_R_R11D,
+  UD_R_R12D,	UD_R_R13D,	UD_R_R14D,	UD_R_R15D,
+	
+  /* 64 bit GPRs */
+  UD_R_RAX,	UD_R_RCX,	UD_R_RDX,	UD_R_RBX,
+  UD_R_RSP,	UD_R_RBP,	UD_R_RSI,	UD_R_RDI,
+  UD_R_R8,	UD_R_R9,	UD_R_R10,	UD_R_R11,
+  UD_R_R12,	UD_R_R13,	UD_R_R14,	UD_R_R15,
+
+  /* segment registers */
+  UD_R_ES,	UD_R_CS,	UD_R_SS,	UD_R_DS,
+  UD_R_FS,	UD_R_GS,	
+
+  /* control registers*/
+  UD_R_CR0,	UD_R_CR1,	UD_R_CR2,	UD_R_CR3,
+  UD_R_CR4,	UD_R_CR5,	UD_R_CR6,	UD_R_CR7,
+  UD_R_CR8,	UD_R_CR9,	UD_R_CR10,	UD_R_CR11,
+  UD_R_CR12,	UD_R_CR13,	UD_R_CR14,	UD_R_CR15,
+	
+  /* debug registers */
+  UD_R_DR0,	UD_R_DR1,	UD_R_DR2,	UD_R_DR3,
+  UD_R_DR4,	UD_R_DR5,	UD_R_DR6,	UD_R_DR7,
+  UD_R_DR8,	UD_R_DR9,	UD_R_DR10,	UD_R_DR11,
+  UD_R_DR12,	UD_R_DR13,	UD_R_DR14,	UD_R_DR15,
+
+  /* mmx registers */
+  UD_R_MM0,	UD_R_MM1,	UD_R_MM2,	UD_R_MM3,
+  UD_R_MM4,	UD_R_MM5,	UD_R_MM6,	UD_R_MM7,
+
+  /* x87 registers */
+  UD_R_ST0,	UD_R_ST1,	UD_R_ST2,	UD_R_ST3,
+  UD_R_ST4,	UD_R_ST5,	UD_R_ST6,	UD_R_ST7, 
+
+  /* extended multimedia registers */
+  UD_R_XMM0,	UD_R_XMM1,	UD_R_XMM2,	UD_R_XMM3,
+  UD_R_XMM4,	UD_R_XMM5,	UD_R_XMM6,	UD_R_XMM7,
+  UD_R_XMM8,	UD_R_XMM9,	UD_R_XMM10,	UD_R_XMM11,
+  UD_R_XMM12,	UD_R_XMM13,	UD_R_XMM14,	UD_R_XMM15,
+
+  UD_R_RIP,
+
+  /* Operand Types */
+  UD_OP_REG,	UD_OP_MEM,	UD_OP_PTR,	UD_OP_IMM,	
+  UD_OP_JIMM,	UD_OP_CONST
+};
+
+/* -----------------------------------------------------------------------------
+ * struct ud_operand - Disassembled instruction Operand.
+ * -----------------------------------------------------------------------------
+ */
+struct ud_operand 
+{
+  enum ud_type		type;
+  uint8_t		size;
+  union {
+	int8_t		sbyte;
+	uint8_t		ubyte;
+	int16_t		sword;
+	uint16_t	uword;
+	int32_t		sdword;
+	uint32_t	udword;
+	int64_t		sqword;
+	uint64_t	uqword;
+
+	struct {
+		uint16_t seg;
+		uint32_t off;
+	} ptr;
+  } lval;
+
+  enum ud_type		base;
+  enum ud_type		index;
+  uint8_t		offset;
+  uint8_t		scale;	
+};
+
+/* -----------------------------------------------------------------------------
+ * struct ud - The udis86 object.
+ * -----------------------------------------------------------------------------
+ */
+struct ud
+{
+  int 			(*inp_hook) (struct ud*);
+  uint8_t		inp_curr;
+  uint8_t		inp_fill;
+  FILE*			inp_file;
+  uint8_t		inp_ctr;
+  uint8_t*		inp_buff;
+  uint8_t*		inp_buff_end;
+  uint8_t		inp_end;
+  void			(*translator)(struct ud*);
+  uint64_t		insn_offset;
+  char			insn_hexcode[32];
+  char			insn_buffer[64];
+  unsigned int		insn_fill;
+  uint8_t		dis_mode;
+  uint64_t		pc;
+  uint8_t		vendor;
+  struct map_entry*	mapen;
+  enum ud_mnemonic_code	mnemonic;
+  struct ud_operand	operand[3];
+  uint8_t		error;
+  uint8_t	 	pfx_rex;
+  uint8_t 		pfx_seg;
+  uint8_t 		pfx_opr;
+  uint8_t 		pfx_adr;
+  uint8_t 		pfx_lock;
+  uint8_t 		pfx_rep;
+  uint8_t 		pfx_repe;
+  uint8_t 		pfx_repne;
+  uint8_t 		pfx_insn;
+  uint8_t		default64;
+  uint8_t		opr_mode;
+  uint8_t		adr_mode;
+  uint8_t		br_far;
+  uint8_t		br_near;
+  uint8_t		c1;
+  uint8_t		c2;
+  uint8_t		c3;
+  uint8_t 		inp_cache[256];
+  uint8_t		inp_sess[64];
+
+};
+
+/* -----------------------------------------------------------------------------
+ * Type-definitions
+ * -----------------------------------------------------------------------------
+ */
+typedef enum ud_type 		ud_type_t;
+typedef enum ud_mnemonic_code	ud_mnemonic_code_t;
+
+typedef struct ud 		ud_t;
+typedef struct ud_operand 	ud_operand_t;
+
+#define UD_SYN_INTEL		ud_translate_intel
+#define UD_SYN_ATT		ud_translate_att
+#define UD_EOI			-1
+#define UD_INP_CACHE_SZ		32
+#define UD_VENDOR_AMD		0
+#define UD_VENDOR_INTEL		1
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/libudis86/udis86.c	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,154 @@
+/* -----------------------------------------------------------------------------
+ * udis86.c
+ *
+ * Copyright (c) 2004, 2005, 2006, Vivek Mohan <vivek@sig9.com>
+ * All rights reserved. See LICENSE
+ * -----------------------------------------------------------------------------
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "input.h"
+#include "extern.h"
+
+/* =============================================================================
+ * ud_init() - Initializes ud_t object.
+ * =============================================================================
+ */
+extern void 
+ud_init(struct ud* u)
+{
+  memset((void*)u, 0, sizeof(struct ud));
+  ud_set_mode(u, 16);
+  u->mnemonic = UD_Iinvalid;
+  ud_set_pc(u, 0);
+#ifndef __UD_STANDALONE__
+  ud_set_input_file(u, stdin);
+#endif /* __UD_STANDALONE__ */
+}
+
+/* =============================================================================
+ * ud_disassemble() - disassembles one instruction and returns the number of 
+ * bytes disassembled. A zero means end of disassembly.
+ * =============================================================================
+ */
+extern unsigned int
+ud_disassemble(struct ud* u)
+{
+  if (ud_input_end(u))
+	return 0;
+
+ 
+  u->insn_buffer[0] = u->insn_hexcode[0] = 0;
+
+ 
+  if (ud_decode(u) == 0)
+	return 0;
+  if (u->translator)
+	u->translator(u);
+  return ud_insn_len(u);
+}
+
+/* =============================================================================
+ * ud_set_mode() - Set Disassemly Mode.
+ * =============================================================================
+ */
+extern void 
+ud_set_mode(struct ud* u, uint8_t m)
+{
+  switch(m) {
+	case 16:
+	case 32:
+	case 64: u->dis_mode = m ; return;
+	default: u->dis_mode = 16; return;
+  }
+}
+
+/* =============================================================================
+ * ud_set_vendor() - Set vendor.
+ * =============================================================================
+ */
+extern void 
+ud_set_vendor(struct ud* u, unsigned v)
+{
+  switch(v) {
+	case UD_VENDOR_INTEL:
+		u->vendor = v;
+		break;
+	default:
+		u->vendor = UD_VENDOR_AMD;
+  }
+}
+
+/* =============================================================================
+ * ud_set_pc() - Sets code origin. 
+ * =============================================================================
+ */
+extern void 
+ud_set_pc(struct ud* u, uint64_t o)
+{
+  u->pc = o;
+}
+
+/* =============================================================================
+ * ud_set_syntax() - Sets the output syntax.
+ * =============================================================================
+ */
+extern void 
+ud_set_syntax(struct ud* u, void (*t)(struct ud*))
+{
+  u->translator = t;
+}
+
+/* =============================================================================
+ * ud_insn() - returns the disassembled instruction
+ * =============================================================================
+ */
+extern char* 
+ud_insn_asm(struct ud* u) 
+{
+  return u->insn_buffer;
+}
+
+/* =============================================================================
+ * ud_insn_offset() - Returns the offset.
+ * =============================================================================
+ */
+extern uint64_t
+ud_insn_off(struct ud* u) 
+{
+  return u->insn_offset;
+}
+
+
+/* =============================================================================
+ * ud_insn_hex() - Returns hex form of disassembled instruction.
+ * =============================================================================
+ */
+extern char* 
+ud_insn_hex(struct ud* u) 
+{
+  return u->insn_hexcode;
+}
+
+/* =============================================================================
+ * ud_insn_ptr() - Returns code disassembled.
+ * =============================================================================
+ */
+extern uint8_t* 
+ud_insn_ptr(struct ud* u) 
+{
+  return u->inp_sess;
+}
+
+/* =============================================================================
+ * ud_insn_len() - Returns the count of bytes disassembled.
+ * =============================================================================
+ */
+extern unsigned int 
+ud_insn_len(struct ud* u) 
+{
+  return u->inp_ctr;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/mkinstalldirs	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,40 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id: mkinstalldirs,v 1.1.1.1 2006/02/04 09:13:58 vivek5797 Exp $
+
+errstatus=0
+
+for file
+do
+   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+   shift
+
+   pathcomp=
+   for d
+   do
+     pathcomp="$pathcomp$d"
+     case "$pathcomp" in
+       -* ) pathcomp=./$pathcomp ;;
+     esac
+
+     if test ! -d "$pathcomp"; then
+        echo "mkdir $pathcomp"
+
+        mkdir "$pathcomp" || lasterr=$?
+
+        if test ! -d "$pathcomp"; then
+  	  errstatus=$lasterr
+        fi
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/tests/Makefile	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,35 @@
+# Makefile
+
+CC		= cc
+RM		= rm
+
+
+.SUFFIXES: .c .o
+.c.o:
+	$(CC) -c $(CFLAGS) -o $@ $<
+
+OBJS =	gen.o
+
+gen: $(OBJS)
+	$(CC) $(OBJS) -ludis86 -o gen
+test16: gen
+	yasm -f bin -o test16.bin test16.asm
+	echo "[bits 16]" > test16.out
+	./gen -16 < test16.bin >> test16.out
+	diff test16.asm test16.out | more
+test32: gen
+	yasm -f bin -o test32.bin test32.asm
+	echo "[bits 32]" > test32.out
+	./gen -32 < test32.bin >> test32.out
+	diff test32.asm test32.out | more
+test64: gen
+	yasm -f bin -o test64.bin test64.asm
+	echo "[bits 64]" > test64.out
+	./gen -64 < test64.bin >> test64.out
+	diff test64.asm test64.out | more
+testjmp: gen
+	yasm -f bin -o testjmp.bin testjmp.asm
+	udcli -64 < testjmp.bin > testjmp.out
+	cat testjmp.out | more
+clean:
+	$(RM) -f core ./*.o ./gen *~ *.bin *.out
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/tests/Makefile.win32	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,35 @@
+# Makefile
+
+CC		= cl
+RM		= del
+
+
+.SUFFIXES: .c .obj
+.c.obj:
+	$(CC) -I.. -c $(CFLAGS) -o $@ $<
+
+OBJS =	gen.obj
+
+gen.exe: $(OBJS)
+	$(CC) $(OBJS) ../libudis86/udis86.lib -o gen.exe
+test16: gen.exe
+	yasm -f bin -o test16.bin test16.asm
+	echo [bits 16]> test16.out
+	gen -16 < test16.bin >> test16.out
+	diff test16.asm test16.out | more
+test32: gen.exe
+	yasm -f bin -o test32.bin test32.asm
+	echo [bits 32]> test32.out
+	gen -32 < test32.bin >> test32.out
+	diff test32.asm test32.out | more
+test64: gen.exe
+	yasm -f bin -o test64.bin test64.asm
+	echo [bits 64]> test64.out
+	gen -64 < test64.bin >> test64.out
+	diff test64.asm test64.out | more
+testjmp: gen.exe
+	yasm -f bin -o testjmp.bin testjmp.asm
+	..\udcli\udcli -64 < testjmp.bin > testjmp.out
+	type testjmp.out | more
+clean:
+	$(RM) *.obj gen.exe *.bin *.out
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/tests/gen.c	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,32 @@
+#include <stdio.h>
+#include <udis86.h>
+
+#ifdef _WIN32
+# include <io.h>
+# include <fcntl.h>
+#endif
+
+/* help string */
+int main(int argc, char **argv)
+{
+  ud_t ud_obj;
+
+#ifdef _WIN32
+  _setmode(_fileno(stdin), _O_BINARY);
+#endif  
+
+  ud_init(&ud_obj);
+  ud_set_input_file(&ud_obj, stdin);
+
+  if (strcmp(argv[1],"-16") == 0)
+	  ud_set_mode(&ud_obj, 16);
+  else if (strcmp(argv[1],"-32") == 0)
+	  ud_set_mode(&ud_obj, 32);
+  else if (strcmp(argv[1],"-64") == 0)
+	  ud_set_mode(&ud_obj, 64);
+
+  ud_set_syntax(&ud_obj, UD_SYN_INTEL);
+
+  while (ud_disassemble(&ud_obj))
+	printf("\t%s\n", ud_insn_asm(&ud_obj));
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/tests/test16.asm	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,2 @@
+[bits 16]
+	movzx eax, word [bx]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/tests/test32.asm	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,238 @@
+[bits 32]
+	mov [0x1000], bx
+	mov [0x10], ax
+	mov ax, [0x10]
+	mov byte [bx+si], 0x10
+	mov byte [bx+si+0x10], 0x10
+	mov word [bp+0x0], 0x10
+	mov word [bp+di+0x10], 0x10
+	mov dword [si+0x10], 0x10
+	mov word [di+0x10], 0x10
+	mov dword [bx+0x10], 0x1000
+	mov word [bx+0x1000], 0x1000
+	mov dword [ebx+ecx*4], 0x100
+	mov [eax+eax*2], eax
+	mov [edx+esi*8], ebp
+	mov dword [ecx*4+0x0], 0x100
+	mov byte [cs:0x100000], 0x10
+	mov word [eax+0x10], 0x10
+	mov [eax+0x10], ax
+	mov [eax+0x1000], ebx
+	mov [ebp+eax+0x0], esi
+	mov [ebp+edi+0x100000], esp
+	mov byte [esp], 0x10
+	add al, 0x10
+	push es
+	pop es
+	adc eax, 0x10000
+	and [eax], al
+	daa 
+	inc ax
+	inc edx
+	push eax
+	push ax
+	pushad 
+	bound eax, [eax]
+	bound ax, [ecx]
+	bsr ax, ax
+	bsf eax, [bx+si]
+	bswap eax
+	bt [eax], ax
+	btr ax, 0x10
+	btc ebx, 0x10
+	bts word [ebx], 0x10
+	call ax
+	call word near [bx+si]
+	call eax
+	call dword near [eax+ecx]
+	call word 0x10:0x100
+	call dword 0x10:0x10000
+	call word far [eax]
+	call dword far [bp+si]
+	cbw 
+	cwd 
+	clc 
+	cld 
+	clflush [eax]
+	cmp eax, ebx
+	cmp ecx, [bx]
+	cmpsb 
+	cmpsw 
+	cmpsd 
+	cmpxchg [eax], ax
+	cmpxchg8b [ebx]
+	cpuid 
+	das 
+	inc eax
+	inc word [ecx]
+	dec byte [si]
+	in al, 0x10
+	in ax, 0x10
+	in eax, 0x10
+	insb 
+	insw 
+	insd 
+	int 0x10
+	into 
+	lahf 
+	lds ax, [eax]
+	les eax, [ebx]
+	lea ax, [eax]
+	lea eax, [bx+si]
+	leave 
+	lodsb 
+	lodsw 
+	lodsd 
+	test al, bl
+	test [eax], bl
+	test [eax], ebx
+	test [eax], bx
+	ret 
+	ret 0x10
+	aad 0x10
+	aam 0x10
+	salc 
+	hlt 
+	cmc 
+	lock xchg ebx, eax
+	repne mov eax, ebx
+	rep mov eax, 0x10
+	push cs
+	outsd 
+	outsw 
+	mov ax, es
+	mov bx, ds
+	mov [eax], es
+	mov [ebx+ecx], cs
+	mov cs, [ebx+ecx]
+	wait 
+	pushfw 
+	pushfd 
+	lodsw 
+	lodsd 
+	retf 0x10
+	int3 
+	into 
+	iretw 
+	iretd 
+	lar eax, [eax]
+	lsl ax, [bx]
+	syscall 
+	clts 
+	sysret 
+	movups xmm0, xmm1
+	mov dr0, eax
+	wrmsr 
+	rdmsr 
+	rdtsc 
+	rdpmc 
+	sysenter 
+	sysexit 
+	cmovo eax, [eax]
+	cmovno eax, [bx]
+	cmovb eax, [eax]
+	cmovae eax, [bx]
+	cmovo eax, [eax]
+	cmovz eax, ebx
+	cmovnz eax, [eax]
+	cmovbe eax, [bx]
+	cmova eax, [bx]
+	movmskps eax, xmm0
+	movmskpd eax, xmm0
+	sqrtps xmm1, xmm0
+	rsqrtps xmm1, xmm0
+	rcpps xmm1, xmm0
+	andps xmm1, xmm0
+	orps xmm1, xmm0
+	xorps xmm1, xmm0
+	andnps xmm1, xmm0
+	sqrtss xmm1, xmm0
+	rsqrtss xmm1, xmm0
+	rcpss xmm1, xmm0
+	sqrtpd xmm1, xmm0
+	andpd xmm1, xmm0
+	andnpd xmm1, xmm0
+	orpd xmm1, xmm0
+	xorpd xmm1, xmm0
+	sqrtsd xmm1, xmm0
+	punpcklbw mm0, [eax]
+	punpcklwd mm0, mm1
+	punpckldq mm0, mm1
+	packsswb mm0, mm1
+	packsswb mm0, mm1
+	pcmpgtb mm0, mm1
+	pcmpgtw mm0, mm1
+	pcmpgtd mm0, mm1
+	packuswb mm0, mm1
+	punpcklbw xmm0, [eax]
+	punpcklwd xmm0, xmm1
+	punpckldq xmm0, xmm1
+	packsswb xmm0, xmm1
+	packsswb xmm0, xmm1
+	pcmpgtb xmm0, xmm1
+	pcmpgtw xmm0, xmm1
+	pcmpgtd xmm0, xmm1
+	packuswb xmm0, xmm1
+	pshufw mm0, mm1, 0x10
+	pcmpeqb mm0, mm1
+	pcmpeqw mm0, mm1
+	pcmpeqd mm0, mm1
+	pcmpeqb xmm0, xmm1
+	pcmpeqw xmm0, xmm1
+	pcmpeqd xmm0, xmm1
+	emms 
+	pshufhw xmm0, xmm1, 0x10
+	pshufd xmm0, xmm1, 0x10
+	pshuflw xmm0, xmm1, 0x10
+	seto [eax]
+	setno [bx]
+	setz [es:eax+ecx*2+0x100]
+	push fs
+	pop fs
+	cpuid 
+	bt [eax], eax
+	shld eax, ebx, 0x10
+	shld [eax], bx, cl
+	cmpxchg [eax], eax
+	lss eax, [eax]
+	btr [eax], eax
+	movnti [eax], eax
+	psrlw mm0, 0x10
+	fadd dword [eax]
+	imul eax, [eax], 0xf6
+	movd dword [eax], xmm0
+	movzx eax, word [eax]
+	push word [0x10]
+	insw 
+	insd 
+	fnstsw ax
+	fucomip st0, st1
+	fcomip st0, st7
+	fucomp st4
+	fucom st5
+	fstp st3
+	fst st1
+	ffree st0
+	fdiv st7, st0
+	fdivr st2, st0
+	fsub st4, st0
+	fsubr st6, st0
+	fmul st0, st0
+	fadd st5, st0
+	ficom word [eax]
+	fidivr word [eax]
+	fimul word [ebx]
+	fisub word [ecx]
+	fld qword [bx+si]
+	fisttp qword [edx+0x100]
+	fnstsw [eax]
+	frstor [ebx]
+	prefetch [bx+si]
+	psrlq xmm0, 0x10
+	psrldq xmm0, 0x10
+	movsldup xmm0, [eax]
+	add [0xffffffff], eax
+	cvtsi2ss xmm1, dword [eax]
+	pause 
+	pop dword [eax]
+	out 0x0, al
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/tests/test64.asm	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,142 @@
+[bits 64]
+	mov rax, 0x102030405060708
+	mov [eax+0x10], ax
+	mov [eax+0x1000], ebx
+	mov [ebp+eax+0x0], esi
+	mov qword [ebp+edi+0x1000], 0x10
+	mov byte [esp], 0x10
+	mov [eax], rax
+	mov [r12], eax
+	mov [r13+r12+0x0], eax
+	mov [r8*4+0x0], sil
+	inc rax
+	dec rax
+	mov [rip+0x200], rax
+	mov rax, 0x10000
+	push rax
+	push r12
+	call word near [r8]
+	call qword near [rax]
+	call word far [r8]
+	call dword far [rax]
+	cbw 
+	cwde 
+	cdqe 
+	cwd 
+	cdq 
+	cqo 
+	cmovl rax, [rax]
+	cmovge eax, [rax]
+	clflush [r14]
+	cmp [rax], rax
+	cmp rbx, r12
+	cmp r12d, r8d
+	cmpsb 
+	cmpsw 
+	cmpsd 
+	cmpsq 
+	cmpxchg [eax], r14
+	cmpxchg8b [ebx]
+	inc r12d
+	inc dword [rax]
+	dec r11w
+	hlt 
+	imul rax, [eax+ebx*8+0x100000], 0x10
+	idiv dword [r12]
+	enter 0x100, 0x0
+	enter 0x100, 0x1
+	enter 0x100, 0x10
+	in al, 0x10
+	in ax, 0x10
+	in eax, 0x10
+	lfs eax, [eax]
+	lgs eax, [ebx]
+	lea eax, [rbx]
+	lea r11, [eax]
+	lodsb 
+	lodsq 
+	lodsd 
+	push rax
+	push r11
+	xchg [eax], sil
+	xchg [eax], ebx
+	xchg [eax], bx
+	xchg r8, rax
+	xchg r9, rax
+	xchg cx, ax
+	movsd 
+	movsq 
+	mov al, r11b
+	mov sil, al
+	mov r11b, dil
+	ret 0x10
+	pop rax
+	pop r11
+	pop qword [eax]
+	insd 
+	outsd 
+	mov [r14d], cs
+	mov cs, [ebx+ecx]
+	pushfq 
+	scasq 
+	lar rax, [eax]
+	lsl ax, [rbx]
+	movups xmm0, [r12d]
+	movupd xmm0, [r12d]
+	movsldup xmm0, [r12d]
+	movups xmm0, xmm1
+	movlps xmm0, [rax]
+	movlps [rax], xmm0
+	unpcklps xmm4, xmm5
+	unpckhps xmm4, xmm5
+	movhps xmm3, [eax]
+	movhps [rax], xmm3
+	movss xmm0, [eax]
+	movss [eax], xmm0
+	movlpd [eax], xmm0
+	movlpd xmm0, [eax]
+	unpcklpd xmm2, xmm4
+	unpckhpd xmm3, [eax+ebx*8+0xffffffff]
+	movhpd xmm3, [rax]
+	movhpd [rax], xmm2
+	movsd xmm3, xmm4
+	movddup xmm3, [rax]
+	mov dr0, rax
+	mov rax, dr1
+	movnti [eax], eax
+	movnti [rax], rax
+	movd dword [eax], xmm0
+	movd qword [eax], xmm0
+	movd xmm11, qword [eax]
+	vmmcall 
+	vmrun 
+	clgi 
+	stgi 
+	mfence 
+	lfence 
+	sfence 
+	clflush [rax]
+	mov cr8, rax
+	push qword [eax]
+	push word [eax]
+	add bh, bh
+	add dil, dil
+	add sil, bpl
+	add al, sil
+	prefetcht0 [eax]
+	prefetchnta [eax]
+	prefetch [eax]
+	add [r8], r9b
+	mov [rax-0x1], eax
+	inc rax
+	jmp qword near [eax]
+	jmp rax
+	mov [0x10], rax
+	mov rax, [0x10]
+	mov rax, 0x102030405060708
+	nop 
+	xchg r8, rax
+	push ax
+	push rax
+	push r11
+	mov rax, [0x100]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/tests/testjmp.asm	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,17 @@
+[bits 64]
+
+	jnz near x
+	jo near x
+	jno word x
+	jc near x
+	jnc word x
+	jae dword x
+	jcxz x
+	jecxz x
+	jrcxz x
+	jmp near x
+	call x
+	jmp word x
+	jmp dword x
+	jmp word [eax]	
+x:	jmp qword [rax]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/udcli/Makefile.in	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,38 @@
+# Makefile
+# udis86 - Cmd line interface.
+#
+
+SHELL		= @SHELL@
+top_srcdir	= @top_srcdir@
+srcdir		= @srcdir@
+CC		= @CC@
+CFLAGS		= @CFLAGS@ -Wall -O2
+LIBS		= @LIBS@
+INSTALL		= @INSTALL@
+INSTALL_PROGRAM	= @INSTALL_PROGRAM@
+INSTALL_DATA	= @INSTALL_DATA@
+prefix		= @prefix@
+exec_prefix	= ${prefix}
+bindir		= $(exec_prefix)/bin
+libdir		= $(prefix)/lib
+mandir		= @mandir@
+includedir	= @includedir@
+RM		= rm
+
+
+.SUFFIXES: .c .o
+.c.o:
+	$(CC) -c $(CFLAGS) -o $@ $<
+
+OBJS =	udcli.o ../libudis86/libudis86.a
+
+udcli: $(OBJS)
+	$(CC) $(CFLAGS) $(OBJS) -o udcli
+install: udcli
+	$(INSTALL_PROGRAM) $(srcdir)/udcli $(INSTALLROOT)$(bindir)/udcli
+uninstall:
+	$(RM) -f $(INSTALLROOT)$(bindir)/udcli
+clean:
+	$(RM) -f core $(srcdir)/*.o $(srcdir)/udcli
+distclean: clean
+	$(RM) -f udcli config.h Makefile *~
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/udcli/Makefile.win32	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,20 @@
+# Makefile
+# udis86 - Cmd line interface.
+#
+
+CC			= cl
+CFLAGS		= -O2
+RM			= del
+
+
+.SUFFIXES: .c .obj
+.c.obj:
+	$(CC) -c $(CFLAGS) -o $@ $<
+
+OBJS =	udcli.obj ../libudis86/udis86.lib
+
+udcli: $(OBJS)
+	$(CC) $(OBJS) -o udcli.exe
+
+clean:
+	$(RM) *.obj udcli.exe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/udcli/udcli.c	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,240 @@
+/* -----------------------------------------------------------------------------
+ * udcli.c - front end to udis86.
+ *
+ * Copyright (c) 2004, 2005, 2006 Vivek Mohan <vivek@sig9.com>
+ * All rights reserved.
+ * See (LICENSE)
+ * -----------------------------------------------------------------------------
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include "../udis86.h"
+
+#if defined(__amd64__) || defined(__x86_64__)
+#  define FMT "l"
+#else
+#  define FMT "ll"
+#endif
+
+#ifdef _WIN32
+# include <io.h>
+# include <fcntl.h>
+#endif
+
+/* help string */
+static char help[] = 
+{
+  "Usage: %s [-option[s]] file\n"
+  "Options:\n"
+  "    -16      : Set the disassembly mode to 16 bits. \n"
+  "    -32      : Set the disassembly mode to 32 bits. (default)\n"
+  "    -64      : Set the disassembly mode to 64 bits.\n"
+  "    -intel   : Set the output to INTEL (NASM like) syntax. (default)\n"
+  "    -att     : Set the output to AT&T (GAS like) syntax.\n"
+  "    -v <v>   : Set vendor. <v> = {intel, amd}.\n"
+  "    -o <pc>  : Set the value of program counter to <pc>. (default = 0)\n"
+  "    -s <n>   : Set the number of bytes to skip before disassembly to <n>.\n"
+  "    -c <n>   : Set the number of bytes to disassemble to <n>.\n"
+  "    -x       : Set the input mode to whitespace seperated 8-bit numbers in\n"
+  "               hexadecimal representation. Example: 0f 01 ae 00\n"
+  "    -noff    : Do not display the offset of instructions.\n"
+  "    -nohex   : Do not display the hexadecimal code of instructions.\n"
+  "    -h       : Display this help message.\n"
+  "\n"
+  "Udcli is a front-end to the Udis86 Disassembler Library.\n" 
+  "http://udis86.sourceforge.net/\n"
+};
+
+FILE* fptr = NULL;
+uint64_t o_skip = 0;
+uint64_t o_count = 0;
+unsigned char o_do_count= 0;
+unsigned char o_do_off = 1;
+unsigned char o_do_hex = 1;
+unsigned char o_do_x = 0;
+unsigned o_vendor = UD_VENDOR_AMD;
+
+int input_hook_x(ud_t* u);
+int input_hook_file(ud_t* u);
+
+int main(int argc, char **argv)
+{
+  char *prog_path = *argv;
+  char *s;
+  ud_t ud_obj;
+  int mode = 0;
+
+  /* initialize */
+  ud_init(&ud_obj);
+  ud_set_mode(&ud_obj, 32);
+  ud_set_syntax(&ud_obj, UD_SYN_INTEL);
+
+#ifdef _WIN32
+  _setmode(_fileno(stdin), _O_BINARY);
+#endif  
+
+  fptr = stdin;
+
+  argv++;
+
+  /* loop through the args */
+  while(--argc > 0) {
+	if (strcmp(*argv,"-16") == 0) {
+		ud_set_mode(&ud_obj, 16);
+		mode = 16;
+	} else if (strcmp(*argv,"-32") == 0) {
+		ud_set_mode(&ud_obj, 32);
+		mode = 32;
+	} else if (strcmp(*argv,"-64") == 0) {
+		ud_set_mode(&ud_obj, 64);
+		mode = 64;
+	} else if (strcmp(*argv,"-intel") == 0)
+		ud_set_syntax(&ud_obj, UD_SYN_INTEL);
+	else if (strcmp(*argv,"-att") == 0)
+		ud_set_syntax(&ud_obj, UD_SYN_ATT);
+	else if (strcmp(*argv,"-noff") == 0)
+		o_do_off = 0;
+	else if (strcmp(*argv,"-nohex") == 0)
+		o_do_hex = 0;
+	else if (strcmp(*argv,"-x") == 0)
+		o_do_x = 1;
+	else if (strcmp(*argv,"-s") == 0)
+		if (--argc) {
+			s = *(++argv);
+			if (sscanf(s, "%"  FMT "d", &o_skip) == 0)
+				fprintf(stderr, "Invalid value given for -s.\n");
+		} else { 
+			fprintf(stderr, "No value given for -s.\n");
+			printf(help, prog_path);
+			exit(EXIT_FAILURE);
+		}
+	else if (strcmp(*argv,"-c") == 0)
+		if (--argc) {
+			o_do_count= 1;
+			s = *(++argv);
+			if (sscanf(s, "%" FMT "d", &o_count) == 0)
+				fprintf(stderr, "Invalid value given for -c.\n");
+		} else { 
+			fprintf(stderr, "No value given for -c.\n");
+			printf(help, prog_path);
+			exit(EXIT_FAILURE);
+		}
+	else if (strcmp(*argv,"-v") == 0)
+		if (--argc) {
+			s = *(++argv);
+			if (*s == 'i')
+				ud_set_vendor(&ud_obj, UD_VENDOR_INTEL);
+		} else { 
+			fprintf(stderr, "No value given for -v.\n");
+			printf(help, prog_path);
+			exit(EXIT_FAILURE);
+		}
+	else if (strcmp(*argv,"-o") == 0) {
+		if (--argc) {
+			uint64_t pc = 0;
+			s = *(++argv);
+			if (sscanf(s, "%" FMT "x", &pc) == 0)
+				fprintf(stderr, "Invalid value given for -o.\n");
+			ud_set_pc(&ud_obj, pc);
+		} else { 
+			fprintf(stderr, "No value given for -o.\n");
+			printf(help, prog_path);
+			exit(EXIT_FAILURE);
+		}
+	} else if((*argv)[0] == '-') {
+		fprintf(stderr, "Invalid option %s.\n", *argv);
+		printf(help, prog_path);
+		exit(EXIT_FAILURE);
+	} else {
+		static int i = 0;
+		s = *argv;
+		if (i) {
+			fprintf(stderr, "Multiple files specified.\n");
+			exit(EXIT_FAILURE);
+		} else i = 1;
+		if ((fptr = fopen(s, "rb")) == NULL) {
+			fprintf(stderr, "Failed to open file: %s.\n", s);
+				exit(EXIT_FAILURE);
+		}
+	}
+	argv++;
+  }
+
+  if (o_do_x)
+	ud_set_input_hook(&ud_obj, input_hook_x);
+  else	ud_set_input_hook(&ud_obj, input_hook_file);	
+
+  if (o_skip) {
+	o_count += o_skip;
+	ud_input_skip(&ud_obj, o_skip);
+  }
+
+  /* disassembly loop */
+  while (ud_disassemble(&ud_obj)) {
+	if (o_do_off)
+		printf("%016" FMT "x ", ud_insn_off(&ud_obj));
+	if (o_do_hex) {
+		char* hex1, *hex2;
+		char c;
+		hex1 = ud_insn_hex(&ud_obj);
+		hex2 = hex1 + 16;
+		c = hex1[16];
+		hex1[16] = 0;
+		printf("%-16s %-24s", hex1, ud_insn_asm(&ud_obj));
+		hex1[16] = c;
+		if (strlen(hex1) > 16) {
+			printf("\n");
+			if (o_do_off)
+				printf("%15s -", "");
+			printf("%-16s", hex2);
+		}
+	} 
+	else printf(" %-24s", ud_insn_asm(&ud_obj));
+
+	printf("\n");
+  }
+  
+  exit(EXIT_SUCCESS);
+  return 0;
+}
+
+int input_hook_x(ud_t* u)
+{
+  unsigned int c, i;
+
+  if (o_do_count) {
+	if (! o_count)
+		return UD_EOI;
+	else --o_count;
+  }
+
+  i = fscanf(fptr, "%x", &c);
+
+  if (i == EOF)
+	return UD_EOI;
+  if (i == 0) {
+	fprintf(stderr, "Error: Invalid input, should be in hexadecimal form (8-bit).\n");
+	return UD_EOI;
+  }
+  if (c > 0xFF)
+	fprintf(stderr, "Warning: Casting non-8-bit input (%x), to %x.\n", c, c & 0xFF);
+  return (int) (c & 0xFF);
+}	
+
+int input_hook_file(ud_t* u)
+{
+  int c;
+
+  if (o_do_count) {
+	  if (! o_count) {
+		return -1;
+	  } else o_count -- ;
+  }
+
+  if ((c = fgetc(fptr)) == EOF)
+	return UD_EOI;
+  return c;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/udis86.h	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,15 @@
+/* -----------------------------------------------------------------------------
+ * udis86.h
+ *
+ * Copyright (c) 2002, 2003, 2004 Vivek Mohan <vivek@sig9.com>
+ * All rights reserved. See (LICENSE)
+ * -----------------------------------------------------------------------------
+ */
+
+#ifndef UDIS86_H
+#define UDIS86_H
+
+#include "libudis86/types.h"
+#include "libudis86/extern.h"
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/accctrl.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,424 @@
+/***********************************************************************\
+*                               accctrl.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.accctrl;
+
+private import win32.basetyps, win32.w32api, win32.winbase, win32.windef;
+
+// FIXME: check types and grouping of constants
+// FIXME: check Windows version support
+
+static assert (_WIN32_WINNT_ONLY,
+	"win32.accctrl is available only if version WindowsNTonly, WindowsXP, "
+	"Windows2003 or WindowsVista is set");
+
+alias LocalFree AccFree;
+
+const uint
+	ACTRL_RESERVED            = 0x00000000,
+	ACTRL_ACCESS_PROTECTED    = 0x00000001,
+	ACTRL_ACCESS_ALLOWED      = 0x00000001,
+	ACTRL_ACCESS_DENIED       = 0x00000002,
+	ACTRL_AUDIT_SUCCESS       = 0x00000004,
+	ACTRL_AUDIT_FAILURE       = 0x00000008,
+	ACTRL_SYSTEM_ACCESS       = 0x04000000,
+	ACTRL_DELETE              = 0x08000000,
+	ACTRL_READ_CONTROL        = 0x10000000,
+	ACTRL_CHANGE_ACCESS       = 0x20000000,
+	ACTRL_CHANGE_OWNER        = 0x40000000,
+	ACTRL_SYNCHRONIZE         = 0x80000000,
+	ACTRL_STD_RIGHTS_ALL      = 0xf8000000;
+
+const uint
+	ACTRL_FILE_READ           = 0x00000001,
+	ACTRL_FILE_WRITE          = 0x00000002,
+	ACTRL_FILE_APPEND         = 0x00000004,
+	ACTRL_FILE_READ_PROP      = 0x00000008,
+	ACTRL_FILE_WRITE_PROP     = 0x00000010,
+	ACTRL_FILE_EXECUTE        = 0x00000020,
+	ACTRL_FILE_READ_ATTRIB    = 0x00000080,
+	ACTRL_FILE_WRITE_ATTRIB   = 0x00000100,
+	ACTRL_FILE_CREATE_PIPE    = 0x00000200;
+
+const uint
+	ACTRL_DIR_LIST            = 0x00000001,
+	ACTRL_DIR_CREATE_OBJECT   = 0x00000002,
+	ACTRL_DIR_CREATE_CHILD    = 0x00000004,
+	ACTRL_DIR_DELETE_CHILD    = 0x00000040,
+	ACTRL_DIR_TRAVERSE        = 0x00000020;
+
+const uint
+	ACTRL_KERNEL_TERMINATE    = 0x00000001,
+	ACTRL_KERNEL_THREAD       = 0x00000002,
+	ACTRL_KERNEL_VM           = 0x00000004,
+	ACTRL_KERNEL_VM_READ      = 0x00000008,
+	ACTRL_KERNEL_VM_WRITE     = 0x00000010,
+	ACTRL_KERNEL_DUP_HANDLE   = 0x00000020,
+	ACTRL_KERNEL_PROCESS      = 0x00000040,
+	ACTRL_KERNEL_SET_INFO     = 0x00000080,
+	ACTRL_KERNEL_GET_INFO     = 0x00000100,
+	ACTRL_KERNEL_CONTROL      = 0x00000200,
+	ACTRL_KERNEL_ALERT        = 0x00000400,
+	ACTRL_KERNEL_GET_CONTEXT  = 0x00000800,
+	ACTRL_KERNEL_SET_CONTEXT  = 0x00001000,
+	ACTRL_KERNEL_TOKEN        = 0x00002000,
+	ACTRL_KERNEL_IMPERSONATE  = 0x00004000,
+	ACTRL_KERNEL_DIMPERSONATE = 0x00008000;
+
+const uint
+	ACTRL_PRINT_SADMIN        = 0x00000001,
+	ACTRL_PRINT_SLIST         = 0x00000002,
+	ACTRL_PRINT_PADMIN        = 0x00000004,
+	ACTRL_PRINT_PUSE          = 0x00000008,
+	ACTRL_PRINT_JADMIN        = 0x00000010;
+
+const uint
+	ACTRL_SVC_GET_INFO        = 0x00000001,
+	ACTRL_SVC_SET_INFO        = 0x00000002,
+	ACTRL_SVC_STATUS          = 0x00000004,
+	ACTRL_SVC_LIST            = 0x00000008,
+	ACTRL_SVC_START           = 0x00000010,
+	ACTRL_SVC_STOP            = 0x00000020,
+	ACTRL_SVC_PAUSE           = 0x00000040,
+	ACTRL_SVC_INTERROGATE     = 0x00000080,
+	ACTRL_SVC_UCONTROL        = 0x00000100;
+
+const uint
+	ACTRL_REG_QUERY           = 0x00000001,
+	ACTRL_REG_SET             = 0x00000002,
+	ACTRL_REG_CREATE_CHILD    = 0x00000004,
+	ACTRL_REG_LIST            = 0x00000008,
+	ACTRL_REG_NOTIFY          = 0x00000010,
+	ACTRL_REG_LINK            = 0x00000020;
+
+const uint
+	ACTRL_WIN_CLIPBRD         = 0x00000001,
+	ACTRL_WIN_GLOBAL_ATOMS    = 0x00000002,
+	ACTRL_WIN_CREATE          = 0x00000004,
+	ACTRL_WIN_LIST_DESK       = 0x00000008,
+	ACTRL_WIN_LIST            = 0x00000010,
+	ACTRL_WIN_READ_ATTRIBS    = 0x00000020,
+	ACTRL_WIN_WRITE_ATTRIBS   = 0x00000040,
+	ACTRL_WIN_SCREEN          = 0x00000080,
+	ACTRL_WIN_EXIT            = 0x00000100;
+
+enum : uint {
+	ACTRL_ACCESS_NO_OPTIONS              = 0x00000000,
+	ACTRL_ACCESS_SUPPORTS_OBJECT_ENTRIES = 0x00000001
+}
+
+const TCHAR[] ACCCTRL_DEFAULT_PROVIDER = "Windows NT Access Provider";
+
+const uint
+	TRUSTEE_ACCESS_ALLOWED    = 0x00000001,
+	TRUSTEE_ACCESS_READ       = 0x00000002,
+	TRUSTEE_ACCESS_WRITE      = 0x00000004,
+	TRUSTEE_ACCESS_EXPLICIT   = 0x00000001,
+	TRUSTEE_ACCESS_READ_WRITE = 0x00000006,
+	TRUSTEE_ACCESS_ALL        = 0xFFFFFFFF;
+
+const uint
+	NO_INHERITANCE                     = 0x0,
+	SUB_OBJECTS_ONLY_INHERIT           = 0x1,
+	SUB_CONTAINERS_ONLY_INHERIT        = 0x2,
+	SUB_CONTAINERS_AND_OBJECTS_INHERIT = 0x3,
+	INHERIT_NO_PROPAGATE               = 0x4,
+	INHERIT_ONLY                       = 0x8,
+	INHERITED_ACCESS_ENTRY             = 0x10,
+	INHERITED_PARENT                   = 0x10000000,
+	INHERITED_GRANDPARENT              = 0x20000000;
+
+alias ULONG INHERIT_FLAGS, ACCESS_RIGHTS;
+alias ULONG* PINHERIT_FLAGS, PACCESS_RIGHTS;
+
+enum ACCESS_MODE {
+	NOT_USED_ACCESS,
+	GRANT_ACCESS,
+	SET_ACCESS,
+	DENY_ACCESS,
+	REVOKE_ACCESS,
+	SET_AUDIT_SUCCESS,
+	SET_AUDIT_FAILURE
+}
+
+enum SE_OBJECT_TYPE {
+	SE_UNKNOWN_OBJECT_TYPE,
+	SE_FILE_OBJECT,
+	SE_SERVICE,
+	SE_PRINTER,
+	SE_REGISTRY_KEY,
+	SE_LMSHARE,
+	SE_KERNEL_OBJECT,
+	SE_WINDOW_OBJECT,
+	SE_DS_OBJECT,
+	SE_DS_OBJECT_ALL,
+	SE_PROVIDER_DEFINED_OBJECT,
+	SE_WMIGUID_OBJECT,
+	SE_REGISTRY_WOW64_32KEY
+}
+
+enum TRUSTEE_TYPE {
+	TRUSTEE_IS_UNKNOWN,
+	TRUSTEE_IS_USER,
+	TRUSTEE_IS_GROUP,
+	TRUSTEE_IS_DOMAIN,
+	TRUSTEE_IS_ALIAS,
+	TRUSTEE_IS_WELL_KNOWN_GROUP,
+	TRUSTEE_IS_DELETED,
+	TRUSTEE_IS_INVALID,
+	TRUSTEE_IS_COMPUTER
+}
+
+enum TRUSTEE_FORM {
+	TRUSTEE_IS_SID,
+	TRUSTEE_IS_NAME,
+	TRUSTEE_BAD_FORM,
+	TRUSTEE_IS_OBJECTS_AND_SID,
+	TRUSTEE_IS_OBJECTS_AND_NAME
+}
+
+enum MULTIPLE_TRUSTEE_OPERATION {
+	NO_MULTIPLE_TRUSTEE,
+	TRUSTEE_IS_IMPERSONATE
+}
+
+struct TRUSTEE_A {
+	TRUSTEE_A*                 pMultipleTrustee;
+	MULTIPLE_TRUSTEE_OPERATION MultipleTrusteeOperation;
+	TRUSTEE_FORM               TrusteeForm;
+	TRUSTEE_TYPE               TrusteeType;
+	LPSTR                      ptstrName;
+}
+alias TRUSTEE_A TRUSTEEA;
+alias TRUSTEE_A* PTRUSTEE_A, PTRUSTEEA;
+
+struct TRUSTEE_W {
+	TRUSTEE_W*                 pMultipleTrustee;
+	MULTIPLE_TRUSTEE_OPERATION MultipleTrusteeOperation;
+	TRUSTEE_FORM               TrusteeForm;
+	TRUSTEE_TYPE               TrusteeType;
+	LPWSTR                     ptstrName;
+}
+alias TRUSTEE_W TRUSTEEW;
+alias TRUSTEEW* PTRUSTEE_W, PTRUSTEEW;
+
+struct ACTRL_ACCESS_ENTRYA {
+	TRUSTEE_A     Trustee;
+	ULONG         fAccessFlags;
+	ACCESS_RIGHTS Access;
+	ACCESS_RIGHTS ProvSpecificAccess;
+	INHERIT_FLAGS Inheritance;
+	LPCSTR        lpInheritProperty;
+}
+alias ACTRL_ACCESS_ENTRYA* PACTRL_ACCESS_ENTRYA;
+
+struct ACTRL_ACCESS_ENTRYW {
+	TRUSTEE_W     Trustee;
+	ULONG         fAccessFlags;
+	ACCESS_RIGHTS Access;
+	ACCESS_RIGHTS ProvSpecificAccess;
+	INHERIT_FLAGS Inheritance;
+	LPCWSTR       lpInheritProperty;
+}
+alias ACTRL_ACCESS_ENTRYW* PACTRL_ACCESS_ENTRYW;
+
+struct ACTRL_ACCESS_ENTRY_LISTA {
+	ULONG                cEntries;
+	ACTRL_ACCESS_ENTRYA* pAccessList;
+}
+alias ACTRL_ACCESS_ENTRY_LISTA* PACTRL_ACCESS_ENTRY_LISTA;
+
+struct ACTRL_ACCESS_ENTRY_LISTW {
+	ULONG                cEntries;
+	ACTRL_ACCESS_ENTRYW* pAccessList;
+}
+alias ACTRL_ACCESS_ENTRY_LISTW* PACTRL_ACCESS_ENTRY_LISTW;
+
+struct ACTRL_PROPERTY_ENTRYA {
+	LPCSTR                    lpProperty;
+	PACTRL_ACCESS_ENTRY_LISTA pAccessEntryList;
+	ULONG                     fListFlags;
+}
+alias ACTRL_PROPERTY_ENTRYA* PACTRL_PROPERTY_ENTRYA;
+
+struct ACTRL_PROPERTY_ENTRYW {
+	LPCWSTR                   lpProperty;
+	PACTRL_ACCESS_ENTRY_LISTW pAccessEntryList;
+	ULONG                     fListFlags;
+}
+alias ACTRL_PROPERTY_ENTRYW* PACTRL_PROPERTY_ENTRYW;
+
+struct ACTRL_ACCESSA {
+	ULONG                  cEntries;
+	PACTRL_PROPERTY_ENTRYA pPropertyAccessList;
+}
+alias ACTRL_ACCESSA ACTRL_AUDITA;
+alias ACTRL_ACCESSA* PACTRL_ACCESSA, PACTRL_AUDITA;
+
+struct ACTRL_ACCESSW {
+	ULONG                  cEntries;
+	PACTRL_PROPERTY_ENTRYW pPropertyAccessList;
+}
+alias ACTRL_ACCESSW ACTRL_AUDITW;
+alias ACTRL_ACCESSW* PACTRL_ACCESSW, PACTRL_AUDITW;
+
+struct TRUSTEE_ACCESSA {
+	LPSTR         lpProperty;
+	ACCESS_RIGHTS Access;
+	ULONG         fAccessFlags;
+	ULONG         fReturnedAccess;
+}
+alias TRUSTEE_ACCESSA* PTRUSTEE_ACCESSA;
+
+struct TRUSTEE_ACCESSW {
+	LPWSTR        lpProperty;
+	ACCESS_RIGHTS Access;
+	ULONG         fAccessFlags;
+	ULONG         fReturnedAccess;
+}
+alias TRUSTEE_ACCESSW* PTRUSTEE_ACCESSW;
+
+struct ACTRL_OVERLAPPED {
+	union {
+		PVOID Provider;
+		ULONG Reserved1;
+	}
+	ULONG     Reserved2;
+	HANDLE    hEvent;
+}
+alias ACTRL_OVERLAPPED* PACTRL_OVERLAPPED;
+
+struct ACTRL_ACCESS_INFOA {
+	ULONG fAccessPermission;
+	LPSTR lpAccessPermissionName;
+}
+alias ACTRL_ACCESS_INFOA* PACTRL_ACCESS_INFOA;
+
+struct ACTRL_ACCESS_INFOW {
+	ULONG  fAccessPermission;
+	LPWSTR lpAccessPermissionName;
+}
+alias ACTRL_ACCESS_INFOW* PACTRL_ACCESS_INFOW;
+
+struct ACTRL_CONTROL_INFOA {
+	LPSTR lpControlId;
+	LPSTR lpControlName;
+}
+alias ACTRL_CONTROL_INFOA* PACTRL_CONTROL_INFOA;
+
+struct ACTRL_CONTROL_INFOW {
+	LPWSTR lpControlId;
+	LPWSTR lpControlName;
+}
+alias ACTRL_CONTROL_INFOW* PACTRL_CONTROL_INFOW;
+
+struct EXPLICIT_ACCESS_A {
+	DWORD       grfAccessPermissions;
+	ACCESS_MODE grfAccessMode;
+	DWORD       grfInheritance;
+	TRUSTEE_A   Trustee;
+}
+alias EXPLICIT_ACCESS_A EXPLICIT_ACCESSA;
+alias EXPLICIT_ACCESS_A* PEXPLICIT_ACCESS_A, PEXPLICIT_ACCESSA;
+
+struct EXPLICIT_ACCESS_W {
+	DWORD       grfAccessPermissions;
+	ACCESS_MODE grfAccessMode;
+	DWORD       grfInheritance;
+	TRUSTEE_W   Trustee;
+}
+alias EXPLICIT_ACCESS_W EXPLICIT_ACCESSW;
+alias EXPLICIT_ACCESS_W* PEXPLICIT_ACCESS_W, PEXPLICIT_ACCESSW;
+
+struct OBJECTS_AND_SID {
+	DWORD ObjectsPresent;
+	GUID  ObjectTypeGuid;
+	GUID  InheritedObjectTypeGuid;
+	SID*  pSid;
+}
+alias OBJECTS_AND_SID* POBJECTS_AND_SID;
+
+struct OBJECTS_AND_NAME_A {
+	DWORD          ObjectsPresent;
+	SE_OBJECT_TYPE ObjectType;
+	LPSTR          ObjectTypeName;
+	LPSTR          InheritedObjectTypeName;
+	LPSTR          ptstrName;
+}
+alias OBJECTS_AND_NAME_A* POBJECTS_AND_NAME_A;
+
+struct OBJECTS_AND_NAME_W {
+	DWORD          ObjectsPresent;
+	SE_OBJECT_TYPE ObjectType;
+	LPWSTR         ObjectTypeName;
+	LPWSTR         InheritedObjectTypeName;
+	LPWSTR         ptstrName;
+}
+alias OBJECTS_AND_NAME_W* POBJECTS_AND_NAME_W;
+
+static if (WINVER >= 0x501) {
+	struct INHERITED_FROMA {
+		LONG  GenerationGap;
+		LPSTR AncestorName;
+	}
+	alias INHERITED_FROMA* PINHERITED_FROMA;
+
+	struct INHERITED_FROMW {
+		LONG   GenerationGap;
+		LPWSTR AncestorName;
+	}
+	alias INHERITED_FROMW* PINHERITED_FROMW;
+}
+
+version (Unicode) {
+	alias TRUSTEEW TRUSTEE;
+	alias ACTRL_ACCESSW ACTRL_ACCESS;
+	alias ACTRL_ACCESS_ENTRY_LISTW ACTRL_ACCESS_ENTRY_LIST;
+	alias ACTRL_ACCESS_INFOW ACTRL_ACCESS_INFO;
+	alias ACTRL_ACCESS_ENTRYW ACTRL_ACCESS_ENTRY;
+	alias ACTRL_AUDITW ACTRL_AUDIT;
+	alias ACTRL_CONTROL_INFOW ACTRL_CONTROL_INFO;
+	alias EXPLICIT_ACCESSW EXPLICIT_ACCESS;
+	alias TRUSTEE_ACCESSW TRUSTEE_ACCESS;
+	alias OBJECTS_AND_NAME_W OBJECTS_AND_NAME_;
+	static if (WINVER >= 0x501) {
+		alias INHERITED_FROMW INHERITED_FROM;
+	}
+} else {
+	alias TRUSTEEA TRUSTEE;
+	alias ACTRL_ACCESSA ACTRL_ACCESS;
+	alias ACTRL_ACCESS_ENTRY_LISTA ACTRL_ACCESS_ENTRY_LIST;
+	alias ACTRL_ACCESS_INFOA ACTRL_ACCESS_INFO;
+	alias ACTRL_ACCESS_ENTRYA ACTRL_ACCESS_ENTRY;
+	alias ACTRL_AUDITA ACTRL_AUDIT;
+	alias ACTRL_CONTROL_INFOA ACTRL_CONTROL_INFO;
+	alias EXPLICIT_ACCESSA EXPLICIT_ACCESS;
+	alias TRUSTEE_ACCESSA TRUSTEE_ACCESS;
+	alias OBJECTS_AND_NAME_A OBJECTS_AND_NAME_;
+	static if (WINVER >= 0x501) {
+		alias INHERITED_FROMA INHERITED_FROM;
+	}
+}
+
+alias TRUSTEE TRUSTEE_;
+alias TRUSTEE* PTRUSTEE, PTRUSTEE_;
+alias ACTRL_ACCESS* PACTRL_ACCESS;
+alias ACTRL_ACCESS_ENTRY_LIST* PACTRL_ACCESS_ENTRY_LIST;
+alias ACTRL_ACCESS_INFO* PACTRL_ACCESS_INFO;
+alias ACTRL_ACCESS_ENTRY* PACTRL_ACCESS_ENTRY;
+alias ACTRL_AUDIT* PACTRL_AUDIT;
+alias ACTRL_CONTROL_INFO* PACTRL_CONTROL_INFO;
+alias EXPLICIT_ACCESS EXPLICIT_ACCESS_;
+alias EXPLICIT_ACCESS* PEXPLICIT_ACCESS, PEXPLICIT_ACCESS_;
+alias TRUSTEE_ACCESS* PTRUSTEE_ACCESS;
+alias OBJECTS_AND_NAME_* POBJECTS_AND_NAME_;
+static if (WINVER >= 0x501) {
+	alias INHERITED_FROM* PINHERITED_FROM;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/aclapi.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,141 @@
+/***********************************************************************\
+*                                aclapi.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.aclapi;
+pragma(lib, "advapi32.lib");
+
+import win32.windows, win32.accctrl;
+
+static assert (_WIN32_WINNT_ONLY,
+	"win32.aclapi is available only if version WindowsNTonly, WindowsXP, "
+	"Windows2003 or WindowsVista is set");
+
+extern (Windows) {
+	VOID BuildExplicitAccessWithNameA(PEXPLICIT_ACCESS_A, LPSTR, DWORD,
+	  ACCESS_MODE, DWORD);
+	VOID BuildExplicitAccessWithNameW(PEXPLICIT_ACCESS_W, LPWSTR, DWORD,
+	  ACCESS_MODE, DWORD);
+	DWORD BuildSecurityDescriptorA(PTRUSTEE_A, PTRUSTEE_A , ULONG,
+	  PEXPLICIT_ACCESS_A, ULONG, PEXPLICIT_ACCESS_A, PSECURITY_DESCRIPTOR,
+	  PULONG, PSECURITY_DESCRIPTOR*);
+	DWORD BuildSecurityDescriptorW(PTRUSTEE_W, PTRUSTEE_W , ULONG,
+	  PEXPLICIT_ACCESS_W, ULONG, PEXPLICIT_ACCESS_W, PSECURITY_DESCRIPTOR,
+	  PULONG, PSECURITY_DESCRIPTOR*);
+	VOID BuildTrusteeWithNameA(PTRUSTEE_A, LPSTR);
+	VOID BuildTrusteeWithNameW(PTRUSTEE_W, LPWSTR);
+	VOID BuildTrusteeWithObjectsAndNameA(PTRUSTEE_A, POBJECTS_AND_NAME_A,
+	  SE_OBJECT_TYPE, LPSTR, LPSTR, LPSTR);
+	VOID BuildTrusteeWithObjectsAndNameW(PTRUSTEE_W, POBJECTS_AND_NAME_W,
+	  SE_OBJECT_TYPE, LPWSTR, LPWSTR, LPWSTR);
+	VOID BuildTrusteeWithObjectsAndSidA(PTRUSTEE_A, POBJECTS_AND_SID,
+	  GUID*, GUID*, PSID);
+	VOID BuildTrusteeWithObjectsAndSidW(PTRUSTEE_W, POBJECTS_AND_SID,
+	  GUID*, GUID*, PSID);
+	VOID BuildTrusteeWithSidA(PTRUSTEE_A, PSID);
+	VOID BuildTrusteeWithSidW(PTRUSTEE_W, PSID);
+	DWORD GetAuditedPermissionsFromAclA(PACL, PTRUSTEE_A, PACCESS_MASK,
+	  PACCESS_MASK);
+	DWORD GetAuditedPermissionsFromAclW(PACL, PTRUSTEE_W, PACCESS_MASK,
+	  PACCESS_MASK);
+	DWORD GetEffectiveRightsFromAclA(PACL, PTRUSTEE_A, PACCESS_MASK);
+	DWORD GetEffectiveRightsFromAclW(PACL, PTRUSTEE_W, PACCESS_MASK);
+	DWORD GetExplicitEntriesFromAclA(PACL, PULONG, PEXPLICIT_ACCESS_A*);
+	DWORD GetExplicitEntriesFromAclW(PACL, PULONG, PEXPLICIT_ACCESS_W*);
+	static if (WINVER >= 0x501) {
+		DWORD GetInheritanceSourceA(LPSTR, SE_OBJECT_TYPE,
+		  SECURITY_INFORMATION, BOOL, GUID**, DWORD, PACL, void*,
+		  PGENERIC_MAPPING, PINHERITED_FROMA);
+		DWORD GetInheritanceSourceW(LPWSTR, SE_OBJECT_TYPE,
+		  SECURITY_INFORMATION, BOOL, GUID**, DWORD, PACL, void*,
+		  PGENERIC_MAPPING, PINHERITED_FROMW);
+	}
+	DWORD GetNamedSecurityInfoA(LPSTR, SE_OBJECT_TYPE, SECURITY_INFORMATION,
+	  PSID*, PSID*, PACL*, PACL*, PSECURITY_DESCRIPTOR*);
+	DWORD GetNamedSecurityInfoW(LPWSTR, SE_OBJECT_TYPE, SECURITY_INFORMATION,
+	  PSID*, PSID*, PACL*, PACL*, PSECURITY_DESCRIPTOR*);
+	DWORD GetSecurityInfo(HANDLE, SE_OBJECT_TYPE, SECURITY_INFORMATION,
+	  PSID*, PSID*, PACL*, PACL*, PSECURITY_DESCRIPTOR*);
+	TRUSTEE_FORM GetTrusteeFormA(PTRUSTEE_A);
+	TRUSTEE_FORM GetTrusteeFormW(PTRUSTEE_W);
+	LPSTR GetTrusteeNameA(PTRUSTEE_A);
+	LPWSTR GetTrusteeNameW(PTRUSTEE_W);
+	TRUSTEE_TYPE GetTrusteeTypeA(PTRUSTEE_A);
+	TRUSTEE_TYPE GetTrusteeTypeW(PTRUSTEE_W);
+	DWORD LookupSecurityDescriptorPartsA(PTRUSTEE_A*, PTRUSTEE_A*, PULONG,
+	  PEXPLICIT_ACCESS_A*, PULONG, PEXPLICIT_ACCESS_A*,
+	  PSECURITY_DESCRIPTOR);
+	DWORD LookupSecurityDescriptorPartsW(PTRUSTEE_W*, PTRUSTEE_W*, PULONG,
+	  PEXPLICIT_ACCESS_W*, PULONG, PEXPLICIT_ACCESS_W*,
+	  PSECURITY_DESCRIPTOR);
+	DWORD SetEntriesInAclA(ULONG, PEXPLICIT_ACCESS_A, PACL, PACL*);
+	DWORD SetEntriesInAclW(ULONG, PEXPLICIT_ACCESS_W, PACL, PACL*);
+	DWORD SetNamedSecurityInfoA(LPSTR, SE_OBJECT_TYPE, SECURITY_INFORMATION,
+	  PSID, PSID, PACL, PACL);
+	DWORD SetNamedSecurityInfoW(LPWSTR, SE_OBJECT_TYPE, SECURITY_INFORMATION,
+	  PSID, PSID, PACL, PACL);
+	DWORD SetSecurityInfo(HANDLE, SE_OBJECT_TYPE, SECURITY_INFORMATION, PSID,
+	  PSID, PACL, PACL);
+	VOID BuildImpersonateExplicitAccessWithNameA(PEXPLICIT_ACCESS_A, LPSTR,
+	  PTRUSTEE_A, DWORD, ACCESS_MODE, DWORD);
+	VOID BuildImpersonateExplicitAccessWithNameW(PEXPLICIT_ACCESS_W, LPWSTR,
+	  PTRUSTEE_W, DWORD, ACCESS_MODE, DWORD);
+	VOID BuildImpersonateTrusteeA(PTRUSTEE_A, PTRUSTEE_A);
+	VOID BuildImpersonateTrusteeW(PTRUSTEE_W, PTRUSTEE_W);
+	PTRUSTEE_A GetMultipleTrusteeA(PTRUSTEE_A);
+	PTRUSTEE_W GetMultipleTrusteeW(PTRUSTEE_W);
+	MULTIPLE_TRUSTEE_OPERATION GetMultipleTrusteeOperationA(PTRUSTEE_A);
+	MULTIPLE_TRUSTEE_OPERATION GetMultipleTrusteeOperationW(PTRUSTEE_W);
+}
+
+version (Unicode) {
+	alias BuildExplicitAccessWithNameW BuildExplicitAccessWithName;
+	alias BuildSecurityDescriptorW BuildSecurityDescriptor;
+	alias BuildTrusteeWithNameW BuildTrusteeWithName;
+	alias BuildTrusteeWithObjectsAndNameW BuildTrusteeWithObjectsAndName;
+	alias BuildTrusteeWithObjectsAndSidW BuildTrusteeWithObjectsAndSid;
+	alias BuildTrusteeWithSidW BuildTrusteeWithSid;
+	alias GetAuditedPermissionsFromAclW GetAuditedPermissionsFromAcl;
+	alias GetEffectiveRightsFromAclW GetEffectiveRightsFromAcl;
+	alias GetExplicitEntriesFromAclW GetExplicitEntriesFromAcl;
+	alias GetNamedSecurityInfoW GetNamedSecurityInfo;
+	alias GetTrusteeFormW GetTrusteeForm;
+	alias GetTrusteeNameW GetTrusteeName;
+	alias GetTrusteeTypeW GetTrusteeType;
+	alias LookupSecurityDescriptorPartsW LookupSecurityDescriptorParts;
+	alias SetEntriesInAclW SetEntriesInAcl;
+	alias SetNamedSecurityInfoW SetNamedSecurityInfo;
+	alias BuildImpersonateExplicitAccessWithNameW
+	  BuildImpersonateExplicitAccessWithName;
+	alias BuildImpersonateTrusteeW BuildImpersonateTrustee;
+	alias GetMultipleTrusteeW GetMultipleTrustee;
+	alias GetMultipleTrusteeOperationW GetMultipleTrusteeOperation;
+} else {
+	alias BuildExplicitAccessWithNameA BuildExplicitAccessWithName;
+	alias BuildSecurityDescriptorA BuildSecurityDescriptor;
+	alias BuildTrusteeWithNameA BuildTrusteeWithName;
+	alias BuildTrusteeWithObjectsAndNameA BuildTrusteeWithObjectsAndName;
+	alias BuildTrusteeWithObjectsAndSidA BuildTrusteeWithObjectsAndSid;
+	alias BuildTrusteeWithSidA BuildTrusteeWithSid;
+	alias GetAuditedPermissionsFromAclA GetAuditedPermissionsFromAcl;
+	alias GetEffectiveRightsFromAclA GetEffectiveRightsFromAcl;
+	alias GetExplicitEntriesFromAclA GetExplicitEntriesFromAcl;
+	alias GetNamedSecurityInfoA GetNamedSecurityInfo;
+	alias GetTrusteeFormA GetTrusteeForm;
+	alias GetTrusteeNameA GetTrusteeName;
+	alias GetTrusteeTypeA GetTrusteeType;
+	alias LookupSecurityDescriptorPartsA LookupSecurityDescriptorParts;
+	alias SetEntriesInAclA SetEntriesInAcl;
+	alias SetNamedSecurityInfoA SetNamedSecurityInfo;
+	alias BuildImpersonateExplicitAccessWithNameA
+	  BuildImpersonateExplicitAccessWithName;
+	alias BuildImpersonateTrusteeA BuildImpersonateTrustee;
+	alias GetMultipleTrusteeA GetMultipleTrustee;
+	alias GetMultipleTrusteeOperationA GetMultipleTrusteeOperation;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/aclui.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,120 @@
+/***********************************************************************\
+*                                aclui.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*             Translated from MinGW API for MS-Windows 3.10             *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.aclui;
+pragma(lib, "aclui.lib");
+
+private import win32.w32api;
+
+static assert (_WIN32_WINNT_ONLY && _WIN32_WINNT >= 0x500,
+	"win32.aclui is available only if version WindowsXP, Windows2003 "
+	"or WindowsVista is set, or both Windows2000 and WindowsNTonly are set");
+
+import win32.accctrl, win32.commctrl, win32.objbase;
+private import win32.basetyps, win32.prsht, win32.unknwn, win32.windef,
+  win32.winuser;
+
+
+struct SI_OBJECT_INFO {
+	DWORD     dwFlags;
+	HINSTANCE hInstance;
+	LPWSTR    pszServerName;
+	LPWSTR    pszObjectName;
+	LPWSTR    pszPageTitle;
+	GUID      guidObjectType;
+}
+alias SI_OBJECT_INFO* PSI_OBJECT_INFO;
+
+// values for SI_OBJECT_INFO.dwFlags
+const DWORD
+	SI_EDIT_PERMS               = 0x00000000,
+	SI_EDIT_OWNER               = 0x00000001,
+	SI_EDIT_AUDITS              = 0x00000002,
+	SI_CONTAINER                = 0x00000004,
+	SI_READONLY                 = 0x00000008,
+	SI_ADVANCED                 = 0x00000010,
+	SI_RESET                    = 0x00000020,
+	SI_OWNER_READONLY           = 0x00000040,
+	SI_EDIT_PROPERTIES          = 0x00000080,
+	SI_OWNER_RECURSE            = 0x00000100,
+	SI_NO_ACL_PROTECT           = 0x00000200,
+	SI_NO_TREE_APPLY            = 0x00000400,
+	SI_PAGE_TITLE               = 0x00000800,
+	SI_SERVER_IS_DC             = 0x00001000,
+	SI_RESET_DACL_TREE          = 0x00004000,
+	SI_RESET_SACL_TREE          = 0x00008000,
+	SI_OBJECT_GUID              = 0x00010000,
+	SI_EDIT_EFFECTIVE           = 0x00020000,
+	SI_RESET_DACL               = 0x00040000,
+	SI_RESET_SACL               = 0x00080000,
+	SI_RESET_OWNER              = 0x00100000,
+	SI_NO_ADDITIONAL_PERMISSION = 0x00200000,
+	SI_MAY_WRITE                = 0x10000000,
+	SI_EDIT_ALL                 = SI_EDIT_PERMS | SI_EDIT_OWNER
+	                              | SI_EDIT_AUDITS;
+
+struct SI_ACCESS {
+	CPtr!(GUID) pguid;
+	ACCESS_MASK mask;
+	LPCWSTR     pszName;
+	DWORD       dwFlags;
+}
+alias SI_ACCESS* PSI_ACCESS;
+
+// values for SI_ACCESS.dwFlags
+const DWORD
+	SI_ACCESS_SPECIFIC  = 0x00010000,
+	SI_ACCESS_GENERAL   = 0x00020000,
+	SI_ACCESS_CONTAINER = 0x00040000,
+	SI_ACCESS_PROPERTY  = 0x00080000;
+
+
+struct SI_INHERIT_TYPE {
+	CPtr!(GUID) pguid;
+	ULONG       dwFlags;
+	LPCWSTR     pszName;
+}
+alias SI_INHERIT_TYPE* PSI_INHERIT_TYPE;
+
+/* values for SI_INHERIT_TYPE.dwFlags
+   INHERIT_ONLY_ACE, CONTAINER_INHERIT_ACE, OBJECT_INHERIT_ACE
+   defined elsewhere */
+
+enum SI_PAGE_TYPE {
+	SI_PAGE_PERM,
+	SI_PAGE_ADVPERM,
+	SI_PAGE_AUDIT,
+	SI_PAGE_OWNER
+}
+
+const uint PSPCB_SI_INITDIALOG = WM_USER + 1;
+
+interface ISecurityInformation : IUnknown {
+	HRESULT GetObjectInformation(PSI_OBJECT_INFO);
+	HRESULT GetSecurity(SECURITY_INFORMATION, PSECURITY_DESCRIPTOR*, BOOL);
+	HRESULT SetSecurity(SECURITY_INFORMATION, PSECURITY_DESCRIPTOR);
+	HRESULT GetAccessRights(CPtr!(GUID), DWORD, PSI_ACCESS*, ULONG*, ULONG*);
+	HRESULT MapGeneric(CPtr!(GUID), UCHAR*, ACCESS_MASK*);
+	HRESULT GetInheritTypes(PSI_INHERIT_TYPE*, ULONG*);
+	HRESULT PropertySheetPageCallback(HWND, UINT, SI_PAGE_TYPE);
+}
+alias ISecurityInformation* LPSECURITYINFO;
+
+/* Comment from MinGW
+ * TODO: ISecurityInformation2, IEffectivePermission, ISecurityObjectTypeInfo
+ */
+
+// FIXME: linkage attribute?
+extern (C) /+DECLSPEC_IMPORT+/ extern const IID IID_ISecurityInformation;
+
+extern (Windows) {
+	HPROPSHEETPAGE CreateSecurityPage(LPSECURITYINFO psi);
+	BOOL EditSecurity(HWND hwndOwner, LPSECURITYINFO psi);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/basetsd.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,129 @@
+/***********************************************************************\
+*                               basetsd.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*             Translated from MinGW API for MS-Windows 3.12             *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.basetsd;
+
+/*	This template is used in these modules to declare constant pointer types,
+ *	in order to support both D 1.x and 2.x.
+ */
+template CPtr(T) {
+	version (D_Version2) {
+		// must use mixin so that it doesn't cause a syntax error under D1
+		mixin("alias const(T)* CPtr;");
+	} else {
+		alias T* CPtr;
+	}
+}
+
+// [SnakE 2009-02-23] Moved HANDLE definition here from winnt.d to avoid
+// 'forwatd template reference' to CPtr from winnt.d caused by a circular
+// import.
+
+typedef void* HANDLE;
+
+alias HANDLE* PHANDLE, LPHANDLE;
+
+version (Win64) {
+	alias long __int3264;
+	const ulong ADDRESS_TAG_BIT = 0x40000000000;
+
+	alias long INT_PTR, LONG_PTR;
+	alias long* PINT_PTR, PLONG_PTR;
+	alias ulong UINT_PTR, ULONG_PTR, HANDLE_PTR;
+	alias ulong* PUINT_PTR, PULONG_PTR;
+	alias int HALF_PTR;
+	alias int* PHALF_PTR;
+	alias uint UHALF_PTR;
+	alias uint* PUHALF_PTR;
+
+	/*	*To* functions are conditioned out in MinGW.
+	 *	Presumably they're not working/tested yet.  Comment:
+			TODO when WIN64 is here
+	 */
+} else {
+	alias int __int3264;
+	const uint ADDRESS_TAG_BIT = 0x80000000;
+
+	alias int INT_PTR, LONG_PTR;
+	alias int* PINT_PTR, PLONG_PTR;
+	alias uint UINT_PTR, ULONG_PTR, HANDLE_PTR;
+	alias uint* PUINT_PTR, PULONG_PTR;
+	alias short HALF_PTR;
+	alias short* PHALF_PTR;
+	alias ushort UHALF_PTR;
+	alias ushort* PUHALF_PTR;
+
+	uint HandleToUlong(HANDLE h)      { return cast(uint) h; }
+	int HandleToLong(HANDLE h)        { return cast(int) h; }
+	HANDLE LongToHandle(LONG_PTR h)   { return cast(HANDLE) h; }
+	uint PtrToUlong(CPtr!(void) p)    { return cast(uint) p; }
+	uint PtrToUint(CPtr!(void) p)     { return cast(uint) p; }
+	int PtrToInt(CPtr!(void) p)       { return cast(int) p; }
+	ushort PtrToUshort(CPtr!(void) p) { return cast(ushort) p; }
+	short PtrToShort(CPtr!(void) p)   { return cast(short) p; }
+	void* IntToPtr(int i)             { return cast(void*) i; }
+	void* UIntToPtr(uint ui)          { return cast(void*) ui; }
+	alias IntToPtr LongToPtr;
+	alias UIntToPtr ULongToPtr;
+}
+
+alias UIntToPtr UintToPtr, UlongToPtr;
+
+enum : UINT_PTR {
+	MAXUINT_PTR = UINT_PTR.max
+}
+
+enum : INT_PTR {
+	MAXINT_PTR = INT_PTR.max,
+	MININT_PTR = INT_PTR.min
+}
+
+enum : ULONG_PTR {
+	MAXULONG_PTR = ULONG_PTR.max
+}
+
+enum : LONG_PTR {
+	MAXLONG_PTR = LONG_PTR.max,
+	MINLONG_PTR = LONG_PTR.min
+}
+
+enum : UHALF_PTR {
+	MAXUHALF_PTR = UHALF_PTR.max
+}
+
+enum : HALF_PTR {
+	MAXHALF_PTR = HALF_PTR.max,
+	MINHALF_PTR = HALF_PTR.min
+}
+
+alias byte INT8;
+alias byte* PINT8;
+alias ubyte UINT8;
+alias ubyte* PUINT8;
+
+alias short INT16;
+alias short* PINT16;
+alias ushort UINT16;
+alias ushort* PUINT16;
+
+alias int LONG32, INT32;
+alias int* PLONG32, PINT32;
+alias uint ULONG32, DWORD32, UINT32;
+alias uint* PULONG32, PDWORD32, PUINT32;
+
+alias ULONG_PTR SIZE_T, DWORD_PTR;
+alias ULONG_PTR* PSIZE_T, PDWORD_PTR;
+alias LONG_PTR SSIZE_T;
+alias LONG_PTR* PSSIZE_T;
+
+alias long LONG64, INT64;
+alias long* PLONG64, PINT64;
+alias ulong ULONG64, DWORD64, UINT64;
+alias ulong* PULONG64, PDWORD64, PUINT64;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/basetyps.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,24 @@
+/***********************************************************************\
+*                               basetyps.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*             Translated from MinGW API for MS-Windows 3.10             *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.basetyps;
+
+private import win32.windef, win32.basetsd;
+
+align(1) struct GUID {  // size is 16
+	DWORD   Data1;
+	WORD    Data2;
+	WORD    Data3;
+	BYTE[8] Data4;
+}
+alias GUID UUID, IID, CLSID, FMTID, uuid_t;
+alias GUID* LPGUID, LPCLSID, LPIID;
+alias CPtr!(GUID) REFGUID, REFIID, REFCLSID, REFFMTID;
+
+alias uint error_status_t, PROPID;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/cderr.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,50 @@
+/***********************************************************************\
+*                               cderr.d                                 *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.cderr;
+
+enum {
+	CDERR_DIALOGFAILURE    = 0xFFFF,
+	CDERR_GENERALCODES     = 0x0000,
+	CDERR_STRUCTSIZE,
+	CDERR_INITIALIZATION,
+	CDERR_NOTEMPLATE,
+	CDERR_NOHINSTANCE,
+	CDERR_LOADSTRFAILURE,
+	CDERR_FINDRESFAILURE,
+	CDERR_LOADRESFAILURE,
+	CDERR_LOCKRESFAILURE,
+	CDERR_MEMALLOCFAILURE,
+	CDERR_MEMLOCKFAILURE,
+	CDERR_NOHOOK,
+	CDERR_REGISTERMSGFAIL,
+	PDERR_PRINTERCODES     = 0x1000,
+	PDERR_SETUPFAILURE,
+	PDERR_PARSEFAILURE,
+	PDERR_RETDEFFAILURE,
+	PDERR_LOADDRVFAILURE,
+	PDERR_GETDEVMODEFAIL,
+	PDERR_INITFAILURE,
+	PDERR_NODEVICES,
+	PDERR_NODEFAULTPRN,
+	PDERR_DNDMMISMATCH,
+	PDERR_CREATEICFAILURE,
+	PDERR_PRINTERNOTFOUND,
+	PDERR_DEFAULTDIFFERENT,
+	CFERR_CHOOSEFONTCODES  = 0x2000,
+	CFERR_NOFONTS,
+	CFERR_MAXLESSTHANMIN,
+	FNERR_FILENAMECODES    = 0x3000,
+	FNERR_SUBCLASSFAILURE,
+	FNERR_INVALIDFILENAME,
+	FNERR_BUFFERTOOSMALL,
+	FRERR_FINDREPLACECODES = 0x4000,
+	FRERR_BUFFERLENGTHZERO,
+	CCERR_CHOOSECOLORCODES = 0x5000
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/cguid.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,13 @@
+/***********************************************************************\
+*                                cguid.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.cguid;
+
+private import win32.basetyps;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/comcat.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,73 @@
+/***********************************************************************\
+*                                comcat.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.comcat;
+
+import win32.windows, win32.ole2;
+private import win32.basetyps, win32.cguid, win32.objbase, win32.unknwn,
+  win32.windef, win32.wtypes;
+
+alias IEnumGUID* LPENUMGUID;
+
+interface IEnumGUID : IUnknown {
+	HRESULT Next(ULONG, GUID*, ULONG*);
+	HRESULT Skip(ULONG);
+	HRESULT Reset();
+	HRESULT Clone(LPENUMGUID*);
+}
+
+alias GUID CATID;
+alias REFGUID REFCATID;
+alias GUID_NULL CATID_NULL;
+alias IsEqualGUID IsEqualCATID;
+
+struct CATEGORYINFO {
+	CATID        catid;
+	LCID         lcid;
+	OLECHAR[128] szDescription;
+}
+alias CATEGORYINFO* LPCATEGORYINFO;
+
+alias IEnumGUID IEnumCATID;
+alias LPENUMGUID LPENUMCATID;
+alias IID_IEnumGUID IID_IEnumCATID;
+
+alias IEnumGUID IEnumCLSID;
+alias LPENUMGUID LPENUMCLSID;
+alias IID_IEnumGUID IID_IEnumCLSID;
+
+interface ICatInformation : IUnknown {
+	HRESULT EnumCategories(LCID, LPENUMCATEGORYINFO*);
+	HRESULT GetCategoryDesc(REFCATID, LCID, PWCHAR*);
+	HRESULT EnumClassesOfCategories(ULONG, CATID*, ULONG, CATID*,
+	  LPENUMCLSID*);
+	HRESULT IsClassOfCategories(REFCLSID, ULONG, CATID*, ULONG, CATID*);
+	HRESULT EnumImplCategoriesOfClass(REFCLSID, LPENUMCATID*);
+	HRESULT EnumReqCategoriesOfClass(REFCLSID, LPENUMCATID*);
+}
+alias ICatInformation* LPCATINFORMATION;
+
+interface ICatRegister : IUnknown {
+	HRESULT RegisterCategories(ULONG, CATEGORYINFO*);
+	HRESULT UnRegisterCategories(ULONG, CATID*);
+	HRESULT RegisterClassImplCategories(REFCLSID, ULONG, CATID*);
+	HRESULT UnRegisterClassImplCategories(REFCLSID, ULONG, CATID*);
+	HRESULT RegisterClassReqCategories(REFCLSID, ULONG, CATID*);
+	HRESULT UnRegisterClassReqCategories(REFCLSID, ULONG, CATID*);
+}
+alias ICatRegister* LPCATREGISTER;
+
+interface IEnumCATEGORYINFO : IUnknown {
+	HRESULT Next(ULONG, CATEGORYINFO*, ULONG*);
+	HRESULT Skip(ULONG);
+	HRESULT Reset();
+	HRESULT Clone(LPENUMCATEGORYINFO*);
+}
+alias IEnumCATEGORYINFO* LPENUMCATEGORYINFO;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/commctrl.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,5874 @@
+/***********************************************************************\
+*                               commctrl.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*             Translated from MinGW API for MS-Windows 3.12             *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.commctrl;
+pragma(lib, "comctl32.lib");
+
+private import win32.w32api, win32.windef, win32.winuser;
+private import win32.winbase; // for SYSTEMTIME
+private import win32.objfwd;  // for LPSTREAM
+
+import win32.prsht;
+
+const COMCTL32_VERSION = 6;
+
+const TCHAR[]
+	DRAGLISTMSGSTRING  = "commctrl_DragListMsg",
+	HOTKEY_CLASS       = "msctls_hotkey32",
+	PROGRESS_CLASS     = "msctls_progress32",
+	STATUSCLASSNAME    = "msctls_statusbar32",
+	TOOLBARCLASSNAME   = "ToolbarWindow32",
+	TOOLTIPS_CLASS     = "tooltips_class32",
+	TRACKBAR_CLASS     = "msctls_trackbar32",
+	UPDOWN_CLASS       = "msctls_updown32",
+	ANIMATE_CLASS      = "SysAnimate32",
+	DATETIMEPICK_CLASS = "SysDateTimePick32",
+	MONTHCAL_CLASS     = "SysMonthCal32",
+	REBARCLASSNAME     = "ReBarWindow32",
+	WC_COMBOBOXEX      = "ComboBoxEx32",
+	WC_IPADDRESS       = "SysIPAddress32",
+	WC_LISTVIEW        = "SysListView32",
+	WC_TABCONTROL      = "SysTabControl32",
+	WC_TREEVIEW        = "SysTreeView32",
+	WC_HEADER          = "SysHeader32",
+	WC_PAGESCROLLER    = "SysPager",
+	WC_NATIVEFONTCTL   = "NativeFontCtl",
+	WC_BUTTON          = "Button",
+	WC_STATIC          = "Static",
+	WC_EDIT            = "Edit",
+	WC_LISTBOX         = "ListBox",
+	WC_COMBOBOX        = "ComboBox",
+	WC_SCROLLBAR       = "ScrollBar",
+	WC_LINKA           = "SysLink";
+
+enum {
+	LVM_FIRST = 0x1000,
+	TV_FIRST  = 0x1100,
+	HDM_FIRST = 0x1200
+}
+
+enum {
+	ACM_OPENA = WM_USER + 100,
+	ACM_PLAY  = WM_USER + 101,
+	ACM_STOP  = WM_USER + 102,
+	ACM_OPENW = WM_USER + 103
+}
+
+enum {
+	ACN_START = 1,
+	ACN_STOP
+}
+
+enum {
+	CBEIF_TEXT          = 0x00000001,
+	CBEIF_IMAGE         = 0x00000002,
+	CBEIF_SELECTEDIMAGE = 0x00000004,
+	CBEIF_OVERLAY       = 0x00000008,
+	CBEIF_INDENT        = 0x00000010,
+	CBEIF_LPARAM        = 0x00000020,
+	CBEIF_DI_SETITEM    = 0x10000000
+}
+
+enum {
+	RBN_FIRST  = -831U,
+	RBN_LAST   = -859U,
+	MCN_FIRST  = -750U,
+	MCN_LAST   = -759U,
+	DTN_FIRST  = -760U,
+	DTN_LAST   = -799U,
+	CBEN_FIRST = -800U,
+	CBEN_LAST  = -830U
+}
+
+enum {
+	CBEN_INSERTITEM = CBEN_FIRST - 1,
+	CBEN_DELETEITEM = CBEN_FIRST - 2,
+	CBEN_BEGINEDIT  = CBEN_FIRST - 4,
+	CBEN_ENDEDITA   = CBEN_FIRST - 5,
+	CBEN_ENDEDITW   = CBEN_FIRST - 6
+}
+
+enum {
+	CBENF_KILLFOCUS = 1,
+	CBENF_RETURN,
+	CBENF_ESCAPE,
+	CBENF_DROPDOWN // = 4
+}
+
+const CBEMAXSTRLEN = 260;
+
+enum {
+	DL_BEGINDRAG  = 1157,
+	DL_CANCELDRAG = 1160,
+	DL_DRAGGING   = 1158,
+	DL_DROPPED    = 1159,
+	DL_CURSORSET  = 0,
+	DL_STOPCURSOR = 1,
+	DL_COPYCURSOR = 2,
+	DL_MOVECURSOR = 3
+}
+
+enum {
+	CCS_TOP           = 1,
+	CCS_NOMOVEY       = 2,
+	CCS_BOTTOM        = 3,
+	CCS_NORESIZE      = 4,
+	CCS_NOPARENTALIGN = 8,
+	CCS_ADJUSTABLE    = 32,
+	CCS_NODIVIDER     = 64
+}
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		CCS_VERT    = 128,
+		CCS_LEFT    = 129,
+		CCS_NOMOVEX = 130,
+		CCS_RIGHT   = 131
+	}
+}
+
+enum {
+	ACS_CENTER      = 0x0001,
+	ACS_TRANSPARENT = 0x0002,
+	ACS_AUTOPLAY    = 0x0004,
+	ACS_TIMER       = 0x0008
+}
+
+enum {
+	PGS_VERT       = 0x00000000,
+	PGS_HORZ       = 0x00000001,
+	PGS_AUTOSCROLL = 0x00000002,
+	PGS_DRAGNDROP  = 0x00000004
+}
+
+const CMB_MASKED = 2;
+
+const MINSYSCOMMAND = SC_SIZE;
+
+enum {
+	SBT_OWNERDRAW  = 0x1000,
+	SBT_NOBORDERS  = 256,
+	SBT_POPOUT     = 512,
+	SBT_RTLREADING = 1024
+}
+
+enum {
+	SB_SETTEXTA       = WM_USER + 1,
+	SB_SETTEXTW       = WM_USER + 11,
+	SB_GETTEXTA       = WM_USER + 2,
+	SB_GETTEXTW       = WM_USER + 13,
+	SB_GETTEXTLENGTHA = WM_USER + 3,
+	SB_GETTEXTLENGTHW = WM_USER + 12,
+	SB_SETPARTS       = WM_USER + 4,
+	SB_GETPARTS       = WM_USER + 6,
+	SB_GETBORDERS     = WM_USER + 7,
+	SB_SETMINHEIGHT   = WM_USER + 8,
+	SB_SIMPLE         = WM_USER + 9,
+	SB_GETRECT        = WM_USER + 10
+}
+
+enum {
+	MSGF_COMMCTRL_BEGINDRAG   = 0x4200,
+	MSGF_COMMCTRL_SIZEHEADER  = 0x4201,
+	MSGF_COMMCTRL_DRAGSELECT  = 0x4202,
+	MSGF_COMMCTRL_TOOLBARCUST = 0x4203
+}
+
+enum {
+	ILC_COLOR    = 0,
+	ILC_COLOR4   = 4,
+	ILC_COLOR8   = 8,
+	ILC_COLOR16  = 16,
+	ILC_COLOR24  = 24,
+	ILC_COLOR32  = 32,
+	ILC_COLORDDB = 254,
+	ILC_MASK     = 1,
+	ILC_PALETTE  = 2048
+}
+
+enum {
+	ILCF_MOVE,
+	ILCF_SWAP
+}
+
+enum {
+	ILS_NORMAL        = 0,
+	ILS_GLOW          = 1,
+	ILS_SHADOW        = 2,
+	ILS_SATURATE      = 4,
+	ILS_ALPHA         = 8,
+	ILD_BLEND25       = 2,
+	ILD_BLEND50       = 4,
+	ILD_SELECTED      = 4,
+	ILD_BLEND         = 4,
+	ILD_FOCUS         = 2,
+	ILD_MASK          = 16,
+	ILD_NORMAL        = 0,
+	ILD_TRANSPARENT   = 1,
+	ILD_IMAGE         = 0x0020,
+	ILD_ROP           = 0x0040,
+	ILD_OVERLAYMASK   = 0x0F00,
+	ILD_PRESERVEALPHA = 0x1000,
+	ILD_SCALE         = 0x2000,
+	ILD_DPISCALE      = 0x4000
+}
+
+enum {
+	HDS_HORZ    = 0,
+	HDS_BUTTONS = 2,
+	HDS_HIDDEN  = 8
+}
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		HDS_HOTTRACK = 4,
+		HDS_DRAGDROP = 0x0040,
+		HDS_FULLDRAG = 0x0080
+	}
+}
+static if (_WIN32_IE >= 0x500) {
+	enum {
+		HDS_FILTERBAR = 0x0100
+	}
+}
+
+enum {
+	NM_FIRST  = 0,
+	NM_LAST   = -99U,
+	LVN_FIRST = -100U,
+	LVN_LAST  = -199U,
+	HDN_FIRST = -300U,
+	HDN_LAST  = -399U,
+	TVN_FIRST = -400U,
+	TVN_LAST  = -499U,
+	TTN_FIRST = -520U,
+	TTN_LAST  = -549U,
+	TCN_FIRST = -550U,
+	TCN_LAST  = -580U,
+	CDN_FIRST = -601U, /* also in commdlg.h */
+	CDN_LAST  = -699U,
+	TBN_FIRST = -700U,
+	TBN_LAST  = -720U,
+	UDN_FIRST = -721U,
+	UDN_LAST  = -740U
+}
+/*static if (_WIN32_IE >= 0x300) {
+	enum {
+		RBN_FIRST  = -831U,
+		RBN_LAST   = -859U,
+		MCN_FIRST  = -750U,
+		MCN_LAST   = -759U,
+		DTN_FIRST  = -760U,
+		DTN_LAST   = -799U,
+		CBEN_FIRST = -800U,
+		CBEN_LAST  = -830U
+	}
+}*/
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		IPN_FIRST        = -860U,
+		IPN_LAST         = -879U,
+		IPN_FIELDCHANGED = IPN_FIRST,
+		SBN_FIRST        = -880U,
+		SBN_LAST         = -899U,
+		PGN_FIRST        = -900U,
+		PGN_LAST         = -950U,
+		PGN_SCROLL       = PGN_FIRST-1,
+		PGN_CALCSIZE     = PGN_FIRST-2
+	}
+}
+
+enum {
+	HDI_WIDTH  = 1,
+	HDI_HEIGHT = 1,
+	HDI_TEXT   = 2,
+	HDI_FORMAT = 4,
+	HDI_LPARAM = 8,
+	HDI_BITMAP = 16
+}
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		HDI_IMAGE      = 32,
+		HDI_DI_SETITEM = 64,
+		HDI_ORDER      = 128
+	}
+}
+static if (_WIN32_IE >= 0x500) {
+	enum {
+		HDI_FILTER = 256
+	}
+}
+
+enum {
+	CBES_EX_NOEDITIMAGE       = 0x00000001,
+	CBES_EX_NOEDITIMAGEINDENT = 0x00000002,
+	CBES_EX_PATHWORDBREAKPROC = 0x00000004
+}
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		CBES_EX_NOSIZELIMIT   = 0x00000008,
+		CBES_EX_CASESENSITIVE = 0x00000010,
+		CBEN_GETDISPINFOA     = CBEN_FIRST - 0,
+		CBEN_GETDISPINFOW     = CBEN_FIRST - 7,
+		CBEN_DRAGBEGINA       = CBEN_FIRST - 8,
+		CBEN_DRAGBEGINW       = CBEN_FIRST - 9
+	}
+}
+
+enum {
+	HDF_LEFT,
+	HDF_RIGHT,
+	HDF_CENTER,
+	HDF_JUSTIFYMASK,
+	HDF_RTLREADING, // = 4
+	HDF_OWNERDRAW = 0x8000,
+	HDF_STRING    = 0x4000,
+	HDF_BITMAP    = 0x2000
+}
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		HDF_BITMAP_ON_RIGHT = 0x1000,
+		HDF_IMAGE           = 0x0800
+	}
+}
+
+enum {
+	CCM_FIRST            = 0x2000,
+	CCM_LAST             = CCM_FIRST + 0x200,
+	CCM_SETBKCOLOR       = 8193,
+	CCM_SETCOLORSCHEME   = 8194,
+	CCM_GETCOLORSCHEME   = 8195,
+	CCM_GETDROPTARGET    = 8196,
+	CCM_SETUNICODEFORMAT = 8197,
+	CCM_GETUNICODEFORMAT = 8198,
+	CCM_SETVERSION       = 0x2007,
+	CCM_GETVERSION       = 0x2008,
+	CCM_SETNOTIFYWINDOW  = 0x2009
+}
+
+enum {
+	HDM_GETITEMCOUNT = HDM_FIRST,
+	HDM_INSERTITEMA  = HDM_FIRST + 1,
+	HDM_INSERTITEMW  = HDM_FIRST + 10,
+	HDM_DELETEITEM   = HDM_FIRST + 2,
+	HDM_GETITEMA     = HDM_FIRST + 3,
+	HDM_GETITEMW     = HDM_FIRST + 11,
+	HDM_SETITEMA     = HDM_FIRST + 4,
+	HDM_SETITEMW     = HDM_FIRST + 12,
+	HDM_LAYOUT       = HDM_FIRST + 5
+}
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		HDM_GETITEMRECT     = HDM_FIRST + 7,
+		HDM_SETIMAGELIST    = HDM_FIRST + 8,
+		HDM_GETIMAGELIST    = HDM_FIRST + 9,
+		HDM_ORDERTOINDEX    = HDM_FIRST + 15,
+		HDM_CREATEDRAGIMAGE = HDM_FIRST + 16,
+		HDM_GETORDERARRAY   = HDM_FIRST + 17,
+		HDM_SETORDERARRAY   = HDM_FIRST + 18,
+		HDM_SETHOTDIVIDER   = HDM_FIRST + 19
+	}
+}
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		HDM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,
+		HDM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT
+	}
+}
+
+enum {
+	HHT_NOWHERE   = 1,
+	HHT_ONHEADER  = 2,
+	HHT_ONDIVIDER = 4,
+	HHT_ONDIVOPEN = 8,
+	HHT_ABOVE     = 256,
+	HHT_BELOW     = 512,
+	HHT_TORIGHT   = 1024,
+	HHT_TOLEFT    = 2048
+}
+
+enum {
+	HDM_HITTEST = HDM_FIRST + 6
+}
+
+enum {
+	HDN_ITEMCHANGINGA    = HDN_FIRST -0,
+	HDN_ITEMCHANGINGW    = HDN_FIRST -20,
+	HDN_ITEMCHANGEDA     = HDN_FIRST -1,
+	HDN_ITEMCHANGEDW     = HDN_FIRST -21,
+	HDN_ITEMCLICKA       = HDN_FIRST -2,
+	HDN_ITEMCLICKW       = HDN_FIRST -22,
+	HDN_ITEMDBLCLICKA    = HDN_FIRST -3,
+	HDN_ITEMDBLCLICKW    = HDN_FIRST -23,
+	HDN_DIVIDERDBLCLICKA = HDN_FIRST -5,
+	HDN_DIVIDERDBLCLICKW = HDN_FIRST -25,
+	HDN_BEGINTRACKA      = HDN_FIRST -6,
+	HDN_BEGINTRACKW      = HDN_FIRST -26,
+	HDN_ENDTRACKA        = HDN_FIRST -7,
+	HDN_ENDTRACKW        = HDN_FIRST -27,
+	HDN_TRACKA           = HDN_FIRST -8,
+	HDN_TRACKW           = HDN_FIRST -28
+}
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		HDN_ENDDRAG      = (HDN_FIRST-11),
+		HDN_BEGINDRAG    = (HDN_FIRST-10),
+		HDN_GETDISPINFOA = (HDN_FIRST-9),
+		HDN_GETDISPINFOW = (HDN_FIRST-29)
+	}
+}
+
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		HICF_OTHER          = 0x00,
+		HICF_MOUSE          = 0x01,
+		HICF_ARROWKEYS      = 0x02,
+		HICF_ACCELERATOR    = 0x04,
+		HICF_DUPACCEL       = 0x08,
+		HICF_ENTERING       = 0x10,
+		HICF_LEAVING        = 0x20,
+		HICF_RESELECT       = 0x40,
+		HICF_LMOUSE         = 0x80,
+		HICF_TOGGLEDROPDOWN = 0x100
+	}
+}
+
+enum {
+	IPM_CLEARADDRESS = WM_USER + 100,
+	IPM_SETADDRESS   = WM_USER + 101,
+	IPM_GETADDRESS   = WM_USER + 102,
+	IPM_SETRANGE     = WM_USER + 103,
+	IPM_SETFOCUS     = WM_USER + 104,
+	IPM_ISBLANK      = WM_USER + 105
+}
+
+static if (_WIN32_IE >= 0x500) {
+	enum {
+		I_INDENTCALLBACK = -1,
+		I_IMAGENONE      = -2
+	}
+}
+
+enum {
+	TBSTATE_CHECKED       = 1,
+	TBSTATE_PRESSED       = 2,
+	TBSTATE_ENABLED       = 4,
+	TBSTATE_HIDDEN        = 8,
+	TBSTATE_INDETERMINATE = 16,
+	TBSTATE_WRAP          = 32
+}
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		TBSTATE_ELLIPSES = 0x40
+	}
+}
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		TBSTATE_MARKED = 0x0080
+	}
+}
+
+enum {
+	TBSTYLE_BUTTON     = 0,
+	TBSTYLE_SEP        = 1,
+	TBSTYLE_CHECK      = 2,
+	TBSTYLE_GROUP      = 4,
+	TBSTYLE_CHECKGROUP = TBSTYLE_GROUP | TBSTYLE_CHECK
+}
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		TBSTYLE_DROPDOWN = 8
+	}
+}
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		TBSTYLE_AUTOSIZE = 16,
+		TBSTYLE_NOPREFIX = 32
+	}
+}
+enum {
+	TBSTYLE_TOOLTIPS = 256,
+	TBSTYLE_WRAPABLE = 512,
+	TBSTYLE_ALTDRAG  = 1024
+}
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		TBSTYLE_FLAT        = 2048,
+		TBSTYLE_LIST        = 4096,
+		TBSTYLE_CUSTOMERASE = 8192
+	}
+}
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		TBSTYLE_REGISTERDROP    = 0x4000,
+		TBSTYLE_TRANSPARENT     = 0x8000,
+		TBSTYLE_EX_DRAWDDARROWS = 0x00000001
+	}
+}
+static if (_WIN32_IE >= 0x501) {
+	enum {
+		TBSTYLE_EX_MIXEDBUTTONS       = 8,
+		TBSTYLE_EX_HIDECLIPPEDBUTTONS = 16
+	}
+}
+static if (_WIN32_WINNT >= 0x501) {
+	enum {
+		TBSTYLE_EX_DOUBLEBUFFER = 0x80
+	}
+}
+
+static if (_WIN32_IE >= 0x500) {
+	enum {
+		BTNS_BUTTON        = TBSTYLE_BUTTON,
+		BTNS_SEP           = TBSTYLE_SEP,
+		BTNS_CHECK         = TBSTYLE_CHECK,
+		BTNS_GROUP         = TBSTYLE_GROUP,
+		BTNS_CHECKGROUP    = TBSTYLE_CHECKGROUP,
+		BTNS_DROPDOWN      = TBSTYLE_DROPDOWN,
+		BTNS_AUTOSIZE      = TBSTYLE_AUTOSIZE,
+		BTNS_NOPREFIX      = TBSTYLE_NOPREFIX,
+		BTNS_WHOLEDROPDOWN = 0x0080
+	}
+}
+static if (_WIN32_IE >= 0x501) {
+	enum {
+		BTNS_SHOWTEXT = 0x0040
+	}
+}
+
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		TBCDRF_NOEDGES        = 0x10000,
+		TBCDRF_HILITEHOTTRACK = 0x20000,
+		TBCDRF_NOOFFSET       = 0x40000,
+		TBCDRF_NOMARK         = 0x80000,
+		TBCDRF_NOETCHEDEFFECT = 0x100000
+	}
+}
+
+const HINST_COMMCTRL = cast(HINSTANCE) (-1);
+
+enum {
+	IDB_STD_SMALL_COLOR,
+	IDB_STD_LARGE_COLOR,
+	IDB_VIEW_SMALL_COLOR = 4,
+	IDB_VIEW_LARGE_COLOR = 5
+}
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		IDB_HIST_SMALL_COLOR = 8,
+		IDB_HIST_LARGE_COLOR = 9
+	}
+}
+
+enum {
+	STD_CUT,
+	STD_COPY,
+	STD_PASTE,
+	STD_UNDO,
+	STD_REDOW,
+	STD_DELETE,
+	STD_FILENEW,
+	STD_FILEOPEN,
+	STD_FILESAVE,
+	STD_PRINTPRE,
+	STD_PROPERTIES,
+	STD_HELP,
+	STD_FIND,
+	STD_REPLACE,
+	STD_PRINT // = 14
+}
+
+enum {
+	VIEW_LARGEICONS,
+	VIEW_SMALLICONS,
+	VIEW_LIST,
+	VIEW_DETAILS,
+	VIEW_SORTNAME,
+	VIEW_SORTSIZE,
+	VIEW_SORTDATE,
+	VIEW_SORTTYPE,
+	VIEW_PARENTFOLDER,
+	VIEW_NETCONNECT,
+	VIEW_NETDISCONNECT,
+	VIEW_NEWFOLDER // = 11
+}
+
+enum {
+	TB_ENABLEBUTTON          = WM_USER + 1,
+	TB_CHECKBUTTON,
+	TB_PRESSBUTTON,
+	TB_HIDEBUTTON,
+	TB_INDETERMINATE, //     = WM_USER + 5,
+	TB_ISBUTTONENABLED       = WM_USER + 9,
+	TB_ISBUTTONCHECKED,
+	TB_ISBUTTONPRESSED,
+	TB_ISBUTTONHIDDEN,
+	TB_ISBUTTONINDETERMINATE, // = WM_USER + 13,
+	TB_SETSTATE              = WM_USER + 17,
+	TB_GETSTATE              = WM_USER + 18,
+	TB_ADDBITMAP             = WM_USER + 19,
+	TB_DELETEBUTTON          = WM_USER + 22,
+	TB_GETBUTTON,
+	TB_BUTTONCOUNT,
+	TB_COMMANDTOINDEX,
+	TB_SAVERESTOREA,
+	TB_CUSTOMIZE,
+	TB_ADDSTRINGA,
+	TB_GETITEMRECT,
+	TB_BUTTONSTRUCTSIZE,
+	TB_SETBUTTONSIZE,
+	TB_SETBITMAPSIZE,
+	TB_AUTOSIZE, //          = WM_USER + 33,
+	TB_GETTOOLTIPS           = WM_USER + 35,
+	TB_SETTOOLTIPS           = WM_USER + 36,
+	TB_SETPARENT             = WM_USER + 37,
+	TB_SETROWS               = WM_USER + 39,
+	TB_GETROWS,
+	TB_GETBITMAPFLAGS,
+	TB_SETCMDID,
+	TB_CHANGEBITMAP,
+	TB_GETBITMAP,
+	TB_GETBUTTONTEXTA,
+	TB_REPLACEBITMAP, //     = WM_USER + 46,
+	TB_GETBUTTONSIZE         = WM_USER + 58,
+	TB_SETBUTTONWIDTH        = WM_USER + 59,
+	TB_GETBUTTONTEXTW        = WM_USER + 75,
+	TB_SAVERESTOREW          = WM_USER + 76,
+	TB_ADDSTRINGW            = WM_USER + 77,
+}
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		TB_MARKBUTTON = WM_USER + 6
+	}
+}
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		TB_ISBUTTONHIGHLIGHTED = WM_USER + 14
+	}
+}
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		TB_ADDBUTTONSA   = WM_USER + 20,
+		TB_INSERTBUTTONA = WM_USER + 21
+	}
+} else {
+	enum {
+		TB_ADDBUTTONS   = WM_USER + 20,
+		TB_INSERTBUTTON = WM_USER + 21
+	}
+}
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		TB_SETINDENT = WM_USER + 47,
+		TB_SETIMAGELIST,
+		TB_GETIMAGELIST,
+		TB_LOADIMAGES,
+		TB_GETRECT,
+		TB_SETHOTIMAGELIST,
+		TB_GETHOTIMAGELIST,
+		TB_SETDISABLEDIMAGELIST,
+		TB_GETDISABLEDIMAGELIST,
+		TB_SETSTYLE,
+		TB_GETSTYLE,
+		//TB_GETBUTTONSIZE,
+		//TB_SETBUTTONWIDTH,
+		TB_SETMAXTEXTROWS,
+		TB_GETTEXTROWS // = WM_USER + 61
+	}
+}
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		TB_GETOBJECT            = WM_USER + 62,
+		TB_GETBUTTONINFOW,
+		TB_SETBUTTONINFOW,
+		TB_GETBUTTONINFOA,
+		TB_SETBUTTONINFOA,
+		TB_INSERTBUTTONW,
+		TB_ADDBUTTONSW,
+		TB_HITTEST, //          = WM_USER + 69
+		TB_SETEXTENDEDSTYLE     = WM_USER + 84,
+		TB_GETEXTENDEDSTYLE     = WM_USER + 85,
+		TB_SETDRAWTEXTFLAGS     = WM_USER + 70,
+		TB_GETHOTITEM,
+		TB_SETHOTITEM,
+		TB_SETANCHORHIGHLIGHT,
+		TB_GETANCHORHIGHLIGHT, // = WM_USER + 74
+		TB_MAPACCELERATORA      = WM_USER + 78,
+		TB_GETINSERTMARK,
+		TB_SETINSERTMARK,
+		TB_INSERTMARKHITTEST,
+		TB_MOVEBUTTON,
+		TB_GETMAXSIZE,
+		//TB_SETEXTENDEDSTYLE,
+		//TB_GETEXTENDEDSTYLE,
+		TB_GETPADDING,
+		TB_SETPADDING,
+		TB_SETINSERTMARKCOLOR,
+		TB_GETINSERTMARKCOLOR,
+		TB_MAPACCELERATORW,
+		TB_GETSTRINGW,
+		TB_GETSTRINGA, //       = WM_USER + 92
+		TB_SETCOLORSCHEME       = CCM_SETCOLORSCHEME,
+		TB_GETCOLORSCHEME       = CCM_GETCOLORSCHEME,
+		TB_SETUNICODEFORMAT     = CCM_SETUNICODEFORMAT,
+		TB_GETUNICODEFORMAT     = CCM_GETUNICODEFORMAT
+	}
+}
+
+const TBBF_LARGE = 1;
+
+enum {
+	TBN_GETBUTTONINFOA = TBN_FIRST -0,
+	TBN_BEGINDRAG      = TBN_FIRST -1,
+	TBN_ENDDRAG        = TBN_FIRST -2,
+	TBN_BEGINADJUST    = TBN_FIRST -3,
+	TBN_ENDADJUST      = TBN_FIRST -4,
+	TBN_RESET          = TBN_FIRST -5,
+	TBN_QUERYINSERT    = TBN_FIRST -6,
+	TBN_QUERYDELETE    = TBN_FIRST -7,
+	TBN_TOOLBARCHANGE  = TBN_FIRST -8,
+	TBN_CUSTHELP       = TBN_FIRST -9
+}
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		TBN_DROPDOWN = TBN_FIRST - 10
+	}
+}
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		TBN_HOTITEMCHANGE  = TBN_FIRST - 13,
+		TBN_DRAGOUT        = TBN_FIRST - 14,
+		TBN_DELETINGBUTTON = TBN_FIRST - 15,
+		TBN_GETDISPINFOA   = TBN_FIRST - 16,
+		TBN_GETDISPINFOW   = TBN_FIRST - 17,
+		TBN_GETINFOTIPA    = TBN_FIRST - 18,
+		TBN_GETINFOTIPW    = TBN_FIRST - 19,
+		TBN_GETBUTTONINFOW = TBN_FIRST - 20
+	}
+}
+static if (_WIN32_IE >= 0x500) {
+	enum {
+		TBN_RESTORE       = TBN_FIRST - 21,
+		TBN_SAVE          = TBN_FIRST - 22,
+		TBN_INITCUSTOMIZE = TBN_FIRST - 23
+	}
+
+	enum {
+		TBNRF_HIDEHELP = 1,
+		TBNRF_ENDCUSTOMIZE
+	}
+
+	enum {
+		TBNF_IMAGE      = 1,
+		TBNF_TEXT       = 2,
+		TBNF_DI_SETITEM = 0x10000000
+	}
+}
+
+enum {
+	TTS_ALWAYSTIP = 1,
+	TTS_NOPREFIX
+}
+static if(_WIN32_IE >= 0x500) {
+	enum {
+		TTS_NOANIMATE = 0x10,
+		TTS_NOFADE    = 0x20,
+		TTS_BALLOON   = 0x40,
+		TTS_CLOSE     = 0x80
+	}
+}
+
+enum {
+	TTF_IDISHWND   = 1,
+	TTF_CENTERTIP  = 2,
+	TTF_RTLREADING = 4,
+	TTF_SUBCLASS   = 16
+}
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		TTF_TRACK       = 0x0020,
+		TTF_ABSOLUTE    = 0x0080,
+		TTF_TRANSPARENT = 0x0100,
+		TTF_DI_SETITEM  = 0x8000
+	}
+
+	static if (_WIN32_IE >= 0x501) {
+		enum {
+			TTF_PARSELINKS = 0x1000
+		}
+	}
+
+	enum {
+		TBCD_TICS = 1,
+		TBCD_THUMB,
+		TBCD_CHANNEL // = 3
+	}
+}
+
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		TBDDRET_DEFAULT,
+		TBDDRET_NODEFAULT,
+		TBDDRET_TREATPRESSED
+	}
+
+	enum {
+		TBIMHT_AFTER = 1,
+		TBIMHT_BACKGROUND
+	}
+}
+
+enum {
+	TTDT_AUTOMATIC,
+	TTDT_RESHOW,
+	TTDT_AUTOPOP,
+	TTDT_INITIAL
+}
+
+enum {
+	TTM_ACTIVATE        = WM_USER + 1,
+	TTM_SETDELAYTIME    = WM_USER + 3,
+	TTM_ADDTOOLA,
+	TTM_DELTOOLA,
+	TTM_NEWTOOLRECTA,
+	TTM_RELAYEVENT,
+	TTM_GETTOOLINFOA,
+	TTM_SETTOOLINFOA,
+	TTM_HITTESTA,
+	TTM_GETTEXTA,
+	TTM_UPDATETIPTEXTA,
+	TTM_GETTOOLCOUNT,
+	TTM_ENUMTOOLSA,
+	TTM_GETCURRENTTOOLA,
+	TTM_WINDOWFROMPOINT, // = WM_USER + 16
+	TTM_ADDTOOLW        = WM_USER + 50,
+	TTM_DELTOOLW,
+	TTM_NEWTOOLRECTW,
+	TTM_GETTOOLINFOW,
+	TTM_SETTOOLINFOW,
+	TTM_HITTESTW,
+	TTM_GETTEXTW,
+	TTM_UPDATETIPTEXTW,
+	TTM_ENUMTOOLSW,
+	TTM_GETCURRENTTOOLW // = WM_USER + 59
+}
+
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		TTM_TRACKACTIVATE = WM_USER + 17,
+		TTM_TRACKPOSITION,
+		TTM_SETTIPBKCOLOR,
+		TTM_SETTIPTEXTCOLOR,
+		TTM_GETDELAYTIME,
+		TTM_GETTIPBKCOLOR,
+		TTM_GETTIPTEXTCOLOR,
+		TTM_SETMAXTIPWIDTH,
+		TTM_GETMAXTIPWIDTH,
+		TTM_SETMARGIN,
+		TTM_GETMARGIN,
+		TTM_POP // = WM_USER + 28
+	}
+}
+
+static if (_WIN32_IE >= 0x400) {  // IE4.0 ???
+	enum {
+		TTM_UPDATE = WM_USER + 29,
+		TTM_GETBUBBLESIZE,
+		TTM_ADJUSTRECT,
+		TTM_SETTITLEA,
+		TTM_SETTITLEW // = WM_USER + 33
+	}
+}
+
+enum {
+	TTN_GETDISPINFOA = TTN_FIRST - 0,
+	TTN_GETDISPINFOW = TTN_FIRST - 10,
+	TTN_NEEDTEXTA    = TTN_GETDISPINFOA,
+	TTN_NEEDTEXTW    = TTN_GETDISPINFOW,
+	TTN_SHOW         = TTN_FIRST-1,
+	TTN_POP          = TTN_FIRST-2
+}
+
+const UD_MAXVAL = 0x7fff;
+const UD_MINVAL = -UD_MAXVAL;
+
+enum {
+	UDN_DELTAPOS    = UDN_FIRST-1,
+	UDS_WRAP        = 1,
+	UDS_SETBUDDYINT = 2,
+	UDS_ALIGNRIGHT  = 4,
+	UDS_ALIGNLEFT   = 8,
+	UDS_AUTOBUDDY   = 16,
+	UDS_ARROWKEYS   = 32,
+	UDS_HORZ        = 64,
+	UDS_NOTHOUSANDS = 128
+}
+
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		UDS_HOTTRACK = 0x0100
+	}
+}
+
+enum {
+	UDM_SETRANGE = WM_USER + 101,
+	UDM_GETRANGE,
+	UDM_SETPOS,
+	UDM_GETPOS,
+	UDM_SETBUDDY,
+	UDM_GETBUDDY,
+	UDM_SETACCEL,
+	UDM_GETACCEL,
+	UDM_SETBASE,
+	UDM_GETBASE // = WM_USER + 110
+}
+
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		UDM_SETRANGE32 = WM_USER + 111,
+		UDM_GETRANGE32,
+		UDM_SETPOS32,
+		UDM_GETPOS32 // = WM_USER + 114
+	}
+}
+
+static if (_WIN32_IE >= 0x500) {
+	enum {
+		UDM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,
+		UDM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT
+	}
+}
+
+/*enum {
+	SB_SETTEXTA       = WM_USER + 1,
+	SB_GETTEXTA,
+	SB_GETTEXTLENGTHA,
+	SB_SETPARTS,   // = WM_USER + 4
+	SB_GETPARTS       = WM_USER + 6,
+	SB_GETBORDERS,
+	SB_SETMINHEIGHT,
+	SB_SIMPLE,
+	SB_GETRECT,
+	SB_SETTEXTW,
+	SB_GETTEXTLENGTHW,
+	SB_GETTEXTW    // = WM_USER + 13
+}*/
+
+/*enum {
+	SBT_OWNERDRAW  = 0x1000,
+	SBT_NOBORDERS  = 256,
+	SBT_POPOUT     = 512,
+	SBT_RTLREADING = 1024
+}*/
+
+static if(_WIN32_IE >= 0x400) {
+	enum {
+		SBT_TOOLTIPS         = 0x0800,
+		SBN_SIMPLEMODECHANGE = SBN_FIRST
+	}
+}
+
+enum {
+	TBS_AUTOTICKS      = 1,
+	TBS_VERT           = 2,
+	TBS_HORZ           = 0,
+	TBS_TOP            = 4,
+	TBS_BOTTOM         = 0,
+	TBS_LEFT           = 4,
+	TBS_RIGHT          = 0,
+	TBS_BOTH           = 8,
+	TBS_NOTICKS        = 16,
+	TBS_ENABLESELRANGE = 32,
+	TBS_FIXEDLENGTH    = 64,
+	TBS_NOTHUMB        = 128
+}
+
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		TBS_TOOLTIPS = 0x0100,
+		TBTS_TOP     = 0,
+		TBTS_LEFT,
+		TBTS_BOTTOM,
+		TBTS_RIGHT // = 3
+	}
+}
+
+static if (_WIN32_IE >= 0x500) {
+	enum {
+		TBS_REVERSED = 0x0200
+	}
+}
+
+static if (_WIN32_IE >= 0x501) {
+	enum {
+		TBS_DOWNISLEFT = 0x0400
+	}
+}
+
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		TBIF_BYINDEX = 0x80000000,
+		TBIF_COMMAND = 32,
+		TBIF_IMAGE   = 1,
+		TBIF_LPARAM  = 16,
+		TBIF_SIZE    = 64,
+		TBIF_STATE   = 4,
+		TBIF_STYLE   = 8,
+		TBIF_TEXT    = 2
+	}
+}
+
+enum {
+	TBM_GETPOS           = WM_USER,
+	TBM_GETRANGEMIN,
+	TBM_GETRANGEMAX,
+	TBM_GETTIC,
+	TBM_SETTIC,
+	TBM_SETPOS,
+	TBM_SETRANGE,
+	TBM_SETRANGEMIN,
+	TBM_SETRANGEMAX,
+	TBM_CLEARTICS,
+	TBM_SETSEL,
+	TBM_SETSELSTART,
+	TBM_SETSELEND,    // = WM_USER+12,
+	TBM_GETPTICS         = WM_USER+14,
+	TBM_GETTICPOS,
+	TBM_GETNUMTICS,
+	TBM_GETSELSTART,
+	TBM_GETSELEND,
+	TBM_CLEARSEL,
+	TBM_SETTICFREQ,
+	TBM_SETPAGESIZE,
+	TBM_GETPAGESIZE,
+	TBM_SETLINESIZE,
+	TBM_GETLINESIZE,
+	TBM_GETTHUMBRECT,
+	TBM_GETCHANNELRECT,
+	TBM_SETTHUMBLENGTH,
+	TBM_GETTHUMBLENGTH,
+	TBM_SETTOOLTIPS,
+	TBM_GETTOOLTIPS,
+	TBM_SETTIPSIDE,
+	TBM_SETBUDDY,
+	TBM_GETBUDDY, //     = WM_USER+33,
+	TBM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,
+	TBM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT
+}
+
+enum {
+	TB_LINEUP,
+	TB_LINEDOWN,
+	TB_PAGEUP,
+	TB_PAGEDOWN,
+	TB_THUMBPOSITION,
+	TB_THUMBTRACK,
+	TB_TOP,
+	TB_BOTTOM,
+	TB_ENDTRACK // = 8
+}
+
+enum {
+	HOTKEYF_SHIFT   = 1,
+	HOTKEYF_CONTROL = 2,
+	HOTKEYF_ALT     = 4,
+	HOTKEYF_EXT     = 8
+}
+
+enum {
+	HKCOMB_NONE = 1,
+	HKCOMB_S    = 2,
+	HKCOMB_C    = 4,
+	HKCOMB_A    = 8,
+	HKCOMB_SC   = 16,
+	HKCOMB_SA   = 32,
+	HKCOMB_CA   = 64,
+	HKCOMB_SCA  = 128
+}
+
+enum {
+	HKM_SETHOTKEY = WM_USER + 1,
+	HKM_GETHOTKEY = WM_USER + 2,
+	HKM_SETRULES  = WM_USER + 3
+}
+
+enum {
+	PBM_SETRANGE     = WM_USER + 1,
+	PBM_SETPOS,
+	PBM_DELTAPOS,
+	PBM_SETSTEP,
+	PBM_STEPIT,   // = WM_USER + 5
+	PBM_SETRANGE32   = 1030,
+	PBM_GETRANGE,
+	PBM_GETPOS,
+	PBM_SETBARCOLOR, // = 1033
+	PBM_SETBKCOLOR   = CCM_SETBKCOLOR
+}
+
+enum {
+	PBS_SMOOTH   = 1,
+	PBS_VERTICAL = 4
+}
+
+enum {
+	LVS_ICON,
+	LVS_REPORT,
+	LVS_SMALLICON,
+	LVS_LIST,        // = 3
+	LVS_TYPEMASK        = 3,
+	LVS_SINGLESEL       = 4,
+	LVS_SHOWSELALWAYS   = 8,
+	LVS_SORTASCENDING   = 16,
+	LVS_SORTDESCENDING  = 32,
+	LVS_SHAREIMAGELISTS = 64,
+	LVS_NOLABELWRAP     = 128,
+	LVS_AUTOARRANGE     = 256,
+	LVS_EDITLABELS      = 512,
+	LVS_NOSCROLL        = 0x2000,
+	LVS_TYPESTYLEMASK   = 0xFC00,
+	LVS_ALIGNTOP        = 0,
+	LVS_ALIGNLEFT       = 0x800,
+	LVS_ALIGNMASK       = 0xC00,
+	LVS_OWNERDRAWFIXED  = 0x400,
+	LVS_NOCOLUMNHEADER  = 0x4000,
+	LVS_NOSORTHEADER    = 0x8000
+}
+
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		CDIS_CHECKED       = 8,
+		CDIS_DEFAULT       = 32,
+		CDIS_DISABLED      = 4,
+		CDIS_FOCUS         = 16,
+		CDIS_GRAYED        = 2,
+		CDIS_HOT           = 64,
+		CDIS_SELECTED      = 1,
+		CDIS_MARKED        = 128,
+		CDIS_INDETERMINATE = 256
+	}
+
+	static if (_WIN32_WINNT >= 0x501) {
+		enum {
+			CDIS_SHOWKEYBOARDCUES = 512
+		}
+	}
+
+	enum {
+		CDDS_POSTERASE     = 4,
+		CDDS_POSTPAINT     = 2,
+		CDDS_PREERASE      = 3,
+		CDDS_PREPAINT      = 1,
+		CDDS_ITEM          = 65536,
+		CDDS_ITEMPOSTERASE = 65540,
+		CDDS_ITEMPOSTPAINT = 65538,
+		CDDS_ITEMPREERASE  = 65539,
+		CDDS_ITEMPREPAINT  = 65537
+	}
+
+	static if (_WIN32_IE >= 0x400) {
+		enum {
+			CDDS_SUBITEM = 0x20000
+		}
+	}
+
+	enum {
+		CDRF_DODEFAULT         = 0x00,
+		CDRF_NOTIFYITEMDRAW    = 0x20,
+		CDRF_NOTIFYSUBITEMDRAW = 0x20,
+		CDRF_NOTIFYITEMERASE   = 0x80,
+		CDRF_NOTIFYPOSTERASE   = 0x40,
+		CDRF_NOTIFYPOSTPAINT   = 0x10,
+		CDRF_NEWFONT           = 0x02,
+		CDRF_SKIPDEFAULT       = 0x04
+	}
+
+	static if (_WIN32_IE >= 0x400) {
+		enum {
+			LVBKIF_SOURCE_NONE    = 0x00000000,
+			LVBKIF_SOURCE_HBITMAP = 0x00000001,
+			LVBKIF_SOURCE_URL     = 0x00000002,
+			LVBKIF_SOURCE_MASK    = 0x00000003,
+			LVBKIF_STYLE_NORMAL   = 0x00000000,
+			LVBKIF_STYLE_TILE     = 0x00000010,
+			LVBKIF_STYLE_MASK     = 0x00000010
+		}
+	}
+
+	static if (_WIN32_WINNT >= 0x501) {
+		enum {
+			LVBKIF_FLAG_TILEOFFSET = 0x00000100,
+			LVBKIF_TYPE_WATERMARK  = 0x10000000
+		}
+	}
+
+	enum {
+		LVS_OWNERDATA = 4096
+	}
+
+	enum {
+		LVS_EX_CHECKBOXES       = 4,
+		LVS_EX_FULLROWSELECT    = 32,
+		LVS_EX_GRIDLINES        = 1,
+		LVS_EX_HEADERDRAGDROP   = 16,
+		LVS_EX_ONECLICKACTIVATE = 64,
+		LVS_EX_SUBITEMIMAGES    = 2,
+		LVS_EX_TRACKSELECT      = 8,
+		LVS_EX_TWOCLICKACTIVATE = 128
+	}
+
+	enum {
+		LVSICF_NOINVALIDATEALL = 0x00000001,
+		LVSICF_NOSCROLL        = 0x00000002
+	}
+
+	static if(_WIN32_IE >= 0x400) {
+		enum {
+			LVS_EX_FLATSB         = 0x00000100,
+			LVS_EX_REGIONAL       = 0x00000200,
+			LVS_EX_INFOTIP        = 0x00000400,
+			LVS_EX_UNDERLINEHOT   = 0x00000800,
+			LVS_EX_UNDERLINECOLD  = 0x00001000,
+			LVS_EX_MULTIWORKAREAS = 0x00002000
+		}
+	}
+
+	static if(_WIN32_IE >= 0x500) {
+		enum {
+			LVS_EX_LABELTIP     = 0x00004000,
+			LVS_EX_BORDERSELECT = 0x00008000
+		}
+	}
+}
+
+enum {
+	LVSIL_NORMAL,
+	LVSIL_SMALL,
+	LVSIL_STATE
+}
+
+enum {
+	LVM_GETBKCOLOR             = LVM_FIRST,
+	LVM_SETBKCOLOR,
+	LVM_GETIMAGELIST,
+	LVM_SETIMAGELIST,
+	LVM_GETITEMCOUNT,       // = LVM_FIRST +   4
+	LVM_SORTITEMSEX            = LVM_FIRST +  81,
+	LVM_SETVIEW                = LVM_FIRST + 142,
+	LVM_GETVIEW,            // = LVM_FIRST + 143
+	LVM_INSERTGROUP            = LVM_FIRST + 145,
+	LVM_SETGROUPINFO           = LVM_FIRST + 147,
+	LVM_GETGROUPINFO           = LVM_FIRST + 149,
+	LVM_REMOVEGROUP,
+	LVM_MOVEGROUP,          // = LVM_FIRST + 151
+	LVM_SETGROUPMETRICS        = LVM_FIRST + 155,
+	LVM_GETGROUPMETRICS,
+	LVM_ENABLEGROUPVIEW,
+	LVM_SORTGROUPS,
+	LVM_INSERTGROUPSORTED,
+	LVM_REMOVEALLGROUPS,
+	LVM_HASGROUP,
+	LVM_SETTILEVIEWINFO,
+	LVM_GETTILEVIEWINFO,
+	LVM_SETTILEINFO,
+	LVM_GETTILEINFO,
+	LVM_SETINSERTMARK,
+	LVM_GETINSERTMARK,
+	LVM_INSERTMARKHITTEST,
+	LVM_GETINSERTMARKRECT,
+	LVM_SETINSERTMARKCOLOR,
+	LVM_GETINSERTMARKCOLOR, // = LVM_FIRST + 171
+	LVM_SETINFOTIP             = LVM_FIRST + 173,
+	LVM_GETSELECTEDCOLUMN,
+	LVM_ISGROUPVIEWENABLED,
+	LVM_GETOUTLINECOLOR,
+	LVM_SETOUTLINECOLOR,    // = LVM_FIRST + 177
+	LVM_CANCELEDITLABEL        = LVM_FIRST + 179,
+	LVM_MAPIDTOINDEX           = LVM_FIRST + 181
+}
+
+static if (_WIN32_WINNT >= 0x501) {
+	enum {
+		LVM_SETSELECTEDCOLUMN  = LVM_FIRST + 140
+	}
+}
+
+enum {
+	LVIF_TEXT  = 1,
+	LVIF_IMAGE = 2,
+	LVIF_PARAM = 4,
+	LVIF_STATE = 8
+}
+
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		LVIF_INDENT      = 16,
+		LVIF_NORECOMPUTE = 2048
+	}
+}
+
+static if (_WIN32_WINNT >= 0x501) {
+	enum {
+		LVIF_GROUPID = 128,
+		LVIF_COLUMNS = 256
+	}
+}
+
+enum {
+	LVIS_FOCUSED        = 1,
+	LVIS_SELECTED       = 2,
+	LVIS_CUT            = 4,
+	LVIS_DROPHILITED    = 8,
+	LVIS_OVERLAYMASK    = 0xF00,
+	LVIS_STATEIMAGEMASK = 0xF000
+}
+
+const LPWSTR LPSTR_TEXTCALLBACKW = cast(LPWSTR) -1;
+const LPSTR  LPSTR_TEXTCALLBACKA = cast(LPSTR) -1;
+
+const I_IMAGECALLBACK = -1;
+
+static if(_WIN32_IE >= 0x400) {
+	enum {
+		LVM_SETBKIMAGEA          = LVM_FIRST + 68,
+		LVM_SETBKIMAGEW          = LVM_FIRST + 138,
+		LVM_GETBKIMAGEA          = LVM_FIRST + 69,
+		LVM_GETBKIMAGEW          = LVM_FIRST + 139,
+		LV_MAX_WORKAREAS         = 16,
+		LVM_SETWORKAREAS         = LVM_FIRST + 65,
+		LVM_GETWORKAREAS         = LVM_FIRST + 70,
+		LVM_GETNUMBEROFWORKAREAS = LVM_FIRST + 73,
+		LVM_GETSELECTIONMARK     = LVM_FIRST + 66,
+		LVM_SETSELECTIONMARK     = LVM_FIRST + 67,
+		LVM_SETHOVERTIME         = LVM_FIRST + 71,
+		LVM_GETHOVERTIME         = LVM_FIRST + 72,
+		LVM_SETTOOLTIPS          = LVM_FIRST + 74,
+		LVM_GETTOOLTIPS          = LVM_FIRST + 78,
+		LVM_SETUNICODEFORMAT     = CCM_SETUNICODEFORMAT,
+		LVM_GETUNICODEFORMAT     = CCM_GETUNICODEFORMAT
+	}
+}
+
+enum {
+	LVNI_ALL,
+	LVNI_FOCUSED     = 1,
+	LVNI_SELECTED    = 2,
+	LVNI_CUT         = 4,
+	LVNI_DROPHILITED = 8,
+	LVNI_ABOVE       = 256,
+	LVNI_BELOW       = 512,
+	LVNI_TOLEFT      = 1024,
+	LVNI_TORIGHT     = 2048
+}
+
+enum {
+	LVM_GETITEMA          = LVM_FIRST + 5,
+	LVM_SETITEMA,
+	LVM_INSERTITEMA,
+	LVM_DELETEITEM,
+	LVM_DELETEALLITEMS,
+	LVM_GETCALLBACKMASK,
+	LVM_SETCALLBACKMASK,
+	LVM_GETNEXTITEM,
+	LVM_FINDITEMA,
+	LVM_GETITEMRECT,
+	LVM_SETITEMPOSITION,
+	LVM_GETITEMPOSITION,
+	LVM_GETSTRINGWIDTHA,
+	LVM_HITTEST,
+	LVM_ENSUREVISIBLE,
+	LVM_SCROLL,
+	LVM_REDRAWITEMS,
+	LVM_ARRANGE,
+	LVM_EDITLABELA,
+	LVM_GETEDITCONTROL,
+	LVM_GETCOLUMNA,
+	LVM_SETCOLUMNA,
+	LVM_INSERTCOLUMNA,
+	LVM_DELETECOLUMN,
+	LVM_GETCOLUMNWIDTH,
+	LVM_SETCOLUMNWIDTH, // = LVM_FIRST + 30,
+	LVM_CREATEDRAGIMAGE   = LVM_FIRST + 33,
+	LVM_GETVIEWRECT,
+	LVM_GETTEXTCOLOR,
+	LVM_SETTEXTCOLOR,
+	LVM_GETTEXTBKCOLOR,
+	LVM_SETTEXTBKCOLOR,
+	LVM_GETTOPINDEX,
+	LVM_GETCOUNTPERPAGE,
+	LVM_GETORIGIN,
+	LVM_UPDATE,
+	LVM_SETITEMSTATE,
+	LVM_GETITEMSTATE,
+	LVM_GETITEMTEXTA,
+	LVM_SETITEMTEXTA,
+	LVM_SETITEMCOUNT,
+	LVM_SORTITEMS,
+	LVM_SETITEMPOSITION32,
+	LVM_GETSELECTEDCOUNT,
+	LVM_GETITEMSPACING,
+	LVM_GETISEARCHSTRINGA, // = LVM_FIRST + 52,
+	LVM_GETITEMW          = LVM_FIRST + 75,
+	LVM_SETITEMW          = LVM_FIRST + 76,
+	LVM_INSERTITEMW       = LVM_FIRST + 77,
+	LVM_FINDITEMW         = LVM_FIRST + 83,
+	LVM_GETSTRINGWIDTHW   = LVM_FIRST + 87,
+	LVM_GETCOLUMNW        = LVM_FIRST + 95,
+	LVM_SETCOLUMNW        = LVM_FIRST + 96,
+	LVM_INSERTCOLUMNW     = LVM_FIRST + 97,
+	LVM_GETITEMTEXTW      = LVM_FIRST + 115,
+	LVM_SETITEMTEXTW,
+	LVM_GETISEARCHSTRINGW,
+	LVM_EDITLABELW     // = LVM_FIRST + 118,
+}
+
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		LVM_GETHEADER                = LVM_FIRST + 31,
+		LVM_SETICONSPACING           = LVM_FIRST + 53,
+		LVM_SETEXTENDEDLISTVIEWSTYLE,
+		LVM_GETEXTENDEDLISTVIEWSTYLE,
+		LVM_GETSUBITEMRECT,
+		LVM_SUBITEMHITTEST,
+		LVM_SETCOLUMNORDERARRAY,
+		LVM_GETCOLUMNORDERARRAY,
+		LVM_SETHOTITEM,
+		LVM_GETHOTITEM,
+		LVM_SETHOTCURSOR,
+		LVM_GETHOTCURSOR,
+		LVM_APPROXIMATEVIEWRECT   // = LVM_FIRST + 64,
+	}
+}
+
+enum {
+	LVFI_PARAM     = 1,
+	LVFI_STRING    = 2,
+	LVFI_PARTIAL   = 8,
+	LVFI_WRAP      = 32,
+	LVFI_NEARESTXY = 64
+}
+
+enum {
+	LVIF_DI_SETITEM = 0x1000
+}
+
+enum {
+	LVIR_BOUNDS,
+	LVIR_ICON,
+	LVIR_LABEL,
+	LVIR_SELECTBOUNDS // = 3
+}
+
+enum {
+	LVHT_NOWHERE         = 1,
+	LVHT_ONITEMICON      = 2,
+	LVHT_ONITEMLABEL     = 4,
+	LVHT_ONITEMSTATEICON = 8,
+	LVHT_ONITEM          = LVHT_ONITEMICON | LVHT_ONITEMLABEL
+	                       | LVHT_ONITEMSTATEICON,
+	LVHT_ABOVE           = 8,
+	LVHT_BELOW           = 16,
+	LVHT_TORIGHT         = 32,
+	LVHT_TOLEFT          = 64
+}
+
+enum {
+	LVA_DEFAULT    = 0,
+	LVA_ALIGNLEFT  = 1,
+	LVA_ALIGNTOP   = 2,
+	LVA_SNAPTOGRID = 5
+}
+
+enum {
+	LVCF_FMT     = 1,
+	LVCF_WIDTH   = 2,
+	LVCF_TEXT    = 4,
+	LVCF_SUBITEM = 8
+}
+
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		LVCF_IMAGE = 16,
+		LVCF_ORDER = 32
+	}
+}
+
+enum {
+	LVCFMT_LEFT,
+	LVCFMT_RIGHT,
+	LVCFMT_CENTER,
+	LVCFMT_JUSTIFYMASK // = 3
+}
+
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		LVCFMT_IMAGE           = 2048,
+		LVCFMT_BITMAP_ON_RIGHT = 4096,
+		LVCFMT_COL_HAS_IMAGES  = 32768
+	}
+}
+
+enum {
+	LVSCW_AUTOSIZE           = -1,
+	LVSCW_AUTOSIZE_USEHEADER = -2
+}
+
+enum {
+	LVN_ITEMCHANGING    = LVN_FIRST,
+	LVN_ITEMCHANGED     = LVN_FIRST - 1,
+	LVN_INSERTITEM      = LVN_FIRST - 2,
+	LVN_DELETEITEM      = LVN_FIRST - 3,
+	LVN_DELETEALLITEMS  = LVN_FIRST - 4,
+	LVN_BEGINLABELEDITA = LVN_FIRST - 5,
+	LVN_ENDLABELEDITA   = LVN_FIRST - 6,
+	LVN_COLUMNCLICK     = LVN_FIRST - 8,
+	LVN_BEGINDRAG       = LVN_FIRST - 9,
+	LVN_BEGINRDRAG      = LVN_FIRST - 11,
+	LVN_GETDISPINFOA    = LVN_FIRST - 50,
+	LVN_SETDISPINFOA    = LVN_FIRST - 51,
+	LVN_KEYDOWN         = LVN_FIRST - 55,
+	LVN_BEGINLABELEDITW = LVN_FIRST - 75,
+	LVN_ENDLABELEDITW   = LVN_FIRST - 76,
+	LVN_GETDISPINFOW    = LVN_FIRST - 77,
+	LVN_SETDISPINFOW    = LVN_FIRST - 78
+}
+
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		LVN_MARQUEEBEGIN = LVN_FIRST - 56,
+		LVN_GETINFOTIPA  = LVN_FIRST - 57,
+		LVN_GETINFOTIPW  = LVN_FIRST - 58,
+		LVKF_ALT         = 1,
+		LVKF_CONTROL     = 2,
+		LVKF_SHIFT       = 4,
+		LVGIT_UNFOLDED   = 1
+	}
+}
+
+enum {
+	TVS_HASBUTTONS      = 1,
+	TVS_HASLINES        = 2,
+	TVS_LINESATROOT     = 4,
+	TVS_EDITLABELS      = 8,
+	TVS_DISABLEDRAGDROP = 16,
+	TVS_SHOWSELALWAYS   = 32
+}
+
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		TVS_RTLREADING  = 64,
+		TVS_NOTOOLTIPS  = 128,
+		TVS_CHECKBOXES  = 256,
+		TVS_TRACKSELECT = 512
+	}
+}
+
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		TVS_SINGLEEXPAND  = 1024,
+		TVS_INFOTIP       = 2048,
+		TVS_FULLROWSELECT = 4096,
+		TVS_NOSCROLL      = 8192,
+		TVS_NONEVENHEIGHT = 16384
+	}
+}
+
+static if (_WIN32_IE >= 0x500) {
+	enum {
+		TVS_NOHSCROLL = 0x8000
+	}
+}
+
+enum {
+	TVIF_TEXT          = 1,
+	TVIF_IMAGE         = 2,
+	TVIF_PARAM         = 4,
+	TVIF_STATE         = 8,
+	TVIF_HANDLE        = 16,
+	TVIF_SELECTEDIMAGE = 32,
+	TVIF_CHILDREN      = 64
+}
+
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		TVIF_INTEGRAL = 0x0080
+	}
+}
+
+enum {
+	TVIS_FOCUSED        = 1,
+	TVIS_SELECTED       = 2,
+	TVIS_CUT            = 4,
+	TVIS_DROPHILITED    = 8,
+	TVIS_BOLD           = 16,
+	TVIS_EXPANDED       = 32,
+	TVIS_EXPANDEDONCE   = 64,
+	TVIS_OVERLAYMASK    = 0xF00,
+	TVIS_STATEIMAGEMASK = 0xF000,
+	TVIS_USERMASK       = 0xF000
+}
+
+enum {
+	I_CHILDRENCALLBACK = -1
+}
+
+alias HANDLE HTREEITEM;
+
+const HTREEITEM
+	TVI_ROOT  = cast(HTREEITEM) 0xFFFF0000,
+	TVI_FIRST = cast(HTREEITEM) 0xFFFF0001,
+	TVI_LAST  = cast(HTREEITEM) 0xFFFF0002,
+	TVI_SORT  = cast(HTREEITEM) 0xFFFF0003;
+
+enum {
+	TVSIL_NORMAL = 0,
+	TVSIL_STATE  = 2
+}
+
+enum {
+	TVM_INSERTITEMA       = TV_FIRST,
+	TVM_DELETEITEM        = TV_FIRST + 1,
+	TVM_EXPAND            = TV_FIRST + 2,
+	TVM_GETITEMRECT       = TV_FIRST + 4,
+	TVM_GETCOUNT,
+	TVM_GETINDENT,
+	TVM_SETINDENT,
+	TVM_GETIMAGELIST,
+	TVM_SETIMAGELIST,
+	TVM_GETNEXTITEM,
+	TVM_SELECTITEM,
+	TVM_GETITEMA,
+	TVM_SETITEMA,
+	TVM_EDITLABELA,
+	TVM_GETEDITCONTROL,
+	TVM_GETVISIBLECOUNT,
+	TVM_HITTEST,
+	TVM_CREATEDRAGIMAGE,
+	TVM_SORTCHILDREN,
+	TVM_ENSUREVISIBLE,
+	TVM_SORTCHILDRENCB,
+	TVM_ENDEDITLABELNOW,
+	TVM_GETISEARCHSTRINGA, // = TV_FIRST + 23
+	TVM_INSERTITEMW       = TV_FIRST + 50,
+	TVM_GETITEMW          = TV_FIRST + 62,
+	TVM_SETITEMW          = TV_FIRST + 63,
+	TVM_GETISEARCHSTRINGW = TV_FIRST + 64,
+	TVM_EDITLABELW        = TV_FIRST + 65
+}
+
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		TVM_GETTOOLTIPS = TV_FIRST + 25,
+		TVM_SETTOOLTIPS = TV_FIRST + 24
+	}
+}
+
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		TVM_SETINSERTMARK      = TV_FIRST + 26,
+		TVM_SETITEMHEIGHT,
+		TVM_GETITEMHEIGHT,
+		TVM_SETBKCOLOR,
+		TVM_SETTEXTCOLOR,
+		TVM_GETBKCOLOR,
+		TVM_GETTEXTCOLOR,
+		TVM_SETSCROLLTIME,
+		TVM_GETSCROLLTIME,  // = TV_FIRST + 34
+		TVM_SETINSERTMARKCOLOR = TV_FIRST + 37,
+		TVM_GETINSERTMARKCOLOR = TV_FIRST + 38,
+		TVM_SETUNICODEFORMAT   = CCM_SETUNICODEFORMAT,
+		TVM_GETUNICODEFORMAT   = CCM_GETUNICODEFORMAT
+	}
+}
+
+static if (_WIN32_IE >= 0x500) {
+	enum {
+		TVM_GETITEMSTATE = TV_FIRST + 39,
+		TVM_SETLINECOLOR = TV_FIRST + 40,
+		TVM_GETLINECOLOR = TV_FIRST + 41
+	}
+}
+
+enum {
+	TVE_COLLAPSE      = 1,
+	TVE_EXPAND        = 2,
+	TVE_TOGGLE        = 3,
+	TVE_COLLAPSERESET = 0x8000
+}
+
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		TVE_EXPANDPARTIAL = 0x4000
+	}
+}
+
+enum {
+	TVC_UNKNOWN,
+	TVC_BYMOUSE,
+	TVC_BYKEYBOARD // = 2
+}
+
+enum {
+	TVGN_ROOT,
+	TVGN_NEXT,
+	TVGN_PREVIOUS,
+	TVGN_PARENT,
+	TVGN_CHILD,
+	TVGN_FIRSTVISIBLE,
+	TVGN_NEXTVISIBLE,
+	TVGN_PREVIOUSVISIBLE,
+	TVGN_DROPHILITE,
+	TVGN_CARET // = 9
+}
+
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		TVGN_LASTVISIBLE = 10
+	}
+}
+
+enum {
+	TVN_SELCHANGINGA    = TVN_FIRST - 1,
+	TVN_SELCHANGEDA     = TVN_FIRST - 2,
+	TVN_GETDISPINFOA    = TVN_FIRST - 3,
+	TVN_SETDISPINFOA    = TVN_FIRST - 4,
+	TVN_ITEMEXPANDINGA  = TVN_FIRST - 5,
+	TVN_ITEMEXPANDEDA   = TVN_FIRST - 6,
+	TVN_BEGINDRAGA      = TVN_FIRST - 7,
+	TVN_BEGINRDRAGA     = TVN_FIRST - 8,
+	TVN_DELETEITEMA     = TVN_FIRST - 9,
+	TVN_BEGINLABELEDITA = TVN_FIRST - 10,
+	TVN_ENDLABELEDITA   = TVN_FIRST - 11,
+	TVN_KEYDOWN         = TVN_FIRST - 12,
+	TVN_SELCHANGINGW    = TVN_FIRST - 50,
+	TVN_SELCHANGEDW     = TVN_FIRST - 51,
+	TVN_GETDISPINFOW    = TVN_FIRST - 52,
+	TVN_SETDISPINFOW    = TVN_FIRST - 53,
+	TVN_ITEMEXPANDINGW  = TVN_FIRST - 54,
+	TVN_ITEMEXPANDEDW   = TVN_FIRST - 55,
+	TVN_BEGINDRAGW      = TVN_FIRST - 56,
+	TVN_BEGINRDRAGW     = TVN_FIRST - 57,
+	TVN_DELETEITEMW     = TVN_FIRST - 58,
+	TVN_BEGINLABELEDITW = TVN_FIRST - 59,
+	TVN_ENDLABELEDITW   = TVN_FIRST - 60
+}
+
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		TVNRET_DEFAULT   = 0,
+		TVNRET_SKIPOLD   = 1,
+		TVNRET_SKIPNEW   = 2,
+		TVN_GETINFOTIPA  = TVN_FIRST - 13,
+		TVN_GETINFOTIPW  = TVN_FIRST - 14,
+		TVN_SINGLEEXPAND = TVN_FIRST - 15
+	}
+}
+
+enum {
+	TVIF_DI_SETITEM = 0x1000
+}
+
+enum {
+	TVHT_NOWHERE         = 1,
+	TVHT_ONITEMICON      = 2,
+	TVHT_ONITEMLABEL     = 4,
+	TVHT_ONITEMINDENT    = 8,
+	TVHT_ONITEMBUTTON    = 16,
+	TVHT_ONITEMRIGHT     = 32,
+	TVHT_ONITEMSTATEICON = 64,
+	TVHT_ABOVE           = 256,
+	TVHT_BELOW           = 512,
+	TVHT_TORIGHT         = 1024,
+	TVHT_TOLEFT          = 2048,
+	TCHT_NOWHERE         = 1,
+	TCHT_ONITEMICON      = 2,
+	TCHT_ONITEMLABEL     = 4,
+	TVHT_ONITEM          = TVHT_ONITEMICON | TVHT_ONITEMLABEL
+	                       | TVHT_ONITEMSTATEICON,
+	TCHT_ONITEM          = TCHT_ONITEMICON | TCHT_ONITEMLABEL
+}
+
+enum {
+	TCS_TABS              = 0,
+	TCS_RIGHTJUSTIFY      = 0,
+	TCS_SINGLELINE        = 0,
+	TCS_FORCEICONLEFT     = 16,
+	TCS_FORCELABELLEFT    = 32,
+	TCS_BUTTONS           = 256,
+	TCS_MULTILINE         = 512,
+	TCS_FIXEDWIDTH        = 1024,
+	TCS_RAGGEDRIGHT       = 2048,
+	TCS_FOCUSONBUTTONDOWN = 0x1000,
+	TCS_OWNERDRAWFIXED    = 0x2000,
+	TCS_TOOLTIPS          = 0x4000,
+	TCS_FOCUSNEVER        = 0x8000
+}
+
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		TCS_BOTTOM         = 2,
+		TCS_RIGHT          = 2,
+		TCS_VERTICAL       = 128,
+		TCS_SCROLLOPPOSITE = 0x0001,
+		TCS_HOTTRACK       = 0x0040,
+		TCS_MULTISELECT    = 0x0004
+	}
+}
+
+static if(_WIN32_IE >= 0x400) {
+	enum {
+		TCS_FLATBUTTONS       = 0x0008,
+		TCS_EX_FLATSEPARATORS = 0x00000001,
+		TCS_EX_REGISTERDROP   = 0x00000002
+	}
+}
+
+enum {
+	TCIF_TEXT       = 1,
+	TCIF_IMAGE      = 2,
+	TCIF_RTLREADING = 4,
+	TCIF_PARAM      = 8
+}
+
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		TCIF_STATE = 16
+	}
+}
+
+enum {
+	TCIS_BUTTONPRESSED = 1
+}
+
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		TCIS_HIGHLIGHTED = 2
+	}
+}
+
+enum {
+	TCM_FIRST          = 0x1300,
+	TCM_GETIMAGELIST   = TCM_FIRST + 2,
+	TCM_SETIMAGELIST,
+	TCM_GETITEMCOUNT,
+	TCM_GETITEMA,
+	TCM_SETITEMA,
+	TCM_INSERTITEMA,
+	TCM_DELETEITEM,
+	TCM_DELETEALLITEMS,
+	TCM_GETITEMRECT,
+	TCM_GETCURSEL,
+	TCM_SETCURSEL,
+	TCM_HITTEST,
+	TCM_SETITEMEXTRA, // = TCM_FIRST + 14
+	TCM_ADJUSTRECT     = TCM_FIRST + 40,
+	TCM_SETITEMSIZE,
+	TCM_REMOVEIMAGE,
+	TCM_SETPADDING,
+	TCM_GETROWCOUNT,
+	TCM_GETTOOLTIPS,
+	TCM_SETTOOLTIPS,
+	TCM_GETCURFOCUS,
+	TCM_SETCURFOCUS,
+	TCM_SETMINTABWIDTH,
+	TCM_DESELECTALL, // = TCM_FIRST + 50
+	TCM_GETITEMW       = TCM_FIRST + 60,
+	TCM_SETITEMW       = TCM_FIRST + 61,
+	TCM_INSERTITEMW    = TCM_FIRST + 62
+}
+
+static if (_WIN32_IE >=0x0400) {
+	enum {
+		TCM_HIGHLIGHTITEM    = TCM_FIRST + 51,
+		TCM_SETEXTENDEDSTYLE = TCM_FIRST + 52,
+		TCM_GETEXTENDEDSTYLE = TCM_FIRST + 53,
+		TCM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,
+		TCM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT
+	}
+}
+
+enum {
+	TCN_KEYDOWN     = TCN_FIRST,
+	TCN_SELCHANGE   = TCN_FIRST - 1,
+	TCN_SELCHANGING = TCN_FIRST - 2
+}
+
+enum {
+	NM_OUTOFMEMORY     = NM_FIRST - 1,
+	NM_CLICK           = NM_FIRST - 2,
+	NM_DBLCLK          = NM_FIRST - 3,
+	NM_RETURN          = NM_FIRST - 4,
+	NM_RCLICK          = NM_FIRST - 5,
+	NM_RDBLCLK         = NM_FIRST - 6,
+	NM_SETFOCUS        = NM_FIRST - 7,
+	NM_KILLFOCUS       = NM_FIRST - 8,
+	NM_CUSTOMDRAW      = NM_FIRST - 12,
+	NM_HOVER           = NM_FIRST - 13,
+	NM_NCHITTEST       = NM_FIRST - 14,
+	NM_KEYDOWN         = NM_FIRST - 15,
+	NM_RELEASEDCAPTURE = NM_FIRST - 16,
+	NM_SETCURSOR       = NM_FIRST - 17,
+	NM_CHAR            = NM_FIRST - 18,
+	NM_TOOLTIPSCREATED = NM_FIRST - 19
+}
+
+enum {
+	SBARS_SIZEGRIP = 256
+}
+
+/*enum {
+	CCM_FIRST            = 0x2000,
+	CCM_LAST             = CCM_FIRST + 0x200,
+	CCM_SETBKCOLOR       = 8193,
+	CCM_SETCOLORSCHEME   = 8194,
+	CCM_GETCOLORSCHEME   = 8195,
+	CCM_GETDROPTARGET    = 8196,
+	CCM_SETUNICODEFORMAT = 8197,
+	CCM_GETUNICODEFORMAT = 8198,
+	CCM_SETVERSION       = 0x2007,
+	CCM_GETVERSION       = 0x2008,
+	CCM_SETNOTIFYWINDOW  = 0x2009
+}*/
+
+static if (_WIN32_WINNT >= 0x501) {
+	enum {
+		CCM_SETWINDOWTHEME = 0x200b,
+		CCM_DPISCALE       = 0x200c
+	}
+}
+
+enum {
+	ICC_LISTVIEW_CLASSES = 1,
+	ICC_TREEVIEW_CLASSES = 2,
+	ICC_BAR_CLASSES      = 4,
+	ICC_TAB_CLASSES      = 8,
+	ICC_UPDOWN_CLASS     = 16,
+	ICC_PROGRESS_CLASS   = 32,
+	ICC_HOTKEY_CLASS     = 64,
+	ICC_ANIMATE_CLASS    = 128,
+	ICC_WIN95_CLASSES    = 255,
+	ICC_DATE_CLASSES     = 256,
+	ICC_USEREX_CLASSES   = 512,
+	ICC_COOL_CLASSES     = 1024
+}
+
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		INFOTIPSIZE            = 1024,
+		ICC_INTERNET_CLASSES   = 2048,
+		ICC_PAGESCROLLER_CLASS = 4096,
+		ICC_NATIVEFNTCTL_CLASS = 8192
+	}
+}
+
+static if (_WIN32_WINNT >= 0x501) {
+	enum {
+		ICC_STANDARD_CLASSES = 0x00004000,
+		ICC_LINK_CLASS       = 0x00008000
+	}
+}
+
+enum {
+	GDTR_MIN = 1,
+	GDTR_MAX = 2
+}
+
+enum {
+	GMR_VISIBLE,
+	GMR_DAYSTATE
+}
+
+enum {
+	GDT_ERROR = -1,
+	GDT_VALID = 0,
+	GDT_NONE  = 1
+}
+
+enum {
+	DTS_SHORTDATEFORMAT = 0,
+	DTS_UPDOWN          = 1,
+	DTS_SHOWNONE        = 2,
+	DTS_LONGDATEFORMAT  = 4,
+	DTS_TIMEFORMAT      = 9,
+	DTS_APPCANPARSE     = 16,
+	DTS_RIGHTALIGN      = 32
+}
+
+static if (_WIN32_IE >= 0x500) {
+	enum {
+		DTS_SHORTDATECENTURYFORMAT = 0x000C
+	}
+}
+
+enum {
+	MCS_DAYSTATE    = 1,
+	MCS_MULTISELECT = 2,
+	MCS_WEEKNUMBERS = 4
+}
+
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		MCS_NOTODAYCIRCLE = 0x0008,
+		MCS_NOTODAY       = 0x0010
+	}
+} else {
+	enum {
+		MCS_NOTODAY = 0x0008
+	}
+}
+
+enum {
+	DTM_GETSYSTEMTIME = 0x1001,
+	DTM_SETSYSTEMTIME = 0x1002,
+	DTM_GETRANGE      = 0x1003,
+	DTM_SETRANGE      = 0x1004,
+	DTM_SETFORMATA    = 0x1005,
+	DTM_SETMCCOLOR    = 0x1006,
+	DTM_GETMCCOLOR    = 0x1007,
+	DTM_GETMONTHCAL   = 0x1008,
+	DTM_SETMCFONT     = 0x1009,
+	DTM_GETMCFONT     = 0x100a,
+	DTM_SETFORMATW    = 0x1050
+}
+
+enum {
+	DTN_USERSTRINGA    = -758U,
+	DTN_USERSTRINGW    = -745U,
+	DTN_WMKEYDOWNA     = -757U,
+	DTN_WMKEYDOWNW     = -744U,
+	DTN_FORMATA        = -756U,
+	DTN_FORMATW        = -743U,
+	DTN_FORMATQUERYA   = -755U,
+	DTN_FORMATQUERYW   = -742U,
+	DTN_DROPDOWN       = -754U,
+	DTN_CLOSEUP        = -753U,
+	DTN_DATETIMECHANGE = -759U,
+}
+
+enum {
+	MCM_GETCURSEL         = 0x1001,
+	MCM_SETCURSEL         = 0x1002,
+	MCM_GETMAXSELCOUNT    = 0x1003,
+	MCM_SETMAXSELCOUNT    = 0x1004,
+	MCM_GETSELRANGE       = 0x1005,
+	MCM_SETSELRANGE       = 0x1006,
+	MCM_GETMONTHRANGE     = 0x1007,
+	MCM_SETDAYSTATE       = 0x1008,
+	MCM_GETMINREQRECT     = 0x1009,
+	MCM_SETCOLOR          = 0x100a,
+	MCM_GETCOLOR          = 0x100b,
+	MCM_SETTODAY          = 0x100c,
+	MCM_GETTODAY          = 0x100d,
+	MCM_HITTEST           = 0x100e,
+	MCM_SETFIRSTDAYOFWEEK = 0x100f,
+	MCM_GETFIRSTDAYOFWEEK = 0x1010,
+	MCM_GETRANGE          = 0x1011,
+	MCM_SETRANGE          = 0x1012,
+	MCM_GETMONTHDELTA     = 0x1013,
+	MCM_SETMONTHDELTA     = 0x1014,
+	MCM_GETMAXTODAYWIDTH  = 0x1015,
+	MCM_GETUNICODEFORMAT  = CCM_GETUNICODEFORMAT,
+	MCM_SETUNICODEFORMAT  = CCM_SETUNICODEFORMAT
+}
+
+enum {
+	MCN_SELCHANGE   = -749U,
+	MCN_GETDAYSTATE = -747U,
+	MCN_SELECT      = -746U
+}
+
+enum {
+	ODT_HEADER = 100,
+	ODT_TAB,
+	ODT_LISTVIEW // = 102
+}
+
+enum {
+	SB_SETBKCOLOR = 0x2001
+}
+
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		SB_ISSIMPLE = 1038
+	}
+
+	enum {
+		MCSC_BACKGROUND,
+		MCSC_TEXT,
+		MCSC_TITLEBK,
+		MCSC_TITLETEXT,
+		MCSC_MONTHBK,
+		MCSC_TRAILINGTEXT // = 5
+	}
+}
+
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		MCHT_TITLE            = 0x10000,
+		MCHT_CALENDAR         = 0x20000,
+		MCHT_TODAYLINK        = 0x30000,
+		MCHT_NEXT             = 0x1000000,
+		MCHT_PREV             = 0x2000000,
+		MCHT_NOWHERE          = 0x00,
+		MCHT_TITLEBK          = MCHT_TITLE,
+		MCHT_TITLEMONTH       = MCHT_TITLE | 0x0001,
+		MCHT_TITLEYEAR        = MCHT_TITLE | 0x0002,
+		MCHT_TITLEBTNNEXT     = MCHT_TITLE | MCHT_NEXT | 0x0003,
+		MCHT_TITLEBTNPREV     = MCHT_TITLE | MCHT_PREV | 0x0003,
+		MCHT_CALENDARBK       = MCHT_CALENDAR,
+		MCHT_CALENDARDATE     = MCHT_CALENDAR | 0x0001,
+		MCHT_CALENDARDATENEXT = MCHT_CALENDARDATE | MCHT_NEXT,
+		MCHT_CALENDARDATEPREV = MCHT_CALENDARDATE | MCHT_PREV,
+		MCHT_CALENDARDAY      = MCHT_CALENDAR | 0x0002,
+		MCHT_CALENDARWEEKNUM  = MCHT_CALENDAR | 0x0003
+	}
+}
+
+enum {
+	RBS_TOOLTIPS    = 256,
+	RBS_VARHEIGHT   = 512,
+	RBS_BANDBORDERS = 1024,
+	RBS_FIXEDORDER  = 2048
+}
+
+enum {
+	RBIM_IMAGELIST = 1
+}
+
+enum {
+	RB_SETCOLORSCHEME = CCM_SETCOLORSCHEME,
+	RB_GETCOLORSCHEME = CCM_GETCOLORSCHEME
+}
+
+enum {
+	RBBS_BREAK          = 0x0001,
+	RBBS_FIXEDSIZE      = 0x0002,
+	RBBS_CHILDEDGE      = 0x0004,
+	RBBS_HIDDEN         = 0x0008,
+	RBBS_NOVERT         = 0x0010,
+	RBBS_FIXEDBMP       = 0x0020,
+	RBBS_VARIABLEHEIGHT = 0x0040,
+	RBBS_GRIPPERALWAYS  = 0x0080,
+	RBBS_NOGRIPPER      = 0x0100
+}
+
+static if (_WIN32_IE >= 0x500) {
+	enum {
+		RBBS_USECHEVRON = 0x0200
+	}
+}
+
+static if (_WIN32_IE >= 0x501) {
+	enum {
+		RBBS_HIDETITLE = 0x0400,
+		RBBS_TOPALIGN  = 0x0800
+	}
+}
+
+enum {
+	RBBIM_STYLE      = 1,
+	RBBIM_COLORS     = 2,
+	RBBIM_TEXT       = 4,
+	RBBIM_IMAGE      = 8,
+	RBBIM_CHILD      = 16,
+	RBBIM_CHILDSIZE  = 32,
+	RBBIM_SIZE       = 64,
+	RBBIM_BACKGROUND = 128,
+	RBBIM_ID         = 256
+}
+
+enum {
+	RB_INSERTBANDA  = WM_USER + 1,
+	RB_DELETEBAND,
+	RB_GETBARINFO,
+	RB_SETBARINFO, // = WM_USER + 4
+	RB_SETBANDINFOA = WM_USER + 6,
+	RB_SETPARENT    = WM_USER + 7,
+	RB_INSERTBANDW  = WM_USER + 10,
+	RB_SETBANDINFOW,
+	RB_GETBANDCOUNT,
+	RB_GETROWCOUNT,
+	RB_GETROWHEIGHT // = WM_USER + 14,
+}
+
+enum {
+	RBN_HEIGHTCHANGE = RBN_FIRST
+}
+
+static if (_WIN32_IE >= 0x300) {
+	enum {
+		LVN_ODCACHEHINT    = LVN_FIRST - 13,
+		LVN_ODFINDITEMA    = LVN_FIRST - 52,
+		LVN_ODFINDITEMW    = LVN_FIRST - 79,
+		LVN_ITEMACTIVATE   = LVN_FIRST - 14,
+		LVN_ODSTATECHANGED = LVN_FIRST - 15
+	}
+
+	version (Unicode) {
+		enum {
+			LVN_ODFINDITEM = LVN_ODFINDITEMW
+		}
+	} else {
+		enum {
+			LVN_ODFINDITEM = LVN_ODFINDITEMA
+		}
+	}
+}
+
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		SB_SETICON          = 1039,
+		SB_SETTIPTEXTA,
+		SB_SETTIPTEXTW,
+		SB_GETTIPTEXTA,
+		SB_GETTIPTEXTW,
+		SB_GETICON,      // = 1044
+		SB_SETUNICODEFORMAT = 0x2005,
+		SB_GETUNICODEFORMAT = 0x2006
+	}
+
+	enum {
+		PGF_INVISIBLE = 0,
+		PGF_NORMAL    = 1,
+		PGF_GRAYED    = 2,
+		PGF_DEPRESSED = 4,
+		PGF_HOT       = 8
+	}
+
+	enum {
+		PGB_TOPORLEFT,
+		PGB_BOTTOMORRIGHT
+	}
+
+	enum {
+		PGF_SCROLLUP    = 1,
+		PGF_SCROLLDOWN  = 2,
+		PGF_SCROLLLEFT  = 4,
+		PGF_SCROLLRIGHT = 8
+	}
+
+	enum {
+		PGK_SHIFT   = 1,
+		PGK_CONTROL = 2,
+		PGK_MENU    = 4
+	}
+
+	enum {
+		PGF_CALCWIDTH  = 1,
+		PGF_CALCHEIGHT = 2
+	}
+
+	enum {
+		PGM_FIRST    = 0x1400,
+		PGM_SETCHILD = PGM_FIRST + 1,
+		PGM_RECALCSIZE,
+		PGM_FORWARDMOUSE,
+		PGM_SETBKCOLOR,
+		PGM_GETBKCOLOR,
+		PGM_SETBORDER,
+		PGM_GETBORDER,
+		PGM_SETPOS,
+		PGM_GETPOS,
+		PGM_SETBUTTONSIZE,
+		PGM_GETBUTTONSIZE,
+		PGM_GETBUTTONSTATE, // = PGM_FIRST + 12
+		PGM_GETDROPTARGET = CCM_GETDROPTARGET
+	}
+
+	enum {
+		RBS_REGISTERDROP    = 4096,
+		RBS_AUTOSIZE        = 8192,
+		RBS_VERTICALGRIPPER = 16384,
+		RBS_DBLCLKTOGGLE    = 32768
+	}
+
+	enum {
+		RBBIM_IDEALSIZE  = 512,
+		RBBIM_LPARAM     = 1024,
+		RBBIM_HEADERSIZE = 2048
+	}
+
+	enum {
+		RB_HITTEST          = WM_USER + 8,
+		RB_GETRECT          = WM_USER + 9,
+		RB_IDTOINDEX        = WM_USER + 16,
+		RB_GETTOOLTIPS,
+		RB_SETTOOLTIPS,
+		RB_SETBKCOLOR,
+		RB_GETBKCOLOR,
+		RB_SETTEXTCOLOR,
+		RB_GETTEXTCOLOR,
+		RB_SIZETORECT,
+		RB_BEGINDRAG,
+		RB_ENDDRAG,
+		RB_DRAGMOVE,
+		RB_GETBARHEIGHT,
+		RB_GETBANDINFOW,
+		RB_GETBANDINFOA,
+		RB_MINIMIZEBAND,
+		RB_MAXIMIZEBAND, // = WM_USER + 31
+		RB_GETDROPTARGET    = CCM_GETDROPTARGET,
+		RB_GETBANDBORDERS   = WM_USER + 34,
+		RB_SHOWBAND         = WM_USER + 35,
+		RB_SETPALETTE       = WM_USER + 37,
+		RB_GETPALETTE       = WM_USER + 38,
+		RB_MOVEBAND         = WM_USER + 39,
+		RB_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,
+		RB_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT
+	}
+
+	enum {
+		RBN_GETOBJECT     = RBN_FIRST - 1,
+		RBN_LAYOUTCHANGED = RBN_FIRST - 2,
+		RBN_AUTOSIZE      = RBN_FIRST - 3,
+		RBN_BEGINDRAG     = RBN_FIRST - 4,
+		RBN_ENDDRAG       = RBN_FIRST - 5,
+		RBN_DELETINGBAND  = RBN_FIRST - 6,
+		RBN_DELETEDBAND   = RBN_FIRST - 7,
+		RBN_CHILDSIZE     = RBN_FIRST - 8
+	}
+
+	enum {
+		RBNM_ID     = 1,
+		RBNM_STYLE  = 2,
+		RBNM_LPARAM = 4
+	}
+
+	enum {
+		RBHT_NOWHERE = 1,
+		RBHT_CAPTION,
+		RBHT_CLIENT,
+		RBHT_GRABBER
+	}
+
+	version (Unicode) {
+		alias SB_SETTIPTEXTW SB_SETTIPTEXT;
+		alias SB_GETTIPTEXTW SB_GETTIPTEXT;
+		alias RB_GETBANDINFOW RB_GETBANDINFO;
+	} else {
+		alias SB_SETTIPTEXTA SB_SETTIPTEXT;
+		alias SB_GETTIPTEXTA SB_GETTIPTEXT;
+		alias RB_GETBANDINFOA RB_GETBANDINFO;
+	}
+} else {
+	enum {
+		RB_GETBANDINFO = WM_USER + 5
+	}
+}
+
+enum {
+	CBEM_INSERTITEMA = WM_USER + 1,
+	CBEM_SETIMAGELIST,
+	CBEM_GETIMAGELIST,
+	CBEM_GETITEMA,
+	CBEM_SETITEMA,
+	CBEM_GETCOMBOCONTROL,
+	CBEM_GETEDITCONTROL,
+	CBEM_SETEXSTYLE,
+	CBEM_GETEXSTYLE, // = WM_USER + 9)
+	CBEM_DELETEITEM  = CB_DELETESTRING
+}
+
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		CBEM_SETEXTENDEDSTYLE = WM_USER + 14,
+		CBEM_GETEXTENDEDSTYLE = WM_USER + 9,
+		CBEM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,
+		CBEM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT
+	}
+}
+
+enum {
+	CBEM_HASEDITCHANGED = WM_USER + 10,
+	CBEM_INSERTITEMW    = WM_USER + 11,
+	CBEM_SETITEMW       = WM_USER + 12,
+	CBEM_GETITEMW       = WM_USER + 13
+}
+
+enum {
+	DA_LAST = 0x7fffffff
+}
+
+enum {
+	DPA_APPEND = 0x7fffffff,
+	DPA_ERR    = -1
+}
+
+enum {
+	DSA_APPEND = 0x7fffffff,
+	DSA_ERR    = -1
+}
+
+enum {
+	DPAS_SORTED       = 1,
+	DPAS_INSERTBEFORE = 2,
+	DPAS_INSERTAFTER  = 4
+}
+
+static if (_WIN32_IE >= 0x400) {
+	enum {
+		WSB_PROP_CYVSCROLL = 1,
+		WSB_PROP_CXHSCROLL = 2,
+		WSB_PROP_CYHSCROLL = 4,
+		WSB_PROP_CXVSCROLL = 8,
+		WSB_PROP_CXHTHUMB  = 16,
+		WSB_PROP_CYVTHUMB  = 32,
+		WSB_PROP_VBKGCOLOR = 64,
+		WSB_PROP_HBKGCOLOR = 128,
+		WSB_PROP_VSTYLE    = 256,
+		WSB_PROP_HSTYLE    = 512,
+		WSB_PROP_WINSTYLE  = 1024,
+		WSB_PROP_PALETTE   = 2048,
+		WSB_PROP_MASK      = 0xfff,
+		FSB_FLAT_MODE      = 2,
+		FSB_ENCARTA_MODE   = 1,
+		FSB_REGULAR_MODE   = 0
+	}
+}
+
+static if (_WIN32_WINNT >= 0x0501) {
+	enum {
+		LIF_ITEMINDEX = 1,
+		LIF_STATE     = 2,
+		LIF_ITEMID    = 4,
+		LIF_URL	      = 8
+	}
+
+	enum {
+		LIS_FOCUSED = 1,
+		LIS_ENABLED = 2,
+		LIS_VISITED = 4
+	}
+
+	enum {
+		LM_HITTEST        = WM_USER + 768,
+		LM_GETIDEALHEIGHT,
+		LM_SETITEM,
+		LM_GETITEM     // = WM_USER + 771
+	}
+
+	const size_t MAX_LINKID_TEXT  =   48;
+	const size_t L_MAX_URL_LENGTH = 2084;
+}
+
+
+struct COMBOBOXEXITEMA {
+	UINT   mask;
+	int    iItem;
+	LPSTR  pszText;
+	int    cchTextMax;
+	int    iImage;
+	int    iSelectedImage;
+	int    iOverlay;
+	int    iIndent;
+	LPARAM lParam;
+}
+alias COMBOBOXEXITEMA*       PCOMBOBOXEXITEMA;
+alias CPtr!(COMBOBOXEXITEMA) PCCOMBOEXITEMA;
+
+struct COMBOBOXEXITEMW {
+	UINT   mask;
+	int    iItem;
+	LPWSTR pszText;
+	int    cchTextMax;
+	int    iImage;
+	int    iSelectedImage;
+	int    iOverlay;
+	int    iIndent;
+	LPARAM lParam;
+}
+alias COMBOBOXEXITEMW*       PCOMBOBOXEXITEMW;
+alias CPtr!(COMBOBOXEXITEMW) PCCOMBOEXITEMW;
+
+static if (_WIN32_IE >= 0x400) {
+	struct NMCOMBOBOXEXA {
+		NMHDR           hdr;
+		COMBOBOXEXITEMA ceItem;
+	}
+	alias NMCOMBOBOXEXA* PNMCOMBOBOXEXA;
+
+	struct NMCOMBOBOXEXW {
+		NMHDR           hdr;
+		COMBOBOXEXITEMW ceItem;
+	}
+	alias NMCOMBOBOXEXW* PNMCOMBOBOXEXW;
+
+	struct NMCBEDRAGBEGINW {
+		NMHDR hdr;
+		int   iItemid;
+		WCHAR szText[CBEMAXSTRLEN];
+	}
+	alias NMCBEDRAGBEGINW* LPNMCBEDRAGBEGINW, PNMCBEDRAGBEGINW;
+
+	struct NMCBEDRAGBEGINA {
+		NMHDR hdr;
+		int   iItemid;
+		char  szText[CBEMAXSTRLEN];
+	}
+	alias NMCBEDRAGBEGINA* LPNMCBEDRAGBEGINA, PNMCBEDRAGBEGINA;
+
+	struct NMIPADDRESS {
+		NMHDR hdr;
+		int   iField;
+		int   iValue;
+	}
+	alias NMIPADDRESS* LPNMIPADDRESS;
+
+	struct NMLVKEYDOWN {
+		NMHDR hdr;
+		WORD  wVKey;
+		UINT  flags;
+	}
+	alias NMLVKEYDOWN* LPNMLVKEYDOWN;
+
+	struct NMPGCALCSIZE {
+		NMHDR hdr;
+		DWORD dwFlag;
+		int   iWidth;
+		int   iHeight;
+	}
+	alias NMPGCALCSIZE* LPNMPGCALCSIZE;
+
+	struct NMPGSCROLL {
+		NMHDR hdr;
+		BOOL  fwKeys;
+		RECT  rcParent;
+		int   iDir;
+		int   iXpos;
+		int   iYpos;
+		int   iScroll;
+	}
+	alias NMPGSCROLL* LPNMPGSCROLL;
+
+	struct NMSELCHANGE {
+		NMHDR      nmhdr;
+		SYSTEMTIME stSelStart;
+		SYSTEMTIME stSelEnd;
+	}
+	alias NMSELCHANGE* LPNMSELCHANGE;
+
+	struct NMTBHOTITEM {
+		NMHDR hdr;
+		int   idOld;
+		int   idNew;
+		DWORD dwFlags;
+	}
+	alias NMTBHOTITEM* LPNMTBHOTITEM;
+
+	struct NMTBDISPINFOA {
+		NMHDR     hdr;
+		DWORD     dwMask;
+		int       idCommand;
+		DWORD_PTR lParam;
+		int       iImage;
+		LPSTR     pszText;
+		int       cchText;
+	}
+	alias NMTBDISPINFOA* LPNMTBDISPINFOA;
+
+	struct NMTBDISPINFOW {
+		NMHDR     hdr;
+		DWORD     dwMask;
+		int       idCommand;
+		DWORD_PTR lParam;
+		int       iImage;
+		LPWSTR    pszText;
+		int       cchText;
+	}
+	alias NMTBDISPINFOW* LPNMTBDISPINFOW;
+
+	struct NMTBGETINFOTIPA {
+		NMHDR  hdr;
+		LPSTR  pszText;
+		int    cchTextMax;
+		int    iItem;
+		LPARAM lParam;
+	}
+	alias NMTBGETINFOTIPA* LPNMTBGETINFOTIPA;
+
+	struct NMTBGETINFOTIPW {
+		NMHDR  hdr;
+		LPWSTR pszText;
+		int    cchTextMax;
+		int    iItem;
+		LPARAM lParam;
+	}
+	alias NMTBGETINFOTIPW* LPNMTBGETINFOTIPW;
+
+	struct NMMOUSE {
+		NMHDR     hdr;
+		DWORD_PTR dwItemSpec;
+		DWORD_PTR dwItemData;
+		POINT     pt;
+		LPARAM    dwHitInfo;
+	}
+	alias NMMOUSE* LPNMMOUSE;
+}
+
+static if (_WIN32_IE >= 0x401) {
+	struct NMTOOLTIPSCREATED {
+		NMHDR hdr;
+		HWND  hwndToolTips;
+	}
+	alias NMTOOLTIPSCREATED* LPNMTOOLTIPSCREATED;
+}
+
+struct NMDATETIMECHANGE {
+	NMHDR      nmhdr;
+	DWORD      dwFlags;
+	SYSTEMTIME st;
+}
+alias NMDATETIMECHANGE* LPNMDATETIMECHANGE;
+
+struct NMCBEENDEDITW {
+	NMHDR hdr;
+	BOOL  fChanged;
+	int   iNewSelection;
+	WCHAR szText[CBEMAXSTRLEN];
+	int   iWhy;
+}
+alias NMCBEENDEDITW* LPNMCBEENDEDITW, PNMCBEENDEDITW;
+
+struct NMCBEENDEDITA {
+	NMHDR hdr;
+	BOOL  fChanged;
+	int   iNewSelection;
+	char  szText[CBEMAXSTRLEN];
+	int   iWhy;
+}
+alias NMCBEENDEDITA* LPNMCBEENDEDITA, PNMCBEENDEDITA;
+
+struct COLORMAP {
+	COLORREF from;
+	COLORREF to;
+}
+alias COLORMAP* LPCOLORMAP;
+
+struct DRAGLISTINFO {
+	UINT  uNotification;
+	HWND  hWnd;
+	POINT ptCursor;
+}
+alias DRAGLISTINFO* LPDRAGLISTINFO;
+
+struct TBBUTTON {
+	int   iBitmap;
+	int   idCommand;
+	BYTE  fsState;
+	BYTE  fsStyle;
+	BYTE  bReserved[2];
+	DWORD dwData;
+	int   iString;
+}
+alias TBBUTTON*       PTBBUTTON, LPTBBUTTON;
+alias CPtr!(TBBUTTON) LPCTBBUTTON;
+
+static if (_WIN32_IE >= 0x400) {
+	struct TBBUTTONINFOA {
+		UINT  cbSize = TBBUTTONINFOA.sizeof;
+		DWORD dwMask;
+		int   idCommand;
+		int   iImage;
+		BYTE  fsState;
+		BYTE  fsStyle;
+		WORD  cx;
+		DWORD lParam;
+		LPSTR pszText;
+		int   cchText;
+	}
+	alias TBBUTTONINFOA* LPTBBUTTONINFOA;
+
+	struct TBBUTTONINFOW {
+		UINT   cbSize = TBBUTTONINFOW.sizeof;
+		DWORD  dwMask;
+		int    idCommand;
+		int    iImage;
+		BYTE   fsState;
+		BYTE   fsStyle;
+		WORD   cx;
+		DWORD  lParam;
+		LPWSTR pszText;
+		int    cchText;
+	}
+	alias TBBUTTONINFOW* LPTBBUTTONINFOW;
+
+	struct TBINSERTMARK {
+		int   iButton;
+		DWORD dwFlags;
+	}
+	alias TBINSERTMARK* LPTBINSERTMARK;
+
+	struct LVBKIMAGEA {
+		ULONG   ulFlags;
+		HBITMAP hbm;
+		LPSTR   pszImage;
+		UINT    cchImageMax;
+		int     xOffsetPercent;
+		int     yOffsetPercent;
+	}
+	alias LVBKIMAGEA* LPLVBKIMAGEA;
+
+	struct LVBKIMAGEW {
+		ULONG   ulFlags;
+		HBITMAP hbm;
+		LPWSTR  pszImage;
+		UINT    cchImageMax;
+		int     xOffsetPercent;
+		int     yOffsetPercent;
+	}
+	alias LVBKIMAGEW* LPLVBKIMAGEW;
+}
+
+/*struct TBNOTIFY {
+	NMHDR    hdr;
+	int      iItem;
+	TBBUTTON tbButton;
+	int      cchText;
+	LPTSTR   pszText;
+}
+alias TBNOTIFY* LPTBNOTIFY;
+*/
+
+/*struct TBSAVEPARAMS {
+	HKEY    hkr;
+	LPCTSTR pszSubKey;
+	LPCTSTR pszValueName;
+}*/
+
+struct IMAGEINFO {
+	HBITMAP hbmImage;
+	HBITMAP hbmMask;
+	int     Unused1;
+	int     Unused2;
+	RECT    rcImage;
+}
+alias IMAGEINFO* LPIMAGEINFO;
+
+alias HANDLE HIMAGELIST;
+
+static if (_WIN32_IE >= 0x500) {
+	struct HDITEMA {
+		UINT    mask;
+		int     cxy;
+		LPSTR   pszText;
+		HBITMAP hbm;
+		int     cchTextMax;
+		int     fmt;
+		LPARAM  lParam;
+		int     iImage;
+		int     iOrder;
+		UINT    type;
+		LPVOID  pvFilter;
+	}
+
+	struct HDITEMW {
+		UINT    mask;
+		int     cxy;
+		LPWSTR  pszText;
+		HBITMAP hbm;
+		int     cchTextMax;
+		int     fmt;
+		LPARAM  lParam;
+		int     iImage;
+		int     iOrder;
+		UINT    type;
+		LPVOID  pvFilter;
+	}
+} else static if (_WIN32_IE >= 0x300) {
+	struct HDITEMA {
+		UINT    mask;
+		int     cxy;
+		LPSTR   pszText;
+		HBITMAP hbm;
+		int     cchTextMax;
+		int     fmt;
+		LPARAM  lParam;
+		int     iImage;
+		int     iOrder;
+	}
+
+	struct HDITEMW {
+		UINT    mask;
+		int     cxy;
+		LPWSTR  pszText;
+		HBITMAP hbm;
+		int     cchTextMax;
+		int     fmt;
+		LPARAM  lParam;
+		int     iImage;
+		int     iOrder;
+	}
+} else {
+	struct HDITEMA {
+		UINT    mask;
+		int     cxy;
+		LPSTR   pszText;
+		HBITMAP hbm;
+		int     cchTextMax;
+		int     fmt;
+		LPARAM  lParam;
+	}
+
+	struct HDITEMW {
+		UINT    mask;
+		int     cxy;
+		LPWSTR  pszText;
+		HBITMAP hbm;
+		int     cchTextMax;
+		int     fmt;
+		LPARAM  lParam;
+	}
+}
+alias HDITEMA* LPHDITEMA;
+alias HDITEMW* LPHDITEMW;
+
+deprecated {
+	alias HDITEMA HD_ITEMA;
+	alias HDITEMW HD_ITEMW;
+	//alias HDITEM HD_ITEM; fixme
+}
+
+struct HD_LAYOUT {
+	RECT*      prc;
+	WINDOWPOS* pwpos;
+}
+alias HDLAYOUT* LPHDLAYOUT;
+deprecated alias HD_LAYOUT HDLAYOUT;
+
+struct HD_HITTESTINFO {
+	POINT pt;
+	UINT  flags;
+	int   iItem;
+}
+alias HD_HITTESTINFO* LPHDHITTESTINFO;
+
+struct HD_NOTIFYA {
+	NMHDR    hdr;
+	int      iItem;
+	int      iButton;
+	HDITEMA* pitem;
+}
+
+struct HD_NOTIFYW {
+	NMHDR    hdr;
+	int      iItem;
+	int      iButton;
+	HDITEMW* pitem;
+}
+
+/* FIXME: NMHEADER structure (base for all events of the comctl controls)
+   is the same as HD_NOTIFY depending on the value of _WIN32_IE macro.
+   I'm defining both for now. */
+struct NMHEADERA {
+	NMHDR    hdr;
+	int      iItem;
+	int      iButton;
+	HDITEMA* pitem;
+}
+alias NMHEADERA* LPNMHEADERA;
+
+struct NMHEADERW {
+	NMHDR    hdr;
+	int      iItem;
+	int      iButton;
+	HDITEMW* pitem;
+}
+alias NMHEADERW* LPNMHEADERW;
+
+version (Unicode) {
+	alias NMHEADERW NMHEADER;
+	alias LPNMHEADERW LPNMHEADER;
+} else {
+	alias NMHEADERA NMHEADER;
+	alias LPNMHEADERA LPNMHEADER;
+}
+// End FIXME
+
+struct NMHDDISPINFOA {
+	NMHDR  hdr;
+	int    iItem;
+	UINT   mask;
+	LPSTR  pszText;
+	int    cchTextMax;
+	int    iImage;
+	LPARAM lParam;
+}
+alias NMHDDISPINFOA* LPNMHDDISPINFOA;
+
+struct NMHDDISPINFOW {
+	NMHDR  hdr;
+	int    iItem;
+	UINT   mask;
+	LPWSTR pszText;
+	int    cchTextMax;
+	int    iImage;
+	LPARAM lParam;
+}
+alias NMHDDISPINFOW* LPNMHDDISPINFOW;
+
+struct NMCUSTOMDRAW {
+	NMHDR  hdr;
+	DWORD  dwDrawStage;
+	HDC    hdc;
+	RECT   rc;
+	DWORD  dwItemSpec;
+	UINT   uItemState;
+	LPARAM lItemlParam;
+}
+alias NMCUSTOMDRAW* LPNMCUSTOMDRAW;
+
+static if (_WIN32_IE >= 0x400) {
+	struct NMLVCUSTOMDRAW {
+		NMCUSTOMDRAW nmcd;
+		COLORREF     clrText;
+		COLORREF     clrTextBk;
+		int          iSubItem;
+	}
+} else {
+	struct NMLVCUSTOMDRAW {
+		NMCUSTOMDRAW nmcd;
+		COLORREF     clrText;
+		COLORREF     clrTextBk;
+	}
+}
+alias NMLVCUSTOMDRAW* LPNMLVCUSTOMDRAW;
+
+static if (_WIN32_IE >= 0x400) {
+	struct NMLVGETINFOTIPA {
+		NMHDR  hdr;
+		DWORD  dwFlags;
+		LPSTR  pszText;
+		int    cchTextMax;
+		int    iItem;
+		int    iSubItem;
+		LPARAM lParam;
+	}
+	alias NMLVGETINFOTIPA* LPNMLVGETINFOTIPA;
+
+	struct NMLVGETINFOTIPW {
+		NMHDR  hdr;
+		DWORD  dwFlags;
+		LPWSTR pszText;
+		int    cchTextMax;
+		int    iItem;
+		int    iSubItem;
+		LPARAM lParam;
+	}
+	alias NMLVGETINFOTIPW* LPNMLVGETINFOTIPW;
+}
+
+static if (_WIN32_IE >= 0x400) {
+	struct NMTVCUSTOMDRAW {
+		NMCUSTOMDRAW nmcd;
+		COLORREF     clrText;
+		COLORREF     clrTextBk;
+		int          iLevel;
+	}
+} else {
+	struct NMTVCUSTOMDRAW {
+		NMCUSTOMDRAW nmcd;
+		COLORREF     clrText;
+		COLORREF     clrTextBk;
+	}
+}
+alias NMTVCUSTOMDRAW* LPNMTVCUSTOMDRAW;
+
+static if (_WIN32_IE >= 0x400) {
+	static if (_WIN32_WINNT >= 0x501) {
+		struct NMTBCUSTOMDRAW {
+			NMCUSTOMDRAW nmcd;
+			HBRUSH       hbrMonoDither;
+			HBRUSH       hbrLines;
+			HPEN         hpenLines;
+			COLORREF     clrText;
+			COLORREF     clrMark;
+			COLORREF     clrTextHighlight;
+			COLORREF     clrBtnFace;
+			COLORREF     clrBtnHighlight;
+			COLORREF     clrHighlightHotTrack;
+			RECT         rcText;
+			int          nStringBkMode;
+			int          nHLStringBkMode;
+			int          iListGap;
+		}
+	} else {
+		struct NMTBCUSTOMDRAW {
+			NMCUSTOMDRAW nmcd;
+			HBRUSH       hbrMonoDither;
+			HBRUSH       hbrLines;
+			HPEN         hpenLines;
+			COLORREF     clrText;
+			COLORREF     clrMark;
+			COLORREF     clrTextHighlight;
+			COLORREF     clrBtnFace;
+			COLORREF     clrBtnHighlight;
+			COLORREF     clrHighlightHotTrack;
+			RECT         rcText;
+			int          nStringBkMode;
+			int          nHLStringBkMode;
+		}
+	}
+	alias NMTBCUSTOMDRAW* LPNMTBCUSTOMDRAW;
+
+	struct NMITEMACTIVATE {
+		NMHDR  hdr;
+		int    iItem;
+		int    iSubItem;
+		UINT   uNewState;
+		UINT   uOldState;
+		UINT   uChanged;
+		POINT  ptAction;
+		LPARAM lParam;
+		UINT   uKeyFlags;
+	}
+	alias NMITEMACTIVATE* LPNMITEMACTIVATE;
+}
+
+struct TBADDBITMAP {
+	HINSTANCE hInst;
+	UINT      nID;
+}
+alias TBADDBITMAP* LPTBADDBITMAP;
+
+struct TBSAVEPARAMSA {
+	HKEY   hkr;
+	LPCSTR pszSubKey;
+	LPCSTR pszValueName;
+}
+
+struct TBSAVEPARAMSW {
+	HKEY    hkr;
+	LPCWSTR pszSubKey;
+	LPCWSTR pszValueName;
+}
+
+struct TBREPLACEBITMAP {
+	HINSTANCE hInstOld;
+	UINT      nIDOld;
+	HINSTANCE hInstNew;
+	UINT      nIDNew;
+	int       nButtons;
+}
+alias TBREPLACEBITMAP* LPTBREPLACEBITMAP;
+
+static if (_WIN32_IE >= 0x500) {
+	struct NMTOOLBARA {
+		NMHDR    hdr;
+		int      iItem;
+		TBBUTTON tbButton;
+		int      cchText;
+		LPSTR    pszText;
+		RECT     rcButton;
+	}
+
+	struct NMTOOLBARW {
+		NMHDR    hdr;
+		int      iItem;
+		TBBUTTON tbButton;
+		int      cchText;
+		LPWSTR   pszText;
+		RECT     rcButton;
+	}
+} else {
+	struct NMTOOLBARA {
+		NMHDR    hdr;
+		int      iItem;
+		TBBUTTON tbButton;
+		int      cchText;
+		LPSTR    pszText;
+	}
+
+	struct NMTOOLBARW {
+		NMHDR    hdr;
+		int      iItem;
+		TBBUTTON tbButton;
+		int      cchText;
+		LPWSTR   pszText;
+	}
+}
+alias NMTOOLBARA* LPNMTOOLBARA;
+alias NMTOOLBARW* LPNMTOOLBARW;
+
+alias NMTOOLBARA TBNOTIFYA;
+alias LPNMTOOLBARA LPTBNOTIFYA;
+
+alias NMTOOLBARW TBNOTIFYW;
+alias LPNMTOOLBARW LPTBNOTIFYW;
+
+static if (_WIN32_WINNT >= 0x501) {
+	struct TOOLINFOA {
+		UINT      cbSize = TOOLINFOA.sizeof;
+		UINT      uFlags;
+		HWND      hwnd;
+		UINT      uId;
+		RECT      rect;
+		HINSTANCE hinst;
+		LPSTR     lpszText;
+		LPARAM    lParam;
+		void*     lpReserved;
+	}
+
+	struct TOOLINFOW {
+		UINT      cbSize = TOOLINFOW.sizeof;
+		UINT      uFlags;
+		HWND      hwnd;
+		UINT      uId;
+		RECT      rect;
+		HINSTANCE hinst;
+		LPWSTR    lpszText;
+		LPARAM    lParam;
+		void*     lpReserved;
+	}
+
+	const size_t
+		TTTOOLINFOA_V1_SIZE = TOOLINFOA.lParam.offsetof,
+		TTTOOLINFOW_V1_SIZE = TOOLINFOW.lParam.offsetof,
+		TTTOOLINFOA_V2_SIZE = TOOLINFOA.lpReserved.offsetof,
+		TTTOOLINFOW_V2_SIZE = TOOLINFOW.lpReserved.offsetof,
+		TTTOOLINFOA_V3_SIZE = TOOLINFOA.sizeof,
+		TTTOOLINFOW_V3_SIZE = TOOLINFOW.sizeof;
+} else static if (_WIN32_IE >= 0x300) {
+	struct TOOLINFOA {
+		UINT      cbSize = TOOLINFOA.sizeof;
+		UINT      uFlags;
+		HWND      hwnd;
+		UINT      uId;
+		RECT      rect;
+		HINSTANCE hinst;
+		LPSTR     lpszText;
+		LPARAM    lParam;
+	}
+
+	struct TOOLINFOW {
+		UINT      cbSize = TOOLINFOW.sizeof;
+		UINT      uFlags;
+		HWND      hwnd;
+		UINT      uId;
+		RECT      rect;
+		HINSTANCE hinst;
+		LPWSTR    lpszText;
+		LPARAM    lParam;
+	}
+
+	const size_t
+		TTTOOLINFOA_V1_SIZE = TOOLINFOA.lParam.offsetof,
+		TTTOOLINFOW_V1_SIZE = TOOLINFOW.lParam.offsetof,
+		TTTOOLINFOA_V2_SIZE = TOOLINFOA.sizeof,
+		TTTOOLINFOW_V2_SIZE = TOOLINFOW.sizeof;
+} else {
+	struct TOOLINFOA {
+		UINT      cbSize = TOOLINFOA.sizeof;
+		UINT      uFlags;
+		HWND      hwnd;
+		UINT      uId;
+		RECT      rect;
+		HINSTANCE hinst;
+		LPSTR     lpszText;
+	}
+
+	struct TOOLINFOW {
+		UINT      cbSize = TOOLINFOW.sizeof;
+		UINT      uFlags;
+		HWND      hwnd;
+		UINT      uId;
+		RECT      rect;
+		HINSTANCE hinst;
+		LPWSTR    lpszText;
+	}
+
+	const size_t
+		TTTOOLINFOA_V1_SIZE = TOOLINFOA.sizeof,
+		TTTOOLINFOW_V1_SIZE = TOOLINFOW.sizeof;
+}
+alias TOOLINFOA TTTOOLINFOA;
+alias TOOLINFOW TTTOOLINFOW;
+alias TTTOOLINFOA* LPTTTOOLINFOA, PTOOLINFOA, LPTOOLINFOA;
+alias TTTOOLINFOW* LPTTTOOLINFOW, PTOOLINFOW, LPTOOLINFOW;
+
+struct TTHITTESTINFOA {
+	HWND      hwnd;
+	POINT     pt;
+	TOOLINFOA ti;
+}
+alias TTHITTESTINFOA* LPTTHITTESTINFOA, LPHITTESTINFOA;
+
+struct TTHITTESTINFOW {
+	HWND      hwnd;
+	POINT     pt;
+	TOOLINFOW ti;
+}
+alias TTHITTESTINFOW* LPTTHITTESTINFOW, LPHITTESTINFOW;
+
+static if (_WIN32_IE >= 0x300) {
+	struct NMTTDISPINFOA {
+		NMHDR     hdr;
+		LPSTR     lpszText;
+		char      szText[80];
+		HINSTANCE hinst;
+		UINT      uFlags;
+		LPARAM    lParam;
+	}
+
+	struct NMTTDISPINFOW {
+		NMHDR     hdr;
+		LPWSTR    lpszText;
+		WCHAR     szText[80];
+		HINSTANCE hinst;
+		UINT      uFlags;
+		LPARAM    lParam;
+	}
+} else {
+	struct NMTTDISPINFOA {
+		NMHDR     hdr;
+		LPSTR     lpszText;
+		char      szText[80];
+		HINSTANCE hinst;
+		UINT      uFlags;
+	}
+
+	struct NMTTDISPINFOW {
+		NMHDR     hdr;
+		LPWSTR    lpszText;
+		WCHAR     szText[80];
+		HINSTANCE hinst;
+		UINT      uFlags;
+	}
+}
+alias NMTTDISPINFOA* LPNMTTDISPINFOA;
+alias NMTTDISPINFOW* LPNMTTDISPINFOW;
+alias NMTTDISPINFOA TOOLTIPTEXTA;
+alias LPNMTTDISPINFOA LPTOOLTIPTEXTA;
+alias NMTTDISPINFOW TOOLTIPTEXTW;
+alias LPNMTTDISPINFOW LPTOOLTIPTEXTW;
+
+struct UDACCEL {
+	UINT nSec;
+	UINT nInc;
+}
+alias UDACCEL* LPUDACCEL;
+
+struct NMUPDOWN {
+	NMHDR hdr;
+	int   iPos;
+	int   iDelta;
+}
+alias NMUPDOWN* LPNMUPDOWN;
+
+deprecated {
+	alias NMUPDOWN NM_UPDOWN;
+	alias LPNMUPDOWN LPNM_UPDOWN;
+}
+
+static if (_WIN32_WINNT >= 0x501) {
+	struct LVITEMA {
+		UINT   mask;
+		int    iItem;
+		int    iSubItem;
+		UINT   state;
+		UINT   stateMask;
+		LPSTR  pszText;
+		int    cchTextMax;
+		int    iImage;
+		LPARAM lParam;
+		int    iIndent;
+		int    iGroupId;
+		UINT   cColumns;
+		PUINT  puColumns;
+	}
+
+	struct LVITEMW {
+		UINT   mask;
+		int    iItem;
+		int    iSubItem;
+		UINT   state;
+		UINT   stateMask;
+		LPWSTR pszText;
+		int    cchTextMax;
+		int    iImage;
+		LPARAM lParam;
+		int    iIndent;
+		int    iGroupId;
+		UINT   cColumns;
+		PUINT  puColumns;
+	}
+} else static if (_WIN32_IE >= 0x300) {
+	struct LVITEMA {
+		UINT   mask;
+		int    iItem;
+		int    iSubItem;
+		UINT   state;
+		UINT   stateMask;
+		LPSTR  pszText;
+		int    cchTextMax;
+		int    iImage;
+		LPARAM lParam;
+		int    iIndent;
+	}
+
+	struct LVITEMW {
+		UINT   mask;
+		int    iItem;
+		int    iSubItem;
+		UINT   state;
+		UINT   stateMask;
+		LPWSTR pszText;
+		int    cchTextMax;
+		int    iImage;
+		LPARAM lParam;
+		int    iIndent;
+	}
+} else {
+	struct LVITEMA {
+		UINT   mask;
+		int    iItem;
+		int    iSubItem;
+		UINT   state;
+		UINT   stateMask;
+		LPSTR  pszText;
+		int    cchTextMax;
+		int    iImage;
+		LPARAM lParam;
+	}
+
+	struct LVITEMW {
+		UINT   mask;
+		int    iItem;
+		int    iSubItem;
+		UINT   state;
+		UINT   stateMask;
+		LPWSTR pszText;
+		int    cchTextMax;
+		int    iImage;
+		LPARAM lParam;
+	}
+}
+alias LVITEMA* LPLVITEMA;
+alias LVITEMW* LPLVITEMW;
+alias LVITEMA LV_ITEMA;
+alias LVITEMW LV_ITEMW;
+
+struct LVFINDINFOA {
+	UINT   flags;
+	LPCSTR psz;
+	LPARAM lParam;
+	POINT  pt;
+	UINT   vkDirection;
+}
+
+struct LVFINDINFOW {
+	UINT    flags;
+	LPCWSTR psz;
+	LPARAM  lParam;
+	POINT   pt;
+	UINT    vkDirection;
+}
+
+alias LVFINDINFOA* LPFINDINFOA;
+alias LVFINDINFOA LV_FINDINFOA;
+alias LVFINDINFOW* LPFINDINFOW;
+alias LVFINDINFOW LV_FINDINFOW;
+
+struct NMLVFINDITEMA {
+	NMHDR       hdr;
+	int         iStart;
+	LVFINDINFOA lvfi;
+}
+
+struct NMLVFINDITEMW {
+	NMHDR       hdr;
+	int         iStart;
+	LVFINDINFOW lvfi;
+}
+
+alias NMLVFINDITEMA* PNMLVFINDITEMA, LPNMLVFINDITEMA;
+alias NMLVFINDITEMW* PNMLVFINDITEMW, LPNMLVFINDITEMW;
+
+static if (_WIN32_IE >= 0x300) {
+	struct LVHITTESTINFO {
+		POINT pt;
+		UINT  flags;
+		int   iItem;
+		int   iSubItem;
+	}
+} else {
+	struct LVHITTESTINFO {
+		POINT pt;
+		UINT  flags;
+		int   iItem;
+	}
+}
+alias LVHITTESTINFO* LPLVHITTESTINFO;
+alias LVHITTESTINFO LV_HITTESTINFO;
+
+static if (_WIN32_IE >= 0x300) {
+	struct LVCOLUMNA {
+		UINT  mask;
+		int   fmt;
+		int   cx;
+		LPSTR pszText;
+		int   cchTextMax;
+		int   iSubItem;
+		int   iImage;
+		int   iOrder;
+	}
+	struct LVCOLUMNW {
+		UINT   mask;
+		int    fmt;
+		int    cx;
+		LPWSTR pszText;
+		int    cchTextMax;
+		int    iSubItem;
+		int    iImage;
+		int    iOrder;
+	}
+} else {
+	struct LVCOLUMNA {
+		UINT  mask;
+		int   fmt;
+		int   cx;
+		LPSTR pszText;
+		int   cchTextMax;
+		int   iSubItem;
+	}
+	struct LVCOLUMNW {
+		UINT   mask;
+		int    fmt;
+		int    cx;
+		LPWSTR pszText;
+		int    cchTextMax;
+		int    iSubItem;
+	}
+}
+alias LVCOLUMNA* LPLVCOLUMNA;
+alias LVCOLUMNW* LPLVCOLUMNW;
+alias LVCOLUMNA LV_COLUMNA;
+alias LVCOLUMNW LV_COLUMNW;
+
+static if (_WIN32_WINNT >= 0x501) {
+	/*	SG: The definitions in this static if block are from the MSDN docs.
+	 *	They are not in MinGW, but nonetheless required for macros that are.
+	 */
+	struct LVGROUP {
+		UINT    cbSize = LVGROUP.sizeof;
+		UINT    mask;
+		LPWSTR  pszHeader;
+		int     cchHeader;
+		LPWSTR  pszFooter;
+		int     cchFooter;
+		int     iGroupId;
+		UINT    stateMask;
+		UINT    state;
+		UINT    uAlign;
+		static if (_WIN32_WINNT >= 0x600) {
+			LPWSTR  pszSubtitle;
+			UINT    cchSubtitle;
+			LPWSTR  pszTask;
+			UINT    cchTask;
+			LPWSTR  pszDescriptionTop;
+			UINT    cchDescriptionTop;
+			LPWSTR  pszDescriptionBottom;
+			UINT    cchDescriptionBottom;
+			int     iTitleImage;
+			int     iExtendedImage;
+			int     iFirstItem;         // Read only
+			UINT    cItems;             // Read only
+			LPWSTR  pszSubsetTitle;     // NULL if group is not subset
+			UINT    cchSubsetTitle;
+		}
+	}
+	alias LVGROUP* PLVGROUP;
+
+	struct LVGROUPMETRICS {
+		UINT     cbSize = LVGROUPMETRICS.sizeof;
+		UINT     mask;
+		UINT     Left;
+		UINT     Top;
+		UINT     Right;
+		UINT     Bottom;
+		COLORREF crLeft;
+		COLORREF crTop;
+		COLORREF crRight;
+		COLORREF crBottom;
+		COLORREF crHeader;
+		COLORREF crFooter;
+	}
+	alias LVGROUPMETRICS* PLVGROUPMETRICS;
+
+	struct LVINSERTMARK {
+		UINT  cbSize = LVINSERTMARK.sizeof;
+		DWORD dwFlags;
+		int   iItem;
+		DWORD dwReserved;
+	}
+	alias LVINSERTMARK* PLVINSERTMARK;
+
+	struct LVTILEINFO {
+		UINT     cbSize = LVTILEINFO.sizeof;
+		int      iItem;
+		UINT     cColumns;
+		PUINT    puColumns;
+		static if (_WIN32_WINNT >= 0x600) {
+			int* piColFmt;
+		}
+	}
+	alias LVTILEINFO* PLVTILEINFO;
+
+	struct LVTILEVIEWINFO {
+		UINT  cbSize = LVTILEVIEWINFO.sizeof;
+		DWORD dwMask;
+		DWORD dwFlags;
+		SIZE  sizeTile;
+		int   cLines;
+		RECT  rcLabelMargin;
+	}
+	alias LVTILEVIEWINFO* PLVTILEVIEWINFO;
+
+	struct LVINSERTGROUPSORTED {
+		PFNLVGROUPCOMPARE pfnGroupCompare;
+		LPVOID* pvData;
+		LVGROUP lvGroup;
+	}
+	alias LVINSERTGROUPSORTED* PLVINSERTGROUPSORTED;
+
+	alias int function(INT, INT, VOID*) PFNLVGROUPCOMPARE;
+
+	struct LVSETINFOTIP {
+		UINT    cbSize = LVSETINFOTIP.sizeof;
+		DWORD   dwFlags;
+		LPWSTR  pszText;
+		int     iItem;
+		int     iSubItem;
+		HBITMAP hbmp;
+	}
+	alias LVSETINFOTIP* PLVSETINFOTIP;
+}
+
+alias int function(LPARAM, LPARAM, LPARAM) PFNLVCOMPARE;
+
+struct NMLISTVIEW {
+	NMHDR  hdr;
+	int    iItem;
+	int    iSubItem;
+	UINT   uNewState;
+	UINT   uOldState;
+	UINT   uChanged;
+	POINT  ptAction;
+	LPARAM lParam;
+}
+alias NMLISTVIEW* LPNMLISTVIEW;
+
+deprecated {
+	alias NMLISTVIEW NM_LISTVIEW;
+	alias LPNMLISTVIEW LPNM_LISTVIEW;
+}
+
+struct NMLVDISPINFOA {
+	NMHDR    hdr;
+	LV_ITEMA item;
+}
+alias NMLVDISPINFOA* LPNMLVDISPINFOA;
+alias NMLVDISPINFOA LV_DISPINFOA;
+
+struct NMLVDISPINFOW {
+	NMHDR    hdr;
+	LV_ITEMW item;
+}
+alias NMLVDISPINFOW* LPNMLVDISPINFOW;
+alias NMLVDISPINFOW LV_DISPINFOW;
+
+struct LV_KEYDOWN {
+	NMHDR hdr;
+	WORD  wVKey;
+	UINT  flags;
+}
+
+struct NMLVCACHEHINT {
+	NMHDR hdr;
+	int   iFrom;
+	int   iTo;
+}
+alias NMLVCACHEHINT* LPNMLVCACHEHINT, PNM_CACHEHINT, LPNM_CACHEHINT;
+alias NMLVCACHEHINT NM_CACHEHINT;
+
+struct TVITEMA {
+	UINT      mask;
+	HTREEITEM hItem;
+	UINT      state;
+	UINT      stateMask;
+	LPSTR     pszText;
+	int       cchTextMax;
+	int       iImage;
+	int       iSelectedImage;
+	int       cChildren;
+	LPARAM    lParam;
+}
+alias TVITEMA* LPTVITEMA, LPTV_ITEMA;
+alias TVITEMA TV_ITEMA;
+
+struct TVITEMW {
+	UINT      mask;
+	HTREEITEM hItem;
+	UINT      state;
+	UINT      stateMask;
+	LPWSTR    pszText;
+	int       cchTextMax;
+	int       iImage;
+	int       iSelectedImage;
+	int       cChildren;
+	LPARAM    lParam;
+}
+alias TVITEMW* LPTVITEMW, LPTV_ITEMW;
+alias TVITEMW TV_ITEMW;
+
+static if (_WIN32_IE >= 0x400) {
+	struct TVITEMEXA {
+		UINT      mask;
+		HTREEITEM hItem;
+		UINT      state;
+		UINT      stateMask;
+		LPSTR     pszText;
+		int       cchTextMax;
+		int       iImage;
+		int       iSelectedImage;
+		int       cChildren;
+		LPARAM    lParam;
+		int       iIntegral;
+	}
+	alias TVITEMEXA* LPTVITEMEXA;
+
+	struct TVITEMEXW {
+		UINT      mask;
+		HTREEITEM hItem;
+		UINT      state;
+		UINT      stateMask;
+		LPWSTR    pszText;
+		int       cchTextMax;
+		int       iImage;
+		int       iSelectedImage;
+		int       cChildren;
+		LPARAM    lParam;
+		int       iIntegral;
+	}
+	alias TVITEMEXW* LPTVITEMEXW;
+}
+
+static if (_WIN32_IE >= 0x400) {
+	struct TVINSERTSTRUCTA {
+		HTREEITEM hParent;
+		HTREEITEM hInsertAfter;
+		union {
+			TVITEMEXA itemex;
+			TV_ITEMA  item;
+		}
+	}
+
+	struct TVINSERTSTRUCTW {
+		HTREEITEM hParent;
+		HTREEITEM hInsertAfter;
+		union {
+			TVITEMEXW itemex;
+			TV_ITEMW  item;
+		}
+	}
+} else {
+	struct TVINSERTSTRUCTA {
+		HTREEITEM hParent;
+		HTREEITEM hInsertAfter;
+		TV_ITEMA  item;
+	}
+
+	struct TVINSERTSTRUCTW {
+		HTREEITEM hParent;
+		HTREEITEM hInsertAfter;
+		TV_ITEMW  item;
+	}
+}
+alias TVINSERTSTRUCTA* LPTVINSERTSTRUCTA, LPTV_INSERTSTRUCTA;
+alias TVINSERTSTRUCTA TV_INSERTSTRUCTA;
+alias TVINSERTSTRUCTW* LPTVINSERTSTRUCTW, LPTV_INSERTSTRUCTW;
+alias TVINSERTSTRUCTW TV_INSERTSTRUCTW;
+
+struct TVHITTESTINFO {
+	POINT     pt;
+	UINT      flags;
+	HTREEITEM hItem;
+}
+alias TVHITTESTINFO* LPTVHITTESTINFO, LPTV_HITTESTINFO;
+alias TVHITTESTINFO TV_HITTESTINFO;
+
+alias int function(LPARAM, LPARAM, LPARAM) PFNTVCOMPARE;
+struct TVSORTCB {
+	HTREEITEM    hParent;
+	PFNTVCOMPARE lpfnCompare;
+	LPARAM       lParam;
+}
+alias TVSORTCB* LPTVSORTCB, LPTV_SORTCB;
+alias TVSORTCB TV_SORTCB;
+
+struct NMTREEVIEWA {
+	NMHDR    hdr;
+	UINT     action;
+	TV_ITEMA itemOld;
+	TV_ITEMA itemNew;
+	POINT    ptDrag;
+}
+alias NMTREEVIEWA* LPNMTREEVIEWA, LPNM_TREEVIEWA;
+alias NMTREEVIEWA NM_TREEVIEWA;
+
+struct NMTREEVIEWW {
+	NMHDR    hdr;
+	UINT     action;
+	TV_ITEMW itemOld;
+	TV_ITEMW itemNew;
+	POINT    ptDrag;
+}
+alias NMTREEVIEWW* LPNMTREEVIEWW, LPNM_TREEVIEWW;
+alias NMTREEVIEWW NM_TREEVIEWW;
+
+struct NMTVDISPINFOA {
+	NMHDR   hdr;
+	TVITEMA item;
+}
+alias NMTVDISPINFOA* LPNMTVDISPINFOA;
+alias NMTVDISPINFOA TV_DISPINFOA;
+
+struct NMTVDISPINFOW {
+	NMHDR   hdr;
+	TVITEMW item;
+}
+alias NMTVDISPINFOW* LPNMTVDISPINFOW;
+alias NMTVDISPINFOW TV_DISPINFOW;
+
+static if (_WIN32_IE >= 0x400) {
+	struct NMTVGETINFOTIPA {
+		NMHDR     hdr;
+		LPSTR     pszText;
+		int       cchTextMax;
+		HTREEITEM hItem;
+		LPARAM    lParam;
+	}
+	alias NMTVGETINFOTIPA* LPNMTVGETINFOTIPA;
+
+	struct NMTVGETINFOTIPW {
+		NMHDR     hdr;
+		LPWSTR    pszText;
+		int       cchTextMax;
+		HTREEITEM hItem;
+		LPARAM    lParam;
+	}
+	alias NMTVGETINFOTIPW* LPNMTVGETINFOTIPW;
+}
+
+struct TV_KEYDOWN {
+	NMHDR hdr;
+	WORD  wVKey;
+	UINT  flags;
+}
+
+struct TC_ITEMHEADERA {
+	UINT  mask;
+	UINT  lpReserved1;
+	UINT  lpReserved2;
+	LPSTR pszText;
+	int   cchTextMax;
+	int   iImage;
+}
+
+struct TC_ITEMHEADERW {
+	UINT   mask;
+	UINT   lpReserved1;
+	UINT   lpReserved2;
+	LPWSTR pszText;
+	int    cchTextMax;
+	int    iImage;
+}
+
+static if (_WIN32_IE >= 0x300) {
+	struct TCITEMA {
+		UINT   mask;
+		DWORD  dwState;
+		DWORD  dwStateMask;
+		LPSTR  pszText;
+		int    cchTextMax;
+		int    iImage;
+		LPARAM lParam;
+	}
+
+	struct TCITEMW {
+		UINT   mask;
+		DWORD  dwState;
+		DWORD  dwStateMask;
+		LPWSTR pszText;
+		int    cchTextMax;
+		int    iImage;
+		LPARAM lParam;
+	}
+} else {
+	struct TCITEMA {
+		UINT   mask;
+		UINT   lpReserved1;
+		UINT   lpReserved2;
+		LPSTR  pszText;
+		int    cchTextMax;
+		int    iImage;
+		LPARAM lParam;
+	}
+
+	struct TCITEMW {
+		UINT   mask;
+		UINT   lpReserved1;
+		UINT   lpReserved2;
+		LPWSTR pszText;
+		int    cchTextMax;
+		int    iImage;
+		LPARAM lParam;
+	}
+}
+alias TCITEMA* LPTCITEMA;
+alias TCITEMA TC_ITEMA;
+alias TCITEMW* LPTCITEMW;
+alias TCITEMW TC_ITEMW;
+
+struct TCHITTESTINFO {
+	POINT pt;
+	UINT  flags;
+}
+alias TCHITTESTINFO* LPTCHITTESTINFO, LPTC_HITTESTINFO;
+alias TCHITTESTINFO TC_HITTESTINFO;
+
+struct TC_KEYDOWN {
+	NMHDR hdr;
+	WORD wVKey;
+	UINT flags;
+}
+
+static if (_WIN32_IE >= 0x300) {
+	struct INITCOMMONCONTROLSEX {
+		DWORD dwSize = INITCOMMONCONTROLSEX.sizeof;
+		DWORD dwICC;
+	}
+	alias INITCOMMONCONTROLSEX* LPINITCOMMONCONTROLSEX;
+}
+
+struct PBRANGE {
+	int iLow;
+	int iHigh;
+}
+alias PBRANGE* PPBRANGE;
+
+struct COLORSCHEME {
+	DWORD    dwSize = COLORSCHEME.sizeof;
+	COLORREF clrBtnHighlight;
+	COLORREF clrBtnShadow;
+}
+alias COLORSCHEME* LPCOLORSCHEME;
+
+struct MCHITTESTINFO {
+	UINT       cbSize = MCHITTESTINFO.sizeof;
+	POINT      pt;
+	UINT       uHit;
+	SYSTEMTIME st;
+}
+alias MCHITTESTINFO* PMCHITTESTINFO;
+
+alias DWORD MONTHDAYSTATE;
+alias MONTHDAYSTATE* LPMONTHDAYSTATE;
+
+struct NMDAYSTATE {
+	NMHDR           nmhdr;
+	SYSTEMTIME      stStart;
+	int             cDayState;
+	LPMONTHDAYSTATE prgDayState;
+}
+alias NMDAYSTATE* LPNMDAYSTATE;
+
+struct REBARINFO {
+	UINT       cbSize = REBARINFO.sizeof;
+	UINT       fMask;
+	HIMAGELIST himl;
+}
+alias REBARINFO* LPREBARINFO;
+
+static if (_WIN32_IE >= 0x400) {
+	struct REBARBANDINFOA {
+		UINT     cbSize = REBARBANDINFOA.sizeof;
+		UINT     fMask;
+		UINT     fStyle;
+		COLORREF clrFore;
+		COLORREF clrBack;
+		LPSTR    lpText;
+		UINT     cch;
+		int      iImage;
+		HWND     hwndChild;
+		UINT     cxMinChild;
+		UINT     cyMinChild;
+		UINT     cx;
+		HBITMAP  hbmBack;
+		UINT     wID;
+		UINT     cyChild;
+		UINT     cyMaxChild;
+		UINT     cyIntegral;
+		UINT     cxIdeal;
+		LPARAM   lParam;
+		UINT     cxHeader;
+	}
+
+	struct REBARBANDINFOW {
+		UINT     cbSize = REBARBANDINFOW.sizeof;
+		UINT     fMask;
+		UINT     fStyle;
+		COLORREF clrFore;
+		COLORREF clrBack;
+		LPWSTR   lpText;
+		UINT     cch;
+		int      iImage;
+		HWND     hwndChild;
+		UINT     cxMinChild;
+		UINT     cyMinChild;
+		UINT     cx;
+		HBITMAP  hbmBack;
+		UINT     wID;
+		UINT     cyChild;
+		UINT     cyMaxChild;
+		UINT     cyIntegral;
+		UINT     cxIdeal;
+		LPARAM   lParam;
+		UINT     cxHeader;
+	}
+
+	enum : size_t {
+		REBARBANDINFOA_V3_SIZE = REBARBANDINFOA.cyChild.offsetof,
+		REBARBANDINFOW_V3_SIZE = REBARBANDINFOW.cyChild.offsetof
+	}
+} else {
+	struct REBARBANDINFOA {
+		UINT     cbSize = REBARBANDINFOA.sizeof;
+		UINT     fMask;
+		UINT     fStyle;
+		COLORREF clrFore;
+		COLORREF clrBack;
+		LPSTR    lpText;
+		UINT     cch;
+		int      iImage;
+		HWND     hwndChild;
+		UINT     cxMinChild;
+		UINT     cyMinChild;
+		UINT     cx;
+		HBITMAP  hbmBack;
+		UINT     wID;
+	}
+
+	struct REBARBANDINFOW {
+		UINT     cbSize = REBARBANDINFOW.sizeof;
+		UINT     fMask;
+		UINT     fStyle;
+		COLORREF clrFore;
+		COLORREF clrBack;
+		LPWSTR   lpText;
+		UINT     cch;
+		int      iImage;
+		HWND     hwndChild;
+		UINT     cxMinChild;
+		UINT     cyMinChild;
+		UINT     cx;
+		HBITMAP  hbmBack;
+		UINT     wID;
+	}
+
+	enum : size_t {
+		REBARBANDINFOA_V3_SIZE = REBARBANDINFOA.sizeof,
+		REBARBANDINFOW_V3_SIZE = REBARBANDINFOW.sizeof
+	}
+}
+alias REBARBANDINFOA*       LPREBARBANDINFOA;
+alias CPtr!(REBARBANDINFOA) LPCREBARBANDINFOA;
+alias REBARBANDINFOW*       LPREBARBANDINFOW;
+alias CPtr!(REBARBANDINFOW) LPCREBARBANDINFOW;
+
+static if (_WIN32_IE >= 0x300) {
+	struct NMLVODSTATECHANGE {
+		NMHDR hdr;
+		int iFrom;
+		int iTo;
+		UINT uNewState;
+		UINT uOldState;
+	}
+	alias NMLVODSTATECHANGE* LPNMLVODSTATECHANGE;
+
+	static if (_WIN32_WINNT >= 0x501) {
+		struct IMAGELISTDRAWPARAMS {
+			DWORD      cbSize = IMAGELISTDRAWPARAMS.sizeof;
+			HIMAGELIST himl;
+			int        i;
+			HDC        hdcDst;
+			int        x;
+			int        y;
+			int        cx;
+			int        cy;
+			int        xBitmap;
+			int        yBitmap;
+			COLORREF   rgbBk;
+			COLORREF   rgbFg;
+			UINT       fStyle;
+			DWORD      dwRop;
+			DWORD      fState;
+			DWORD      Frame;
+			COLORREF   crEffect;
+		}
+	} else {
+		struct IMAGELISTDRAWPARAMS {
+			DWORD      cbSize = IMAGELISTDRAWPARAMS.sizeof;
+			HIMAGELIST himl;
+			int        i;
+			HDC        hdcDst;
+			int        x;
+			int        y;
+			int        cx;
+			int        cy;
+			int        xBitmap;
+			int        yBitmap;
+			COLORREF   rgbBk;
+			COLORREF   rgbFg;
+			UINT       fStyle;
+			DWORD      dwRop;
+		}
+	}
+	alias IMAGELISTDRAWPARAMS* LPIMAGELISTDRAWPARAMS;
+}
+
+static if (_WIN32_IE >= 0x400) {
+	struct NMREBARCHILDSIZE {
+		NMHDR hdr;
+		UINT  uBand;
+		UINT  wID;
+		RECT  rcChild;
+		RECT  rcBand;
+	}
+	alias NMREBARCHILDSIZE* LPNMREBARCHILDSIZE;
+
+	struct NMREBAR {
+		NMHDR  hdr;
+		DWORD  dwMask;
+		UINT   uBand;
+		UINT   fStyle;
+		UINT   wID;
+		LPARAM lParam;
+	}
+	alias NMREBAR* LPNMREBAR;
+
+	struct NMRBAUTOSIZE {
+		NMHDR hdr;
+		BOOL  fChanged;
+		RECT  rcTarget;
+		RECT  rcActual;
+	}
+	alias NMRBAUTOSIZE* LPNMRBAUTOSIZE;
+
+	static if (_WIN32_IE >= 0x500) {
+		struct NMREBARCHEVRON {
+			NMHDR  hdr;
+			UINT   uBand;
+			UINT   wID;
+			LPARAM lParam;
+			RECT   rc;
+			LPARAM lParamNM;
+		}
+		alias NMREBARCHEVRON* LPNMREBARCHEVRON;
+	}
+
+	struct RBHITTESTINFO {
+		POINT pt;
+		UINT  flags;
+		int   iBand;
+	}
+	alias RBHITTESTINFO* LPRBHITTESTINFO;
+}
+
+alias HANDLE HDSA;
+alias HANDLE HDPA;
+
+version (Unicode) {
+	alias HDITEMW HDITEM;
+	alias LPHDITEMW LPHDITEM;
+	alias TOOLINFOW TOOLINFO;
+	alias TOOLINFOW* PTOOLINFO, LPTOOLINFO;
+	alias TTHITTESTINFOW TTHITTESTINFO;
+	alias TTHITTESTINFOW* LPHITTESTINFO, LPTTHITTESTINFO;
+	alias TOOLTIPTEXTW TOOLTIPTEXT;
+	alias TOOLTIPTEXTW* LPTOOLTIPTEXT;
+	alias NMTTDISPINFOW NMTTDISPINFO;
+	alias NMTTDISPINFOW* LPNMTTDISPINFO;
+	alias TV_ITEMW TV_ITEM;
+	alias TV_ITEMW* LPTV_ITEM;
+	alias TVITEMW TVITEM;
+	alias TVITEMW* LPTVITEM;
+
+	static if (_WIN32_IE >= 0x400) {
+		alias TVITEMEXW TVITEMEX;
+		alias TVITEMEXW* LPTVITEMEX;
+	}
+
+	alias TV_INSERTSTRUCTW TV_INSERTSTRUCT;
+	alias TV_INSERTSTRUCTW* LPTV_INSERTSTRUCT;
+	alias TVINSERTSTRUCTW TVINSERTSTRUCT;
+	alias TVINSERTSTRUCTW* LPTVINSERTSTRUCT;
+	alias NM_TREEVIEWW NM_TREEVIEW;
+	alias NM_TREEVIEWW* LPNM_TREEVIEW;
+	alias NMTREEVIEWW NMTREEVIEW;
+	alias NMTREEVIEWW* LPNMTREEVIEW;
+	alias NMHDDISPINFOW NMHDDISPINFO;
+	alias NMHDDISPINFOW* LPNMHDDISPINFO;
+
+	alias ACM_OPENW ACM_OPEN;
+	alias COMBOBOXEXITEMW COMBOBOXEXITEM;
+	alias PCOMBOBOXEXITEMW PCOMBOBOXEXITEM;
+	//alias PCCOMBOBOXEXITEMW PCCOMBOBOXEXITEM; fixme
+	alias CBEM_INSERTITEMW CBEM_INSERTITEM;
+	alias CBEM_SETITEMW CBEM_SETITEM;
+	alias CBEM_GETITEMW CBEM_GETITEM;
+	alias CBEN_ENDEDITW CBEN_ENDEDIT;
+	alias NMCBEENDEDITW NMCBEENDEDIT;
+	alias LPNMCBEENDEDITW LPNMCBEENDEDIT;
+	alias PNMCBEENDEDITW PNMCBEENDEDIT;
+
+	static if (_WIN32_IE >= 0x400) {
+		alias NMCOMBOBOXEXW NMCOMBOBOXEX;
+		alias PNMCOMBOBOXEXW PNMCOMBOBOXEX;
+		alias CBEN_GETDISPINFOW CBEN_GETDISPINFO;
+		alias CBEN_DRAGBEGINW CBEN_DRAGBEGIN;
+		alias NMCBEDRAGBEGINW NMCBEDRAGBEGIN;
+		alias LPNMCBEDRAGBEGINW LPNMCBEDRAGBEGIN;
+		alias PNMCBEDRAGBEGINW PNMCBEDRAGBEGIN;
+	}
+
+	alias SB_GETTEXTW SB_GETTEXT;
+	alias SB_SETTEXTW SB_SETTEXT;
+	alias SB_GETTEXTLENGTHW SB_GETTEXTLENGTH;
+	alias HDM_INSERTITEMW HDM_INSERTITEM;
+	alias HDM_GETITEMW HDM_GETITEM;
+	alias HDM_SETITEMW HDM_SETITEM;
+	alias HDN_ITEMCHANGINGW HDN_ITEMCHANGING;
+	alias HDN_ITEMCHANGEDW HDN_ITEMCHANGED;
+	alias HDN_ITEMCLICKW HDN_ITEMCLICK;
+	alias HDN_ITEMDBLCLICKW HDN_ITEMDBLCLICK;
+	alias HDN_DIVIDERDBLCLICKW HDN_DIVIDERDBLCLICK;
+	alias HDN_BEGINTRACKW HDN_BEGINTRACK;
+	alias HDN_ENDTRACKW HDN_ENDTRACK;
+	alias HDN_TRACKW HDN_TRACK;
+
+	static if (_WIN32_IE >= 0x300) {
+		alias HDN_GETDISPINFOW HDN_GETDISPINFO;
+	}
+
+	alias HD_NOTIFYW HD_NOTIFY;
+	alias TBSAVEPARAMSW TBSAVEPARAMS;
+	alias TB_GETBUTTONTEXTW TB_GETBUTTONTEXT;
+	alias TB_SAVERESTOREW TB_SAVERESTORE;
+	alias TB_ADDSTRINGW TB_ADDSTRING;
+
+	static if (_WIN32_IE >= 0x400) {
+		alias TBN_GETBUTTONINFOW TBN_GETBUTTONINFO;  // fixme
+		alias TB_GETBUTTONINFOW TB_GETBUTTONINFO;
+		alias TB_SETBUTTONINFOW TB_SETBUTTONINFO;
+		alias TB_INSERTBUTTONW TB_INSERTBUTTON;
+		alias TB_ADDBUTTONSW TB_ADDBUTTONS;
+		alias TB_MAPACCELERATORW TB_MAPACCELERATOR;
+		alias TB_GETSTRINGW TB_GETSTRING;
+		alias TBBUTTONINFOW TBBUTTONINFO;
+		alias LPTBBUTTONINFOW LPTBBUTTONINFO;
+		alias TBN_GETDISPINFOW TBN_GETDISPINFO;
+		alias NMTBDISPINFOW NMTBDISPINFO;
+		alias LPNMTBDISPINFOW LPNMTBDISPINFO;
+		alias NMTBGETINFOTIPW NMTBGETINFOTIP;
+		alias LPNMTBGETINFOTIPW LPNMTBGETINFOTIP;
+	}
+
+	alias TBNOTIFYW TBNOTIFY;
+	alias LPTBNOTIFYW LPTBNOTIFY;
+	alias NMTOOLBARW NMTOOLBAR;
+	alias LPNMTOOLBARW LPNMTOOLBAR;
+	alias TTM_ADDTOOLW TTM_ADDTOOL;
+	alias TTM_DELTOOLW TTM_DELTOOL;
+	alias TTM_NEWTOOLRECTW TTM_NEWTOOLRECT;
+	alias TTM_GETTOOLINFOW TTM_GETTOOLINFO;
+	alias TTM_SETTOOLINFOW TTM_SETTOOLINFO;
+	alias TTM_HITTESTW TTM_HITTEST;
+	alias TTM_GETTEXTW TTM_GETTEXT;
+	alias TTM_UPDATETIPTEXTW TTM_UPDATETIPTEXT;
+	alias TTM_ENUMTOOLSW TTM_ENUMTOOLS;
+	alias TTM_GETCURRENTTOOLW TTM_GETCURRENTTOOL;
+	alias TTN_NEEDTEXTW TTN_NEEDTEXT;
+	alias TTN_GETDISPINFOW TTN_GETDISPINFO;
+	//alias SB_GETTEXTW SB_GETTEXT;
+	//alias SB_SETTEXTW SB_SETTEXT;
+	//alias SB_GETTEXTLENGTHW SB_GETTEXTLENGTH;
+	alias LV_ITEMW LV_ITEM;
+	alias LVITEMW LVITEM;
+	alias LVITEM* LPLVITEM;
+	alias LPSTR_TEXTCALLBACKW LPSTR_TEXTCALLBACK;
+
+	static if (_WIN32_IE >= 0x400) {
+		alias LVBKIMAGEW LVBKIMAGE;
+		alias LPLVBKIMAGEW LPLVBKIMAGE;
+		alias LVM_SETBKIMAGEW LVM_SETBKIMAGE;
+		alias LVM_GETBKIMAGEW LVM_GETBKIMAGE;
+	}
+
+	alias LVM_GETITEMW LVM_GETITEM;
+	alias LVM_SETITEMW LVM_SETITEM;
+	alias LVM_INSERTITEMW LVM_INSERTITEM;
+	alias LV_FINDINFOW LV_FINDINFO;
+	alias LVFINDINFOW LVFINDINFO;
+	alias LPFINDINFOW LPFINDINFO;
+	alias NMLVFINDITEMW NMLVFINDITEM;
+	alias PNMLVFINDITEMW PNMLVFINDITEM;
+	alias LPNMLVFINDITEMW LPNMLVFINDITEM;
+	alias LVM_FINDITEMW LVM_FINDITEM;
+	alias LVM_GETSTRINGWIDTHW LVM_GETSTRINGWIDTH;
+	alias LVM_EDITLABELW LVM_EDITLABEL;
+	alias LV_COLUMNW LV_COLUMN;
+	alias LVCOLUMNW LVCOLUMN;
+	alias LVCOLUMNW* LPLVCOLUMN;
+	alias LVM_GETCOLUMNW LVM_GETCOLUMN;
+	alias LVM_SETCOLUMNW LVM_SETCOLUMN;
+	alias LVM_INSERTCOLUMNW LVM_INSERTCOLUMN;
+	alias LVM_GETITEMTEXTW LVM_GETITEMTEXT;
+	alias LVM_SETITEMTEXTW LVM_SETITEMTEXT;
+	alias LVM_GETISEARCHSTRINGW LVM_GETISEARCHSTRING;
+	alias LVN_BEGINLABELEDITW LVN_BEGINLABELEDIT;
+	alias LVN_ENDLABELEDITW LVN_ENDLABELEDIT;
+	alias LVN_GETDISPINFOW LVN_GETDISPINFO;
+	alias LVN_SETDISPINFOW LVN_SETDISPINFO;
+
+	static if (_WIN32_IE >= 0x400) {
+		alias LVN_GETINFOTIPW LVN_GETINFOTIP;
+		alias NMLVGETINFOTIPW NMLVGETINFOTIP;
+		alias LPNMLVGETINFOTIPW LPNMLVGETINFOTIP;
+	}
+
+	alias LV_DISPINFOW LV_DISPINFO;
+	alias NMLVDISPINFOW NMLVDISPINFO;
+	alias LPNMLVDISPINFOW LPNMLVDISPINFO;
+	alias TVM_INSERTITEMW TVM_INSERTITEM;
+	alias TVM_GETITEMW TVM_GETITEM;
+	alias TVM_SETITEMW TVM_SETITEM;
+	alias TVM_EDITLABELW TVM_EDITLABEL;
+	alias TVM_GETISEARCHSTRINGW TVM_GETISEARCHSTRING;
+	alias NMTVDISPINFOW TV_DISPINFO;
+	alias NMTVDISPINFOW NMTVDISPINFO;
+	alias LPNMTVDISPINFOW LPNMTVDISPINFO;
+
+	static if (_WIN32_IE >= 0x400) {
+		alias NMTVGETINFOTIPW NMTVGETINFOTIP;
+		alias LPNMTVGETINFOTIPW LPNMTVGETINFOTIP;
+		alias TVN_GETINFOTIPW TVN_GETINFOTIP;
+	}
+
+	alias TVN_SELCHANGINGW TVN_SELCHANGING;
+	alias TVN_SELCHANGEDW TVN_SELCHANGED;
+	alias TVN_GETDISPINFOW TVN_GETDISPINFO;
+	alias TVN_SETDISPINFOW TVN_SETDISPINFO;
+	alias TVN_ITEMEXPANDINGW TVN_ITEMEXPANDING;
+	alias TVN_ITEMEXPANDEDW TVN_ITEMEXPANDED;
+	alias TVN_BEGINDRAGW TVN_BEGINDRAG;
+	alias TVN_BEGINRDRAGW TVN_BEGINRDRAG;
+	alias TVN_DELETEITEMW TVN_DELETEITEM;
+	alias TVN_BEGINLABELEDITW TVN_BEGINLABELEDIT;
+	alias TVN_ENDLABELEDITW TVN_ENDLABELEDIT;
+	alias TC_ITEMHEADERW TC_ITEMHEADER;
+	alias TC_ITEMW TC_ITEM;
+	alias TCITEMW TCITEM;
+	alias LPTCITEMW LPTCITEM;
+	alias TCM_GETITEMW TCM_GETITEM;
+	alias TCM_SETITEMW TCM_SETITEM;
+	alias TCM_INSERTITEMW TCM_INSERTITEM;
+	alias CreateStatusWindowW CreateStatusWindow;
+	alias DrawStatusTextW DrawStatusText;
+	alias ImageList_LoadImageW ImageList_LoadImage;
+	alias DTM_SETFORMATW DTM_SETFORMAT;
+	alias DTN_USERSTRINGW DTN_USERSTRING;
+	alias DTN_WMKEYDOWNW DTN_WMKEYDOWN;
+	alias DTN_FORMATW DTN_FORMAT;
+	alias DTN_FORMATQUERYW DTN_FORMATQUERY;
+	alias REBARBANDINFOW REBARBANDINFO;
+	alias REBARBANDINFO* LPREBARBANDINFO;
+	alias LPCREBARBANDINFOW LPCREBARBANDINFO;
+	alias REBARBANDINFOW_V3_SIZE REBARBANDINFO_V3_SIZE;
+	alias RB_INSERTBANDW RB_INSERTBAND;
+	alias RB_SETBANDINFOW RB_SETBANDINFO;
+} else {
+	alias HDITEMA HDITEM;
+	alias LPHDITEMA LPHDITEM;
+	alias TOOLINFOA TOOLINFO;
+	alias TOOLINFOA* PTOOLINFO, LPTOOLINFO;
+	alias TTHITTESTINFOA TTHITTESTINFO;
+	alias TTHITTESTINFOA* LPHITTESTINFO, LPTTHITTESTINFO;
+	alias TOOLTIPTEXTA TOOLTIPTEXT;
+	alias TOOLTIPTEXTA* LPTOOLTIPTEXT;
+	alias NMTTDISPINFOA NMTTDISPINFO;
+	alias NMTTDISPINFOA* LPNMTTDISPINFO;
+	alias TV_ITEMA TV_ITEM;
+	alias TV_ITEMA* LPTV_ITEM;
+	alias TVITEMA TVITEM;
+	alias TVITEMA* LPTVITEM;
+
+	static if (_WIN32_IE >= 0x400) {
+		alias TVITEMEXA TVITEMEX;
+		alias TVITEMEXA* LPTVITEMEX;
+	}
+
+	alias TV_INSERTSTRUCTA TV_INSERTSTRUCT;
+	alias TV_INSERTSTRUCTA* LPTV_INSERTSTRUCT;
+	alias TVINSERTSTRUCTA TVINSERTSTRUCT;
+	alias TVINSERTSTRUCTA* LPTVINSERTSTRUCT;
+	alias NM_TREEVIEWA NM_TREEVIEW;
+	alias NM_TREEVIEWA* LPNM_TREEVIEW;
+	alias NMTREEVIEWA NMTREEVIEW;
+	alias NMTREEVIEWA* LPNMTREEVIEW;
+	alias NMHDDISPINFOW NMHDDISPINFO;
+	alias NMHDDISPINFOW* LPNMHDDISPINFO;
+
+	alias ACM_OPENA ACM_OPEN;
+	alias COMBOBOXEXITEMA COMBOBOXEXITEM;
+	alias PCOMBOBOXEXITEMA PCOMBOBOXEXITEM;
+	//alias PCCOMBOBOXEXITEMA PCCOMBOBOXEXITEM; fixme
+	alias CBEM_INSERTITEMA CBEM_INSERTITEM;
+	alias CBEM_SETITEMA CBEM_SETITEM;
+	alias CBEM_GETITEMA CBEM_GETITEM;
+	alias CBEN_ENDEDITA CBEN_ENDEDIT;
+	alias NMCBEENDEDITA NMCBEENDEDIT;
+	alias LPNMCBEENDEDITA LPNMCBEENDEDIT;
+	alias PNMCBEENDEDITA PNMCBEENDEDIT;
+
+	static if (_WIN32_IE >= 0x400) {
+		alias TB_GETBUTTONINFOA TB_GETBUTTONINFO;
+		alias TB_SETBUTTONINFOA TB_SETBUTTONINFO;
+		alias TB_INSERTBUTTONA TB_INSERTBUTTON;
+		alias TB_ADDBUTTONSA TB_ADDBUTTONS;
+		alias TB_MAPACCELERATORA TB_MAPACCELERATOR;
+		alias TB_GETSTRINGA TB_GETSTRING;
+		alias NMCOMBOBOXEXA NMCOMBOBOXEX;
+		alias PNMCOMBOBOXEXA PNMCOMBOBOXEX;
+		alias CBEN_DRAGBEGINA CBEN_DRAGBEGIN;
+		alias CBEN_GETDISPINFOA CBEN_GETDISPINFO;
+		alias NMCBEDRAGBEGINA NMCBEDRAGBEGIN;
+		alias LPNMCBEDRAGBEGINA LPNMCBEDRAGBEGIN;
+		alias PNMCBEDRAGBEGINA PNMCBEDRAGBEGIN;
+		alias TBN_GETDISPINFOA TBN_GETDISPINFO;
+		alias NMTBDISPINFOA NMTBDISPINFO;
+		alias LPNMTBDISPINFOA LPNMTBDISPINFO;
+		alias NMTBGETINFOTIPA NMTBGETINFOTIP;
+		alias LPNMTBGETINFOTIPA LPNMTBGETINFOTIP;
+	}
+
+	alias SB_GETTEXTA SB_GETTEXT;
+	alias SB_SETTEXTA SB_SETTEXT;
+	alias SB_GETTEXTLENGTHA SB_GETTEXTLENGTH;
+	alias HDM_INSERTITEMA HDM_INSERTITEM;
+	alias HDM_GETITEMA HDM_GETITEM;
+	alias HDM_SETITEMA HDM_SETITEM;
+	alias HDN_ITEMCHANGINGA HDN_ITEMCHANGING;
+	alias HDN_ITEMCHANGEDA HDN_ITEMCHANGED;
+	alias HDN_ITEMCLICKA HDN_ITEMCLICK;
+	alias HDN_ITEMDBLCLICKA HDN_ITEMDBLCLICK;
+	alias HDN_DIVIDERDBLCLICKA HDN_DIVIDERDBLCLICK;
+	alias HDN_BEGINTRACKA HDN_BEGINTRACK;
+	alias HDN_ENDTRACKA HDN_ENDTRACK;
+	alias HDN_TRACKA HDN_TRACK;
+
+	static if (_WIN32_IE >= 0x300) {
+		alias HDN_GETDISPINFOA HDN_GETDISPINFO;
+	}
+
+	alias HD_NOTIFYA HD_NOTIFY;
+	alias TBSAVEPARAMSA TBSAVEPARAMS;
+	alias TB_GETBUTTONTEXTA TB_GETBUTTONTEXT;
+	alias TB_SAVERESTOREA TB_SAVERESTORE;
+	alias TB_ADDSTRINGA TB_ADDSTRING;
+	alias TBN_GETBUTTONINFOA TBN_GETBUTTONINFO;
+
+	static if (_WIN32_IE >= 0x400) {
+		alias TBBUTTONINFOA TBBUTTONINFO;
+		alias LPTBBUTTONINFOA LPTBBUTTONINFO;
+	}
+
+	alias TBNOTIFYA TBNOTIFY;
+	alias LPTBNOTIFYA LPTBNOTIFY;
+	alias NMTOOLBARA NMTOOLBAR;
+	alias LPNMTOOLBARA LPNMTOOLBAR;
+	alias TTM_ADDTOOLA TTM_ADDTOOL;
+	alias TTM_DELTOOLA TTM_DELTOOL;
+	alias TTM_NEWTOOLRECTA TTM_NEWTOOLRECT;
+	alias TTM_GETTOOLINFOA TTM_GETTOOLINFO;
+	alias TTM_SETTOOLINFOA TTM_SETTOOLINFO;
+	alias TTM_HITTESTA TTM_HITTEST;
+	alias TTM_GETTEXTA TTM_GETTEXT;
+	alias TTM_UPDATETIPTEXTA TTM_UPDATETIPTEXT;
+	alias TTM_ENUMTOOLSA TTM_ENUMTOOLS;
+	alias TTM_GETCURRENTTOOLA TTM_GETCURRENTTOOL;
+	alias TTN_NEEDTEXTA TTN_NEEDTEXT;
+	alias TTN_GETDISPINFOA TTN_GETDISPINFO;
+	alias LV_ITEMA LV_ITEM;
+	alias LVITEMA LVITEM;
+	alias LVITEM* LPLVITEM;
+	alias LPSTR_TEXTCALLBACKA LPSTR_TEXTCALLBACK;
+
+	static if (_WIN32_IE >= 0x400) {
+		alias LVBKIMAGEA LVBKIMAGE;
+		alias LPLVBKIMAGEA LPLVBKIMAGE;
+		alias LVM_SETBKIMAGEA LVM_SETBKIMAGE;
+		alias LVM_GETBKIMAGEA LVM_GETBKIMAGE;
+	}
+
+	alias LVM_GETITEMA LVM_GETITEM;
+	alias LVM_SETITEMA LVM_SETITEM;
+	alias LVM_INSERTITEMA LVM_INSERTITEM;
+	alias LV_FINDINFOA LV_FINDINFO;
+	alias LVFINDINFOA LVFINDINFO;
+	alias LPFINDINFOA LPFINDINFO;
+	alias NMLVFINDITEMA NMLVFINDITEM;
+	alias PNMLVFINDITEMA PNMLVFINDITEM;
+	alias LPNMLVFINDITEMA LPNMLVFINDITEM;
+	alias LVM_FINDITEMA LVM_FINDITEM;
+	alias LVM_GETSTRINGWIDTHA LVM_GETSTRINGWIDTH;
+	alias LVM_EDITLABELA LVM_EDITLABEL;
+	alias LV_COLUMNA LV_COLUMN;
+	alias LVCOLUMNA LVCOLUMN;
+	alias LVCOLUMNA* LPLVCOLUMN;
+	alias LVM_GETCOLUMNA LVM_GETCOLUMN;
+	alias LVM_SETCOLUMNA LVM_SETCOLUMN;
+	alias LVM_INSERTCOLUMNA LVM_INSERTCOLUMN;
+	alias LVM_GETITEMTEXTA LVM_GETITEMTEXT;
+	alias LVM_SETITEMTEXTA LVM_SETITEMTEXT;
+	alias LVM_GETISEARCHSTRINGA LVM_GETISEARCHSTRING;
+	alias LVN_BEGINLABELEDITA LVN_BEGINLABELEDIT;
+	alias LVN_ENDLABELEDITA LVN_ENDLABELEDIT;
+	alias LVN_GETDISPINFOA LVN_GETDISPINFO;
+	alias LVN_SETDISPINFOA LVN_SETDISPINFO;
+
+	static if (_WIN32_IE >= 0x400) {
+		alias LVN_GETINFOTIPA LVN_GETINFOTIP;
+		alias NMLVGETINFOTIPA NMLVGETINFOTIP;
+		alias LPNMLVGETINFOTIPA LPNMLVGETINFOTIP;
+	}
+
+	alias LV_DISPINFOA LV_DISPINFO;
+	alias NMLVDISPINFOA NMLVDISPINFO;
+	alias LPNMLVDISPINFOA LPNMLVDISPINFO;
+	alias TVM_INSERTITEMA TVM_INSERTITEM;
+	alias TVM_GETITEMA TVM_GETITEM;
+	alias TVM_SETITEMA TVM_SETITEM;
+	alias TVM_EDITLABELA TVM_EDITLABEL;
+	alias TVM_GETISEARCHSTRINGA TVM_GETISEARCHSTRING;
+	alias NMTVDISPINFOA TV_DISPINFO;
+	alias NMTVDISPINFOA NMTVDISPINFO;
+	alias LPNMTVDISPINFOA LPNMTVDISPINFO;
+
+	static if (_WIN32_IE >= 0x400) {
+		alias NMTVGETINFOTIPA NMTVGETINFOTIP;
+		alias LPNMTVGETINFOTIPA LPNMTVGETINFOTIP;
+		alias TVN_GETINFOTIPA TVN_GETINFOTIP;
+	}
+
+	alias TVN_SELCHANGINGA TVN_SELCHANGING;
+	alias TVN_SELCHANGEDA TVN_SELCHANGED;
+	alias TVN_GETDISPINFOA TVN_GETDISPINFO;
+	alias TVN_SETDISPINFOA TVN_SETDISPINFO;
+	alias TVN_ITEMEXPANDINGA TVN_ITEMEXPANDING;
+	alias TVN_ITEMEXPANDEDA TVN_ITEMEXPANDED;
+	alias TVN_BEGINDRAGA TVN_BEGINDRAG;
+	alias TVN_BEGINRDRAGA TVN_BEGINRDRAG;
+	alias TVN_DELETEITEMA TVN_DELETEITEM;
+	alias TVN_BEGINLABELEDITA TVN_BEGINLABELEDIT;
+	alias TVN_ENDLABELEDITA TVN_ENDLABELEDIT;
+	alias TC_ITEMHEADERA TC_ITEMHEADER;
+	alias TC_ITEMA TC_ITEM;
+	alias TCITEMA TCITEM;
+	alias LPTCITEMA LPTCITEM;
+	alias TCM_GETITEMA TCM_GETITEM;
+	alias TCM_SETITEMA TCM_SETITEM;
+	alias TCM_INSERTITEMA TCM_INSERTITEM;
+	alias CreateStatusWindowA CreateStatusWindow;
+	alias DrawStatusTextA DrawStatusText;
+	alias ImageList_LoadImageA ImageList_LoadImage;
+	alias DTM_SETFORMATA DTM_SETFORMAT;
+	alias DTN_USERSTRINGA DTN_USERSTRING;
+	alias DTN_WMKEYDOWNA DTN_WMKEYDOWN;
+	alias DTN_FORMATA DTN_FORMAT;
+	alias DTN_FORMATQUERYA DTN_FORMATQUERY;
+	alias REBARBANDINFOA REBARBANDINFO;
+	alias REBARBANDINFOA* LPREBARBANDINFO;
+	alias LPCREBARBANDINFOA LPCREBARBANDINFO;
+	alias REBARBANDINFOA_V3_SIZE REBARBANDINFO_V3_SIZE;
+	alias RB_INSERTBANDA RB_INSERTBAND;
+	alias RB_SETBANDINFOA RB_SETBANDINFO;
+}
+
+
+alias INT function(PVOID, PVOID) PFNDPAENUMCALLBACK;
+alias INT function(PVOID, PVOID) PFNDSAENUMCALLBACK;
+alias INT function(PVOID, PVOID, LPARAM) PFNDPACOMPARE;
+
+static if (_WIN32_WINNT >= 0x501) {
+	extern (Windows)
+	alias LRESULT function(HWND, UINT, WPARAM, LPARAM, UINT_PTR, DWORD_PTR)
+	  SUBCLASSPROC;
+
+	struct LITEM {
+		UINT mask;
+		int  iLink;
+		UINT state;
+		UINT stateMask;
+		WCHAR[MAX_LINKID_TEXT]  szID;
+		WCHAR[L_MAX_URL_LENGTH] szUrl;
+	}
+	alias LITEM* PLITEM;
+
+	struct LHITTESTINFO {
+		POINT pt;
+		LITEM item;
+	}
+	alias LHITTESTINFO* PLHITTESTINFO;
+
+	struct NMLINK {
+		NMHDR hdr;
+		LITEM item;
+	}
+	alias NMLINK* PNMLINK;
+}
+
+uint INDEXTOOVERLAYMASK(uint i) { return i << 8; }
+uint INDEXTOSTATEIMAGEMASK(uint i) { return i << 12; }
+
+template HANDLE_WM_NOTIFY(R) {
+	R HANDLE_WM_NOTIFY(HWND hwnd, WPARAM wParam, LPARAM lParam,
+		  R function(HWND, int, NMHDR*) fn) {
+		return fn(hwnd, wParam, cast(NMHDR*) lParam);
+	}
+}
+int FORWARD_WM_NOTIFY(HWND hwnd, int idFrom, NMHDR* pnmhdr,
+	  int function(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) fn) {
+	return fn(hwnd, WM_NOTIFY, idFrom, cast(LPARAM) pnmhdr);
+}
+
+//#define CCSIZEOF_STRUCT(s, m) (((int)((PBYTE)(&((s*)0)->m)-((PBYTE)((s*)0))))+sizeof(((s*)0)->m))
+
+LPARAM MAKEIPADDRESS(ubyte b1, ubyte b2, ubyte b3, ubyte b4) {
+	return (cast(DWORD) b1 << 24)
+	     | (cast(DWORD) b2 << 16)
+	     | (cast(DWORD) b3 << 8)
+	     | (cast(DWORD) b4);
+}
+
+LPARAM MAKEIPRANGE(ubyte low, ubyte high) {
+	return (cast(int) high << 8) | low;
+}
+
+ubyte FIRST_IPADDRESS(LPARAM x) {
+	return cast(ubyte) (x >> 24);
+}
+
+ubyte SECOND_IPADDRESS(LPARAM x) {
+	return cast(ubyte) (x >> 16);
+}
+
+ubyte THIRD_IPADDRESS(LPARAM x) {
+	return cast(ubyte) (x >> 8);
+}
+
+ubyte FOURTH_IPADDRESS(LPARAM x) {
+	return cast(ubyte) x;
+}
+
+HWND Animate_Create(HWND hwndP, UINT id, DWORD dwStyle,
+	  HINSTANCE hInstance) {
+	return CreateWindow(cast(TCHAR*)ANIMATE_CLASS.ptr, null, dwStyle, 0, 0, 0, 0, hwndP,
+	  cast(HMENU) id, hInstance, null);
+}
+
+BOOL Animate_Open(HWND hwnd, LPTSTR szName) {
+	return SendMessage(hwnd, ACM_OPEN, 0, cast(LPARAM) szName);
+}
+
+BOOL Animate_OpenEx(HWND hwnd, HINSTANCE hInst, LPTSTR szName) {
+	return SendMessage(hwnd, ACM_OPEN, cast(WPARAM) hInst,
+	  cast(LPARAM) szName);
+}
+
+BOOL Animate_Play(HWND hwnd, int from, int to, int rep) {
+	return SendMessage(hwnd, ACM_PLAY, rep,
+	  MAKELONG(cast(ushort) from, cast(ushort) to));
+}
+
+BOOL Animate_Stop(HWND hwnd) {
+	return SendMessage(hwnd, ACM_STOP, 0, 0);
+}
+
+BOOL Animate_Close(HWND hwnd) {
+	return Animate_Open(hwnd, null);
+}
+
+BOOL Animate_Seek(HWND hwnd, int frame) {
+	return Animate_Play(hwnd, frame, frame, 1);
+}
+
+extern (Windows) {
+	HBITMAP CreateMappedBitmap(HINSTANCE, int, UINT, LPCOLORMAP, int);
+	HWND CreateStatusWindowA(LONG, LPCSTR, HWND, UINT);
+	HWND CreateStatusWindowW(LONG, LPCWSTR, HWND, UINT);
+	HWND CreateToolbarEx(HWND, DWORD, UINT, int, HINSTANCE, UINT,
+	  LPCTBBUTTON, int, int, int, int, int, UINT);
+	HWND CreateUpDownControl(DWORD, int, int, int, int, HWND, int, HINSTANCE,
+	  HWND, int, int, int);
+}
+
+HWND DateTime_GetMonthCal(HWND hwnd) {
+	return cast(HWND) SendMessage(hwnd, DTM_GETMONTHCAL, 0, 0);
+}
+
+COLORREF DateTime_GetMonthCalColor(HWND hwnd, int iColor) {
+	return cast(COLORREF) SendMessage(hwnd, DTM_GETMCCOLOR, iColor, 0);
+}
+
+HFONT DateTime_GetMonthCalFont(HWND hwnd) {
+	return cast(HFONT) SendMessage(hwnd, DTM_GETMCFONT, 0, 0);
+}
+
+DWORD DateTime_GetRange(HWND hwnd, LPSYSTEMTIME lpSysTimeArray) {
+	return SendMessage(hwnd, DTM_GETRANGE, 0, cast(LPARAM) lpSysTimeArray);
+}
+
+DWORD DateTime_GetSystemtime(HWND hwnd, LPSYSTEMTIME lpSysTime) {
+	return SendMessage(hwnd, DTM_GETSYSTEMTIME, 0, cast(LPARAM) lpSysTime);
+}
+
+BOOL DateTime_SetFormat(HWND hwnd, LPCTSTR lpszFormat) {
+	return cast(BOOL) SendMessage(hwnd, DTM_SETFORMAT, 0,
+	  cast(LPARAM) lpszFormat);
+}
+
+LRESULT DateTime_SetMonthCalColor(HWND hwnd, int iColor, COLORREF clr) {
+	return SendMessage(hwnd, DTM_SETMCCOLOR, cast(WPARAM) iColor,
+	  cast(LPARAM) clr);
+}
+
+void DateTime_SetMonthCalFont(HWND hwnd, HFONT hfont, BOOL fRedraw) {
+	SendMessage(hwnd, DTM_SETMCFONT, cast(WPARAM) hfont, fRedraw);
+}
+
+BOOL DateTime_SetRange(HWND hwnd, WPARAM flags, LPSYSTEMTIME lpSysTimeArray) {
+	return cast(BOOL) SendMessage(hwnd, DTM_SETRANGE, flags,
+	  cast(LPARAM) lpSysTimeArray);
+}
+
+BOOL DateTime_SetSystemtime(HWND hwnd, WPARAM flag, LPSYSTEMTIME lpSysTime) {
+	return cast(BOOL) SendMessage(hwnd, DTM_SETSYSTEMTIME, flag,
+	  cast(LPARAM) lpSysTime);
+}
+
+extern (Windows) {
+	void DrawInsert(HWND, HWND, int);
+	void DrawStatusTextA(HDC, LPRECT, LPCSTR, UINT);
+	void DrawStatusTextW(HDC, LPRECT, LPCWSTR, UINT);
+	void GetEffectiveClientRect(HWND, LPRECT, LPINT);
+}
+
+int Header_GetItemCount(HWND w) {
+	return SendMessage(w, HDM_GETITEMCOUNT, 0, 0);
+}
+
+int Header_InsertItem(HWND w, int i, CPtr!(HDITEM) phdi) {
+	return SendMessage(w, HDM_INSERTITEM, i, cast(LPARAM) phdi);
+}
+
+BOOL Header_DeleteItem(HWND w, int i) {
+	return cast(BOOL) SendMessage(w, HDM_DELETEITEM, i, 0);
+}
+
+BOOL Header_GetItem(HWND w, int i, LPHDITEM phdi) {
+	return cast(BOOL) SendMessage(w, HDM_GETITEM, i, cast(LPARAM) phdi);
+}
+
+BOOL Header_SetItem(HWND w, int i, CPtr!(HDITEM) phdi) {
+	return cast(BOOL) SendMessage(w, HDM_SETITEM, i, cast(LPARAM) phdi);
+}
+
+BOOL Header_Layout(HWND w, LPHDLAYOUT playout) {
+	return SendMessage(w, HDM_LAYOUT, 0, cast(LPARAM) playout);
+}
+
+static if (_WIN32_IE >= 0x300) {
+	int Header_OrderToIndex(HWND w, int i) {
+		return SendMessage(w, HDM_ORDERTOINDEX, i, 0);
+	}
+
+	BOOL Header_GetItemRect(HWND w, int i, RECT* r) {
+		return cast(BOOL) SendMessage(w, HDM_GETITEMRECT, i, cast(LPARAM) r);
+	}
+
+	BOOL Header_GetOrderArray(HWND w, int iSize, LPINT lpiArray) {
+		return cast(BOOL) SendMessage(w, HDM_GETORDERARRAY, iSize,
+		  cast(LPARAM) lpiArray);
+	}
+
+	BOOL Header_SetOrderArray(HWND w, int iSize, LPINT lpiArray) {
+		return cast(BOOL) SendMessage(w, HDM_SETORDERARRAY, iSize,
+		  cast(LPARAM) lpiArray);
+	}
+
+	HIMAGELIST Header_CreateDragImage(HWND w, int i) {
+		return cast(HIMAGELIST) SendMessage(w, HDM_CREATEDRAGIMAGE, i, 0);
+	}
+
+	HIMAGELIST Header_SetImageList(HWND w, HIMAGELIST himl) {
+		return cast(HIMAGELIST) SendMessage(w, HDM_SETIMAGELIST, 0,
+		  cast(LPARAM) himl);
+	}
+
+	HIMAGELIST Header_GetImageList(HWND w) {
+		return cast(HIMAGELIST) SendMessage(w, HDM_GETIMAGELIST, 0, 0);
+	}
+}
+
+static if (_WIN32_IE >= 0x400) {
+	BOOL Header_GetUnicodeFormat(HWND w) {
+		return cast(BOOL) SendMessage(w, HDM_GETUNICODEFORMAT, 0, 0);
+	}
+
+	BOOL Header_SetUnicodeFormat(HWND w, BOOL fUnicode) {
+		return cast(BOOL) SendMessage(w, HDM_SETUNICODEFORMAT, fUnicode, 0);
+	}
+}
+
+extern (Windows) {
+	HDSA DSA_Create(INT, INT);
+	BOOL DSA_Destroy(HDSA);
+	VOID DSA_DestroyCallback(HDSA, PFNDSAENUMCALLBACK, PVOID);
+	PVOID DSA_GetItemPtr(HDSA, INT);
+	INT DSA_InsertItem(HDSA, INT, PVOID);
+	HDPA DPA_Create(INT);
+	BOOL DPA_Destroy(HDPA);
+	PVOID DPA_DeletePtr(HDPA, INT);
+	BOOL DPA_DeleteAllPtrs(HDPA);
+	VOID DPA_EnumCallback(HDPA, PFNDPAENUMCALLBACK, PVOID);
+	VOID DPA_DestroyCallback(HDPA, PFNDPAENUMCALLBACK, PVOID);
+	BOOL DPA_SetPtr(HDPA, INT, PVOID);
+	INT DPA_InsertPtr(HDPA, INT, PVOID);
+	PVOID DPA_GetPtr(HDPA, INT_PTR);
+	BOOL DPA_Sort(HDPA, PFNDPACOMPARE, LPARAM);
+	INT DPA_Search(HDPA, PVOID, INT, PFNDPACOMPARE, LPARAM, UINT);
+	BOOL Str_SetPtrW(LPWSTR*, LPCWSTR);
+
+	static if (_WIN32_IE >= 0x400) {
+		BOOL FlatSB_EnableScrollBar(HWND, INT, UINT);
+		BOOL FlatSB_ShowScrollBar(HWND, INT, BOOL);
+		BOOL FlatSB_GetScrollRange(HWND, INT, LPINT, LPINT);
+		BOOL FlatSB_GetScrollInfo(HWND, INT, LPSCROLLINFO);
+		INT FlatSB_GetScrollPos(HWND, INT);
+		BOOL FlatSB_GetScrollProp(HWND, INT, LPINT);
+		version (Win64) {
+			BOOL FlatSB_GetScrollPropPtr(HWND, INT, PINT_PTR);
+		} else {
+			alias FlatSB_GetScrollProp FlatSB_GetScrollPropPtr;
+		}
+		INT FlatSB_SetScrollPos(HWND, INT, INT, BOOL);
+		INT FlatSB_SetScrollInfo(HWND, INT, LPSCROLLINFO, BOOL);
+		INT FlatSB_SetScrollRange(HWND, INT, INT, INT, BOOL);
+		BOOL FlatSB_SetScrollProp(HWND, UINT, INT_PTR, BOOL);
+		alias FlatSB_SetScrollProp FlatSB_SetScrollPropPtr;
+		BOOL InitializeFlatSB(HWND);
+		HRESULT UninitializeFlatSB(HWND);
+	}
+
+	static if (_WIN32_WINNT >= 0x501) {
+		BOOL SetWindowSubclass(HWND, SUBCLASSPROC, UINT_PTR, DWORD_PTR);
+		BOOL GetWindowSubclass(HWND, SUBCLASSPROC, UINT_PTR, DWORD_PTR*);
+		BOOL RemoveWindowSubclass(HWND, SUBCLASSPROC, UINT_PTR);
+		LRESULT DefSubclassProc(HWND, UINT, WPARAM, LPARAM);
+		INT DrawShadowText(HDC, LPCWSTR, UINT, RECT*, DWORD, COLORREF,
+		  COLORREF, INT, INT);
+	}
+
+	int ImageList_Add(HIMAGELIST, HBITMAP, HBITMAP);
+	int ImageList_AddMasked(HIMAGELIST, HBITMAP, COLORREF);
+	BOOL ImageList_BeginDrag(HIMAGELIST, int, int, int);
+	HIMAGELIST ImageList_Create(int, int, UINT, int, int);
+	BOOL ImageList_Destroy(HIMAGELIST);
+	BOOL ImageList_DragEnter(HWND, int, int);
+	BOOL ImageList_DragLeave(HWND);
+	BOOL ImageList_DragMove(int, int);
+	BOOL ImageList_DragShowNolock(BOOL);
+	BOOL ImageList_Draw(HIMAGELIST, int, HDC, int, int, UINT);
+	BOOL ImageList_DrawEx(HIMAGELIST, int, HDC, int, int, int, int, COLORREF,
+	  COLORREF, UINT);
+	void ImageList_EndDrag(PVOID);
+	COLORREF ImageList_GetBkColor(HIMAGELIST);
+	HIMAGELIST ImageList_GetDragImage(LPPOINT, LPPOINT);
+	HICON ImageList_GetIcon(HIMAGELIST, int, UINT);
+	BOOL ImageList_GetIconSize(HIMAGELIST, int*, int*);
+	int ImageList_GetImageCount(HIMAGELIST);
+	BOOL ImageList_GetImageInfo(HIMAGELIST, int, IMAGEINFO*);
+	HIMAGELIST ImageList_LoadImageA(HINSTANCE, LPCSTR, int, int, COLORREF,
+	  UINT, UINT);
+	HIMAGELIST ImageList_LoadImageW(HINSTANCE, LPCWSTR, int, int, COLORREF,
+	  UINT, UINT);
+	HIMAGELIST ImageList_Merge(HIMAGELIST, int, HIMAGELIST, int, int, int);
+	BOOL ImageList_Remove(HIMAGELIST, int);
+	BOOL ImageList_Replace(HIMAGELIST, int, HBITMAP, HBITMAP);
+	int ImageList_ReplaceIcon(HIMAGELIST, int, HICON);
+	COLORREF ImageList_SetBkColor(HIMAGELIST, COLORREF);
+	BOOL ImageList_SetDragCursorImage(HIMAGELIST, int, int, int);
+	BOOL ImageList_SetIconSize(HIMAGELIST, int, int);
+	BOOL ImageList_SetOverlayImage(HIMAGELIST, int, int);
+
+	//#ifdef _OBJIDL_H
+	HIMAGELIST ImageList_Read(LPSTREAM);
+	BOOL ImageList_Write(HIMAGELIST, LPSTREAM);
+	//#endif
+
+	static if (_WIN32_IE >= 0x400) {
+		HIMAGELIST ImageList_Duplicate(HIMAGELIST himl);
+	}
+
+	void InitCommonControls();
+
+	static if (_WIN32_IE >= 0x300) {
+		BOOL InitCommonControlsEx(LPINITCOMMONCONTROLSEX);
+	}
+
+	int LBItemFromPt(HWND, POINT, BOOL);
+}
+
+int ImageList_AddIcon(HIMAGELIST himl, HICON hicon) {
+	return ImageList_ReplaceIcon(himl, -1, hicon);
+}
+
+HICON ImageList_ExtractIcon(HINSTANCE hi, HIMAGELIST himl, int i) {
+	return ImageList_GetIcon(himl, i, 0);
+}
+
+HIMAGELIST ImageList_LoadBitmap(HINSTANCE hi, LPCTSTR lpbmp, int cx,
+	  int cGrow, COLORREF crMask) {
+	return ImageList_LoadImage(hi, lpbmp, cx, cGrow, crMask, IMAGE_BITMAP, 0);
+}
+
+BOOL ImageList_RemoveAll(HIMAGELIST himl) {
+	return ImageList_Remove(himl, -1);
+}
+
+COLORREF ListView_GetBkColor(HWND w) {
+	return cast(COLORREF) SendMessage(w, LVM_GETBKCOLOR, 0, 0);
+}
+
+HIMAGELIST ListView_GetImageList(HWND w, int i) {
+	return cast(HIMAGELIST) SendMessage(w, LVM_GETIMAGELIST, i, 0);
+}
+
+int ListView_GetItemCount(HWND w) {
+	return SendMessage(w, LVM_GETITEMCOUNT, 0, 0);
+}
+
+BOOL ListView_GetItem(HWND w, LPLVITEM pitem) {
+	return cast(BOOL) SendMessage(w, LVM_GETITEM, 0, cast(LPARAM) pitem);
+}
+
+BOOL ListView_SetBkColor(HWND w, COLORREF c) {
+	return cast(BOOL) SendMessage(w, LVM_SETBKCOLOR, 0, cast(LPARAM) c);
+}
+
+HIMAGELIST ListView_SetImageList(HWND w, HIMAGELIST h, int i) {
+	return cast(HIMAGELIST) SendMessage(w, LVM_SETIMAGELIST, i,
+	  cast(LPARAM) h);
+}
+
+BOOL ListView_SetItem(HWND w, CPtr!(LV_ITEM) i) {
+	return cast(BOOL) SendMessage(w, LVM_SETITEM, 0, cast(LPARAM) i);
+}
+
+int ListView_InsertItem(HWND w, CPtr!(LV_ITEM) i) {
+	return SendMessage(w, LVM_INSERTITEM, 0, cast(LPARAM) i);
+}
+
+BOOL ListView_DeleteItem(HWND w, int i) {
+	return cast(BOOL) SendMessage(w, LVM_DELETEITEM, i, 0);
+}
+
+BOOL ListView_DeleteAllItems(HWND w) {
+	return cast(BOOL) SendMessage(w, LVM_DELETEALLITEMS, 0, 0);
+}
+
+UINT ListView_GetCallbackMask(HWND w) {
+	return cast(UINT) SendMessage(w, LVM_GETCALLBACKMASK, 0, 0);
+}
+
+BOOL ListView_SetCallbackMask(HWND w, UINT m) {
+	return cast(BOOL) SendMessage(w, LVM_SETCALLBACKMASK, m, 0);
+}
+
+int ListView_GetNextItem(HWND w, int i, UINT f) {
+	return SendMessage(w, LVM_GETNEXTITEM, i, MAKELPARAM(cast(ushort)f, 0));
+}
+
+int ListView_FindItem(HWND w, int i, CPtr!(LV_FINDINFO) p) {
+	return SendMessage(w, LVM_FINDITEM, i, cast(LPARAM) p);
+}
+
+BOOL ListView_GetItemRect(HWND w, int i, LPRECT p, int c) {
+	return cast(BOOL) SendMessage(w, LVM_GETITEMRECT, i, p ?
+	  (p.left = c, cast(LPARAM) p) : 0);
+}
+
+BOOL ListView_SetItemPosition(HWND w, int i, int x, int y) {
+	return cast(BOOL) SendMessage(w, LVM_SETITEMPOSITION, i, MAKELPARAM(cast(ushort)x, cast(ushort)y));
+}
+
+BOOL ListView_GetItemPosition(HWND w, int i, POINT* p) {
+	return cast(BOOL) SendMessage(w, LVM_GETITEMPOSITION, i, cast(LPARAM) p);
+}
+
+DWORD ListView_GetItemSpacing(HWND w, BOOL f) {
+	return cast(DWORD) SendMessage(w, LVM_GETITEMSPACING, f, 0);
+}
+
+int ListView_GetStringWidth(HWND w, LPCSTR s) {
+	return SendMessage(w, LVM_GETSTRINGWIDTH, 0, cast(LPARAM) s);
+}
+
+int ListView_HitTest(HWND w, LPLVHITTESTINFO p) {
+	return SendMessage(w, LVM_HITTEST, 0, cast(LPARAM) p);
+}
+
+BOOL ListView_EnsureVisible(HWND w, int i, BOOL f) {
+	return cast(BOOL) SendMessage(w, LVM_ENSUREVISIBLE, i, MAKELPARAM(cast(ushort)f, 0));
+}
+
+BOOL ListView_Scroll(HWND w, int dx, int dy) {
+	return cast(BOOL) SendMessage(w, LVM_SCROLL, dx, dy);
+}
+
+BOOL ListView_RedrawItems(HWND w, int f, int l) {
+	return cast(BOOL) SendMessage(w, LVM_REDRAWITEMS, f, l);
+}
+
+BOOL ListView_Arrange(HWND w, UINT c) {
+	return cast(BOOL) SendMessage(w, LVM_ARRANGE, c, 0);
+}
+
+HWND ListView_EditLabel(HWND w, int i) {
+	return cast(HWND) SendMessage(w, LVM_EDITLABEL, i, 0);
+}
+
+HWND ListView_GetEditControl(HWND w) {
+	return cast(HWND) SendMessage(w, LVM_GETEDITCONTROL, 0, 0);
+}
+
+BOOL ListView_GetColumn(HWND w, int i, LPLVCOLUMN p) {
+	return cast(BOOL) SendMessage(w, LVM_GETCOLUMN, i, cast(LPARAM) p);
+}
+
+BOOL ListView_SetColumn(HWND w, int i, CPtr!(LV_COLUMN) p) {
+	return cast(BOOL) SendMessage(w, LVM_SETCOLUMN, i, cast(LPARAM) p);
+}
+
+int ListView_InsertColumn(HWND w, int i, CPtr!(LV_COLUMN) p) {
+	return SendMessage(w, LVM_INSERTCOLUMN, i, cast(LPARAM) p);
+}
+
+BOOL ListView_DeleteColumn(HWND w, int i) {
+	return cast(BOOL) SendMessage(w, LVM_DELETECOLUMN, i, 0);
+}
+
+int ListView_GetColumnWidth(HWND w, int i) {
+	return SendMessage(w, LVM_GETCOLUMNWIDTH, i, 0);
+}
+
+BOOL ListView_SetColumnWidth(HWND w, int i, int x) {
+	return cast(BOOL) SendMessage(w, LVM_SETCOLUMNWIDTH, i, MAKELPARAM(cast(ushort)x, 0));
+}
+
+HIMAGELIST ListView_CreateDragImage(HWND w, int i, LPPOINT p) {
+	return cast(HIMAGELIST) SendMessage(w, LVM_CREATEDRAGIMAGE, i,
+	  cast(LPARAM) p);
+}
+
+BOOL ListView_GetViewRect(HWND w, RECT* p) {
+	return cast(BOOL) SendMessage(w, LVM_GETVIEWRECT, 0, cast(LPARAM) p);
+}
+
+COLORREF ListView_GetTextColor(HWND w) {
+	return cast(COLORREF) SendMessage(w, LVM_GETTEXTCOLOR, 0, 0);
+}
+
+BOOL ListView_SetTextColor(HWND w, COLORREF c) {
+	return cast(BOOL) SendMessage(w, LVM_SETTEXTCOLOR, 0, cast(LPARAM) c);
+}
+
+COLORREF ListView_GetTextBkColor(HWND w) {
+	return cast(COLORREF) SendMessage(w, LVM_GETTEXTBKCOLOR, 0, 0);
+}
+
+BOOL ListView_SetTextBkColor(HWND w, COLORREF c) {
+	return cast(BOOL) SendMessage(w, LVM_SETTEXTBKCOLOR, 0, cast(LPARAM) c);
+}
+
+int ListView_GetTopIndex(HWND w) {
+	return SendMessage(w, LVM_GETTOPINDEX, 0, 0);
+}
+
+int ListView_GetCountPerPage(HWND w) {
+	return SendMessage(w, LVM_GETCOUNTPERPAGE, 0, 0);
+}
+
+BOOL ListView_GetOrigin(HWND w, LPPOINT p) {
+	return cast(BOOL) SendMessage(w, LVM_GETORIGIN, 0, cast(LPARAM) p);
+}
+
+BOOL ListView_Update(HWND w, WPARAM i) {
+	return cast(BOOL) SendMessage(w, LVM_UPDATE, i, 0);
+}
+
+void ListView_SetItemState(HWND w, int i, UINT d, UINT m) {
+	LV_ITEM _lvi;
+	_lvi.stateMask = m;
+	_lvi.state = d;
+	SendMessage(w, LVM_SETITEMSTATE, i, cast(LPARAM) &_lvi);
+}
+
+UINT ListView_GetItemState(HWND w, int i, UINT m) {
+	return cast(UINT) SendMessage(w, LVM_GETITEMSTATE, i, m);
+}
+
+void ListView_GetItemText(HWND w, int i, int iS, LPTSTR s, int n) {
+	LV_ITEM _lvi;
+	_lvi.iSubItem = iS;
+	_lvi.cchTextMax = n;
+	_lvi.pszText = s;
+	SendMessage(w, LVM_GETITEMTEXT, i, cast(LPARAM) &_lvi);
+}
+
+void ListView_SetItemText(HWND w, int i, int iS, LPTSTR s) {
+	LV_ITEM _lvi;
+	_lvi.iSubItem = iS;
+	_lvi.pszText = s;
+	SendMessage(w, LVM_SETITEMTEXT, i, cast(LPARAM) &_lvi);
+}
+
+void ListView_SetItemCount(HWND w, int n) {
+	SendMessage(w, LVM_SETITEMCOUNT, n, 0);
+}
+
+BOOL ListView_SortItems(HWND w, PFNLVCOMPARE f, LPARAM l) {
+	return cast(BOOL) SendMessage(w, LVM_SORTITEMS, l, cast(LPARAM) f);
+}
+
+void ListView_SetItemPosition32(HWND w, int i, int x, int y) {
+	POINT p;
+	p.x = x;
+	p.y = y;
+	SendMessage(w, LVM_SETITEMPOSITION32, i, cast(LPARAM) &p);
+}
+
+UINT ListView_GetSelectedCount(HWND w) {
+	return cast(UINT) SendMessage(w, LVM_GETSELECTEDCOUNT, 0, 0);
+}
+
+UINT ListView_GetCheckState(HWND w, UINT i) {
+	return ((cast(UINT) SendMessage(w, LVM_GETITEMSTATE, i, LVIS_STATEIMAGEMASK)) >> 12) - 1;
+}
+
+void ListView_SetCheckState(HWND w, UINT i, BOOL f) {
+	ListView_SetItemState(w, i, INDEXTOSTATEIMAGEMASK(f ? 2 : 1),
+	  LVIS_STATEIMAGEMASK);
+}
+
+BOOL ListView_GetISearchString(HWND w, LPSTR lpsz) {
+	return cast(BOOL) SendMessage(w, LVM_GETISEARCHSTRING, 0,
+	  cast(LPARAM) lpsz);
+}
+
+void ListView_CancelEditLabel(HWND w) {
+	SendMessage(w, LVM_CANCELEDITLABEL, 0, 0);
+}
+
+int ListView_EnableGroupView(HWND w, BOOL i) {
+	return cast(int) SendMessage(w, LVM_ENABLEGROUPVIEW, i, 0);
+}
+
+static if (_WIN32_WINDOWS >= 0x410 && (_WIN32_WINNT >= 0x500 || _WIN32_IE >= 0x500)) {
+	BOOL ListView_SortItemsEx(HWND w, PFNLVCOMPARE c, LPARAM p) {
+		return SendMessage(w, LVM_SORTITEMSEX, cast(WPARAM) p, cast(LPARAM)c);
+	}
+}
+
+static if (_WIN32_WINNT >= 0x501) {
+	int ListView_GetGroupInfo(HWND w, int i, PLVGROUP p) {
+		return SendMessage(w, LVM_GETGROUPINFO, i, cast(LPARAM) p);
+	}
+
+	void ListView_GetGroupMetrics(HWND w, PLVGROUPMETRICS p) {
+		SendMessage(w, LVM_GETGROUPMETRICS, 0, cast(LPARAM) p);
+	}
+
+	BOOL ListView_GetInsertMark(HWND w, PLVINSERTMARK p) {
+		return SendMessage(w, LVM_GETINSERTMARK, 0, cast(LPARAM) p);
+	}
+
+	COLORREF ListView_GetInsertMarkColor(HWND w) {
+		return SendMessage(w, LVM_GETINSERTMARKCOLOR, 0, 0);
+	}
+
+	int ListView_GetInsertMarkRect(HWND w, LPRECT p) {
+		return SendMessage(w, LVM_GETINSERTMARKRECT, 0, cast(LPARAM) p);
+	}
+
+	COLORREF ListView_GetOutlineColor(HWND w) {
+		return SendMessage(w, LVM_GETOUTLINECOLOR, 0, 0);
+	}
+
+	UINT ListView_GetSelectedColumn(HWND w) {
+		return SendMessage(w, LVM_GETSELECTEDCOLUMN, 0, 0);
+	}
+
+	void ListView_GetTileInfo(HWND w, PLVTILEINFO p) {
+		SendMessage(w, LVM_GETTILEINFO, 0, cast(LPARAM) p);
+	}
+
+	void ListView_GetTileViewInfo(HWND w, PLVTILEVIEWINFO p) {
+		SendMessage(w, LVM_GETTILEVIEWINFO, 0, cast(LPARAM) p);
+	}
+
+	DWORD ListView_GetView(HWND w) {
+		return SendMessage(w, LVM_GETVIEW, 0, 0);
+	}
+
+	BOOL ListView_HasGroup(HWND w, int i) {
+		return SendMessage(w, LVM_HASGROUP, i, 0);
+	}
+
+	int ListView_InsertGroup(HWND w, int i, PLVGROUP p) {
+		return SendMessage(w, LVM_INSERTGROUP, i, cast(LPARAM) p);
+	}
+
+	void ListView_InsertGroupSorted(HWND w, PLVINSERTGROUPSORTED p) {
+		SendMessage(w, LVM_INSERTGROUPSORTED, cast(WPARAM) p, 0);
+	}
+
+	BOOL ListView_InsertMarkHitTest(HWND w, LPPOINT p, PLVINSERTMARK t) {
+		return SendMessage(w, LVM_INSERTMARKHITTEST, cast(WPARAM) p, cast(LPARAM) t);
+	}
+
+	BOOL ListView_IsGroupViewEnabled(HWND w) {
+		return SendMessage(w, LVM_ISGROUPVIEWENABLED, 0, 0);
+	}
+
+	UINT ListView_MapIDToIndex(HWND w, UINT i) {
+		return SendMessage(w, LVM_MAPIDTOINDEX, i, 0);
+	}
+
+	/*	??? MSDN documents this as "Not implemented", except in relation to
+	 *	Windows CE/Mobile.
+	 */
+	void ListView_MoveGroup(HWND w, int i, int t) {
+		SendMessage(w, LVM_MOVEGROUP, i, t);
+	}
+
+	void ListView_RemoveAllGroups(HWND w) {
+		SendMessage(w, LVM_REMOVEALLGROUPS, 0, 0);
+	}
+
+	int ListView_RemoveGroup(HWND w, int i) {
+		return SendMessage(w, LVM_REMOVEGROUP, i, 0);
+	}
+
+	int ListView_SetGroupInfo(HWND w, int i, PLVGROUP p) {
+		return SendMessage(w, LVM_SETGROUPINFO, i, cast(LPARAM) p);
+	}
+
+	void ListView_SetGroupMetrics(HWND w, PLVGROUPMETRICS p) {
+		SendMessage(w, LVM_SETGROUPMETRICS, 0, cast(LPARAM) p);
+	}
+
+	BOOL ListView_SetInfoTip(HWND w, PLVSETINFOTIP p) {
+		return SendMessage(w, LVM_SETINFOTIP, 0, cast(LPARAM) p);
+	}
+
+	BOOL ListView_SetInsertMark(HWND w, PLVINSERTMARK p) {
+		return SendMessage(w, LVM_SETINSERTMARK, 0, cast(LPARAM) p);
+	}
+
+	COLORREF ListView_SetInsertMarkColor(HWND w, COLORREF c) {
+		return SendMessage(w, LVM_SETINSERTMARKCOLOR, 0, c);
+	}
+
+	COLORREF ListView_SetOutlineColor(HWND w, COLORREF c) {
+		return SendMessage(w, LVM_SETOUTLINECOLOR, 0, c);
+	}
+
+	void ListView_SetSelectedColumn(HWND w, int i) {
+		SendMessage(w, LVM_SETSELECTEDCOLUMN, i, 0);
+	}
+
+	BOOL ListView_SetTileInfo(HWND w, PLVTILEINFO p) {
+		return SendMessage(w, LVM_SETTILEINFO, 0, cast(LPARAM) p);
+	}
+
+	BOOL ListView_SetTileViewInfo(HWND w, PLVTILEVIEWINFO p) {
+		return SendMessage(w, LVM_SETTILEVIEWINFO, 0, cast(LPARAM) p);
+	}
+
+	int ListView_SetView(HWND w, DWORD i) {
+		return SendMessage(w, LVM_SETVIEW, i, 0);
+	}
+
+	int ListView_SortGroups(HWND w, PFNLVGROUPCOMPARE c, LPVOID p) {
+		return SendMessage(w, LVM_SORTGROUPS, cast(WPARAM) c, cast(LPARAM) p);
+	}
+}
+
+static if (_WIN32_WINNT >= 0x501) {
+	enum {
+		CBM_FIRST        = 0x1700,
+		CB_SETMINVISIBLE = CBM_FIRST + 1,
+		CB_GETMINVISIBLE = CBM_FIRST + 2
+	}
+
+	BOOL ComboBox_SetMinVisible(HWND w, INT i) {
+		return cast(BOOL) SendMessage(w, CB_SETMINVISIBLE, cast(WPARAM) i, 0);
+	}
+
+	int ComboBox_GetMinVisible(HWND w) {
+		return SendMessage(w, CB_GETMINVISIBLE, 0, 0);
+	}
+}
+
+extern (Windows) BOOL MakeDragList(HWND);
+extern (Windows) void MenuHelp(UINT, WPARAM, LPARAM, HMENU, HINSTANCE, HWND,
+  PUINT);
+
+COLORREF MonthCal_GetColor(HWND hwnd, INT icolor) {
+	return cast(COLORREF) SendMessage(hwnd, MCM_GETCOLOR,
+	  cast(WPARAM) icolor, 0);
+}
+
+BOOL MonthCal_GetCurSel(HWND hwnd, LPSYSTEMTIME lpsystime) {
+	return cast(BOOL) SendMessage(hwnd, MCM_GETCURSEL, 0,
+	  cast(LPARAM) lpsystime);
+}
+
+DWORD MonthCal_GetFirstDayOfWeek(HWND hwnd) {
+	return cast(DWORD) SendMessage(hwnd, MCM_GETFIRSTDAYOFWEEK, 0, 0);
+}
+
+DWORD MonthCal_GetMaxSelCount(HWND hwnd) {
+	return cast(DWORD) SendMessage(hwnd, MCM_GETMAXSELCOUNT, 0, 0);
+}
+
+DWORD MonthCal_GetMaxTodayWidth(HWND hwnd) {
+	return cast(DWORD) SendMessage(hwnd, MCM_GETMAXTODAYWIDTH, 0, 0);
+}
+
+BOOL MonthCal_GetMinReqRect(HWND hwnd, LPRECT lpRectInfo) {
+	return cast(BOOL) SendMessage(hwnd, MCM_GETMINREQRECT, 0,
+	  cast(LPARAM) lpRectInfo);
+}
+
+INT MonthCal_GetMonthDelta(HWND hwnd) {
+	return SendMessage(hwnd, MCM_GETMONTHDELTA, 0, 0);
+}
+
+INT MonthCal_GetMonthRange(HWND hwnd, DWORD flag, LPSYSTEMTIME systimearray) {
+	return SendMessage(hwnd, MCM_GETMONTHRANGE, cast(WPARAM) flag,
+	  cast(LPARAM) systimearray);
+}
+
+DWORD MonthCal_GetRange(HWND hwnd, LPSYSTEMTIME systimearray) {
+	return cast(DWORD) SendMessage(hwnd, MCM_GETRANGE, 0,
+	  cast(LPARAM) systimearray);
+}
+
+BOOL MonthCal_GetSelRange(HWND hwnd, LPSYSTEMTIME systimearray) {
+	return cast(BOOL) SendMessage(hwnd, MCM_GETSELRANGE, 0,
+	  cast(LPARAM) systimearray);
+}
+
+BOOL MonthCal_GetToday(HWND hwnd, LPSYSTEMTIME systime) {
+	return cast(BOOL) SendMessage(hwnd, MCM_GETTODAY, 0,
+	  cast(LPARAM) systime);
+}
+
+BOOL MonthCal_GetUnicodeFormat(HWND hwnd) {
+	return cast(BOOL) SendMessage(hwnd, MCM_GETUNICODEFORMAT, 0, 0);
+}
+
+DWORD MonthCal_HitTest(HWND hwnd, PMCHITTESTINFO pmchittest) {
+	return cast(DWORD) SendMessage(hwnd, MCM_HITTEST, 0,
+	  cast(LPARAM) pmchittest);
+}
+
+COLORREF MonthCal_SetColor(HWND hwnd, INT icolor, COLORREF clr) {
+	return cast(COLORREF) SendMessage(hwnd, MCM_SETCOLOR, cast(WPARAM) icolor,
+	  cast(LPARAM) clr);
+}
+
+BOOL MonthCal_SetCurSel(HWND hwnd, LPSYSTEMTIME lpsystime) {
+	return cast(BOOL) SendMessage(hwnd, MCM_SETCURSEL, 0,
+	  cast(LPARAM) lpsystime);
+}
+
+BOOL MonthCal_SetDayState(HWND hwnd, INT imonths, LPMONTHDAYSTATE lpdatestatearray) {
+	return cast(BOOL) SendMessage(hwnd, MCM_SETDAYSTATE, cast(WPARAM) imonths,
+	  cast(LPARAM) lpdatestatearray);
+}
+
+DWORD MonthCal_SetFirstDayOfWeek(HWND hwnd, INT iday) {
+	return cast(DWORD) SendMessage(hwnd, MCM_SETFIRSTDAYOFWEEK, 0,
+	  cast(LPARAM) iday);
+}
+
+BOOL MonthCal_SetMaxSelCount(HWND hwnd, UINT imax) {
+	return cast(BOOL) SendMessage(hwnd, MCM_SETMAXSELCOUNT,
+	  cast(WPARAM) imax, 0);
+}
+
+INT MonthCal_SetMonthDelta(HWND hwnd, INT idelta) {
+	return SendMessage(hwnd, MCM_SETMONTHDELTA, cast(WPARAM) idelta, 0);
+}
+
+BOOL MonthCal_SetSelRange(HWND hwnd, LPSYSTEMTIME systimearray) {
+	return cast(BOOL) SendMessage(hwnd, MCM_SETSELRANGE, 0,
+	  cast(LPARAM) systimearray);
+}
+
+void MonthCal_SetToday(HWND hwnd, LPSYSTEMTIME systime) {
+	SendMessage(hwnd, MCM_SETTODAY, 0, cast(LPARAM) systime);
+}
+
+BOOL MonthCal_SetUnicodeFormat(HWND hwnd, BOOL unicode) {
+	return cast(BOOL) SendMessage(hwnd, MCM_SETUNICODEFORMAT,
+	  cast(WPARAM) unicode, 0);
+}
+
+BOOL MonthCal_SetRange(HWND w, DWORD f, LPSYSTEMTIME st) {
+	return cast(BOOL) SendMessage(w, MCM_SETRANGE, cast(WPARAM) f,
+	  cast(LPARAM) st);
+}
+
+extern (Windows) BOOL ShowHideMenuCtl(HWND, UINT, PINT);
+
+BOOL TabCtrl_GetItem(HWND w, int i, LPTCITEM p) {
+	return cast(BOOL) SendMessage(w, TCM_GETITEM, i, cast(LPARAM) p);
+}
+
+BOOL TabCtrl_SetItem(HWND w, int i, LPTCITEM p) {
+	return cast(BOOL) SendMessage(w, TCM_SETITEM, i, cast(LPARAM) p);
+}
+
+int TabCtrl_InsertItem(HWND w, int i, CPtr!(TC_ITEM) p) {
+	return SendMessage(w, TCM_INSERTITEM, i, cast(LPARAM) p);
+}
+
+BOOL TabCtrl_DeleteItem(HWND w, int i) {
+	return cast(BOOL) SendMessage(w, TCM_DELETEITEM, i, 0);
+}
+
+BOOL TabCtrl_DeleteAllItems(HWND w) {
+	return cast(BOOL) SendMessage(w, TCM_DELETEALLITEMS, 0, 0);
+}
+
+BOOL TabCtrl_GetItemRect(HWND w, int i, LPRECT p) {
+	return cast(BOOL) SendMessage(w, TCM_GETITEMRECT, i, cast(LPARAM) p);
+}
+
+int TabCtrl_GetCurSel(HWND w) {
+	return SendMessage(w, TCM_GETCURSEL, 0, 0);
+}
+
+int TabCtrl_SetCurSel(HWND w, int i) {
+	return SendMessage(w, TCM_SETCURSEL, i, 0);
+}
+
+int TabCtrl_HitTest(HWND w, LPTCHITTESTINFO p) {
+	return SendMessage(w, TCM_HITTEST, 0, cast(LPARAM) p);
+}
+
+BOOL TabCtrl_SetItemExtra(HWND w, int c) {
+	return cast(BOOL) SendMessage(w, TCM_SETITEMEXTRA, c, 0);
+}
+
+int TabCtrl_AdjustRect(HWND w, BOOL b, LPRECT p) {
+	return SendMessage(w, TCM_ADJUSTRECT, b, cast(LPARAM) p);
+}
+
+DWORD TabCtrl_SetItemSize(HWND w, int x, int y) {
+	return cast(DWORD) SendMessage(w, TCM_SETITEMSIZE, 0, MAKELPARAM(cast(ushort)x, cast(ushort)y));
+}
+
+void TabCtrl_RemoveImage(HWND w, int i) {
+	SendMessage(w, TCM_REMOVEIMAGE, i, 0);
+}
+
+void TabCtrl_SetPadding(HWND w, int x, int y) {
+	SendMessage(w, TCM_SETPADDING, 0, MAKELPARAM(cast(ushort)x, cast(ushort)y));
+}
+
+int TabCtrl_GetRowCount(HWND w) {
+	return SendMessage(w, TCM_GETROWCOUNT, 0, 0);
+}
+
+HWND TabCtrl_GetToolTips(HWND w) {
+	return cast(HWND) SendMessage(w, TCM_GETTOOLTIPS, 0, 0);
+}
+
+void TabCtrl_SetToolTips(HWND w, HWND t) {
+	SendMessage(w, TCM_SETTOOLTIPS, cast(WPARAM) t, 0);
+}
+
+int TabCtrl_GetCurFocus(HWND w) {
+	return SendMessage(w, TCM_GETCURFOCUS, 0, 0);
+}
+
+void TabCtrl_SetCurFocus(HWND w, int i) {
+	SendMessage(w, TCM_SETCURFOCUS, i, 0);
+}
+
+HIMAGELIST TabCtrl_GetImageList(HWND w) {
+	return cast(HIMAGELIST) SendMessage(w, TCM_GETIMAGELIST, 0, 0);
+}
+
+HIMAGELIST TabCtrl_SetImageList(HWND w, HIMAGELIST h) {
+	return cast(HIMAGELIST) SendMessage(w, TCM_SETIMAGELIST, 0,
+	  cast(LPARAM) h);
+}
+
+int TabCtrl_GetItemCount(HWND w) {
+	return SendMessage(w, TCM_GETITEMCOUNT, 0, 0);
+}
+
+extern (Windows) BOOL _TrackMouseEvent(LPTRACKMOUSEEVENT);
+
+HTREEITEM TreeView_InsertItem(HWND w, LPTVINSERTSTRUCT i) {
+	return cast(HTREEITEM) SendMessage(w, TVM_INSERTITEM, 0, cast(LPARAM) i);
+}
+
+BOOL TreeView_DeleteItem(HWND w, HTREEITEM i) {
+	return cast(BOOL) SendMessage(w, TVM_DELETEITEM, 0, cast(LPARAM) i);
+}
+
+BOOL TreeView_DeleteAllItems(HWND w) {
+	return cast(BOOL) SendMessage(w, TVM_DELETEITEM, 0, cast(LPARAM) TVI_ROOT);
+}
+
+BOOL TreeView_Expand(HWND w, HTREEITEM i, UINT c) {
+	return cast(BOOL) SendMessage(w, TVM_EXPAND, c, cast(LPARAM) i);
+}
+
+BOOL TreeView_GetItemRect(HWND w, HTREEITEM i, LPRECT p, BOOL c) {
+	*cast(HTREEITEM*) p = i;
+	return cast(BOOL) SendMessage(w, TVM_GETITEMRECT, c, cast(LPARAM) p);
+}
+
+UINT TreeView_GetCount(HWND w) {
+	return cast(UINT) SendMessage(w, TVM_GETCOUNT, 0, 0);
+}
+
+UINT TreeView_GetIndent(HWND w) {
+	return cast(UINT) SendMessage(w, TVM_GETINDENT, 0, 0);
+}
+
+BOOL TreeView_SetIndent(HWND w, INT i) {
+	return cast(BOOL) SendMessage(w, TVM_SETINDENT, i, 0);
+}
+
+HIMAGELIST TreeView_GetImageList(HWND w, INT i) {
+	return cast(HIMAGELIST) SendMessage(w, TVM_GETIMAGELIST, i, 0);
+}
+
+HIMAGELIST TreeView_SetImageList(HWND w, HIMAGELIST h, INT i) {
+	return cast(HIMAGELIST) SendMessage(w, TVM_SETIMAGELIST, i,
+	  cast(LPARAM) h);
+}
+
+HTREEITEM TreeView_GetNextItem(HWND w, HTREEITEM i, UINT c) {
+	return cast(HTREEITEM) SendMessage(w, TVM_GETNEXTITEM, c, cast(LPARAM) i);
+}
+
+HTREEITEM TreeView_GetChild(HWND w, HTREEITEM i) {
+	return TreeView_GetNextItem(w, i, TVGN_CHILD);
+}
+
+HTREEITEM TreeView_GetNextSibling(HWND w, HTREEITEM i) {
+	return TreeView_GetNextItem(w, i, TVGN_NEXT);
+}
+
+HTREEITEM TreeView_GetPrevSibling(HWND w, HTREEITEM i) {
+	return TreeView_GetNextItem(w, i, TVGN_PREVIOUS);
+}
+
+HTREEITEM TreeView_GetParent(HWND w, HTREEITEM i) {
+	return TreeView_GetNextItem(w, i, TVGN_PARENT);
+}
+
+HTREEITEM TreeView_GetFirstVisible(HWND w) {
+	return TreeView_GetNextItem(w, null, TVGN_FIRSTVISIBLE);
+}
+
+HTREEITEM TreeView_GetNextVisible(HWND w, HTREEITEM i) {
+	return TreeView_GetNextItem(w, i, TVGN_NEXTVISIBLE);
+}
+
+HTREEITEM TreeView_GetPrevVisible(HWND w, HTREEITEM i) {
+	return TreeView_GetNextItem(w, i, TVGN_PREVIOUSVISIBLE);
+}
+
+HTREEITEM TreeView_GetSelection(HWND w) {
+	return TreeView_GetNextItem(w, null, TVGN_CARET);
+}
+
+HTREEITEM TreeView_GetDropHilight(HTREEITEM w) {
+	return TreeView_GetNextItem(w, null, TVGN_DROPHILITE);
+}
+
+HTREEITEM TreeView_GetRoot(HWND w) {
+	return TreeView_GetNextItem(w, null, TVGN_ROOT);
+}
+
+BOOL TreeView_Select(HWND w, HTREEITEM i, UINT c) {
+	return cast(BOOL) SendMessage(w, TVM_SELECTITEM, c, cast(LPARAM) i);
+}
+
+BOOL TreeView_SelectItem(HWND w, HTREEITEM i) {
+	return TreeView_Select(w, i, TVGN_CARET);
+}
+
+BOOL TreeView_SelectDropTarget(HWND w, HTREEITEM i) {
+	return TreeView_Select(w, i, TVGN_DROPHILITE);
+}
+
+BOOL TreeView_SelectSetFirstVisible(HWND w, HTREEITEM i) {
+	return TreeView_Select(w, i, TVGN_FIRSTVISIBLE);
+}
+
+BOOL TreeView_GetItem(HWND w, LPTVITEM i) {
+ return cast(BOOL) SendMessage(w, TVM_GETITEM, 0, cast(LPARAM) i);
+}
+
+BOOL TreeView_SetItem(HWND w, CPtr!(TV_ITEM) i) {
+	return cast(BOOL) SendMessage(w, TVM_SETITEM, 0, cast(LPARAM) i);
+}
+
+HWND TreeView_EditLabel(HWND w, HTREEITEM i) {
+	return cast(HWND) SendMessage(w, TVM_EDITLABEL, 0, cast(LPARAM) i);
+}
+
+HWND TreeView_GetEditControl(HWND w) {
+	return cast(HWND) SendMessage(w, TVM_GETEDITCONTROL, 0, 0);
+}
+
+UINT TreeView_GetVisibleCount(HWND w) {
+	return cast(UINT) SendMessage(w, TVM_GETVISIBLECOUNT, 0, 0);
+}
+
+HTREEITEM TreeView_HitTest(HWND w, LPTVHITTESTINFO p) {
+	return cast(HTREEITEM) SendMessage(w, TVM_HITTEST, 0, cast(LPARAM) p);
+}
+
+HIMAGELIST TreeView_CreateDragImage(HWND w, HTREEITEM i) {
+	return cast(HIMAGELIST) SendMessage(w, TVM_CREATEDRAGIMAGE, 0,
+	  cast(LPARAM) i);
+}
+
+BOOL TreeView_SortChildren(HWND w, HTREEITEM i, BOOL r) {
+	return cast(BOOL) SendMessage(w, TVM_SORTCHILDREN, r, cast(LPARAM) i);
+}
+
+BOOL TreeView_EnsureVisible(HWND w, HTREEITEM i) {
+	return cast(BOOL) SendMessage(w, TVM_ENSUREVISIBLE, 0, cast(LPARAM) i);
+}
+
+BOOL TreeView_SortChildrenCB(HWND w, LPTVSORTCB s, BOOL r) {
+	return cast(BOOL) SendMessage(w, TVM_SORTCHILDRENCB, r, cast(LPARAM) s);
+}
+
+BOOL TreeView_EndEditLabelNow(HWND w, BOOL f) {
+	return cast(BOOL) SendMessage(w, TVM_ENDEDITLABELNOW, f, 0);
+}
+
+BOOL TreeView_GetISearchString(HWND w, LPTSTR s) {
+	return cast(BOOL) SendMessage(w, TVM_GETISEARCHSTRING, 0, cast(LPARAM) s);
+}
+
+static if (_WIN32_IE >= 0x300) {
+	DWORD ListView_ApproximateViewRect(HWND w, int iw, int ih, int i) {
+		return cast(DWORD) SendMessage(w, LVM_APPROXIMATEVIEWRECT, i,
+		  MAKELPARAM(cast(ushort)iw, cast(ushort)ih));
+	}
+
+	DWORD ListView_SetExtendedListViewStyle(HWND w, DWORD s) {
+		return cast(DWORD) SendMessage(w, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, s);
+	}
+
+	DWORD ListView_GetExtendedListViewStyle(HWND w) {
+		return cast(DWORD) SendMessage(w, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
+	}
+
+	BOOL ListView_SetColumnOrderArray(HWND w, int i, int* a) {
+		return cast(BOOL) SendMessage(w, LVM_SETCOLUMNORDERARRAY,
+		  cast(WPARAM) i, cast(LPARAM) a);
+	}
+
+	BOOL ListView_GetColumnOrderArray(HWND w, int i, int* a) {
+		return cast(BOOL) SendMessage(w, LVM_GETCOLUMNORDERARRAY,
+		  cast(WPARAM) i, cast(LPARAM) a);
+	}
+
+	HWND ListView_GetHeader(HWND w) {
+		return cast(HWND) SendMessage(w, LVM_GETHEADER, 0, 0);
+	}
+
+	HCURSOR ListView_GetHotCursor(HWND w) {
+		return cast(HCURSOR) SendMessage(w, LVM_GETHOTCURSOR, 0, 0);
+	}
+
+	INT ListView_GetHotItem(HWND w) {
+		return SendMessage(w, LVM_GETHOTITEM, 0, 0);
+	}
+
+	BOOL ListView_GetSubItemRect(HWND w, int i, int isi, int c, LPRECT p) {
+		return cast(BOOL) SendMessage(w, LVM_GETSUBITEMRECT, i,
+		  p ? (p.left = c, p.top = isi, cast(LPARAM) p) : 0);
+	}
+
+	HCURSOR ListView_SetHotCursor(HWND w, HCURSOR c) {
+		return cast(HCURSOR) SendMessage(w, LVM_SETHOTCURSOR, 0,
+		  cast(LPARAM) c);
+	}
+
+	INT ListView_SetHotItem(HWND w, INT i) {
+		return SendMessage(w, LVM_SETHOTITEM, cast(WPARAM) i, 0);
+	}
+
+	DWORD ListView_SetIconSpacing(HWND w, int x, int y) {
+		return cast(DWORD) SendMessage(w, LVM_SETICONSPACING, 0,
+		  MAKELONG(cast(ushort)x, cast(ushort)y));
+	}
+
+	INT ListView_SubItemHitTest(HWND w, LPLVHITTESTINFO p) {
+		return SendMessage(w, LVM_SUBITEMHITTEST, 0, cast(LPARAM) p);
+	}
+
+	BOOL ListView_SetItemCountEx(HWND w, int i, DWORD f) {
+		return cast(BOOL) SendMessage(w, LVM_SETITEMCOUNT, i, cast(LPARAM) f);
+	}
+
+	extern (Windows) {
+		WINBOOL ImageList_SetImageCount(HIMAGELIST, UINT);
+		WINBOOL ImageList_Copy(HIMAGELIST, int, HIMAGELIST, int, UINT);
+		WINBOOL ImageList_DrawIndirect(IMAGELISTDRAWPARAMS*);
+	}
+
+	int TabCtrl_SetMinTabWidth(HWND hwnd, int x) {
+		return SendMessage(hwnd, TCM_SETMINTABWIDTH, 0, x);
+	}
+
+	VOID TabCtrl_DeselectAll(HWND hwnd, UINT fExcludeFocus) {
+		SendMessage(hwnd, TCM_DESELECTALL, fExcludeFocus, 0);
+	}
+
+	HWND TreeView_GetToolTips(HWND w) {
+		return cast(HWND) SendMessage(w, TVM_GETTOOLTIPS, 0, 0);
+	}
+
+	HWND TreeView_SetToolTips(HWND w, HWND wt) {
+		return cast(HWND) SendMessage(w, TVM_SETTOOLTIPS, cast(WPARAM) wt, 0);
+	}
+}
+
+static if (_WIN32_IE >= 0x400) {
+	BOOL ListView_GetBkImage(HWND h, LPLVBKIMAGE plvbki) {
+		return cast(BOOL) SendMessage(h, LVM_GETBKIMAGE, 0,
+		  cast(LPARAM) plvbki);
+	}
+
+	BOOL ListView_SetBkImage(HWND h, LPLVBKIMAGE plvbki) {
+		return cast(BOOL) SendMessage(h, LVM_SETBKIMAGE, 0,
+		  cast(LPARAM) plvbki);
+	}
+
+	DWORD ListView_SetExtendedListViewStyleEx(HWND w, DWORD m, DWORD s) {
+		return cast(DWORD) SendMessage(w, LVM_SETEXTENDEDLISTVIEWSTYLE, m, s);
+	}
+
+	VOID ListView_SetWorkAreas(HWND w, INT n, LPRECT r) {
+		SendMessage(w, LVM_SETWORKAREAS, cast(WPARAM) n, cast(LPARAM) r);
+	}
+
+	VOID ListView_GetWorkAreas(HWND w, INT n, LPRECT r) {
+		SendMessage(w, LVM_GETWORKAREAS, cast(WPARAM) n, cast(LPARAM) r);
+	}
+
+	BOOL ListView_GetNumberOfWorkAreas(HWND w, LPUINT n) {
+		return cast(BOOL) SendMessage(w, LVM_GETNUMBEROFWORKAREAS, 0,
+		  cast(LPARAM) n);
+	}
+
+	DWORD ListView_SetHoverTime(HWND w, DWORD t) {
+		return cast(DWORD) SendMessage(w, LVM_SETHOVERTIME, 0,
+		  cast(LPARAM) t);
+	}
+
+	DWORD ListView_GetHoverTime(HWND w) {
+		return cast(DWORD) SendMessage(w, LVM_GETHOVERTIME, 0, 0);
+	}
+
+	INT ListView_GetSelectionMark(HWND w) {
+		return SendMessage(w, LVM_GETSELECTIONMARK, 0, 0);
+	}
+
+	INT ListView_SetSelectionMark(HWND w, INT i) {
+		return SendMessage(w, LVM_SETSELECTIONMARK, 0, cast(LPARAM) i);
+	}
+
+	HWND ListView_SetToolTips(HWND w, HWND n) {
+		return cast(HWND) SendMessage(w, LVM_SETTOOLTIPS, cast(WPARAM) n, 0);
+	}
+
+	HWND ListView_GetToolTips(HWND w) {
+		return cast(HWND) SendMessage(w, LVM_GETTOOLTIPS, 0, 0);
+	}
+
+	BOOL ListView_SetUnicodeFormat(HWND w, BOOL f) {
+		return cast(BOOL) SendMessage(w, LVM_SETUNICODEFORMAT,
+		  cast(WPARAM) f, 0);
+	}
+
+	BOOL ListView_GetUnicodeFormat(HWND w) {
+		return cast(BOOL) SendMessage(w, LVM_GETUNICODEFORMAT, 0, 0);
+	}
+
+	BOOL TabCtrl_HighlightItem(HWND hwnd, INT i, WORD fHighlight) {
+		return cast(BOOL) SendMessage(hwnd, TCM_HIGHLIGHTITEM,
+		  cast(WPARAM) i, cast(LPARAM) MAKELONG(fHighlight, 0));
+	}
+
+	DWORD TabCtrl_SetExtendedStyle(HWND hwnd, DWORD dw) {
+		return cast(DWORD) SendMessage(hwnd, TCM_SETEXTENDEDSTYLE, 0, dw);
+	}
+
+	DWORD TabCtrl_GetExtendedStyle(HWND hwnd) {
+		return cast(DWORD) SendMessage(hwnd, TCM_GETEXTENDEDSTYLE, 0, 0);
+	}
+
+	BOOL TabCtrl_SetUnicodeFormat(HWND hwnd, HWND fUnicode) {
+		return cast(BOOL) SendMessage(hwnd, TCM_SETUNICODEFORMAT,
+		  cast(WPARAM) fUnicode, 0);
+	}
+
+	BOOL TabCtrl_GetUnicodeFormat(HWND hwnd) {
+		return cast(BOOL) SendMessage(hwnd, TCM_GETUNICODEFORMAT, 0, 0);
+	}
+
+	COLORREF TreeView_GetBkColor(HWND w) {
+		return cast(COLORREF) SendMessage(w, TVM_GETBKCOLOR, 0, 0);
+	}
+
+	COLORREF TreeView_GetInsertMarkColor(HWND w) {
+		return cast(COLORREF) SendMessage(w, TVM_GETINSERTMARKCOLOR, 0, 0);
+	}
+
+	int TreeView_GetItemHeight(HWND w) {
+		return SendMessage(w, TVM_GETITEMHEIGHT, 0, 0);
+	}
+
+	UINT TreeView_GetScrollTime(HWND w) {
+		return cast(UINT) SendMessage(w, TVM_GETSCROLLTIME, 0, 0);
+	}
+
+	COLORREF TreeView_GetTextColor(HWND w) {
+		return cast(COLORREF) SendMessage(w, TVM_GETTEXTCOLOR, 0, 0);
+	}
+
+	COLORREF TreeView_SetBkColor(HWND w, COLORREF c) {
+		return cast(COLORREF) SendMessage(w, TVM_SETBKCOLOR, 0,
+		  cast(LPARAM) c);
+	}
+
+	COLORREF TreeView_SetInsertMarkColor(HWND w, COLORREF c) {
+		return cast(COLORREF) SendMessage(w, TVM_SETINSERTMARKCOLOR, 0,
+		  cast(LPARAM) c);
+	}
+
+	int TreeView_SetItemHeight(HWND w, SHORT h) {
+		return SendMessage(w, TVM_SETITEMHEIGHT, cast(WPARAM) h, 0);
+	}
+
+	UINT TreeView_SetScrollTime(HWND w, UINT t) {
+		return cast(UINT) SendMessage(w, TVM_SETSCROLLTIME, cast(WPARAM) t, 0);
+	}
+
+	COLORREF TreeView_SetTextColor(HWND w, COLORREF c) {
+		return cast(COLORREF) SendMessage(w, TVM_SETTEXTCOLOR, 0,
+		  cast(LPARAM) c);
+	}
+
+	BOOL TreeView_SetInsertMark(HWND w, HTREEITEM i, BOOL a) {
+		return cast(BOOL) SendMessage(w, TVM_SETINSERTMARK, cast(WPARAM) a,
+		  cast(LPARAM) i);
+	}
+
+	BOOL TreeView_SetUnicodeFormat(HWND w, BOOL u) {
+		return cast(BOOL) SendMessage(w, TVM_SETUNICODEFORMAT,
+		  cast(WPARAM) u, 0);
+	}
+
+	BOOL TreeView_GetUnicodeFormat(HWND w) {
+		return cast(BOOL) SendMessage(w, TVM_GETUNICODEFORMAT, 0, 0);
+	}
+
+	HTREEITEM TreeView_GetLastVisible(HWND w) {
+		return TreeView_GetNextItem(w, null, TVGN_LASTVISIBLE);
+	}
+}
+
+static if (_WIN32_IE >= 0x500) {
+	UINT TreeView_GetItemState(HWND w, HTREEITEM i, UINT m) {
+		return cast(UINT) SendMessage(w, TVM_GETITEMSTATE, cast(WPARAM) i,
+		  cast(LPARAM) m);
+	}
+
+	BOOL TreeView_SetItemState(HWND w, HTREEITEM i, UINT d, UINT m) {
+		TVITEM _tvi;
+		_tvi.mask = TVIF_STATE;
+		_tvi.hItem = i;
+		_tvi.stateMask = m;
+		_tvi.state = d;
+		return cast(BOOL) SendMessage(w, TVM_SETITEM, 0, cast(LPARAM) &_tvi);
+	}
+}
+
+
+//#ifdef _WIN32_WCE               // these are PPC only
+/+
+extern (Windows) {
+	HWND  CommandBar_Create(HINSTANCE, HWND, int);
+	BOOL  CommandBar_Show(HWND, BOOL);
+	int   CommandBar_AddBitmap(HWND, HINSTANCE, int, int, int, int);
+	HWND  CommandBar_InsertComboBox(HWND, HINSTANCE, int, UINT, WORD, WORD);
+	BOOL  CommandBar_InsertMenubar(HWND, HINSTANCE, WORD, WORD );
+	BOOL  CommandBar_InsertMenubarEx(HWND, HINSTANCE, LPTSTR, WORD);
+	BOOL  CommandBar_DrawMenuBar(HWND, WORD);
+	HMENU CommandBar_GetMenu(HWND, WORD);
+	BOOL  CommandBar_AddAdornments(HWND, DWORD, DWORD);
+	int   CommandBar_Height(HWND hwndCB);
+}
+
+// MinGW: These two are not in the DLL
+void CommandBar_InsertButton(HWND hwnd, int i, LPTBBUTTON lptbbutton) {
+    SendMessage(hwnd, TB_INSERTBUTTON, i, lptbbutton);
+}
+alias DestroyWindow CommandBar_Destroy;
++/
+//#endif // _WIN32_WCE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/commdlg.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,698 @@
+/***********************************************************************\
+*                               commdlg.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*             Translated from MinGW API for MS-Windows 3.12             *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.commdlg;
+pragma(lib, "comdlg32.lib");
+
+private import win32.w32api;
+import win32.windef, win32.winuser;
+import win32.wingdi; // for LPLOGFONTA
+
+const TCHAR[]
+	LBSELCHSTRING = "commdlg_LBSelChangedNotify",
+	SHAREVISTRING = "commdlg_ShareViolation",
+	FILEOKSTRING  = "commdlg_FileNameOK",
+	COLOROKSTRING = "commdlg_ColorOK",
+	SETRGBSTRING  = "commdlg_SetRGBColor",
+	HELPMSGSTRING = "commdlg_help",
+	FINDMSGSTRING = "commdlg_FindReplace";
+
+enum : UINT {
+	CDN_FIRST          = -601, // also in commctrl.h
+	CDN_LAST           = -699,
+	CDN_INITDONE       = CDN_FIRST,
+	CDN_SELCHANGE      = CDN_FIRST - 1,
+	CDN_FOLDERCHANGE   = CDN_FIRST - 2,
+	CDN_SHAREVIOLATION = CDN_FIRST - 3,
+	CDN_HELP           = CDN_FIRST - 4,
+	CDN_FILEOK         = CDN_FIRST - 5,
+	CDN_TYPECHANGE     = CDN_FIRST - 6
+}
+
+enum : UINT {
+	CDM_FIRST           = WM_USER + 100,
+	CDM_LAST            = WM_USER + 200,
+	CDM_GETSPEC         = CDM_FIRST,
+	CDM_GETFILEPATH,
+	CDM_GETFOLDERPATH,
+	CDM_GETFOLDERIDLIST,
+	CDM_SETCONTROLTEXT,
+	CDM_HIDECONTROL,
+	CDM_SETDEFEXT    // = CDM_FIRST + 6
+}
+
+// flags for ChooseColor
+enum : DWORD {
+	CC_RGBINIT              = 0x0001,
+	CC_FULLOPEN             = 0x0002,
+	CC_PREVENTFULLOPEN      = 0x0004,
+	CC_SHOWHELP             = 0x0008,
+	CC_ENABLEHOOK           = 0x0010,
+	CC_ENABLETEMPLATE       = 0x0020,
+	CC_ENABLETEMPLATEHANDLE = 0x0040,
+	CC_SOLIDCOLOR           = 0x0080,
+	CC_ANYCOLOR             = 0x0100
+}
+
+// flags for ChooseFont
+enum : DWORD {
+	CF_SCREENFONTS          = 0x00000001,
+	CF_PRINTERFONTS         = 0x00000002,
+	CF_BOTH                 = 0x00000003,
+	CF_SHOWHELP             = 0x00000004,
+	CF_ENABLEHOOK           = 0x00000008,
+	CF_ENABLETEMPLATE       = 0x00000010,
+	CF_ENABLETEMPLATEHANDLE = 0x00000020,
+	CF_INITTOLOGFONTSTRUCT  = 0x00000040,
+	CF_USESTYLE             = 0x00000080,
+	CF_EFFECTS              = 0x00000100,
+	CF_APPLY                = 0x00000200,
+	CF_ANSIONLY             = 0x00000400,
+	CF_SCRIPTSONLY          = CF_ANSIONLY,
+	CF_NOVECTORFONTS        = 0x00000800,
+	CF_NOOEMFONTS           = 0x00000800,
+	CF_NOSIMULATIONS        = 0x00001000,
+	CF_LIMITSIZE            = 0x00002000,
+	CF_FIXEDPITCHONLY       = 0x00004000,
+	CF_WYSIWYG              = 0x00008000,
+	CF_FORCEFONTEXIST       = 0x00010000,
+	CF_SCALABLEONLY         = 0x00020000,
+	CF_TTONLY               = 0x00040000,
+	CF_NOFACESEL            = 0x00080000,
+	CF_NOSTYLESEL           = 0x00100000,
+	CF_NOSIZESEL            = 0x00200000,
+	CF_SELECTSCRIPT         = 0x00400000,
+	CF_NOSCRIPTSEL          = 0x00800000,
+	CF_NOVERTFONTS          = 0x01000000
+}
+
+// Font type for ChooseFont
+enum : WORD {
+	BOLD_FONTTYPE      = 0x0100,
+	ITALIC_FONTTYPE    = 0x0200,
+	REGULAR_FONTTYPE   = 0x0400,
+	SCREEN_FONTTYPE    = 0x2000,
+	PRINTER_FONTTYPE   = 0x4000,
+	SIMULATED_FONTTYPE = 0x8000
+}
+
+enum : UINT {
+	WM_CHOOSEFONT_GETLOGFONT = WM_USER +   1,
+	WM_CHOOSEFONT_SETLOGFONT = WM_USER + 101,
+	WM_CHOOSEFONT_SETFLAGS   = WM_USER + 102
+}
+
+// flags for OpenFileName
+enum : DWORD {
+	OFN_SHAREWARN            = 0,
+	OFN_SHARENOWARN          = 0x000001,
+	OFN_READONLY             = 0x000001,
+	OFN_SHAREFALLTHROUGH     = 0x000002,
+	OFN_OVERWRITEPROMPT      = 0x000002,
+	OFN_HIDEREADONLY         = 0x000004,
+	OFN_NOCHANGEDIR          = 0x000008,
+	OFN_SHOWHELP             = 0x000010,
+	OFN_ENABLEHOOK           = 0x000020,
+	OFN_ENABLETEMPLATE       = 0x000040,
+	OFN_ENABLETEMPLATEHANDLE = 0x000080,
+	OFN_NOVALIDATE           = 0x000100,
+	OFN_ALLOWMULTISELECT     = 0x000200,
+	OFN_EXTENSIONDIFFERENT   = 0x000400,
+	OFN_PATHMUSTEXIST        = 0x000800,
+	OFN_FILEMUSTEXIST        = 0x001000,
+	OFN_CREATEPROMPT         = 0x002000,
+	OFN_SHAREAWARE           = 0x004000,
+	OFN_NOREADONLYRETURN     = 0x008000,
+	OFN_NOTESTFILECREATE     = 0x010000,
+	OFN_NONETWORKBUTTON      = 0x020000,
+	OFN_NOLONGNAMES          = 0x040000,
+	OFN_EXPLORER             = 0x080000,
+	OFN_NODEREFERENCELINKS   = 0x100000,
+	OFN_LONGNAMES            = 0x200000,
+	OFN_ENABLESIZING         = 0x800000
+}
+
+enum : DWORD {
+	FR_DOWN                 = 0x00000001,
+	FR_WHOLEWORD            = 0x00000002,
+	FR_MATCHCASE            = 0x00000004,
+	FR_FINDNEXT             = 0x00000008,
+	FR_REPLACE              = 0x00000010,
+	FR_REPLACEALL           = 0x00000020,
+	FR_DIALOGTERM           = 0x00000040,
+	FR_SHOWHELP             = 0x00000080,
+	FR_ENABLEHOOK           = 0x00000100,
+	FR_ENABLETEMPLATE       = 0x00000200,
+	FR_NOUPDOWN             = 0x00000400,
+	FR_NOMATCHCASE          = 0x00000800,
+	FR_NOWHOLEWORD          = 0x00001000,
+	FR_ENABLETEMPLATEHANDLE = 0x00002000,
+	FR_HIDEUPDOWN           = 0x00004000,
+	FR_HIDEMATCHCASE        = 0x00008000,
+	FR_HIDEWHOLEWORD        = 0x00010000,
+	FR_MATCHDIAC            = 0x20000000,
+	FR_MATCHKASHIDA         = 0x40000000,
+	FR_MATCHALEFHAMZA       = 0x80000000
+}
+
+enum : DWORD {
+	PD_ALLPAGES                   = 0,
+	PD_SELECTION                  = 0x000001,
+	PD_PAGENUMS                   = 0x000002,
+	PD_NOSELECTION                = 0x000004,
+	PD_NOPAGENUMS                 = 0x000008,
+	PD_COLLATE                    = 0x000010,
+	PD_PRINTTOFILE                = 0x000020,
+	PD_PRINTSETUP                 = 0x000040,
+	PD_NOWARNING                  = 0x000080,
+	PD_RETURNDC                   = 0x000100,
+	PD_RETURNIC                   = 0x000200,
+	PD_RETURNDEFAULT              = 0x000400,
+	PD_SHOWHELP                   = 0x000800,
+	PD_ENABLEPRINTHOOK            = 0x001000,
+	PD_ENABLESETUPHOOK            = 0x002000,
+	PD_ENABLEPRINTTEMPLATE        = 0x004000,
+	PD_ENABLESETUPTEMPLATE        = 0x008000,
+	PD_ENABLEPRINTTEMPLATEHANDLE  = 0x010000,
+	PD_ENABLESETUPTEMPLATEHANDLE  = 0x020000,
+	PD_USEDEVMODECOPIES           = 0x040000,
+	PD_USEDEVMODECOPIESANDCOLLATE = 0x040000,
+	PD_DISABLEPRINTTOFILE         = 0x080000,
+	PD_HIDEPRINTTOFILE            = 0x100000,
+	PD_NONETWORKBUTTON            = 0x200000
+}
+
+static if (_WIN32_WINNT_ONLY && _WIN32_WINNT >= 0x500) {
+	enum : DWORD {
+		PD_CURRENTPAGE      = 0x00400000,
+		PD_NOCURRENTPAGE    = 0x00800000,
+		PD_EXCLUSIONFLAGS   = 0x01000000,
+		PD_USELARGETEMPLATE = 0x10000000,
+	}
+
+	enum : HRESULT {
+		PD_RESULT_CANCEL,
+		PD_RESULT_PRINT,
+		PD_RESULT_APPLY
+	}
+
+	const DWORD START_PAGE_GENERAL = 0xFFFFFFFF;
+}
+
+enum {
+	PSD_DEFAULTMINMARGINS             = 0,
+	PSD_INWININIINTLMEASURE           = 0,
+	PSD_MINMARGINS                    = 0x000001,
+	PSD_MARGINS                       = 0x000002,
+	PSD_INTHOUSANDTHSOFINCHES         = 0x000004,
+	PSD_INHUNDREDTHSOFMILLIMETERS     = 0x000008,
+	PSD_DISABLEMARGINS                = 0x000010,
+	PSD_DISABLEPRINTER                = 0x000020,
+	PSD_NOWARNING                     = 0x000080,
+	PSD_DISABLEORIENTATION            = 0x000100,
+	PSD_DISABLEPAPER                  = 0x000200,
+	PSD_RETURNDEFAULT                 = 0x000400,
+	PSD_SHOWHELP                      = 0x000800,
+	PSD_ENABLEPAGESETUPHOOK           = 0x002000,
+	PSD_ENABLEPAGESETUPTEMPLATE       = 0x008000,
+	PSD_ENABLEPAGESETUPTEMPLATEHANDLE = 0x020000,
+	PSD_ENABLEPAGEPAINTHOOK           = 0x040000,
+	PSD_DISABLEPAGEPAINTING           = 0x080000
+}
+
+enum : UINT {
+	WM_PSD_PAGESETUPDLG = WM_USER,
+	WM_PSD_FULLPAGERECT,
+	WM_PSD_MINMARGINRECT,
+	WM_PSD_MARGINRECT,
+	WM_PSD_GREEKTEXTRECT,
+	WM_PSD_ENVSTAMPRECT,
+	WM_PSD_YAFULLPAGERECT // = WM_USER + 6
+}
+
+enum : int {
+	CD_LBSELNOITEMS = -1,
+	CD_LBSELCHANGE,
+	CD_LBSELSUB,
+	CD_LBSELADD
+}
+
+const WORD DN_DEFAULTPRN = 1;
+
+/+
+// Both MinGW and the windows docs indicate that there are macros for the send messages
+// the controls. These seem to be totally unnecessary -- and at least one of MinGW or
+// Windows Docs is buggy!
+
+int CommDlg_OpenSave_GetSpec(HWND hWndControl, LPARAM lparam, WPARAM wParam) {
+	return SendMessage(hWndControl, CDM_GETSPEC, wParam, lParam);
+}
+
+int CommDlg_OpenSave_GetFilePath(HWND hWndControl, LPARAM lparam, WPARAM wParam) {
+	return SendMessage(hWndControl, CDM_GETFILEPATH, wParam, lParam);
+}
+
+int CommDlg_OpenSave_GetFolderPath(HWND hWndControl, LPARAM lparam, WPARAM wParam) {
+	return SendMessage(hWndControl, CDM_GETFOLDERPATH, wParam, lParam);
+}
+
+int CommDlg_OpenSave_GetFolderIDList(HWND hWndControl, LPARAM lparam, WPARAM wParam) {
+	return SendMessage(hWndControl, CDM_GETFOLDERIDLIST, wParam, lParam);
+}
+
+void CommDlg_OpenSave_SetControlText(HWND hWndControl, LPARAM lparam, WPARAM wParam) {
+	return SendMessage(hWndControl, CDM_SETCONTROLTEXT, wParam, lParam);
+}
+
+void CommDlg_OpenSave_HideControl(HWND hWndControl, WPARAM wParam) {
+	return SendMessage(hWndControl, CDM_HIDECONTROL, wParam, 0);
+}
+
+void CommDlg_OpenSave_SetDefExt(HWND hWndControl, TCHAR* lparam) {
+	return SendMessage(hWndControl, CDM_SETCONTROLTEXT, 0, cast(LPARAM)lParam);
+}
+
+// These aliases seem even more unnecessary
+alias CommDlg_OpenSave_GetSpec
+	CommDlg_OpenSave_GetSpecA, CommDlg_OpenSave_GetSpecW;
+alias CommDlg_OpenSave_GetFilePath
+	CommDlg_OpenSave_GetFilePathA, CommDlg_OpenSave_GetFilePathW;
+alias CommDlg_OpenSave_GetFolderPath
+	CommDlg_OpenSave_GetFolderPathA, CommDlg_OpenSave_GetFolderPathW;
++/
+
+// Callbacks.
+extern(Windows) {
+alias UINT function (HWND, UINT, WPARAM, LPARAM)
+	LPCCHOOKPROC, LPCFHOOKPROC, LPFRHOOKPROC, LPOFNHOOKPROC,
+	LPPAGEPAINTHOOK, LPPAGESETUPHOOK, LPSETUPHOOKPROC, LPPRINTHOOKPROC;
+}
+
+align (1):
+
+struct CHOOSECOLORA {
+	DWORD        lStructSize = CHOOSECOLORA.sizeof;
+	HWND         hwndOwner;
+	HWND         hInstance;
+	COLORREF     rgbResult;
+	COLORREF*    lpCustColors;
+	DWORD        Flags;
+	LPARAM       lCustData;
+	LPCCHOOKPROC lpfnHook;
+	LPCSTR       lpTemplateName;
+}
+alias CHOOSECOLORA* LPCHOOSECOLORA;
+
+struct CHOOSECOLORW {
+	DWORD        lStructSize = CHOOSECOLORW.sizeof;
+	HWND         hwndOwner;
+	HWND         hInstance;
+	COLORREF     rgbResult;
+	COLORREF*    lpCustColors;
+	DWORD        Flags;
+	LPARAM       lCustData;
+	LPCCHOOKPROC lpfnHook;
+	LPCWSTR      lpTemplateName;
+}
+alias CHOOSECOLORW* LPCHOOSECOLORW;
+
+align (4) struct CHOOSEFONTA {
+	DWORD        lStructSize = CHOOSEFONTA.sizeof;
+	HWND         hwndOwner;
+	HDC          hDC;
+	LPLOGFONTA   lpLogFont;
+	INT          iPointSize;
+	DWORD        Flags;
+	DWORD        rgbColors;
+	LPARAM       lCustData;
+	LPCFHOOKPROC lpfnHook;
+	LPCSTR       lpTemplateName;
+	HINSTANCE    hInstance;
+	LPSTR        lpszStyle;
+	WORD         nFontType;
+	//WORD         ___MISSING_ALIGNMENT__;
+	INT          nSizeMin;
+	INT          nSizeMax;
+}
+alias CHOOSEFONTA* LPCHOOSEFONTA;
+
+align (4) struct CHOOSEFONTW {
+	DWORD        lStructSize = CHOOSEFONTW.sizeof;
+	HWND         hwndOwner;
+	HDC          hDC;
+	LPLOGFONTW   lpLogFont;
+	INT          iPointSize;
+	DWORD        Flags;
+	DWORD        rgbColors;
+	LPARAM       lCustData;
+	LPCFHOOKPROC lpfnHook;
+	LPCWSTR      lpTemplateName;
+	HINSTANCE    hInstance;
+	LPWSTR       lpszStyle;
+	WORD         nFontType;
+	//WORD         ___MISSING_ALIGNMENT__;
+	INT          nSizeMin;
+	INT          nSizeMax;
+}
+alias CHOOSEFONTW* LPCHOOSEFONTW;
+
+struct DEVNAMES {
+	WORD wDriverOffset;
+	WORD wDeviceOffset;
+	WORD wOutputOffset;
+	WORD wDefault;
+}
+alias DEVNAMES* LPDEVNAMES;
+
+struct FINDREPLACEA {
+	DWORD        lStructSize = FINDREPLACEA.sizeof;
+	HWND         hwndOwner;
+	HINSTANCE    hInstance;
+	DWORD        Flags;
+	LPSTR        lpstrFindWhat;
+	LPSTR        lpstrReplaceWith;
+	WORD         wFindWhatLen;
+	WORD         wReplaceWithLen;
+	LPARAM       lCustData;
+	LPFRHOOKPROC lpfnHook;
+	LPCSTR       lpTemplateName;
+}
+alias FINDREPLACEA* LPFINDREPLACEA;
+
+struct FINDREPLACEW {
+	DWORD        lStructSize = FINDREPLACEW.sizeof;
+	HWND         hwndOwner;
+	HINSTANCE    hInstance;
+	DWORD        Flags;
+	LPWSTR       lpstrFindWhat;
+	LPWSTR       lpstrReplaceWith;
+	WORD         wFindWhatLen;
+	WORD         wReplaceWithLen;
+	LPARAM       lCustData;
+	LPFRHOOKPROC lpfnHook;
+	LPCWSTR      lpTemplateName;
+}
+alias FINDREPLACEW* LPFINDREPLACEW;
+
+struct OPENFILENAMEA {
+	DWORD         lStructSize = OPENFILENAMEA.sizeof;
+	HWND          hwndOwner;
+	HINSTANCE     hInstance;
+	LPCSTR        lpstrFilter;
+	LPSTR         lpstrCustomFilter;
+	DWORD         nMaxCustFilter;
+	DWORD         nFilterIndex;
+	LPSTR         lpstrFile;
+	DWORD         nMaxFile;
+	LPSTR         lpstrFileTitle;
+	DWORD         nMaxFileTitle;
+	LPCSTR        lpstrInitialDir;
+	LPCSTR        lpstrTitle;
+	DWORD         Flags;
+	WORD          nFileOffset;
+	WORD          nFileExtension;
+	LPCSTR        lpstrDefExt;
+	DWORD         lCustData;
+	LPOFNHOOKPROC lpfnHook;
+	LPCSTR        lpTemplateName;
+}
+alias OPENFILENAMEA* LPOPENFILENAMEA;
+
+struct OPENFILENAMEW {
+	DWORD         lStructSize = OPENFILENAMEW.sizeof;
+	HWND          hwndOwner;
+	HINSTANCE     hInstance;
+	LPCWSTR       lpstrFilter;
+	LPWSTR        lpstrCustomFilter;
+	DWORD         nMaxCustFilter;
+	DWORD         nFilterIndex;
+	LPWSTR        lpstrFile;
+	DWORD         nMaxFile;
+	LPWSTR        lpstrFileTitle;
+	DWORD         nMaxFileTitle;
+	LPCWSTR       lpstrInitialDir;
+	LPCWSTR       lpstrTitle;
+	DWORD         Flags;
+	WORD          nFileOffset;
+	WORD          nFileExtension;
+	LPCWSTR       lpstrDefExt;
+	DWORD         lCustData;
+	LPOFNHOOKPROC lpfnHook;
+	LPCWSTR       lpTemplateName;
+}
+alias OPENFILENAMEW* LPOPENFILENAMEW;
+
+const size_t OPENFILENAME_SIZE_VERSION_400 = 76;
+
+struct OFNOTIFYA {
+	NMHDR           hdr;
+	LPOPENFILENAMEA lpOFN;
+	LPSTR           pszFile;
+}
+alias OFNOTIFYA* LPOFNOTIFYA;
+
+struct OFNOTIFYW {
+	NMHDR           hdr;
+	LPOPENFILENAMEW lpOFN;
+	LPWSTR          pszFile;
+}
+alias OFNOTIFYW* LPOFNOTIFYW;
+
+struct PAGESETUPDLGA {
+	DWORD           lStructSize = PAGESETUPDLGA.sizeof;
+	HWND            hwndOwner;
+	HGLOBAL         hDevMode;
+	HGLOBAL         hDevNames;
+	DWORD           Flags;
+	POINT           ptPaperSize;
+	RECT            rtMinMargin;
+	RECT            rtMargin;
+	HINSTANCE       hInstance;
+	LPARAM          lCustData;
+	LPPAGESETUPHOOK lpfnPageSetupHook;
+	LPPAGEPAINTHOOK lpfnPagePaintHook;
+	LPCSTR          lpPageSetupTemplateName;
+	HGLOBAL         hPageSetupTemplate;
+}
+alias PAGESETUPDLGA* LPPAGESETUPDLGA;
+
+struct PAGESETUPDLGW {
+	DWORD           lStructSize = PAGESETUPDLGW.sizeof;
+	HWND            hwndOwner;
+	HGLOBAL         hDevMode;
+	HGLOBAL         hDevNames;
+	DWORD           Flags;
+	POINT           ptPaperSize;
+	RECT            rtMinMargin;
+	RECT            rtMargin;
+	HINSTANCE       hInstance;
+	LPARAM          lCustData;
+	LPPAGESETUPHOOK lpfnPageSetupHook;
+	LPPAGEPAINTHOOK lpfnPagePaintHook;
+	LPCWSTR         lpPageSetupTemplateName;
+	HGLOBAL         hPageSetupTemplate;
+}
+alias PAGESETUPDLGW* LPPAGESETUPDLGW;
+
+struct PRINTDLGA {
+	DWORD           lStructSize = PRINTDLGA.sizeof;
+	HWND            hwndOwner;
+	HANDLE          hDevMode;
+	HANDLE          hDevNames;
+	HDC             hDC;
+	DWORD           Flags;
+	WORD            nFromPage;
+	WORD            nToPage;
+	WORD            nMinPage;
+	WORD            nMaxPage;
+	WORD            nCopies;
+	HINSTANCE       hInstance;
+	DWORD           lCustData;
+	LPPRINTHOOKPROC lpfnPrintHook;
+	LPSETUPHOOKPROC lpfnSetupHook;
+	LPCSTR          lpPrintTemplateName;
+	LPCSTR          lpSetupTemplateName;
+	HANDLE          hPrintTemplate;
+	HANDLE          hSetupTemplate;
+}
+alias PRINTDLGA* LPPRINTDLGA;
+
+struct PRINTDLGW {
+	DWORD           lStructSize = PRINTDLGW.sizeof;
+	HWND            hwndOwner;
+	HANDLE          hDevMode;
+	HANDLE          hDevNames;
+	HDC             hDC;
+	DWORD           Flags;
+	WORD            nFromPage;
+	WORD            nToPage;
+	WORD            nMinPage;
+	WORD            nMaxPage;
+	WORD            nCopies;
+	HINSTANCE       hInstance;
+	DWORD           lCustData;
+	LPPRINTHOOKPROC lpfnPrintHook;
+	LPSETUPHOOKPROC lpfnSetupHook;
+	LPCWSTR         lpPrintTemplateName;
+	LPCWSTR         lpSetupTemplateName;
+	HANDLE          hPrintTemplate;
+	HANDLE          hSetupTemplate;
+}
+alias PRINTDLGW* LPPRINTDLGW;
+
+static if (_WIN32_WINNT_ONLY && _WIN32_WINNT >= 0x500) {
+	import win32.unknwn; // for LPUNKNOWN
+	import win32.prsht;  // for HPROPSHEETPAGE
+
+	struct PRINTPAGERANGE {
+		DWORD  nFromPage;
+		DWORD  nToPage;
+	}
+	alias PRINTPAGERANGE* LPPRINTPAGERANGE;
+
+	struct PRINTDLGEXA {
+		DWORD            lStructSize = PRINTDLGEXA.sizeof;
+		HWND             hwndOwner;
+		HGLOBAL          hDevMode;
+		HGLOBAL          hDevNames;
+		HDC              hDC;
+		DWORD            Flags;
+		DWORD            Flags2;
+		DWORD            ExclusionFlags;
+		DWORD            nPageRanges;
+		DWORD            nMaxPageRanges;
+		LPPRINTPAGERANGE lpPageRanges;
+		DWORD            nMinPage;
+		DWORD            nMaxPage;
+		DWORD            nCopies;
+		HINSTANCE        hInstance;
+		LPCSTR           lpPrintTemplateName;
+		LPUNKNOWN        lpCallback;
+		DWORD            nPropertyPages;
+		HPROPSHEETPAGE*  lphPropertyPages;
+		DWORD            nStartPage;
+		DWORD            dwResultAction;
+	}
+	alias PRINTDLGEXA* LPPRINTDLGEXA;
+
+	struct PRINTDLGEXW {
+		DWORD            lStructSize = PRINTDLGEXW.sizeof;
+		HWND             hwndOwner;
+		HGLOBAL          hDevMode;
+		HGLOBAL          hDevNames;
+		HDC              hDC;
+		DWORD            Flags;
+		DWORD            Flags2;
+		DWORD            ExclusionFlags;
+		DWORD            nPageRanges;
+		DWORD            nMaxPageRanges;
+		LPPRINTPAGERANGE lpPageRanges;
+		DWORD            nMinPage;
+		DWORD            nMaxPage;
+		DWORD            nCopies;
+		HINSTANCE        hInstance;
+		LPCWSTR          lpPrintTemplateName;
+		LPUNKNOWN        lpCallback;
+		DWORD            nPropertyPages;
+		HPROPSHEETPAGE*  lphPropertyPages;
+		DWORD            nStartPage;
+		DWORD            dwResultAction;
+	}
+	alias PRINTDLGEXW* LPPRINTDLGEXW;
+
+} // _WIN32_WINNT_ONLY && _WIN32_WINNT >= 0x500
+
+extern (Windows) {
+	BOOL ChooseColorA(LPCHOOSECOLORA);
+	BOOL ChooseColorW(LPCHOOSECOLORW);
+	BOOL ChooseFontA(LPCHOOSEFONTA);
+	BOOL ChooseFontW(LPCHOOSEFONTW);
+	DWORD CommDlgExtendedError();
+	HWND FindTextA(LPFINDREPLACEA);
+	HWND FindTextW(LPFINDREPLACEW);
+	short GetFileTitleA(LPCSTR, LPSTR, WORD);
+	short GetFileTitleW(LPCWSTR, LPWSTR, WORD);
+	BOOL GetOpenFileNameA(LPOPENFILENAMEA);
+	BOOL GetOpenFileNameW(LPOPENFILENAMEW);
+	BOOL GetSaveFileNameA(LPOPENFILENAMEA);
+	BOOL GetSaveFileNameW(LPOPENFILENAMEW);
+	BOOL PageSetupDlgA(LPPAGESETUPDLGA);
+	BOOL PageSetupDlgW(LPPAGESETUPDLGW);
+	BOOL PrintDlgA(LPPRINTDLGA);
+	BOOL PrintDlgW(LPPRINTDLGW);
+	HWND ReplaceTextA(LPFINDREPLACEA);
+	HWND ReplaceTextW(LPFINDREPLACEW);
+
+	static if (_WIN32_WINNT_ONLY && _WIN32_WINNT >= 0x500) {
+		HRESULT PrintDlgExA(LPPRINTDLGEXA);
+		HRESULT PrintDlgExW(LPPRINTDLGEXW);
+	}
+}
+
+version (Unicode) {
+	alias CHOOSECOLORW CHOOSECOLOR;
+	alias CHOOSEFONTW CHOOSEFONT;
+	alias FINDREPLACEW FINDREPLACE;
+	alias OPENFILENAMEW OPENFILENAME;
+	alias OFNOTIFYW OFNOTIFY;
+	alias PAGESETUPDLGW PAGESETUPDLG;
+	alias PRINTDLGW PRINTDLG;
+
+	alias ChooseColorW ChooseColor;
+	alias ChooseFontW ChooseFont;
+	alias FindTextW FindText;
+	alias GetFileTitleW GetFileTitle;
+	alias GetOpenFileNameW GetOpenFileName;
+	alias GetSaveFileNameW GetSaveFileName;
+	alias PageSetupDlgW PageSetupDlg;
+	alias PrintDlgW PrintDlg;
+	alias ReplaceTextW ReplaceText;
+
+	static if (_WIN32_WINNT_ONLY && _WIN32_WINNT >= 0x500) {
+		alias PRINTDLGEXW PRINTDLGEX;
+		alias PrintDlgExW PrintDlgEx;
+	}
+
+} else { // UNICODE
+
+	alias CHOOSECOLORA CHOOSECOLOR;
+	alias CHOOSEFONTA CHOOSEFONT;
+	alias FINDREPLACEA FINDREPLACE;
+	alias OPENFILENAMEA OPENFILENAME;
+	alias OFNOTIFYA OFNOTIFY;
+	alias PAGESETUPDLGA PAGESETUPDLG;
+	alias PRINTDLGA PRINTDLG;
+
+	alias ChooseColorA ChooseColor;
+	alias ChooseFontA ChooseFont;
+	alias FindTextA FindText;
+	alias GetFileTitleA GetFileTitle;
+	alias GetOpenFileNameA GetOpenFileName;
+	alias GetSaveFileNameA GetSaveFileName;
+	alias PageSetupDlgA PageSetupDlg;
+	alias PrintDlgA PrintDlg;
+	alias ReplaceTextA ReplaceText;
+
+	static if (_WIN32_WINNT_ONLY && _WIN32_WINNT >= 0x500) {
+		alias PRINTDLGEXA PRINTDLGEX;
+		alias PrintDlgExA PrintDlgEx;
+	}
+
+} // UNICODE
+
+alias CHOOSECOLOR* LPCHOOSECOLOR;
+alias CHOOSEFONT* LPCHOOSEFONT;
+alias FINDREPLACE* LPFINDREPLACE;
+alias OPENFILENAME* LPOPENFILENAME;
+alias OFNOTIFY* LPOFNOTIFY;
+alias PAGESETUPDLG* LPPAGESETUPDLG;
+alias PRINTDLG* LPPRINTDLG;
+static if (_WIN32_WINNT_ONLY && _WIN32_WINNT >= 0x500) {
+	alias PRINTDLGEX* LPPRINTDLGEX;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/core.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,45 @@
+/***********************************************************************\
+*                                core.d                                 *
+*                                                                       *
+*                    Helper module for the Windows API                  *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.core;
+
+/**
+ The core Windows API functions.
+
+ Importing this file is equivalent to the C code:
+ ---
+ #define WIN32_LEAN_AND_MEAN
+ #include "windows.h"
+ ---
+
+*/
+
+public import win32.windef;
+public import win32.winnt;
+public import win32.wincon;
+public import win32.winbase;
+public import win32.wingdi;
+public import win32.winuser;
+public import win32.winnls;
+public import win32.winver;
+public import win32.winnetwk;
+
+// We can't use static if for imports, build gets confused.
+// static if (_WIN32_WINNT_ONLY) import win32.winsvc;
+version (WindowsVista) {
+	version = WIN32_WINNT_ONLY;
+} else version (Windows2003) {
+	version = WIN32_WINNT_ONLY;
+} else version (WindowsXP) {
+	version = WIN32_WINNT_ONLY;
+} else version (WindowsNTonly) {
+	version = WIN32_WINNT_ONLY;
+}
+
+version (WIN32_WINNT_ONLY) {
+	public import win32.winsvc;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/cpl.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,77 @@
+/***********************************************************************\
+*                                 cpl.d                                 *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.cpl;
+
+private import win32.windef, win32.winuser;
+
+enum : uint {
+	WM_CPL_LAUNCH = WM_USER + 1000,
+	WM_CPL_LAUNCHED
+}
+
+enum : uint {
+	CPL_DYNAMIC_RES,
+	CPL_INIT,
+	CPL_GETCOUNT,
+	CPL_INQUIRE,
+	CPL_SELECT,
+	CPL_DBLCLK,
+	CPL_STOP,
+	CPL_EXIT,
+	CPL_NEWINQUIRE,
+	CPL_STARTWPARMSA,
+	CPL_STARTWPARMSW, // = 10
+	CPL_SETUP = 200
+}
+
+extern (Windows) alias LONG function(HWND, UINT, LONG, LONG) APPLET_PROC;
+
+struct CPLINFO {
+	int  idIcon;
+	int  idName;
+	int  idInfo;
+	LONG lData;
+}
+alias CPLINFO* LPCPLINFO;
+
+struct NEWCPLINFOA {
+	DWORD     dwSize = NEWCPLINFOA.sizeof;
+	DWORD     dwFlags;
+	DWORD     dwHelpContext;
+	LONG      lData;
+	HICON     hIcon;
+	CHAR[32]  szName;
+	CHAR[64]  szInfo;
+	CHAR[128] szHelpFile;
+}
+alias NEWCPLINFOA* LPNEWCPLINFOA;
+
+struct NEWCPLINFOW {
+	DWORD      dwSize = NEWCPLINFOW.sizeof;
+	DWORD      dwFlags;
+	DWORD      dwHelpContext;
+	LONG       lData;
+	HICON      hIcon;
+	WCHAR[32]  szName;
+	WCHAR[64]  szInfo;
+	WCHAR[128] szHelpFile;
+}
+alias NEWCPLINFOW* LPNEWCPLINFOW;
+
+version (Unicode) {
+	alias CPL_STARTWPARMSW CPL_STARTWPARMS;
+	alias NEWCPLINFOW NEWCPLINFO;
+} else {
+	alias CPL_STARTWPARMSA CPL_STARTWPARMS;
+	alias NEWCPLINFOA NEWCPLINFO;
+}
+
+alias NEWCPLINFO* LPNEWCPLINFO;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/cplext.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,19 @@
+/***********************************************************************\
+*                                cplext.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*             Translated from MinGW API for MS-Windows 3.10             *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.cplext;
+
+enum : uint {
+	CPLPAGE_MOUSE_BUTTONS      = 1,
+	CPLPAGE_MOUSE_PTRMOTION    = 2,
+	CPLPAGE_MOUSE_WHEEL        = 3,
+	CPLPAGE_KEYBOARD_SPEED     = 1,
+	CPLPAGE_DISPLAY_BACKGROUND = 1
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/custcntl.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,122 @@
+/***********************************************************************\
+*                               custcntl.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.custcntl;
+
+private import win32.windef;
+
+// FIXME: check type
+const CCF_NOTEXT = 1;
+
+const size_t
+	CCHCCCLASS =  32,
+	CCHCCDESC  =  32,
+	CCHCCTEXT  = 256;
+
+struct CCSTYLEA {
+	DWORD           flStyle;
+	DWORD           flExtStyle;
+	CHAR[CCHCCTEXT] szText;
+	LANGID          lgid;
+	WORD            wReserved1;
+}
+alias CCSTYLEA* LPCCSTYLEA;
+
+struct CCSTYLEW {
+	DWORD            flStyle;
+	DWORD            flExtStyle;
+	WCHAR[CCHCCTEXT] szText;
+	LANGID           lgid;
+	WORD             wReserved1;
+}
+alias CCSTYLEW* LPCCSTYLEW;
+
+struct CCSTYLEFLAGA {
+	DWORD flStyle;
+	DWORD flStyleMask;
+	LPSTR pszStyle;
+}
+alias CCSTYLEFLAGA* LPCCSTYLEFLAGA;
+
+struct CCSTYLEFLAGW {
+	DWORD  flStyle;
+	DWORD  flStyleMask;
+	LPWSTR pszStyle;
+}
+alias CCSTYLEFLAGW* LPCCSTYLEFLAGW;
+
+struct CCINFOA {
+	CHAR[CCHCCCLASS]  szClass;
+	DWORD             flOptions;
+	CHAR[CCHCCDESC]   szDesc;
+	UINT              cxDefault;
+	UINT              cyDefault;
+	DWORD             flStyleDefault;
+	DWORD             flExtStyleDefault;
+	DWORD             flCtrlTypeMask;
+	CHAR[CCHCCTEXT]   szTextDefault;
+	INT               cStyleFlags;
+	LPCCSTYLEFLAGA    aStyleFlags;
+	LPFNCCSTYLEA      lpfnStyle;
+	LPFNCCSIZETOTEXTA lpfnSizeToText;
+	DWORD             dwReserved1;
+	DWORD             dwReserved2;
+}
+alias CCINFOA* LPCCINFOA;
+
+struct CCINFOW {
+	WCHAR[CCHCCCLASS] szClass;
+	DWORD             flOptions;
+	WCHAR[CCHCCDESC]  szDesc;
+	UINT              cxDefault;
+	UINT              cyDefault;
+	DWORD             flStyleDefault;
+	DWORD             flExtStyleDefault;
+	DWORD             flCtrlTypeMask;
+	WCHAR[CCHCCTEXT]  szTextDefault;
+	INT               cStyleFlags;
+	LPCCSTYLEFLAGW    aStyleFlags;
+	LPFNCCSTYLEW      lpfnStyle;
+	LPFNCCSIZETOTEXTW lpfnSizeToText;
+	DWORD             dwReserved1;
+	DWORD             dwReserved2;
+}
+alias CCINFOW* LPCCINFOW;
+
+extern (Windows) {
+	alias BOOL function(HWND, LPCCSTYLEA) LPFNCCSTYLEA;
+	alias BOOL function(HWND, LPCCSTYLEW) LPFNCCSTYLEW;
+	alias INT function(DWORD, DWORD, HFONT, LPSTR) LPFNCCSIZETOTEXTA;
+	alias INT function(DWORD, DWORD, HFONT, LPWSTR) LPFNCCSIZETOTEXTW;
+	alias UINT function(LPCCINFOA) LPFNCCINFOA;
+	alias UINT function(LPCCINFOW) LPFNCCINFOW;
+	UINT CustomControlInfoA(LPCCINFOA acci);
+	UINT CustomControlInfoW(LPCCINFOW acci);
+}
+
+version (Unicode) {
+	alias CCSTYLEW CCSTYLE;
+	alias CCSTYLEFLAGW CCSTYLEFLAG;
+	alias CCINFOW CCINFO;
+	alias LPFNCCSTYLEW LPFNCCSTYLE;
+	alias LPFNCCSIZETOTEXTW LPFNCCSIZETOTEXT;
+	alias LPFNCCINFOW LPFNCCINFO;
+} else {
+	alias CCSTYLEA CCSTYLE;
+	alias CCSTYLEFLAGA CCSTYLEFLAG;
+	alias CCINFOA CCINFO;
+	alias LPFNCCSTYLEA LPFNCCSTYLE;
+	alias LPFNCCSIZETOTEXTA LPFNCCSIZETOTEXT;
+	alias LPFNCCINFOA LPFNCCINFO;
+}
+
+alias CCSTYLE* LPCCSTYLE;
+alias CCSTYLEFLAG* LPCCSTYLEFLAG;
+alias CCINFO* LPCCINFO;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/dbt.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,194 @@
+/***********************************************************************\
+*                                  dbt.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Vladimir Vlasov                          *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.dbt;
+
+import win32.w32api, win32.windef;
+import win32.basetyps; // for GUID
+
+// FIXME: clean up Windows version support
+
+enum : DWORD {
+	DBT_NO_DISK_SPACE           = 0x47,
+	DBT_CONFIGMGPRIVATE         = 0x7FFF,
+	DBT_DEVICEARRIVAL           = 0x8000,
+	DBT_DEVICEQUERYREMOVE       = 0x8001,
+	DBT_DEVICEQUERYREMOVEFAILED = 0x8002,
+	DBT_DEVICEREMOVEPENDING     = 0x8003,
+	DBT_DEVICEREMOVECOMPLETE    = 0x8004,
+	DBT_DEVICETYPESPECIFIC      = 0x8005,
+	DBT_DEVTYP_OEM              = 0,
+	DBT_DEVTYP_DEVNODE          = 1,
+	DBT_DEVTYP_VOLUME           = 2,
+	DBT_DEVTYP_PORT             = 3,
+	DBT_DEVTYP_NET              = 4
+}
+
+static if (_WIN32_WINDOWS >= 0x040A) {
+	enum : DWORD {
+		DBT_DEVTYP_DEVICEINTERFACE = 5,
+		DBT_DEVTYP_HANDLE          = 6
+	}
+}
+
+enum : DWORD {
+	DBT_APPYBEGIN,
+	DBT_APPYEND,
+	DBT_DEVNODES_CHANGED     = 7,
+	DBT_QUERYCHANGECONFIG    = 0x17,
+	DBT_CONFIGCHANGED        = 0x18,
+	DBT_CONFIGCHANGECANCELED = 0x19,
+	DBT_MONITORCHANGE        = 0x1B,
+	DBT_SHELLLOGGEDON        = 32,
+	DBT_CONFIGMGAPI32        = 34,
+	DBT_VXDINITCOMPLETE      = 35,
+	DBT_VOLLOCKQUERYLOCK     = 0x8041,
+	DBT_VOLLOCKLOCKTAKEN     = 0x8042,
+	DBT_VOLLOCKLOCKFAILED    = 0x8043,
+	DBT_VOLLOCKQUERYUNLOCK   = 0x8044,
+	DBT_VOLLOCKLOCKRELEASED  = 0x8045,
+	DBT_VOLLOCKUNLOCKFAILED  = 0x8046,
+	DBT_USERDEFINED          = 0xFFFF
+}
+
+enum : WORD {
+	DBTF_MEDIA = 1,
+	DBTF_NET   = 2
+}
+
+enum : DWORD {
+	BSM_ALLCOMPONENTS      = 0,
+	BSM_APPLICATIONS       = 8,
+	BSM_ALLDESKTOPS        = 16,
+	BSM_INSTALLABLEDRIVERS = 4,
+	BSM_NETDRIVER          = 2,
+	BSM_VXDS               = 1,
+	BSF_FLUSHDISK          = 0x00000004,
+	BSF_FORCEIFHUNG        = 0x00000020,
+	BSF_IGNORECURRENTTASK  = 0x00000002,
+	BSF_NOHANG             = 0x00000008,
+	BSF_NOTIMEOUTIFNOTHUNG = 0x00000040,
+	BSF_POSTMESSAGE        = 0x00000010,
+	BSF_QUERY              = 0x00000001,
+	BSF_MSGSRV32ISOK_BIT   = 31,
+	BSF_MSGSRV32ISOK       = 0x80000000
+}
+
+static if (_WIN32_WINNT >= 0x0500) {
+	enum : DWORD {
+		BSF_ALLOWSFW          = 0x00000080,
+		BSF_SENDNOTIFYMESSAGE = 0x00000100
+	}
+}
+
+static if (_WIN32_WINNT >= 0x0501) {
+	enum : DWORD {
+		BSF_LUID        = 0x00000400,
+		BSF_RETURNHDESK = 0x00000200
+	}
+}
+
+struct DEV_BROADCAST_HDR {
+	DWORD dbch_size = DEV_BROADCAST_HDR.sizeof;
+	DWORD dbch_devicetype;
+	DWORD dbch_reserved;
+}
+alias DEV_BROADCAST_HDR* PDEV_BROADCAST_HDR;
+
+struct DEV_BROADCAST_OEM {
+	DWORD dbco_size = DEV_BROADCAST_OEM.sizeof;
+	DWORD dbco_devicetype;
+	DWORD dbco_reserved;
+	DWORD dbco_identifier;
+	DWORD dbco_suppfunc;
+}
+alias DEV_BROADCAST_OEM* PDEV_BROADCAST_OEM;
+
+struct DEV_BROADCAST_PORT_A {
+	DWORD dbcp_size = DEV_BROADCAST_PORT_A.sizeof;
+	DWORD dbcp_devicetype;
+	DWORD dbcp_reserved;
+	char  _dbcp_name;
+	char* dbcp_name() { return &_dbcp_name; }
+}
+alias DEV_BROADCAST_PORT_A* PDEV_BROADCAST_PORT_A;
+
+struct DEV_BROADCAST_PORT_W {
+	DWORD  dbcp_size = DEV_BROADCAST_PORT_W.sizeof;
+	DWORD  dbcp_devicetype;
+	DWORD  dbcp_reserved;
+	WCHAR  _dbcp_name;
+	WCHAR* dbcp_name() { return &_dbcp_name; }
+}
+alias DEV_BROADCAST_PORT_W* PDEV_BROADCAST_PORT_W;
+
+struct DEV_BROADCAST_USERDEFINED {
+	DEV_BROADCAST_HDR dbud_dbh;
+	char  _dbud_szName;
+	char* dbud_szName() { return &_dbud_szName; }
+}
+
+struct DEV_BROADCAST_VOLUME {
+	DWORD dbcv_size = DEV_BROADCAST_VOLUME.sizeof;
+	DWORD dbcv_devicetype;
+	DWORD dbcv_reserved;
+	DWORD dbcv_unitmask;
+	WORD  dbcv_flags;
+}
+alias DEV_BROADCAST_VOLUME* PDEV_BROADCAST_VOLUME;
+
+version (Unicode) {
+	alias DEV_BROADCAST_PORT_W DEV_BROADCAST_PORT;
+} else {
+	alias DEV_BROADCAST_PORT_A DEV_BROADCAST_PORT;
+}
+alias DEV_BROADCAST_PORT* PDEV_BROADCAST_PORT;
+
+static if ((_WIN32_WINDOWS >= 0x0410) || (_WIN32_WINNT >= 0x0500)) {
+	struct DEV_BROADCAST_DEVICEINTERFACE_A {
+		DWORD dbcc_size = DEV_BROADCAST_DEVICEINTERFACE_A.sizeof;
+		DWORD dbcc_devicetype;
+		DWORD dbcc_reserved;
+		GUID  dbcc_classguid;
+		char  _dbcc_name;
+		char* dbcc_name() { return &_dbcc_name; }
+	}
+	alias DEV_BROADCAST_DEVICEINTERFACE_A* PDEV_BROADCAST_DEVICEINTERFACE_A;
+
+	struct DEV_BROADCAST_DEVICEINTERFACE_W {
+		DWORD  dbcc_size = DEV_BROADCAST_DEVICEINTERFACE_W.sizeof;
+		DWORD  dbcc_devicetype;
+		DWORD  dbcc_reserved;
+		GUID   dbcc_classguid;
+		WCHAR  _dbcc_name;
+		WCHAR* dbcc_name() { return &_dbcc_name; }
+	}
+	alias DEV_BROADCAST_DEVICEINTERFACE_W* PDEV_BROADCAST_DEVICEINTERFACE_W;
+
+	version (Unicode) {
+		alias DEV_BROADCAST_DEVICEINTERFACE_W DEV_BROADCAST_DEVICEINTERFACE;
+	} else {
+		alias DEV_BROADCAST_DEVICEINTERFACE_A DEV_BROADCAST_DEVICEINTERFACE;
+	}
+	alias DEV_BROADCAST_DEVICEINTERFACE* PDEV_BROADCAST_DEVICEINTERFACE;
+
+	struct DEV_BROADCAST_HANDLE {
+		DWORD  dbch_size = DEV_BROADCAST_HANDLE.sizeof;
+		DWORD  dbch_devicetype;
+		DWORD  dbch_reserved;
+		HANDLE dbch_handle;
+		DWORD  dbch_hdevnotify;
+		GUID   dbch_eventguid;
+		LONG   dbch_nameoffset;
+		BYTE   _dbch_data;
+		BYTE*  dbch_data() { return &_dbch_data; }
+	}
+	alias DEV_BROADCAST_HANDLE* PDEV_BROADCAST_HANDLE;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/dde.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,215 @@
+/***********************************************************************\
+*                                 dde.d                                 *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.dde;
+pragma(lib, "user32.lib");
+
+private import win32.windef;
+
+enum : uint {
+	WM_DDE_FIRST     = 0x03E0,
+	WM_DDE_INITIATE  = WM_DDE_FIRST,
+	WM_DDE_TERMINATE,
+	WM_DDE_ADVISE,
+	WM_DDE_UNADVISE,
+	WM_DDE_ACK,
+	WM_DDE_DATA,
+	WM_DDE_REQUEST,
+	WM_DDE_POKE,
+	WM_DDE_EXECUTE,
+	WM_DDE_LAST      = WM_DDE_EXECUTE
+}
+
+struct DDEACK {
+	ubyte bAppReturnCode;
+	ubyte _bf;
+
+	ubyte reserved() { return cast(ubyte) (_bf & 0x3F); }
+	bool  fBusy()    { return cast(bool)  (_bf & 0x40); }
+	bool  fAck()     { return cast(bool)  (_bf & 0x80); }
+
+	ubyte reserved(ubyte r) {
+		_bf = cast(ubyte) ((_bf & ~0x3F) | (r & 0x3F));
+		return cast(ubyte)(r & 0x3F);
+	}
+
+	bool fBusy(bool f) { _bf = cast(ubyte) ((_bf & ~0x40) | (f << 6)); return f; }
+	bool fAck(bool f)  { _bf = cast(ubyte) ((_bf & ~0x80) | (f << 7)); return f; }
+}
+
+struct DDEADVISE {
+	ushort _bf;
+	short  cfFormat;
+
+	ushort reserved()  { return cast(ushort) (_bf & 0x3FFF); }
+	bool   fDeferUpd() { return cast(bool)   (_bf & 0x4000); }
+	bool   fAckReq()   { return cast(bool)   (_bf & 0x8000); }
+
+	ushort reserved(ushort r) {
+		_bf = cast(ushort) ((_bf & ~0x3FFF) | (r & 0x3FFF));
+		return cast(ushort)(r & 0x3FFF);
+	}
+
+	bool   fDeferUpd(bool f) { _bf = cast(ushort) ((_bf & ~0x4000) | (f << 14)); return f; }
+	bool   fAckReq(bool f)   { _bf = cast(ushort) ((_bf & ~0x8000) | (f << 15)); return f; }
+}
+
+struct DDEDATA {
+	ushort _bf;
+	short  cfFormat;
+	byte   _Value;
+
+	ushort unused()    { return cast(ushort) (_bf & 0x0FFF); }
+	bool   fResponse() { return cast(bool)   (_bf & 0x1000); }
+	bool   fRelease()  { return cast(bool)   (_bf & 0x2000); }
+	bool   reserved()  { return cast(bool)   (_bf & 0x4000); }
+	bool   fAckReq()   { return cast(bool)   (_bf & 0x8000); }
+
+	byte*  Value() { return &_Value; }
+
+	ushort unused(ushort r) {
+		_bf = cast(ushort) ((_bf & ~0x0FFF) | (r & 0x0FFF));
+		return cast(ushort)(r & 0x0FFF);
+	}
+
+	bool   fResponse(bool f) { _bf = cast(ushort) ((_bf & ~0x1000) | (f << 12)); return f; }
+	bool   fRelease(bool f)  { _bf = cast(ushort) ((_bf & ~0x2000) | (f << 13)); return f; }
+	bool   reserved(bool f)  { _bf = cast(ushort) ((_bf & ~0x4000) | (f << 14)); return f; }
+	bool   fAckReq(bool f)   { _bf = cast(ushort) ((_bf & ~0x8000) | (f << 15)); return f; }
+}
+
+struct DDEPOKE {
+	ushort _bf;
+	short  cfFormat;
+	byte   _Value;
+
+	ushort unused()    { return cast(ushort) (_bf & 0x1FFF); }
+	bool   fRelease()  { return cast(bool)   (_bf & 0x2000); }
+	ubyte  fReserved() { return cast(ubyte)  ((_bf & 0xC000) >>> 14); }
+
+	byte*  Value() { return &_Value; }
+
+	ushort unused(ushort u) {
+		_bf = cast(ushort) ((_bf & ~0x1FFF) | (u & 0x1FFF));
+		return cast(ushort)(u & 0x1FFF);
+	}
+
+	bool   fRelease(bool f)   { _bf = cast(ushort) ((_bf & ~0x2000) | (f << 13)); return f; }
+	ubyte  fReserved(ubyte r) { _bf = cast(ushort) ((_bf & ~0xC000) | (r << 14)); return r; }
+}
+
+deprecated struct DDELN {
+	ushort _bf;
+	short  cfFormat;
+
+	ushort unused()    { return cast(ushort) (_bf & 0x1FFF); }
+	bool   fRelease()  { return cast(bool)   (_bf & 0x2000); }
+	bool   fDeferUpd() { return cast(bool)   (_bf & 0x4000); }
+	bool   fAckReq()   { return cast(bool)   (_bf & 0x8000); }
+
+	ushort unused(ushort u) {
+		_bf = cast(ushort)((_bf & ~0x1FFF) | (u & 0x1FFF));
+		return cast(ushort)(u & 0x1FFF);
+	}
+
+	bool   fRelease(bool f)  { _bf = cast(ushort) ((_bf & ~0x2000) | (f << 13)); return f; }
+	bool   fDeferUpd(bool f) { _bf = cast(ushort) ((_bf & ~0x4000) | (f << 14)); return f; }
+	bool   fAckReq(bool f)   { _bf = cast(ushort) ((_bf & ~0x8000) | (f << 15)); return f; }
+}
+
+deprecated struct DDEUP {
+	ushort _bf;
+	short  cfFormat;
+	byte   _rgb;
+
+	ushort unused()    { return cast(ushort) (_bf & 0x0FFF); }
+	bool   fAck()      { return cast(bool)   (_bf & 0x1000); }
+	bool   fRelease()  { return cast(bool)   (_bf & 0x2000); }
+	bool   fReserved() { return cast(bool)   (_bf & 0x4000); }
+	bool   fAckReq()   { return cast(bool)   (_bf & 0x8000); }
+
+	byte*  rgb() { return &_rgb; }
+
+	ushort unused(ushort r) {
+		_bf = cast(ushort) ((_bf & ~0x0FFF) | (r & 0x0FFF));
+		return cast(ushort)(r & 0x0FFF);
+	}
+
+	bool   fAck(bool f)      { _bf = cast(ushort) ((_bf & ~0x1000) | (f << 12)); return f; }
+	bool   fRelease(bool f)  { _bf = cast(ushort) ((_bf & ~0x2000) | (f << 13)); return f; }
+	bool   fReserved(bool f) { _bf = cast(ushort) ((_bf & ~0x4000) | (f << 14)); return f; }
+	bool   fAckReq(bool f)   { _bf = cast(ushort) ((_bf & ~0x8000) | (f << 15)); return f; }
+}
+
+extern (Windows) {
+	BOOL DdeSetQualityOfService(HWND, SECURITY_QUALITY_OF_SERVICE*,
+	  PSECURITY_QUALITY_OF_SERVICE);
+	BOOL ImpersonateDdeClientWindow(HWND, HWND);
+	LPARAM PackDDElParam(UINT, UINT_PTR, UINT_PTR);
+	BOOL UnpackDDElParam(UINT, LPARAM, PUINT_PTR, PUINT_PTR);
+	BOOL FreeDDElParam(UINT, LPARAM);
+	LPARAM ReuseDDElParam(LPARAM, UINT, UINT, UINT_PTR, UINT_PTR);
+}
+
+debug (WindowsUnitTest) {
+	unittest {
+		DDEACK ddeack;
+
+		with (ddeack) {
+			reserved = 10;
+			assert (_bf == 0x0A);
+			fBusy = true;
+			assert (_bf == 0x4A);
+			fAck = true;
+			assert (_bf == 0xCA);
+
+			assert (reserved == 10);
+			assert (fBusy == true);
+			assert (fAck == true);
+
+			reserved = 43;
+			assert (_bf == 0xEB);
+			fBusy = false;
+			assert (_bf == 0xAB);
+			fAck = false;
+			assert (_bf == 0x2B);
+
+			assert (reserved == 43);
+			assert (fBusy == false);
+			assert (fAck == false);
+		}
+
+		DDEPOKE ddepoke;
+
+		with (ddepoke) {
+			unused = 3456;
+			assert (_bf == 0x0D80);
+			fRelease = true;
+			assert (_bf == 0x2D80);
+			fReserved = 2;
+			assert (_bf == 0xAD80);
+
+			assert (unused == 3456);
+			assert (fRelease == true);
+			assert (fReserved == 2);
+
+			unused = 2109;
+			assert (_bf == 0xa83d);
+			fRelease = false;
+			assert (_bf == 0x883d);
+			fReserved = 1;
+			assert (_bf == 0x483d);
+
+			assert (unused == 2109);
+			assert (fRelease == false);
+			assert (fReserved == 1);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/ddeml.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,374 @@
+/***********************************************************************\
+*                                ddeml.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.ddeml;
+pragma(lib, "user32.lib");
+
+private import win32.basetsd, win32.windef, win32.winnt;
+
+enum : int {
+	CP_WINANSI    = 1004,
+	CP_WINUNICODE = 1200
+}
+
+enum : UINT {
+	XTYPF_NOBLOCK = 2,
+	XTYPF_NODATA  = 4,
+	XTYPF_ACKREQ  = 8
+}
+
+enum : UINT {
+	XCLASS_MASK         = 0xFC00,
+	XCLASS_BOOL         = 0x1000,
+	XCLASS_DATA         = 0x2000,
+	XCLASS_FLAGS        = 0x4000,
+	XCLASS_NOTIFICATION = 0x8000
+}
+
+enum : UINT {
+	XST_NULL,
+	XST_INCOMPLETE,
+	XST_CONNECTED,
+	XST_INIT1,
+	XST_INIT2,
+	XST_REQSENT,
+	XST_DATARCVD,
+	XST_POKESENT,
+	XST_POKEACKRCVD,
+	XST_EXECSENT,
+	XST_EXECACKRCVD,
+	XST_ADVSENT,
+	XST_UNADVSENT,
+	XST_ADVACKRCVD,
+	XST_UNADVACKRCVD,
+	XST_ADVDATASENT,
+	XST_ADVDATAACKRCVD // = 16
+}
+
+enum : UINT {
+	XTYP_ERROR           = XCLASS_NOTIFICATION | XTYPF_NOBLOCK,
+	XTYP_ADVDATA         = 0x0010 | XCLASS_FLAGS,
+	XTYP_ADVREQ          = 0x0020 | XCLASS_DATA | XTYPF_NOBLOCK,
+	XTYP_ADVSTART        = 0x0030 | XCLASS_BOOL,
+	XTYP_ADVSTOP         = 0x0040 | XCLASS_NOTIFICATION,
+	XTYP_EXECUTE         = 0x0050 | XCLASS_FLAGS,
+	XTYP_CONNECT         = 0x0060 | XCLASS_BOOL | XTYPF_NOBLOCK,
+	XTYP_CONNECT_CONFIRM = 0x0070 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK,
+	XTYP_XACT_COMPLETE   = 0x0080 | XCLASS_NOTIFICATION,
+	XTYP_POKE            = 0x0090 | XCLASS_FLAGS,
+	XTYP_REGISTER        = 0x00A0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK,
+	XTYP_REQUEST         = 0x00B0 | XCLASS_DATA,
+	XTYP_DISCONNECT      = 0x00C0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK,
+	XTYP_UNREGISTER      = 0x00D0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK,
+	XTYP_WILDCONNECT     = 0x00E0 | XCLASS_DATA | XTYPF_NOBLOCK,
+	XTYP_MONITOR         = 0X00F0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK,
+	XTYP_MASK            = 0x00F0,
+	XTYP_SHIFT           = 4
+}
+
+/+
+#define TIMEOUT_ASYNC  0xFFFFFFFF
+#define QID_SYNC       0xFFFFFFFF
++/
+
+enum : UINT {
+	ST_CONNECTED  =   1,
+	ST_ADVISE     =   2,
+	ST_ISLOCAL    =   4,
+	ST_BLOCKED    =   8,
+	ST_CLIENT     =  16,
+	ST_TERMINATED =  32,
+	ST_INLIST     =  64,
+	ST_BLOCKNEXT  = 128,
+	ST_ISSELF     = 256
+}
+
+/+
+#define CADV_LATEACK 0xFFFF
++/
+
+enum : UINT {
+	DMLERR_NO_ERROR      = 0,
+	DMLERR_FIRST         = 0x4000,
+	DMLERR_ADVACKTIMEOUT = DMLERR_FIRST,
+	DMLERR_BUSY,
+	DMLERR_DATAACKTIMEOUT,
+	DMLERR_DLL_NOT_INITIALIZED,
+	DMLERR_DLL_USAGE,
+	DMLERR_EXECACKTIMEOUT,
+	DMLERR_INVALIDPARAMETER,
+	DMLERR_LOW_MEMORY,
+	DMLERR_MEMORY_ERROR,
+	DMLERR_NOTPROCESSED,
+	DMLERR_NO_CONV_ESTABLISHED,
+	DMLERR_POKEACKTIMEOUT,
+	DMLERR_POSTMSG_FAILED,
+	DMLERR_REENTRANCY,
+	DMLERR_SERVER_DIED,
+	DMLERR_SYS_ERROR,
+	DMLERR_UNADVACKTIMEOUT,
+	DMLERR_UNFOUND_QUEUE_ID, // = 0x4011
+	DMLERR_LAST          = DMLERR_UNFOUND_QUEUE_ID
+}
+
+/+
+#define DDE_FACK	0x8000
+#define DDE_FBUSY	0x4000
+#define DDE_FDEFERUPD	0x4000
+#define DDE_FACKREQ	0x8000
+#define DDE_FRELEASE	0x2000
+#define DDE_FREQUESTED	0x1000
+#define DDE_FAPPSTATUS	0x00ff
+#define DDE_FNOTPROCESSED	0
+#define DDE_FACKRESERVED	(~(DDE_FACK|DDE_FBUSY|DDE_FAPPSTATUS))
+#define DDE_FADVRESERVED	(~(DDE_FACKREQ|DDE_FDEFERUPD))
+#define DDE_FDATRESERVED	(~(DDE_FACKREQ|DDE_FRELEASE|DDE_FREQUESTED))
+#define DDE_FPOKRESERVED	(~DDE_FRELEASE)
+#define MSGF_DDEMGR	0x8001
+#define CBR_BLOCK	((HDDEDATA)0xffffffff)
++/
+
+const DWORD
+	APPCLASS_STANDARD         = 0,
+	APPCLASS_MONITOR          = 0x00000001,
+	APPCLASS_MASK             = 0x0000000F,
+	APPCMD_CLIENTONLY         = 0x00000010,
+	APPCMD_FILTERINITS        = 0x00000020,
+	APPCMD_MASK               = 0x00000FF0,
+	CBF_FAIL_SELFCONNECTIONS  = 0x00001000,
+	CBF_FAIL_CONNECTIONS      = 0x00002000,
+	CBF_FAIL_ADVISES          = 0x00004000,
+	CBF_FAIL_EXECUTES         = 0x00008000,
+	CBF_FAIL_POKES            = 0x00010000,
+	CBF_FAIL_REQUESTS         = 0x00020000,
+	CBF_FAIL_ALLSVRXACTIONS   = 0x0003f000,
+	CBF_SKIP_CONNECT_CONFIRMS = 0x00040000,
+	CBF_SKIP_REGISTRATIONS    = 0x00080000,
+	CBF_SKIP_UNREGISTRATIONS  = 0x00100000,
+	CBF_SKIP_DISCONNECTS      = 0x00200000,
+	CBF_SKIP_ALLNOTIFICATIONS = 0x003c0000,
+	MF_HSZ_INFO               = 0x01000000,
+	MF_SENDMSGS               = 0x02000000,
+	MF_POSTMSGS               = 0x04000000,
+	MF_CALLBACKS              = 0x08000000,
+	MF_ERRORS                 = 0x10000000,
+	MF_LINKS                  = 0x20000000,
+	MF_CONV                   = 0x40000000,
+	MF_MASK                   = 0xFF000000;
+
+enum : UINT {
+	EC_ENABLEALL    = 0,
+	EC_ENABLEONE    = ST_BLOCKNEXT,
+	EC_DISABLE      = ST_BLOCKED,
+	EC_QUERYWAITING = 2
+}
+
+enum : UINT {
+	DNS_REGISTER   = 1,
+	DNS_UNREGISTER = 2,
+	DNS_FILTERON   = 4,
+	DNS_FILTEROFF  = 8
+}
+
+/+
+#define HDATA_APPOWNED	1
+#define MAX_MONITORS	4
++/
+
+enum : int {
+	MH_CREATE  = 1,
+	MH_KEEP    = 2,
+	MH_DELETE  = 3,
+	MH_CLEANUP = 4
+}
+
+alias HANDLE HCONVLIST, HCONV, HSZ, HDDEDATA;
+
+extern (Windows) alias HDDEDATA
+  function(UINT, UINT, HCONV, HSZ, HSZ, HDDEDATA, DWORD, DWORD) PFNCALLBACK;
+
+struct HSZPAIR {
+	HSZ hszSvc;
+	HSZ hszTopic;
+}
+alias HSZPAIR* PHSZPAIR;
+
+struct CONVCONTEXT {
+	UINT                        cb = CONVCONTEXT.sizeof;
+	UINT                        wFlags;
+	UINT                        wCountryID;
+	int                         iCodePage;
+	DWORD                       dwLangID;
+	DWORD                       dwSecurity;
+	SECURITY_QUALITY_OF_SERVICE qos;
+}
+alias CONVCONTEXT* PCONVCONTEXT;
+
+struct CONVINFO {
+	DWORD       cb = CONVINFO.sizeof;
+	DWORD       hUser;
+	HCONV       hConvPartner;
+	HSZ         hszSvcPartner;
+	HSZ         hszServiceReq;
+	HSZ         hszTopic;
+	HSZ         hszItem;
+	UINT        wFmt;
+	UINT        wType;
+	UINT        wStatus;
+	UINT        wConvst;
+	UINT        wLastError;
+	HCONVLIST   hConvList;
+	CONVCONTEXT ConvCtxt;
+	HWND        hwnd;
+	HWND        hwndPartner;
+}
+alias CONVINFO* PCONVINFO;
+
+struct DDEML_MSG_HOOK_DATA {
+	UINT     uiLo;
+	UINT     uiHi;
+	DWORD    cbData;
+	DWORD[8] Data;
+}
+
+struct MONHSZSTRUCT {
+	UINT     cb = MONHSZSTRUCT.sizeof;
+	int      fsAction;
+	DWORD    dwTime;
+	HSZ      hsz;
+	HANDLE   hTask;
+	TCHAR[1] _str;
+
+	TCHAR* str() { return _str.ptr; }
+}
+alias MONHSZSTRUCT* PMONHSZSTRUCT;
+
+struct MONLINKSTRUCT {
+	UINT   cb = MONLINKSTRUCT.sizeof;
+	DWORD  dwTime;
+	HANDLE hTask;
+	BOOL   fEstablished;
+	BOOL   fNoData;
+	HSZ    hszSvc;
+	HSZ    hszTopic;
+	HSZ    hszItem;
+	UINT   wFmt;
+	BOOL   fServer;
+	HCONV  hConvServer;
+	HCONV  hConvClient;
+}
+alias MONLINKSTRUCT* PMONLINKSTRUCT;
+
+struct MONCONVSTRUCT {
+	UINT   cb = MONCONVSTRUCT.sizeof;
+	BOOL   fConnect;
+	DWORD  dwTime;
+	HANDLE hTask;
+	HSZ    hszSvc;
+	HSZ    hszTopic;
+	HCONV  hConvClient;
+	HCONV  hConvServer;
+}
+alias MONCONVSTRUCT* PMONCONVSTRUCT;
+
+struct MONCBSTRUCT {
+	UINT        cb = MONCBSTRUCT.sizeof;
+	DWORD       dwTime;
+	HANDLE      hTask;
+	DWORD       dwRet;
+	UINT        wType;
+	UINT        wFmt;
+	HCONV       hConv;
+	HSZ         hsz1;
+	HSZ         hsz2;
+	HDDEDATA    hData;
+	ULONG_PTR   dwData1;
+	ULONG_PTR   dwData2;
+	CONVCONTEXT cc;
+	DWORD       cbData;
+	DWORD[8]    Data;
+}
+alias MONCBSTRUCT* PMONCBSTRUCT;
+
+struct MONERRSTRUCT {
+	UINT   cb = MONERRSTRUCT.sizeof;
+	UINT   wLastError;
+	DWORD  dwTime;
+	HANDLE hTask;
+}
+alias MONERRSTRUCT* PMONERRSTRUCT;
+
+struct MONMSGSTRUCT {
+	UINT   cb = MONMSGSTRUCT.sizeof;
+	HWND   hwndTo;
+	DWORD  dwTime;
+	HANDLE hTask;
+	UINT   wMsg;
+	WPARAM wParam;
+	LPARAM lParam;
+	DDEML_MSG_HOOK_DATA dmhd;
+}
+alias MONMSGSTRUCT* PMONMSGSTRUCT;
+
+extern (Windows) {
+	BOOL DdeAbandonTransaction(DWORD, HCONV, DWORD);
+	PBYTE DdeAccessData(HDDEDATA, PDWORD);
+	HDDEDATA DdeAddData(HDDEDATA, PBYTE, DWORD, DWORD);
+	HDDEDATA DdeClientTransaction(PBYTE, DWORD, HCONV, HSZ, UINT, UINT,
+	  DWORD, PDWORD);
+	int DdeCmpStringHandles(HSZ, HSZ);
+	HCONV DdeConnect(DWORD, HSZ, HSZ, PCONVCONTEXT);
+	HCONVLIST DdeConnectList(DWORD, HSZ, HSZ, HCONVLIST, PCONVCONTEXT);
+	HDDEDATA DdeCreateDataHandle(DWORD, PBYTE, DWORD, DWORD, HSZ, UINT,
+	  UINT);
+	HSZ DdeCreateStringHandleA(DWORD, LPSTR, int);
+	HSZ DdeCreateStringHandleW(DWORD, LPWSTR, int);
+	BOOL DdeDisconnect(HCONV);
+	BOOL DdeDisconnectList(HCONVLIST);
+	BOOL DdeEnableCallback(DWORD, HCONV, UINT);
+	BOOL DdeFreeDataHandle(HDDEDATA);
+	BOOL DdeFreeStringHandle(DWORD, HSZ);
+	DWORD DdeGetData(HDDEDATA, PBYTE, DWORD, DWORD);
+	UINT DdeGetLastError(DWORD);
+	BOOL DdeImpersonateClient(HCONV);
+	UINT DdeInitializeA(PDWORD, PFNCALLBACK, DWORD, DWORD);
+	UINT DdeInitializeW(PDWORD, PFNCALLBACK, DWORD, DWORD);
+	BOOL DdeKeepStringHandle(DWORD, HSZ);
+	HDDEDATA DdeNameService(DWORD, HSZ, HSZ, UINT);
+	BOOL DdePostAdvise(DWORD, HSZ, HSZ);
+	UINT DdeQueryConvInfo(HCONV, DWORD, PCONVINFO);
+	HCONV DdeQueryNextServer(HCONVLIST, HCONV);
+	DWORD DdeQueryStringA(DWORD, HSZ, LPSTR, DWORD, int);
+	DWORD DdeQueryStringW(DWORD, HSZ, LPWSTR, DWORD, int);
+	HCONV DdeReconnect(HCONV);
+	BOOL DdeSetUserHandle(HCONV, DWORD, DWORD);
+	BOOL DdeUnaccessData(HDDEDATA);
+	BOOL DdeUninitialize(DWORD);
+}
+
+const TCHAR[]
+	SZDDESYS_TOPIC         = "System",
+	SZDDESYS_ITEM_TOPICS   = "Topics",
+	SZDDESYS_ITEM_SYSITEMS = "SysItems",
+	SZDDESYS_ITEM_RTNMSG   = "ReturnMessage",
+	SZDDESYS_ITEM_STATUS   = "Status",
+	SZDDESYS_ITEM_FORMATS  = "Formats",
+	SZDDESYS_ITEM_HELP     = "Help",
+	SZDDE_ITEM_ITEMLIST    = "TopicItemList";
+
+version (Unicode) {
+	alias DdeCreateStringHandleW DdeCreateStringHandle;
+	alias DdeInitializeW DdeInitialize;
+	alias DdeQueryStringW DdeQueryString;
+} else {
+	alias DdeCreateStringHandleA DdeCreateStringHandle;
+	alias DdeInitializeA DdeInitialize;
+	alias DdeQueryStringA DdeQueryString;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/dhcpcsdk.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,58 @@
+/***********************************************************************\
+*                               dhcpcsdk.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.dhcpcsdk;
+
+private import win32.w32api, win32.windef;
+
+static assert (_WIN32_WINNT_ONLY && _WIN32_WINNT >= 0x500,
+"win32.dhcpcsdk is available only if version WindowsXP, Windows2003
+or WindowsVista is set, or both Windows2000 and WindowsNTonly are set");
+
+//#if (_WIN32_WINNT >= 0x0500)
+
+// FIXME: check type
+const DHCPCAPI_REGISTER_HANDLE_EVENT = 1;
+const DHCPCAPI_REQUEST_PERSISTENT    = 1;
+const DHCPCAPI_REQUEST_SYNCHRONOUS   = 2;
+
+struct DHCPCAPI_CLASSID {
+	ULONG  Flags;
+	LPBYTE Data;
+	ULONG  nBytesData;
+}
+alias DHCPCAPI_CLASSID* PDHCPCAPI_CLASSID, LPDHCPCAPI_CLASSID;
+
+struct DHCPAPI_PARAMS {
+	ULONG  Flags;
+	ULONG  OptionId;
+	BOOL   IsVendor;
+	LPBYTE Data;
+	DWORD  nBytesData;
+}
+alias DHCPAPI_PARAMS* PDHCPAPI_PARAMS, LPDHCPAPI_PARAMS;
+
+struct DHCPCAPI_PARAMS_ARRAY {
+	ULONG            nParams;
+	LPDHCPAPI_PARAMS Params;
+}
+alias DHCPCAPI_PARAMS_ARRAY* PDHCPCAPI_PARAMS_ARRAY, LPDHCPCAPI_PARAMS_ARRAY;
+
+extern (Windows) {
+	void DhcpCApiCleanup();
+	DWORD DhcpCApiInitialize(LPDWORD);
+	DWORD DhcpDeRegisterParamChange(DWORD, LPVOID, LPVOID);
+	DWORD DhcpRegisterParamChange(DWORD, LPVOID, PWSTR, LPDHCPCAPI_CLASSID,
+	  DHCPCAPI_PARAMS_ARRAY, LPVOID);
+	DWORD DhcpRemoveDNSRegistrations();
+	DWORD DhcpUndoRequestParams(DWORD, LPVOID, LPWSTR, LPWSTR);
+}
+
+//#endif // (_WIN32_WINNT >= 0x0500)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/d3d10.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,1229 @@
+/***********************************************************************\
+*                                 d3d10.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.directx.d3d10;
+
+private import win32.windows;
+
+public import win32.directx.dxgitype;
+public import win32.directx.dxgi;
+public import win32.directx.d3d10misc;
+public import win32.directx.d3d10shader;
+public import win32.directx.d3d10effect;
+
+pragma(lib, "d3d10.lib");
+
+const D3D10_16BIT_INDEX_STRIP_CUT_VALUE	= 0xffff;
+const D3D10_32BIT_INDEX_STRIP_CUT_VALUE	= 0xffffffff;
+const D3D10_8BIT_INDEX_STRIP_CUT_VALUE = 0xff;
+const D3D10_ARRAY_AXIS_ADDRESS_RANGE_BIT_COUNT = 9;
+const D3D10_CLIP_OR_CULL_DISTANCE_COUNT = 8;
+const D3D10_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT = 2;
+const D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT = 14;
+const D3D10_COMMONSHADER_CONSTANT_BUFFER_COMPONENTS = 4;
+const D3D10_COMMONSHADER_CONSTANT_BUFFER_COMPONENT_BIT_COUNT = 32;
+const D3D10_COMMONSHADER_CONSTANT_BUFFER_HW_SLOT_COUNT = 15;
+const D3D10_COMMONSHADER_CONSTANT_BUFFER_REGISTER_COMPONENTS = 4;
+const D3D10_COMMONSHADER_CONSTANT_BUFFER_REGISTER_COUNT = 15;
+const D3D10_COMMONSHADER_CONSTANT_BUFFER_REGISTER_READS_PER_INST = 1;
+const D3D10_COMMONSHADER_CONSTANT_BUFFER_REGISTER_READ_PORTS = 1;
+const D3D10_COMMONSHADER_FLOWCONTROL_NESTING_LIMIT = 64;
+const D3D10_COMMONSHADER_IMMEDIATE_CONSTANT_BUFFER_REGISTER_COMPONENTS = 4;
+const D3D10_COMMONSHADER_IMMEDIATE_CONSTANT_BUFFER_REGISTER_COUNT = 1;
+const D3D10_COMMONSHADER_IMMEDIATE_CONSTANT_BUFFER_REGISTER_READS_PER_INST = 1;
+const D3D10_COMMONSHADER_IMMEDIATE_CONSTANT_BUFFER_REGISTER_READ_PORTS = 1;
+const D3D10_COMMONSHADER_IMMEDIATE_VALUE_COMPONENT_BIT_COUNT = 32;
+const D3D10_COMMONSHADER_INPUT_RESOURCE_REGISTER_COMPONENTS = 1;
+const D3D10_COMMONSHADER_INPUT_RESOURCE_REGISTER_COUNT = 128;
+const D3D10_COMMONSHADER_INPUT_RESOURCE_REGISTER_READS_PER_INST = 1;
+const D3D10_COMMONSHADER_INPUT_RESOURCE_REGISTER_READ_PORTS = 1;
+const D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT = 128;
+const D3D10_COMMONSHADER_SAMPLER_REGISTER_COMPONENTS = 1;
+const D3D10_COMMONSHADER_SAMPLER_REGISTER_COUNT = 16;
+const D3D10_COMMONSHADER_SAMPLER_REGISTER_READS_PER_INST = 1;
+const D3D10_COMMONSHADER_SAMPLER_REGISTER_READ_PORTS = 1;
+const D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT = 16;
+const D3D10_COMMONSHADER_SUBROUTINE_NESTING_LIMIT = 32;
+const D3D10_COMMONSHADER_TEMP_REGISTER_COMPONENTS = 4;
+const D3D10_COMMONSHADER_TEMP_REGISTER_COMPONENT_BIT_COUNT = 32;
+const D3D10_COMMONSHADER_TEMP_REGISTER_COUNT = 4096;
+const D3D10_COMMONSHADER_TEMP_REGISTER_READS_PER_INST = 3;
+const D3D10_COMMONSHADER_TEMP_REGISTER_READ_PORTS = 3;
+const D3D10_COMMONSHADER_TEXCOORD_RANGE_REDUCTION_MAX = 10;
+const D3D10_COMMONSHADER_TEXCOORD_RANGE_REDUCTION_MIN = -10;
+const D3D10_COMMONSHADER_TEXEL_OFFSET_MAX_NEGATIVE = -8;
+const D3D10_COMMONSHADER_TEXEL_OFFSET_MAX_POSITIVE = 7;
+const D3D10_DEFAULT_BLEND_FACTOR_ALPHA = 1.0f;
+const D3D10_DEFAULT_BLEND_FACTOR_BLUE = 1.0f;
+const D3D10_DEFAULT_BLEND_FACTOR_GREEN = 1.0f;
+const D3D10_DEFAULT_BLEND_FACTOR_RED = 1.0f;
+const D3D10_DEFAULT_BORDER_COLOR_COMPONENT = 0.0f;
+const D3D10_DEFAULT_DEPTH_BIAS = 0;
+const D3D10_DEFAULT_DEPTH_BIAS_CLAMP = 0.0f;
+const D3D10_DEFAULT_MAX_ANISOTROPY = 16.0f;
+const D3D10_DEFAULT_MIP_LOD_BIAS = 0.0f;
+const D3D10_DEFAULT_RENDER_TARGET_ARRAY_INDEX = 0;
+const D3D10_DEFAULT_SAMPLE_MASK = 0xffffffff;
+const D3D10_DEFAULT_SCISSOR_ENDX = 0;
+const D3D10_DEFAULT_SCISSOR_ENDY = 0;
+const D3D10_DEFAULT_SCISSOR_STARTX = 0;
+const D3D10_DEFAULT_SCISSOR_STARTY = 0;
+const D3D10_DEFAULT_SLOPE_SCALED_DEPTH_BIAS = 0.0f;
+const D3D10_DEFAULT_STENCIL_READ_MASK = 0xff;
+const D3D10_DEFAULT_STENCIL_REFERENCE = 0;
+const D3D10_DEFAULT_STENCIL_WRITE_MASK = 0xff;
+const D3D10_DEFAULT_VIEWPORT_AND_SCISSORRECT_INDEX = 0;
+const D3D10_DEFAULT_VIEWPORT_HEIGHT = 0;
+const D3D10_DEFAULT_VIEWPORT_MAX_DEPTH = 0.0f;
+const D3D10_DEFAULT_VIEWPORT_MIN_DEPTH = 0.0f;
+const D3D10_DEFAULT_VIEWPORT_TOPLEFTX = 0;
+const D3D10_DEFAULT_VIEWPORT_TOPLEFTY = 0;
+const D3D10_DEFAULT_VIEWPORT_WIDTH = 0;
+const D3D10_FLOAT16_FUSED_TOLERANCE_IN_ULP = 0.6;
+const D3D10_FLOAT32_MAX = 3.402823466e+38f;
+const D3D10_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP = 0.6f;
+const D3D10_FLOAT_TO_SRGB_EXPONENT_DENOMINATOR = 2.4f;
+const D3D10_FLOAT_TO_SRGB_EXPONENT_NUMERATOR = 1.0f;
+const D3D10_FLOAT_TO_SRGB_OFFSET = 0.055f;
+const D3D10_FLOAT_TO_SRGB_SCALE_1 = 12.92f;
+const D3D10_FLOAT_TO_SRGB_SCALE_2 = 1.055f;
+const D3D10_FLOAT_TO_SRGB_THRESHOLD = 0.0031308f;
+const D3D10_FTOI_INSTRUCTION_MAX_INPUT = 2147483647.999f;
+const D3D10_FTOI_INSTRUCTION_MIN_INPUT = -2147483648.999f;
+const D3D10_FTOU_INSTRUCTION_MAX_INPUT = 4294967295.999f;
+const D3D10_FTOU_INSTRUCTION_MIN_INPUT = 0.0f;
+const D3D10_GS_INPUT_PRIM_CONST_REGISTER_COMPONENTS = 1;
+const D3D10_GS_INPUT_PRIM_CONST_REGISTER_COMPONENT_BIT_COUNT = 32;
+const D3D10_GS_INPUT_PRIM_CONST_REGISTER_COUNT = 1;
+const D3D10_GS_INPUT_PRIM_CONST_REGISTER_READS_PER_INST = 2;
+const D3D10_GS_INPUT_PRIM_CONST_REGISTER_READ_PORTS = 1;
+const D3D10_GS_INPUT_REGISTER_COMPONENTS = 4;
+const D3D10_GS_INPUT_REGISTER_COMPONENT_BIT_COUNT = 32;
+const D3D10_GS_INPUT_REGISTER_COUNT = 16;
+const D3D10_GS_INPUT_REGISTER_READS_PER_INST = 2;
+const D3D10_GS_INPUT_REGISTER_READ_PORTS = 1;
+const D3D10_GS_INPUT_REGISTER_VERTICES = 6;
+const D3D10_GS_OUTPUT_ELEMENTS = 32;
+const D3D10_GS_OUTPUT_REGISTER_COMPONENTS = 4;
+const D3D10_GS_OUTPUT_REGISTER_COMPONENT_BIT_COUNT = 32;
+const D3D10_GS_OUTPUT_REGISTER_COUNT = 32;
+const D3D10_IA_DEFAULT_INDEX_BUFFER_OFFSET_IN_BYTES = 0;
+const D3D10_IA_DEFAULT_PRIMITIVE_TOPOLOGY = 0;
+const D3D10_IA_DEFAULT_VERTEX_BUFFER_OFFSET_IN_BYTES = 0;
+const D3D10_IA_INDEX_INPUT_RESOURCE_SLOT_COUNT = 1;
+const D3D10_IA_INSTANCE_ID_BIT_COUNT = 32;
+const D3D10_IA_INTEGER_ARITHMETIC_BIT_COUNT = 32;
+const D3D10_IA_PRIMITIVE_ID_BIT_COUNT = 32;
+const D3D10_IA_VERTEX_ID_BIT_COUNT = 32;
+const D3D10_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT = 16;
+const D3D10_IA_VERTEX_INPUT_STRUCTURE_ELEMENTS_COMPONENTS = 64;
+const D3D10_IA_VERTEX_INPUT_STRUCTURE_ELEMENT_COUNT = 16;
+const D3D10_INTEGER_DIVIDE_BY_ZERO_QUOTIENT = 0xffffffff;
+const D3D10_INTEGER_DIVIDE_BY_ZERO_REMAINDER = 0xffffffff;
+const D3D10_LINEAR_GAMMA = 1.0f;
+const D3D10_MAX_BORDER_COLOR_COMPONENT = 1.0f;
+const D3D10_MAX_DEPTH = 1.0f;
+const D3D10_MAX_MAXANISOTROPY = 16;
+const D3D10_MAX_MULTISAMPLE_SAMPLE_COUNT = 32;
+const D3D10_MAX_POSITION_VALUE = 3.402823466e+34f;
+const D3D10_MAX_TEXTURE_DIMENSION_2_TO_EXP = 17;
+const D3D10_MIN_BORDER_COLOR_COMPONENT = 0.0f;
+const D3D10_MIN_DEPTH = 0.0f;
+const D3D10_MIN_MAXANISOTROPY = 0;
+const D3D10_MIP_LOD_BIAS_MAX = 15.99f;
+const D3D10_MIP_LOD_BIAS_MIN = -16.0f;
+const D3D10_MIP_LOD_FRACTIONAL_BIT_COUNT = 6;
+const D3D10_MIP_LOD_RANGE_BIT_COUNT = 8;
+const D3D10_MULTISAMPLE_ANTIALIAS_LINE_WIDTH = 1.4f;
+const D3D10_NONSAMPLE_FETCH_OUT_OF_RANGE_ACCESS_RESULT = 0;
+const D3D10_PIXEL_ADDRESS_RANGE_BIT_COUNT = 13;
+const D3D10_PRE_SCISSOR_PIXEL_ADDRESS_RANGE_BIT_COUNT = 15;
+const D3D10_PS_FRONTFACING_DEFAULT_VALUE = 0xffffffff;
+const D3D10_PS_FRONTFACING_FALSE_VALUE = 0;
+const D3D10_PS_FRONTFACING_TRUE_VALUE = 0xffffffff;
+const D3D10_PS_INPUT_REGISTER_COMPONENTS = 4;
+const D3D10_PS_INPUT_REGISTER_COMPONENT_BIT_COUNT = 32;
+const D3D10_PS_INPUT_REGISTER_COUNT = 32;
+const D3D10_PS_INPUT_REGISTER_READS_PER_INST = 2;
+const D3D10_PS_INPUT_REGISTER_READ_PORTS = 1;
+const D3D10_PS_LEGACY_PIXEL_CENTER_FRACTIONAL_COMPONENT = 0.0f;
+const D3D10_PS_OUTPUT_DEPTH_REGISTER_COMPONENTS = 1;
+const D3D10_PS_OUTPUT_DEPTH_REGISTER_COMPONENT_BIT_COUNT = 32;
+const D3D10_PS_OUTPUT_DEPTH_REGISTER_COUNT = 1;
+const D3D10_PS_OUTPUT_REGISTER_COMPONENTS = 4;
+const D3D10_PS_OUTPUT_REGISTER_COMPONENT_BIT_COUNT = 32;
+const D3D10_PS_OUTPUT_REGISTER_COUNT = 8;
+const D3D10_PS_PIXEL_CENTER_FRACTIONAL_COMPONENT = 0.5f;
+const D3D10_REQ_BLEND_OBJECT_COUNT_PER_CONTEXT = 4096;
+const D3D10_REQ_BUFFER_RESOURCE_TEXEL_COUNT_2_TO_EXP = 27;
+const D3D10_REQ_CONSTANT_BUFFER_ELEMENT_COUNT = 4096;
+const D3D10_REQ_DEPTH_STENCIL_OBJECT_COUNT_PER_CONTEXT = 4096;
+const D3D10_REQ_DRAWINDEXED_INDEX_COUNT_2_TO_EXP = 32;
+const D3D10_REQ_DRAW_VERTEX_COUNT_2_TO_EXP = 32;
+const D3D10_REQ_FILTERING_HW_ADDRESSABLE_RESOURCE_DIMENSION = 8192;
+const D3D10_REQ_GS_INVOCATION_32BIT_OUTPUT_COMPONENT_LIMIT = 1024;
+const D3D10_REQ_IMMEDIATE_CONSTANT_BUFFER_ELEMENT_COUNT = 4096;
+const D3D10_REQ_MAXANISOTROPY = 16;
+const D3D10_REQ_MIP_LEVELS = 14;
+const D3D10_REQ_MULTI_ELEMENT_STRUCTURE_SIZE_IN_BYTES = 2048;
+const D3D10_REQ_RASTERIZER_OBJECT_COUNT_PER_CONTEXT = 4096;
+const D3D10_REQ_RENDER_TO_BUFFER_WINDOW_WIDTH = 8192;
+const D3D10_REQ_RESOURCE_SIZE_IN_MEGABYTES = 128;
+const D3D10_REQ_RESOURCE_VIEW_COUNT_PER_CONTEXT_2_TO_EXP = 20;
+const D3D10_REQ_SAMPLER_OBJECT_COUNT_PER_CONTEXT = 4096;
+const D3D10_REQ_TEXTURE1D_ARRAY_AXIS_DIMENSION = 512;
+const D3D10_REQ_TEXTURE1D_U_DIMENSION = 8192;
+const D3D10_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION = 512;
+const D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION = 8192;
+const D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION = 2048;
+const D3D10_REQ_TEXTURECUBE_DIMENSION = 8192;
+const D3D10_RESINFO_INSTRUCTION_MISSING_COMPONENT_RETVAL = 0;
+const D3D10_SHADER_MAJOR_VERSION = 4;
+const D3D10_SHADER_MINOR_VERSION = 0;
+const D3D10_SHIFT_INSTRUCTION_PAD_VALUE = 0;
+const D3D10_SHIFT_INSTRUCTION_SHIFT_VALUE_BIT_COUNT = 5;
+const D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT = 8;
+const D3D10_SO_BUFFER_MAX_STRIDE_IN_BYTES = 2048;
+const D3D10_SO_BUFFER_MAX_WRITE_WINDOW_IN_BYTES = 256;
+const D3D10_SO_BUFFER_SLOT_COUNT = 4;
+const D3D10_SO_DDI_REGISTER_INDEX_DENOTING_GAP = 0xffffffff;
+const D3D10_SO_MULTIPLE_BUFFER_ELEMENTS_PER_BUFFER = 1;
+const D3D10_SO_SINGLE_BUFFER_COMPONENT_LIMIT = 64;
+const D3D10_SRGB_GAMMA = 2.2f;
+const D3D10_SRGB_TO_FLOAT_DENOMINATOR_1 = 12.92f;
+const D3D10_SRGB_TO_FLOAT_DENOMINATOR_2 = 1.055f;
+const D3D10_SRGB_TO_FLOAT_EXPONENT = 2.4f;
+const D3D10_SRGB_TO_FLOAT_OFFSET = 0.055f;
+const D3D10_SRGB_TO_FLOAT_THRESHOLD = 0.04045f;
+const D3D10_SRGB_TO_FLOAT_TOLERANCE_IN_ULP = 0.5f;
+const D3D10_STANDARD_COMPONENT_BIT_COUNT = 32;
+const D3D10_STANDARD_COMPONENT_BIT_COUNT_DOUBLED = 64;
+const D3D10_STANDARD_MAXIMUM_ELEMENT_ALIGNMENT_BYTE_MULTIPLE = 4;
+const D3D10_STANDARD_PIXEL_COMPONENT_COUNT = 128;
+const D3D10_STANDARD_PIXEL_ELEMENT_COUNT = 32;
+const D3D10_STANDARD_VECTOR_SIZE = 4;
+const D3D10_STANDARD_VERTEX_ELEMENT_COUNT = 16;
+const D3D10_STANDARD_VERTEX_TOTAL_COMPONENT_COUNT = 64;
+const D3D10_SUBPIXEL_FRACTIONAL_BIT_COUNT = 8;
+const D3D10_SUBTEXEL_FRACTIONAL_BIT_COUNT = 6;
+const D3D10_TEXEL_ADDRESS_RANGE_BIT_COUNT = 18;
+const D3D10_UNBOUND_MEMORY_ACCESS_RESULT = 0;
+const D3D10_VIEWPORT_AND_SCISSORRECT_MAX_INDEX = 15;
+const D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE = 16;
+const D3D10_VIEWPORT_BOUNDS_MAX = 16383;
+const D3D10_VIEWPORT_BOUNDS_MIN = -16384;
+const D3D10_VS_INPUT_REGISTER_COMPONENTS = 4;
+const D3D10_VS_INPUT_REGISTER_COMPONENT_BIT_COUNT = 32;
+const D3D10_VS_INPUT_REGISTER_COUNT = 16;
+const D3D10_VS_INPUT_REGISTER_READS_PER_INST = 2;
+const D3D10_VS_INPUT_REGISTER_READ_PORTS = 1;
+const D3D10_VS_OUTPUT_REGISTER_COMPONENTS = 4;
+const D3D10_VS_OUTPUT_REGISTER_COMPONENT_BIT_COUNT = 32;
+const D3D10_VS_OUTPUT_REGISTER_COUNT = 16;
+const D3D10_WHQL_CONTEXT_COUNT_FOR_RESOURCE_LIMIT = 10;
+const D3D10_WHQL_DRAWINDEXED_INDEX_COUNT_2_TO_EXP = 25;
+const D3D10_WHQL_DRAW_VERTEX_COUNT_2_TO_EXP = 25;
+const D3D_MAJOR_VERSION = 10;
+const D3D_MINOR_VERSION = 0;
+const D3D_SPEC_DATE_DAY = 8;
+const D3D_SPEC_DATE_MONTH = 8;
+const D3D_SPEC_DATE_YEAR = 2006;
+const D3D_SPEC_VERSION = 1.050005;
+
+const _FACD3D10 = 0x879;
+const _FACD3D10DEBUG = _FACD3D10 + 1;
+
+HRESULT MAKE_D3D10_HRESULT(T)(T code) {
+	return MAKE_HRESULT(1, _FACD3D10, code);
+}
+
+HRESULT MAKE_D3D10_STATUS(T)(T code) {
+	return MAKE_HRESULT(0, _FACD3D10, code);
+}
+
+const D3D10_ERROR_TOO_MANY_UNIQUE_STATE_OBJECTS = MAKE_D3D10_HRESULT(1);
+const D3D10_ERROR_FILE_NOT_FOUND = MAKE_D3D10_HRESULT(2);
+
+enum D3D10_INPUT_CLASSIFICATION {
+	D3D10_INPUT_PER_VERTEX_DATA		= 0,
+	D3D10_INPUT_PER_INSTANCE_DATA	= 1
+}
+
+const D3D10_APPEND_ALIGNED_ELEMENT = 0xffffffff;
+
+struct D3D10_INPUT_ELEMENT_DESC {
+	LPCSTR SemanticName;
+	UINT SemanticIndex;
+	DXGI_FORMAT Format;
+	UINT InputSlot;
+	UINT AlignedByteOffset;
+	D3D10_INPUT_CLASSIFICATION InputSlotClass;
+	UINT InstanceDataStepRate;
+}
+
+enum D3D10_FILL_MODE {
+	D3D10_FILL_WIREFRAME	= 2,
+	D3D10_FILL_SOLID		= 3
+}
+
+enum D3D10_PRIMITIVE_TOPOLOGY {
+	D3D10_PRIMITIVE_TOPOLOGY_UNDEFINED			= 0,
+	D3D10_PRIMITIVE_TOPOLOGY_POINTLIST			= 1,
+	D3D10_PRIMITIVE_TOPOLOGY_LINELIST			= 2,
+	D3D10_PRIMITIVE_TOPOLOGY_LINESTRIP			= 3,
+	D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST		= 4,
+	D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP		= 5,
+	D3D10_PRIMITIVE_TOPOLOGY_LINELIST_ADJ		= 10,
+	D3D10_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ		= 11,
+	D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ	= 12,
+	D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ	= 13
+}
+
+enum D3D10_PRIMITIVE {
+	D3D10_PRIMITIVE_UNDEFINED	= 0,
+	D3D10_PRIMITIVE_POINT	= 1,
+	D3D10_PRIMITIVE_LINE	= 2,
+	D3D10_PRIMITIVE_TRIANGLE	= 3,
+	D3D10_PRIMITIVE_LINE_ADJ	= 6,
+	D3D10_PRIMITIVE_TRIANGLE_ADJ	= 7
+}
+
+enum D3D10_CULL_MODE {
+	D3D10_CULL_NONE = 1,
+	D3D10_CULL_FRONT,
+	D3D10_CULL_BACK
+}
+
+struct D3D10_SO_DECLARATION_ENTRY {
+	LPCSTR SemanticName;
+	UINT SemanticIndex;
+	BYTE StartComponent;
+	BYTE ComponentCount;
+	BYTE OutputSlot;
+}
+
+struct D3D10_VIEWPORT {
+	INT TopLeftX;
+	INT TopLeftY;
+	UINT Width;
+	UINT Height;
+	FLOAT MinDepth;
+	FLOAT MaxDepth;
+}
+
+enum D3D10_RESOURCE_DIMENSION {
+	D3D10_RESOURCE_DIMENSION_UNKNOWN	= 0,
+	D3D10_RESOURCE_DIMENSION_BUFFER,
+	D3D10_RESOURCE_DIMENSION_TEXTURE1D,
+	D3D10_RESOURCE_DIMENSION_TEXTURE2D,
+	D3D10_RESOURCE_DIMENSION_TEXTURE3D
+}
+
+enum D3D10_SRV_DIMENSION {
+	D3D10_SRV_DIMENSION_UNKNOWN	= 0,
+	D3D10_SRV_DIMENSION_BUFFER,
+	D3D10_SRV_DIMENSION_TEXTURE1D,
+	D3D10_SRV_DIMENSION_TEXTURE1DARRAY,
+	D3D10_SRV_DIMENSION_TEXTURE2D,
+	D3D10_SRV_DIMENSION_TEXTURE2DARRAY,
+	D3D10_SRV_DIMENSION_TEXTURE2DMS,
+	D3D10_SRV_DIMENSION_TEXTURE2DMSARRAY,
+	D3D10_SRV_DIMENSION_TEXTURE3D,
+	D3D10_SRV_DIMENSION_TEXTURECUBE
+}
+
+enum D3D10_DSV_DIMENSION {
+	D3D10_DSV_DIMENSION_UNKNOWN	= 0,
+	D3D10_DSV_DIMENSION_TEXTURE1D,
+	D3D10_DSV_DIMENSION_TEXTURE1DARRAY,
+	D3D10_DSV_DIMENSION_TEXTURE2D,
+	D3D10_DSV_DIMENSION_TEXTURE2DARRAY,
+	D3D10_DSV_DIMENSION_TEXTURE2DMS,
+	D3D10_DSV_DIMENSION_TEXTURE2DMSARRAY6
+}
+
+enum D3D10_RTV_DIMENSION {
+	D3D10_RTV_DIMENSION_UNKNOWN	= 0,
+	D3D10_RTV_DIMENSION_BUFFER,
+	D3D10_RTV_DIMENSION_TEXTURE1D,
+	D3D10_RTV_DIMENSION_TEXTURE1DARRAY,
+	D3D10_RTV_DIMENSION_TEXTURE2D,
+	D3D10_RTV_DIMENSION_TEXTURE2DARRAY,
+	D3D10_RTV_DIMENSION_TEXTURE2DMS,
+	D3D10_RTV_DIMENSION_TEXTURE2DMSARRAY,
+	D3D10_RTV_DIMENSION_TEXTURE3D
+}
+
+enum D3D10_USAGE {
+	D3D10_USAGE_DEFAULT	= 0,
+	D3D10_USAGE_IMMUTABLE,
+	D3D10_USAGE_DYNAMIC,
+	D3D10_USAGE_STAGING
+}
+
+enum D3D10_BIND_FLAG {
+	D3D10_BIND_VERTEX_BUFFER	= 0x01,
+	D3D10_BIND_INDEX_BUFFER		= 0x02,
+	D3D10_BIND_CONSTANT_BUFFER	= 0x04,
+	D3D10_BIND_SHADER_RESOURCE	= 0x08,
+	D3D10_BIND_STREAM_OUTPUT	= 0x10,
+	D3D10_BIND_RENDER_TARGET	= 0x20,
+	D3D10_BIND_DEPTH_STENCIL	= 0x40
+}
+
+enum D3D10_CPU_ACCESS_FLAG {
+	D3D10_CPU_ACCESS_WRITE	= 0x10000,
+	D3D10_CPU_ACCESS_READ	= 0x20000
+}
+
+enum D3D10_RESOURCE_MISC_FLAG {
+	D3D10_RESOURCE_MISC_GENERATE_MIPS	= 0x01,
+	D3D10_RESOURCE_MISC_SHARED			= 0x02,
+	D3D10_RESOURCE_MISC_TEXTURECUBE		= 0x04
+}
+
+enum D3D10_MAP {
+	D3D10_MAP_READ = 1,
+	D3D10_MAP_WRITE,
+	D3D10_MAP_READ_WRITE,
+	D3D10_MAP_WRITE_DISCARD,
+	D3D10_MAP_WRITE_NO_OVERWRITE
+}
+
+enum D3D10_MAP_FLAG {
+	D3D10_MAP_FLAG_DO_NOT_WAIT = 0x100000
+}
+
+enum D3D10_RAISE_FLAG {
+	D3D10_RAISE_FLAG_DRIVER_INTERNAL_ERROR = 0x01
+}
+
+enum D3D10_CLEAR_FLAG {
+	D3D10_CLEAR_DEPTH	= 0x01,
+	D3D10_CLEAR_STENCIL	= 0x02
+}
+
+alias RECT D3D10_RECT;
+
+struct D3D10_BOX {
+	UINT left;
+	UINT top;
+	UINT front;
+	UINT right;
+	UINT bottom;
+	UINT back;
+}
+
+extern (Windows) interface ID3D10DeviceChild : IUnknown {
+	//extern(Windows) :
+	void GetDevice(ID3D10Device* ppDevice);
+	HRESULT GetPrivateData(REFGUID guid, UINT *pDataSize, void *pData);
+	HRESULT SetPrivateData(REFGUID guid, UINT DataSize, void *pData);
+	HRESULT SetPrivateDataInterface(REFGUID guid, IUnknown pData);
+}
+
+enum D3D10_COMPARISON_FUNC {
+	D3D10_COMPARISON_NEVER = 1,
+	D3D10_COMPARISON_LESS,
+	D3D10_COMPARISON_EQUAL,
+	D3D10_COMPARISON_LESS_EQUAL,
+	D3D10_COMPARISON_GREATER,
+	D3D10_COMPARISON_NOT_EQUAL,
+	D3D10_COMPARISON_GREATER_EQUAL,
+	D3D10_COMPARISON_ALWAYS
+}
+
+enum D3D10_DEPTH_WRITE_MASK {
+	D3D10_DEPTH_WRITE_MASK_ZERO	= 0,
+	D3D10_DEPTH_WRITE_MASK_ALL
+}
+
+enum D3D10_STENCIL_OP {
+	D3D10_STENCIL_OP_KEEP = 1,
+	D3D10_STENCIL_OP_ZERO,
+	D3D10_STENCIL_OP_REPLACE,
+	D3D10_STENCIL_OP_INCR_SAT,
+	D3D10_STENCIL_OP_DECR_SAT,
+	D3D10_STENCIL_OP_INVERT,
+	D3D10_STENCIL_OP_INCR,
+	D3D10_STENCIL_OP_DECR
+}
+
+struct D3D10_DEPTH_STENCILOP_DESC {
+	D3D10_STENCIL_OP StencilFailOp;
+	D3D10_STENCIL_OP StencilDepthFailOp;
+	D3D10_STENCIL_OP StencilPassOp;
+	D3D10_COMPARISON_FUNC StencilFunc;
+}
+
+struct D3D10_DEPTH_STENCIL_DESC {
+	BOOL DepthEnable;
+	D3D10_DEPTH_WRITE_MASK DepthWriteMask;
+	D3D10_COMPARISON_FUNC DepthFunc;
+	BOOL StencilEnable;
+	UINT8 StencilReadMask;
+	UINT8 StencilWriteMask;
+	D3D10_DEPTH_STENCILOP_DESC FrontFace;
+	D3D10_DEPTH_STENCILOP_DESC BackFace;
+}
+
+interface ID3D10DepthStencilState : ID3D10DeviceChild {
+	extern(Windows) :
+	void GetDesc(D3D10_DEPTH_STENCIL_DESC *pDesc);
+}
+
+enum D3D10_BLEND {
+	D3D10_BLEND_ZERO			= 1,
+	D3D10_BLEND_ONE				= 2,
+	D3D10_BLEND_SRC_COLOR		= 3,
+	D3D10_BLEND_INV_SRC_COLOR	= 4,
+	D3D10_BLEND_SRC_ALPHA		= 5,
+	D3D10_BLEND_INV_SRC_ALPHA	= 6,
+	D3D10_BLEND_DEST_ALPHA		= 7,
+	D3D10_BLEND_INV_DEST_ALPHA	= 8,
+	D3D10_BLEND_DEST_COLOR		= 9,
+	D3D10_BLEND_INV_DEST_COLOR	= 10,
+	D3D10_BLEND_SRC_ALPHA_SAT	= 11,
+	D3D10_BLEND_BLEND_FACTOR	= 14,
+	D3D10_BLEND_INV_BLEND_FACTOR	= 15,
+	D3D10_BLEND_SRC1_COLOR		= 16,
+	D3D10_BLEND_INV_SRC1_COLOR	= 17,
+	D3D10_BLEND_SRC1_ALPHA		= 18,
+	D3D10_BLEND_INV_SRC1_ALPHA	= 19
+}
+
+enum D3D10_BLEND_OP {
+	D3D10_BLEND_OP_ADD = 1,
+	D3D10_BLEND_OP_SUBTRACT,
+	D3D10_BLEND_OP_REV_SUBTRACT,
+	D3D10_BLEND_OP_MIN,
+	D3D10_BLEND_OP_MAX
+}
+
+enum D3D10_COLOR_WRITE_ENABLE {
+	D3D10_COLOR_WRITE_ENABLE_RED	= 1,
+	D3D10_COLOR_WRITE_ENABLE_GREEN	= 2,
+	D3D10_COLOR_WRITE_ENABLE_BLUE	= 4,
+	D3D10_COLOR_WRITE_ENABLE_ALPHA	= 8,
+	D3D10_COLOR_WRITE_ENABLE_ALL	= (((D3D10_COLOR_WRITE_ENABLE_RED | D3D10_COLOR_WRITE_ENABLE_GREEN) | D3D10_COLOR_WRITE_ENABLE_BLUE)  | D3D10_COLOR_WRITE_ENABLE_ALPHA)
+}
+
+struct D3D10_BLEND_DESC {
+	BOOL AlphaToCoverageEnable;
+	BOOL[8] BlendEnable;
+	D3D10_BLEND SrcBlend;
+	D3D10_BLEND DestBlend;
+	D3D10_BLEND_OP BlendOp;
+	D3D10_BLEND SrcBlendAlpha;
+	D3D10_BLEND DestBlendAlpha;
+	D3D10_BLEND_OP BlendOpAlpha;
+	UINT8[8] RenderTargetWriteMask;
+}
+
+interface ID3D10BlendState : ID3D10DeviceChild {
+	extern(Windows) :
+	void GetDesc(D3D10_BLEND_DESC *pDesc);
+}
+
+struct D3D10_RASTERIZER_DESC {
+	D3D10_FILL_MODE FillMode;
+	D3D10_CULL_MODE CullMode;
+	BOOL FrontCounterClockwise;
+	INT DepthBias;
+	FLOAT DepthBiasClamp;
+	FLOAT SlopeScaledDepthBias;
+	BOOL DepthClipEnable;
+	BOOL ScissorEnable;
+	BOOL MultisampleEnable;
+	BOOL AntialiasedLineEnable;
+}
+
+interface ID3D10RasterizerState : ID3D10DeviceChild {
+	extern(Windows) :
+	void GetDesc(D3D10_RASTERIZER_DESC *pDesc);
+}
+
+UINT D3D10CalcSubresource(UINT MipSlice, UINT ArraySlice, UINT MipLevels) {
+	return MipSlice + ArraySlice * MipLevels;
+}
+
+struct D3D10_SUBRESOURCE_DATA {
+	void *pSysMem;
+	UINT SysMemPitch;
+	UINT SysMemSlicePitch;
+}
+
+interface ID3D10Resource : ID3D10DeviceChild {
+	extern(Windows) :
+	void GetType(D3D10_RESOURCE_DIMENSION *rType);
+	void SetEvictionPriority(UINT EvictionPriority);
+	UINT GetEvictionPriority();
+}
+
+struct D3D10_BUFFER_DESC {
+	UINT ByteWidth;
+	D3D10_USAGE Usage;
+	UINT BindFlags;
+	UINT CPUAccessFlags;
+	UINT MiscFlags;
+}
+
+interface ID3D10Buffer : ID3D10Resource {
+	extern(Windows) :
+	HRESULT Map(D3D10_MAP MapType, UINT MapFlags, void **ppData);
+	void Unmap();
+	void GetDesc(D3D10_BUFFER_DESC *pDesc);
+}
+
+struct D3D10_TEXTURE1D_DESC {
+	UINT Width;
+	UINT MipLevels;
+	UINT ArraySize;
+	DXGI_FORMAT Format;
+	D3D10_USAGE Usage;
+	UINT BindFlags;
+	UINT CPUAccessFlags;
+	UINT MiscFlags;
+}
+
+interface ID3D10Texture1D : ID3D10Resource {
+	extern(Windows) :
+	HRESULT Map(UINT Subresource, D3D10_MAP MapType, UINT MapFlags, void **ppData);
+	void Unmap(UINT Subresource);
+	void GetDesc(D3D10_TEXTURE1D_DESC *pDesc);
+}
+
+struct D3D10_TEXTURE2D_DESC {
+	UINT Width;
+	UINT Height;
+	UINT MipLevels;
+	UINT ArraySize;
+	DXGI_FORMAT Format;
+	DXGI_SAMPLE_DESC SampleDesc;
+	D3D10_USAGE Usage;
+	UINT BindFlags;
+	UINT CPUAccessFlags;
+	UINT MiscFlags;
+}
+
+struct D3D10_MAPPED_TEXTURE2D {
+	void *pData;
+	UINT RowPitch;
+}
+
+interface ID3D10Texture2D : ID3D10Resource {
+	extern(Windows) :
+	HRESULT Map(UINT Subresource, D3D10_MAP MapType, UINT MapFlags, D3D10_MAPPED_TEXTURE2D *pMappedTex2D);
+	void Unmap(UINT Subresource);
+	void GetDesc(D3D10_TEXTURE2D_DESC *pDesc);
+}
+
+struct D3D10_TEXTURE3D_DESC {
+	UINT Width;
+	UINT Height;
+	UINT Depth;
+	UINT MipLevels;
+	DXGI_FORMAT Format;
+	D3D10_USAGE Usage;
+	UINT BindFlags;
+	UINT CPUAccessFlags;
+	UINT MiscFlags;
+}
+
+struct D3D10_MAPPED_TEXTURE3D {
+	void *pData;
+	UINT RowPitch;
+	UINT DepthPitch;
+}
+
+interface ID3D10Texture3D : ID3D10Resource {
+	extern(Windows) :
+	HRESULT Map(UINT Subresource, D3D10_MAP MapType, UINT MapFlags, D3D10_MAPPED_TEXTURE3D *pMappedTex3D);
+	void Unmap(UINT Subresource);
+	void GetDesc(D3D10_TEXTURE3D_DESC *pDesc);
+}
+
+enum D3D10_TEXTURECUBE_FACE {
+	D3D10_TEXTURECUBE_FACE_POSITIVE_X = 0,
+	D3D10_TEXTURECUBE_FACE_NEGATIVE_X,
+	D3D10_TEXTURECUBE_FACE_POSITIVE_Y,
+	D3D10_TEXTURECUBE_FACE_NEGATIVE_Y,
+	D3D10_TEXTURECUBE_FACE_POSITIVE_Z,
+	D3D10_TEXTURECUBE_FACE_NEGATIVE_Z
+}
+
+interface ID3D10View : ID3D10DeviceChild {
+	extern(Windows) :
+	void GetResource(ID3D10Resource *ppResource);
+}
+
+struct D3D10_BUFFER_SRV {
+	UINT ElementOffset;
+	UINT ElementWidth;
+}
+
+struct D3D10_TEX1D_SRV {
+	UINT MostDetailedMip;
+	UINT MipLevels;
+}
+
+struct D3D10_TEX1D_ARRAY_SRV {
+	UINT MostDetailedMip;
+	UINT MipLevels;
+	UINT FirstArraySlice;
+	UINT ArraySize;
+}
+
+struct D3D10_TEX2D_SRV {
+	UINT MostDetailedMip;
+	UINT MipLevels;
+}
+
+struct D3D10_TEX2D_ARRAY_SRV {
+	UINT MostDetailedMip;
+	UINT MipLevels;
+	UINT FirstArraySlice;
+	UINT ArraySize;
+}
+
+struct D3D10_TEX3D_SRV {
+	UINT MostDetailedMip;
+	UINT MipLevels;
+}
+
+struct D3D10_TEXCUBE_SRV {
+	UINT MostDetailedMip;
+	UINT MipLevels;
+}
+
+struct D3D10_TEX2DMS_SRV {
+	UINT UnusedField_NothingToDefine;
+}
+
+struct D3D10_TEX2DMS_ARRAY_SRV {
+	UINT FirstArraySlice;
+	UINT ArraySize;
+}
+
+struct D3D10_SHADER_RESOURCE_VIEW_DESC {
+	DXGI_FORMAT Format;
+	D3D10_SRV_DIMENSION ViewDimension;
+	union {
+		D3D10_BUFFER_SRV Buffer;
+		D3D10_TEX1D_SRV Texture1D;
+		D3D10_TEX1D_ARRAY_SRV Texture1DArray;
+		D3D10_TEX2D_SRV Texture2D;
+		D3D10_TEX2D_ARRAY_SRV Texture2DArray;
+		D3D10_TEX2DMS_SRV Texture2DMS;
+		D3D10_TEX2DMS_ARRAY_SRV Texture2DMSArray;
+		D3D10_TEX3D_SRV Texture3D;
+		D3D10_TEXCUBE_SRV TextureCube;
+	}
+}
+
+interface ID3D10ShaderResourceView : ID3D10View {
+	extern(Windows) :
+	void GetDesc(D3D10_SHADER_RESOURCE_VIEW_DESC *pDesc);
+}
+
+struct D3D10_BUFFER_RTV {
+	UINT ElementOffset;
+	UINT ElementWidth;
+}
+
+struct D3D10_TEX1D_RTV {
+	UINT MipSlice;
+}
+
+struct D3D10_TEX1D_ARRAY_RTV {
+	UINT MipSlice;
+	UINT FirstArraySlice;
+	UINT ArraySize;
+}
+
+struct D3D10_TEX2D_RTV {
+	UINT MipSlice;
+}
+
+struct D3D10_TEX2DMS_RTV {
+	UINT UnusedField_NothingToDefine;
+}
+
+struct D3D10_TEX2D_ARRAY_RTV {
+	UINT MipSlice;
+	UINT FirstArraySlice;
+	UINT ArraySize;
+}
+
+struct D3D10_TEX2DMS_ARRAY_RTV {
+	UINT FirstArraySlice;
+	UINT ArraySize;
+}
+
+struct D3D10_TEX3D_RTV {
+	UINT MipSlice;
+	UINT FirstWSlice;
+	UINT WSize;
+}
+
+struct D3D10_RENDER_TARGET_VIEW_DESC {
+	DXGI_FORMAT Format;
+	D3D10_RTV_DIMENSION ViewDimension;
+	union {
+		D3D10_BUFFER_RTV Buffer;
+		D3D10_TEX1D_RTV Texture1D;
+		D3D10_TEX1D_ARRAY_RTV Texture1DArray;
+		D3D10_TEX2D_RTV Texture2D;
+		D3D10_TEX2D_ARRAY_RTV Texture2DArray;
+		D3D10_TEX2DMS_RTV Texture2DMS;
+		D3D10_TEX2DMS_ARRAY_RTV Texture2DMSArray;
+		D3D10_TEX3D_RTV Texture3D;
+	}
+}
+
+interface ID3D10RenderTargetView : ID3D10View {
+	extern(Windows) :
+	void GetDesc(D3D10_RENDER_TARGET_VIEW_DESC *pDesc);
+}
+
+struct D3D10_TEX1D_DSV {
+	UINT MipSlice;
+}
+
+struct D3D10_TEX1D_ARRAY_DSV {
+	UINT MipSlice;
+	UINT FirstArraySlice;
+	UINT ArraySize;
+}
+
+struct D3D10_TEX2D_DSV {
+	UINT MipSlice;
+}
+
+struct D3D10_TEX2D_ARRAY_DSV {
+	UINT MipSlice;
+	UINT FirstArraySlice;
+	UINT ArraySize;
+}
+
+struct D3D10_TEX2DMS_DSV {
+	UINT UnusedField_NothingToDefine;
+}
+
+struct D3D10_TEX2DMS_ARRAY_DSV {
+	UINT FirstArraySlice;
+	UINT ArraySize;
+}
+
+struct D3D10_DEPTH_STENCIL_VIEW_DESC {
+	DXGI_FORMAT Format;
+	D3D10_DSV_DIMENSION ViewDimension;
+	union {
+		D3D10_TEX1D_DSV Texture1D;
+		D3D10_TEX1D_ARRAY_DSV Texture1DArray;
+		D3D10_TEX2D_DSV Texture2D;
+		D3D10_TEX2D_ARRAY_DSV Texture2DArray;
+		D3D10_TEX2DMS_DSV Texture2DMS;
+		D3D10_TEX2DMS_ARRAY_DSV Texture2DMSArray;
+	}
+}
+
+interface ID3D10DepthStencilView : ID3D10View {
+	extern(Windows) :
+	void GetDesc(D3D10_DEPTH_STENCIL_VIEW_DESC *pDesc);
+}
+
+interface ID3D10VertexShader : ID3D10DeviceChild { }
+
+interface ID3D10GeometryShader : ID3D10DeviceChild { }
+
+interface ID3D10PixelShader : ID3D10DeviceChild { }
+
+interface ID3D10InputLayout : ID3D10DeviceChild { }
+
+enum D3D10_FILTER {
+	D3D10_FILTER_MIN_MAG_MIP_POINT							= 0x00,
+	D3D10_FILTER_MIN_MAG_POINT_MIP_LINEAR					= 0x01,
+	D3D10_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT				= 0x04,
+	D3D10_FILTER_MIN_POINT_MAG_MIP_LINEAR					= 0x05,
+	D3D10_FILTER_MIN_LINEAR_MAG_MIP_POINT					= 0x10,
+	D3D10_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR			= 0x11,
+	D3D10_FILTER_MIN_MAG_LINEAR_MIP_POINT					= 0x14,
+	D3D10_FILTER_MIN_MAG_MIP_LINEAR							= 0x15,
+	D3D10_FILTER_ANISOTROPIC								= 0x55,
+	D3D10_FILTER_COMPARISON_MIN_MAG_MIP_POINT				= 0x80,
+	D3D10_FILTER_COMPARISON_MIN_MAG_POINT_MIP_LINEAR		= 0x81,
+	D3D10_FILTER_COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT	= 0x84,
+	D3D10_FILTER_COMPARISON_MIN_POINT_MAG_MIP_LINEAR		= 0x85,
+	D3D10_FILTER_COMPARISON_MIN_LINEAR_MAG_MIP_POINT		= 0x90,
+	D3D10_FILTER_COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR	= 0x91,
+	D3D10_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT		= 0x94,
+	D3D10_FILTER_COMPARISON_MIN_MAG_MIP_LINEAR				= 0x95,
+	D3D10_FILTER_COMPARISON_ANISOTROPIC						= 0xd5,
+	D3D10_FILTER_TEXT_1BIT									= 0x80000000
+}
+
+
+enum D3D10_FILTER_TYPE {
+	D3D10_FILTER_TYPE_POINT		= 0,
+	D3D10_FILTER_TYPE_LINEAR
+}
+
+const D3D10_FILTER_TYPE_MASK = 0x03;
+
+const D3D10_MIN_FILTER_SHIFT = 4;
+
+const D3D10_MAG_FILTER_SHIFT = 2;
+
+const D3D10_MIP_FILTER_SHIFT = 0;
+
+const D3D10_COMPARISON_FILTERING_BIT = 0x80;
+
+const D3D10_ANISOTROPIC_FILTERING_BIT = 0x40;
+
+const D3D10_TEXT_1BIT_BIT = 0x80000000;
+
+D3D10_FILTER D3D10_ENCODE_BASIC_FILTER(int min, int mag, int mip, bool bComparison) {
+	return cast(D3D10_FILTER)(((bComparison) ? D3D10_COMPARISON_FILTERING_BIT : 0) |
+	       ((min & D3D10_FILTER_TYPE_MASK) << D3D10_MIN_FILTER_SHIFT) |
+		   ((mag & D3D10_FILTER_TYPE_MASK) << D3D10_MAG_FILTER_SHIFT) |
+		   ((mip & D3D10_FILTER_TYPE_MASK) << D3D10_MIP_FILTER_SHIFT));
+}
+
+D3D10_FILTER D3D10_ENCODE_ANISOTROPIC_FILTER(bool bComparison) {
+	return cast(D3D10_FILTER)(D3D10_ANISOTROPIC_FILTERING_BIT |
+		D3D10_ENCODE_BASIC_FILTER(D3D10_FILTER_TYPE.D3D10_FILTER_TYPE_LINEAR,
+			D3D10_FILTER_TYPE.D3D10_FILTER_TYPE_LINEAR, D3D10_FILTER_TYPE.D3D10_FILTER_TYPE_LINEAR,
+			bComparison));
+}
+
+D3D10_FILTER_TYPE D3D10_DECODE_MIN_FILTER(D3D10_FILTER d3d10Filter) {
+	return cast(D3D10_FILTER_TYPE)((d3d10Filter >> D3D10_MIN_FILTER_SHIFT) & D3D10_FILTER_TYPE_MASK);
+}
+
+D3D10_FILTER_TYPE D3D10_DECODE_MAG_FILTER(D3D10_FILTER d3d10Filter) {
+	return cast(D3D10_FILTER_TYPE)((d3d10Filter >> D3D10_MAG_FILTER_SHIFT) & D3D10_FILTER_TYPE_MASK);
+}
+
+D3D10_FILTER_TYPE D3D10_DECODE_MIP_FILTER(D3D10_FILTER d3d10Filter) {
+	return cast(D3D10_FILTER_TYPE)((d3d10Filter >> D3D10_MIP_FILTER_SHIFT) & D3D10_FILTER_TYPE_MASK);
+}
+
+bool D3D10_DECODE_IS_COMPARISON_FILTER(D3D10_FILTER d3d10Filter) {
+	return (d3d10Filter & D3D10_COMPARISON_FILTERING_BIT) == D3D10_COMPARISON_FILTERING_BIT;
+}
+
+bool D3D10_DECODE_IS_ANISOTROPIC_FILTER(D3D10_FILTER d3d10Filter) {
+	return ((d3d10Filter & D3D10_ANISOTROPIC_FILTERING_BIT) &&
+	       (D3D10_FILTER_TYPE.D3D10_FILTER_TYPE_LINEAR == D3D10_DECODE_MIN_FILTER(d3d10Filter)) &&
+	       (D3D10_FILTER_TYPE.D3D10_FILTER_TYPE_LINEAR == D3D10_DECODE_MAG_FILTER(d3d10Filter)) &&
+	       (D3D10_FILTER_TYPE.D3D10_FILTER_TYPE_LINEAR == D3D10_DECODE_MIP_FILTER(d3d10Filter)));
+}
+
+bool D3D10_DECODE_IS_TEXT_1BIT_FILTER(D3D10_FILTER d3d10Filter) {
+	return d3d10Filter == D3D10_TEXT_1BIT_BIT;
+}
+
+enum D3D10_TEXTURE_ADDRESS_MODE {
+	D3D10_TEXTURE_ADDRESS_WRAP = 1,
+	D3D10_TEXTURE_ADDRESS_MIRROR,
+	D3D10_TEXTURE_ADDRESS_CLAMP,
+	D3D10_TEXTURE_ADDRESS_BORDER,
+	D3D10_TEXTURE_ADDRESS_MIRROR_ONCE
+}
+
+struct D3D10_SAMPLER_DESC {
+	D3D10_FILTER Filter;
+	D3D10_TEXTURE_ADDRESS_MODE AddressU;
+	D3D10_TEXTURE_ADDRESS_MODE AddressV;
+	D3D10_TEXTURE_ADDRESS_MODE AddressW;
+	FLOAT MipLODBias;
+	UINT MaxAnisotropy;
+	D3D10_COMPARISON_FUNC ComparisonFunc;
+	FLOAT[4] BorderColor;
+	FLOAT MinLOD;
+	FLOAT MaxLOD;
+}
+
+interface ID3D10SamplerState : ID3D10DeviceChild {
+	extern(Windows) :
+	void GetDesc(D3D10_SAMPLER_DESC *pDesc);
+}
+
+enum D3D10_FORMAT_SUPPORT {
+	D3D10_FORMAT_SUPPORT_BUFFER						= 0x000001,
+	D3D10_FORMAT_SUPPORT_IA_VERTEX_BUFFER			= 0x000002,
+	D3D10_FORMAT_SUPPORT_IA_INDEX_BUFFER			= 0x000004,
+	D3D10_FORMAT_SUPPORT_SO_BUFFER					= 0x000008,
+	D3D10_FORMAT_SUPPORT_TEXTURE1D					= 0x000010,
+	D3D10_FORMAT_SUPPORT_TEXTURE2D					= 0x000020,
+	D3D10_FORMAT_SUPPORT_TEXTURE3D					= 0x000040,
+	D3D10_FORMAT_SUPPORT_TEXTURECUBE				= 0x000080,
+	D3D10_FORMAT_SUPPORT_SHADER_LOAD				= 0x000100,
+	D3D10_FORMAT_SUPPORT_SHADER_SAMPLE				= 0x000200,
+	D3D10_FORMAT_SUPPORT_SHADER_SAMPLE_COMPARISON	= 0x000400,
+	D3D10_FORMAT_SUPPORT_SHADER_SAMPLE_MONO_TEXT	= 0x000800,
+	D3D10_FORMAT_SUPPORT_MIP						= 0x001000,
+	D3D10_FORMAT_SUPPORT_MIP_AUTOGEN				= 0x002000,
+	D3D10_FORMAT_SUPPORT_RENDER_TARGET				= 0x004000,
+	D3D10_FORMAT_SUPPORT_BLENDABLE					= 0x008000,
+	D3D10_FORMAT_SUPPORT_DEPTH_STENCIL				= 0x010000,
+	D3D10_FORMAT_SUPPORT_CPU_LOCKABLE				= 0x020000,
+	D3D10_FORMAT_SUPPORT_MULTISAMPLE_RESOLVE		= 0x040000,
+	D3D10_FORMAT_SUPPORT_DISPLAY					= 0x080000,
+	D3D10_FORMAT_SUPPORT_CAST_WITHIN_BIT_LAYOUT		= 0x100000,
+	D3D10_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET	= 0x200000,
+	D3D10_FORMAT_SUPPORT_MULTISAMPLE_LOAD			= 0x400000,
+	D3D10_FORMAT_SUPPORT_SHADER_GATHER				= 0x800000
+}
+
+interface ID3D10Asynchronous : ID3D10DeviceChild {
+	extern(Windows) :
+	void Begin();
+	void End();
+	HRESULT GetData(void *pData, UINT DataSize, UINT GetDataFlags);
+	UINT GetDataSize();
+}
+
+enum D3D10_ASYNC_GETDATA_FLAG {
+	D3D10_ASYNC_GETDATA_DONOTFLUSH	= 0x1
+}
+
+enum D3D10_QUERY {
+	D3D10_QUERY_EVENT					= 0,
+	D3D10_QUERY_OCCLUSION				= (D3D10_QUERY_EVENT + 1),
+	D3D10_QUERY_TIMESTAMP				= (D3D10_QUERY_OCCLUSION + 1),
+	D3D10_QUERY_TIMESTAMP_DISJOINT		= (D3D10_QUERY_TIMESTAMP + 1),
+	D3D10_QUERY_PIPELINE_STATISTICS		= (D3D10_QUERY_TIMESTAMP_DISJOINT + 1),
+	D3D10_QUERY_OCCLUSION_PREDICATE		= (D3D10_QUERY_PIPELINE_STATISTICS + 1),
+	D3D10_QUERY_SO_STATISTICS			= (D3D10_QUERY_OCCLUSION_PREDICATE + 1),
+	D3D10_QUERY_SO_OVERFLOW_PREDICATE	= (D3D10_QUERY_SO_STATISTICS + 1)
+}
+
+enum D3D10_QUERY_MISC_FLAG {
+	D3D10_QUERY_MISC_PREDICATEHINT = 0x01
+}
+
+struct D3D10_QUERY_DESC {
+	D3D10_QUERY Query;
+	UINT MiscFlags;
+}
+
+interface ID3D10Query : ID3D10Asynchronous {
+	extern(Windows) :
+	void GetDesc(D3D10_QUERY_DESC *pDesc);
+}
+
+interface ID3D10Predicate : ID3D10Query { }
+
+struct D3D10_QUERY_DATA_TIMESTAMP_DISJOINT {
+	UINT64 Frequency;
+	BOOL Disjoint;
+}
+
+struct D3D10_QUERY_DATA_PIPELINE_STATISTICS {
+	UINT64 IAVertices;
+	UINT64 IAPrimitives;
+	UINT64 VSInvocations;
+	UINT64 GSInvocations;
+	UINT64 GSPrimitives;
+	UINT64 CInvocations;
+	UINT64 CPrimitives;
+	UINT64 PSInvocations;
+}
+
+struct D3D10_QUERY_DATA_SO_STATISTICS {
+	UINT64 NumPrimitivesWritten;
+	UINT64 PrimitivesStorageNeeded;
+}
+
+enum D3D10_COUNTER {
+	D3D10_COUNTER_GPU_IDLE								= 0,
+	D3D10_COUNTER_VERTEX_PROCESSING						= (D3D10_COUNTER_GPU_IDLE + 1),
+	D3D10_COUNTER_GEOMETRY_PROCESSING					= (D3D10_COUNTER_VERTEX_PROCESSING + 1),
+	D3D10_COUNTER_PIXEL_PROCESSING						= (D3D10_COUNTER_GEOMETRY_PROCESSING + 1),
+	D3D10_COUNTER_OTHER_GPU_PROCESSING					= (D3D10_COUNTER_PIXEL_PROCESSING + 1),
+	D3D10_COUNTER_HOST_ADAPTER_BANDWIDTH_UTILIZATION	= (D3D10_COUNTER_OTHER_GPU_PROCESSING + 1),
+	D3D10_COUNTER_LOCAL_VIDMEM_BANDWIDTH_UTILIZATION	= (D3D10_COUNTER_HOST_ADAPTER_BANDWIDTH_UTILIZATION + 1),
+	D3D10_COUNTER_VERTEX_THROUGHPUT_UTILIZATION			= (D3D10_COUNTER_LOCAL_VIDMEM_BANDWIDTH_UTILIZATION + 1),
+	D3D10_COUNTER_TRIANGLE_SETUP_THROUGHPUT_UTILIZATION	= (D3D10_COUNTER_VERTEX_THROUGHPUT_UTILIZATION + 1),
+	D3D10_COUNTER_FILLRATE_THROUGHPUT_UTILIZATION		= (D3D10_COUNTER_TRIANGLE_SETUP_THROUGHPUT_UTILIZATION + 1),
+	D3D10_COUNTER_VS_MEMORY_LIMITED						= (D3D10_COUNTER_FILLRATE_THROUGHPUT_UTILIZATION + 1),
+	D3D10_COUNTER_VS_COMPUTATION_LIMITED				= (D3D10_COUNTER_VS_MEMORY_LIMITED + 1),
+	D3D10_COUNTER_GS_MEMORY_LIMITED						= (D3D10_COUNTER_VS_COMPUTATION_LIMITED + 1),
+	D3D10_COUNTER_GS_COMPUTATION_LIMITED				= (D3D10_COUNTER_GS_MEMORY_LIMITED + 1),
+	D3D10_COUNTER_PS_MEMORY_LIMITED						= (D3D10_COUNTER_GS_COMPUTATION_LIMITED + 1),
+	D3D10_COUNTER_PS_COMPUTATION_LIMITED				= (D3D10_COUNTER_PS_MEMORY_LIMITED + 1),
+	D3D10_COUNTER_POST_TRANSFORM_CACHE_HIT_RATE			= (D3D10_COUNTER_PS_COMPUTATION_LIMITED + 1),
+	D3D10_COUNTER_TEXTURE_CACHE_HIT_RATE				= (D3D10_COUNTER_POST_TRANSFORM_CACHE_HIT_RATE + 1),
+	D3D10_COUNTER_DEVICE_DEPENDENT_0					= 0x40000000
+}
+
+enum D3D10_COUNTER_TYPE {
+	D3D10_COUNTER_TYPE_FLOAT32	= 0,
+	D3D10_COUNTER_TYPE_UINT16	= (D3D10_COUNTER_TYPE_FLOAT32 + 1),
+	D3D10_COUNTER_TYPE_UINT32	= (D3D10_COUNTER_TYPE_UINT16 + 1),
+	D3D10_COUNTER_TYPE_UINT64	= (D3D10_COUNTER_TYPE_UINT32 + 1)
+}
+
+struct D3D10_COUNTER_DESC {
+	D3D10_COUNTER Counter;
+	UINT MiscFlags;
+}
+
+struct D3D10_COUNTER_INFO {
+	D3D10_COUNTER LastDeviceDependentCounter;
+	UINT NumSimultaneousCounters;
+	UINT8 NumDetectableParallelUnits;
+}
+
+interface ID3D10Counter : ID3D10Asynchronous {
+	extern(Windows) :
+	void GetDesc(D3D10_COUNTER_DESC *pDesc);
+}
+
+interface ID3D10Device : IUnknown {
+	extern(Windows) :
+	void VSSetConstantBuffers(UINT StartSlot, UINT NumBuffers, ID3D10Buffer* ppConstantBuffers);
+	void PSSetShaderResources(UINT StartSlot, UINT NumViews, ID3D10ShaderResourceView* ppShaderResourceViews);
+	void PSSetShader(ID3D10PixelShader pPixelShader);
+	void PSSetSamplers(UINT StartSlot, UINT NumSamplers, ID3D10SamplerState* ppSamplers);
+	void VSSetShader(ID3D10VertexShader pVertexShader);
+	void DrawIndexed(UINT IndexCount, UINT StartIndexLocation, INT BaseVertexLocation);
+	void Draw(UINT VertexCount, UINT StartVertexLocation);
+	void PSSetConstantBuffers(UINT StartSlot, UINT NumBuffers, ID3D10Buffer* ppConstantBuffers);
+	void IASetInputLayout(ID3D10InputLayout pInputLayout);
+	void IASetVertexBuffers(UINT StartSlot, UINT NumBuffers, ID3D10Buffer* ppVertexBuffers, UINT* pStrides, UINT* pOffsets);
+	void IASetIndexBuffer(ID3D10Buffer pIndexBuffer, DXGI_FORMAT Format, UINT Offset);
+	void DrawIndexedInstanced(UINT IndexCountPerInstance, UINT InstanceCount, UINT StartIndexLocation, INT BaseVertexLocation, UINT StartInstanceLocation);
+	void DrawInstanced(UINT VertexCountPerInstance, UINT InstanceCount, UINT StartVertexLocation, UINT StartInstanceLocation);
+	void GSSetConstantBuffers(UINT StartSlot, UINT NumBuffers, ID3D10Buffer* ppConstantBuffers);
+	void GSSetShader(ID3D10GeometryShader pShader);
+	void IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY Topology);
+	void VSSetShaderResources(UINT StartSlot, UINT NumViews, ID3D10ShaderResourceView* ppShaderResourceViews);
+	void VSSetSamplers(UINT StartSlot, UINT NumSamplers, ID3D10SamplerState* ppSamplers);
+	void SetPredication(ID3D10Predicate pPredicate, BOOL PredicateValue);
+	void GSSetShaderResources(UINT StartSlot, UINT NumViews, ID3D10ShaderResourceView* ppShaderResourceViews);
+	void GSSetSamplers(UINT StartSlot, UINT NumSamplers, ID3D10SamplerState* ppSamplers);
+	void OMSetRenderTargets(UINT NumViews, ID3D10RenderTargetView* ppRenderTargetViews, ID3D10DepthStencilView pDepthStencilView);
+	void OMSetBlendState(ID3D10BlendState pBlendState, FLOAT[4] BlendFactor, UINT SampleMask);
+	void OMSetDepthStencilState(ID3D10DepthStencilState pDepthStencilState, UINT StencilRef);
+	void SOSetTargets(UINT NumBuffers, ID3D10Buffer* ppSOTargets, UINT* pOffsets);
+	void DrawAuto();
+	void RSSetState(ID3D10RasterizerState pRasterizerState);
+	void RSSetViewports(UINT NumViewports, D3D10_VIEWPORT* pViewports);
+	void RSSetScissorRects(UINT NumRects, D3D10_RECT* pRects);
+	void CopySubresourceRegion(ID3D10Resource pDstResource, UINT DstSubresource, UINT DstX, UINT DstY, UINT DstZ, ID3D10Resource pSrcResource, UINT SrcSubresource, D3D10_BOX* pSrcBox);
+	void CopyResource(ID3D10Resource pDstResource, ID3D10Resource pSrcResource);
+	void UpdateSubresource(ID3D10Resource pDstResource, UINT DstSubresource, D3D10_BOX* pDstBox, void* pSrcData, UINT SrcRowPitch, UINT SrcDepthPitch);
+	void ClearRenderTargetView(ID3D10RenderTargetView pRenderTargetView, FLOAT[4] ColorRGBA);
+	void ClearDepthStencilView(ID3D10DepthStencilView pDepthStencilView, UINT ClearFlags, FLOAT Depth, UINT8 Stencil);
+	void GenerateMips(ID3D10ShaderResourceView pShaderResourceView);
+	void ResolveSubresource(ID3D10Resource pDstResource, UINT DstSubresource, ID3D10Resource pSrcResource, UINT SrcSubresource, DXGI_FORMAT Format);
+	void VSGetConstantBuffers(UINT StartSlot, UINT NumBuffers, ID3D10Buffer* ppConstantBuffers);
+	void PSGetShaderResources(UINT StartSlot, UINT NumViews, ID3D10ShaderResourceView* ppShaderResourceViews);
+	void PSGetShader(ID3D10PixelShader* ppPixelShader);
+	void PSGetSamplers(UINT StartSlot, UINT NumSamplers, ID3D10SamplerState* ppSamplers);
+	void VSGetShader(ID3D10VertexShader* ppVertexShader);
+	void PSGetConstantBuffers(UINT StartSlot, UINT NumBuffers, ID3D10Buffer* ppConstantBuffers);
+	void IAGetInputLayout(ID3D10InputLayout* ppInputLayout);
+	void IAGetVertexBuffers(UINT StartSlot, UINT NumBuffers, ID3D10Buffer* ppVertexBuffers, UINT* pStrides, UINT* pOffsets);
+	void IAGetIndexBuffer(ID3D10Buffer* pIndexBuffer, DXGI_FORMAT* Format, UINT* Offset);
+	void GSGetConstantBuffers(UINT StartSlot, UINT NumBuffers, ID3D10Buffer* ppConstantBuffers);
+	void GSGetShader(ID3D10GeometryShader* ppGeometryShader);
+	void IAGetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY* pTopology);
+	void VSGetShaderResources(UINT StartSlot, UINT NumViews, ID3D10ShaderResourceView* ppShaderResourceViews);
+	void VSGetSamplers(UINT StartSlot, UINT NumSamplers, ID3D10SamplerState* ppSamplers);
+	void GetPredication(ID3D10Predicate* ppPredicate, BOOL* pPredicateValue);
+	void GSGetShaderResources(UINT StartSlot, UINT NumViews, ID3D10ShaderResourceView* ppShaderResourceViews);
+	void GSGetSamplers(UINT StartSlot, UINT NumSamplers, ID3D10SamplerState* ppSamplers);
+	void OMGetRenderTargets(UINT NumViews, ID3D10RenderTargetView* ppRenderTargetViews, ID3D10DepthStencilView* ppDepthStencilView);
+	void OMGetBlendState(ID3D10BlendState* ppBlendState, FLOAT BlendFactor[ 4 ], UINT* pSampleMask);
+	void OMGetDepthStencilState(ID3D10DepthStencilState* ppDepthStencilState, UINT* pStencilRef);
+	void SOGetTargets(UINT NumBuffers, ID3D10Buffer* ppSOTargets, UINT* pOffsets);
+	void RSGetState(ID3D10RasterizerState* ppRasterizerState);
+	void RSGetViewports(UINT* NumViewports, D3D10_VIEWPORT* pViewports);
+	void RSGetScissorRects(UINT* NumRects, D3D10_RECT* pRects);
+	HRESULT GetDeviceRemovedReason();
+	HRESULT SetExceptionMode(UINT RaiseFlags);
+	UINT GetExceptionMode();
+	HRESULT GetPrivateData(REFGUID guid, UINT* pDataSize, void* pData);
+	HRESULT SetPrivateData(REFGUID guid, UINT DataSize, void* pData);
+	HRESULT SetPrivateDataInterface(REFGUID guid, IUnknown pData);
+	void ClearState();
+	void Flush();
+	HRESULT CreateBuffer(D3D10_BUFFER_DESC* pDesc, D3D10_SUBRESOURCE_DATA* pInitialData, ID3D10Buffer* ppBuffer);
+	HRESULT CreateTexture1D(D3D10_TEXTURE1D_DESC* pDesc, D3D10_SUBRESOURCE_DATA* pInitialData, ID3D10Texture1D* ppTexture1D);
+	HRESULT CreateTexture2D(D3D10_TEXTURE2D_DESC* pDesc, D3D10_SUBRESOURCE_DATA* pInitialData, ID3D10Texture2D* ppTexture2D);
+	HRESULT CreateTexture3D(D3D10_TEXTURE3D_DESC* pDesc, D3D10_SUBRESOURCE_DATA* pInitialData, ID3D10Texture3D* ppTexture3D);
+	HRESULT CreateShaderResourceView(ID3D10Resource pResource, D3D10_SHADER_RESOURCE_VIEW_DESC* pDesc, ID3D10ShaderResourceView* ppSRView);
+	HRESULT CreateRenderTargetView(ID3D10Resource pResource, D3D10_RENDER_TARGET_VIEW_DESC* pDesc, ID3D10RenderTargetView* ppRTView);
+	HRESULT CreateDepthStencilView(ID3D10Resource pResource, D3D10_DEPTH_STENCIL_VIEW_DESC* pDesc, ID3D10DepthStencilView* ppDepthStencilView);
+	HRESULT CreateInputLayout(D3D10_INPUT_ELEMENT_DESC* pInputElementDescs, UINT NumElements, void* pShaderBytecodeWithInputSignature, SIZE_T BytecodeLength, ID3D10InputLayout* ppInputLayout);
+	HRESULT CreateVertexShader(void* pShaderBytecode, SIZE_T BytecodeLength, ID3D10VertexShader* ppVertexShader);
+	HRESULT CreateGeometryShader(void* pShaderBytecode, SIZE_T BytecodeLength, ID3D10GeometryShader* ppGeometryShader);
+	HRESULT CreateGeometryShaderWithStreamOutput(void* pShaderBytecode, SIZE_T BytecodeLength, D3D10_SO_DECLARATION_ENTRY* pSODeclaration, UINT NumEntries, UINT OutputStreamStride, ID3D10GeometryShader* ppGeometryShader);
+	HRESULT CreatePixelShader(void* pShaderBytecode, SIZE_T BytecodeLength, ID3D10PixelShader* ppPixelShader);
+	HRESULT CreateBlendState(D3D10_BLEND_DESC* pBlendStateDesc, ID3D10BlendState* ppBlendState);
+	HRESULT CreateDepthStencilState(D3D10_DEPTH_STENCIL_DESC* pDepthStencilDesc, ID3D10DepthStencilState* ppDepthStencilState);
+	HRESULT CreateRasterizerState(D3D10_RASTERIZER_DESC* pRasterizerDesc, ID3D10RasterizerState* ppRasterizerState);
+	HRESULT CreateSamplerState(D3D10_SAMPLER_DESC* pSamplerDesc, ID3D10SamplerState* ppSamplerState);
+	HRESULT CreateQuery(D3D10_QUERY_DESC* pQueryDesc, ID3D10Query* ppQuery);
+	HRESULT CreatePredicate(D3D10_QUERY_DESC* pPredicateDesc, ID3D10Predicate* ppPredicate);
+	HRESULT CreateCounter(D3D10_COUNTER_DESC* pCounterDesc, ID3D10Counter* ppCounter);
+	HRESULT CheckFormatSupport(DXGI_FORMAT Format, UINT* pFormatSupport);
+	HRESULT CheckMultisampleQualityLevels(DXGI_FORMAT Format, UINT SampleCount, UINT* pNumQualityLevels);
+	void CheckCounterInfo(D3D10_COUNTER_INFO* pCounterInfo);
+	HRESULT CheckCounter(D3D10_COUNTER_DESC* pDesc, D3D10_COUNTER_TYPE* pType, UINT* pActiveCounters, LPSTR szName, UINT* pNameLength, LPSTR szUnits, UINT* pUnitsLength, LPSTR szDescription, UINT* pDescriptionLength);
+	UINT GetCreationFlags();
+	HRESULT OpenSharedResource(HANDLE hResource, REFIID ReturnedInterface, void** ppResource);
+	void SetTextFilterSize(UINT Width, UINT Height);
+	void GetTextFilterSize(UINT* pWidth, UINT* pHeight);
+}
+
+interface ID3D10Multithread : IUnknown {
+	extern(Windows) :
+	void Enter();
+	void Leave();
+	BOOL SetMultithreadProtected(BOOL bMTProtect);
+	BOOL GetMultithreadProtected();
+}
+
+enum D3D10_CREATE_DEVICE_FLAG {
+	D3D10_CREATE_DEVICE_SINGLETHREADED								= 0x01,
+	D3D10_CREATE_DEVICE_DEBUG										= 0x02,
+	D3D10_CREATE_DEVICE_SWITCH_TO_REF								= 0x04,
+	D3D10_CREATE_DEVICE_PREVENT_INTERNAL_THREADING_OPTIMIZATIONS	= 0x08
+}
+
+const D3D10_SDK_VERSION	= 29;
+
+extern(C) const GUID IID_ID3D10DeviceChild			= {0x9B7E4C00, 0x342C, 0x4106, [0xA1, 0x9F, 0x4F, 0x27, 0x04, 0xF6, 0x89, 0xF0]};
+extern(C) const GUID IID_ID3D10DepthStencilState	= {0x2B4B1CC8, 0xA4AD, 0x41f8, [0x83, 0x22, 0xCA, 0x86, 0xFC, 0x3E, 0xC6, 0x75]};
+extern(C) const GUID IID_ID3D10BlendState			= {0xEDAD8D19, 0x8A35, 0x4d6d, [0x85, 0x66, 0x2E, 0xA2, 0x76, 0xCD, 0xE1, 0x61]};
+extern(C) const GUID IID_ID3D10RasterizerState		= {0xA2A07292, 0x89AF, 0x4345, [0xBE, 0x2E, 0xC5, 0x3D, 0x9F, 0xBB, 0x6E, 0x9F]};
+extern(C) const GUID IID_ID3D10Resource				= {0x9B7E4C01, 0x342C, 0x4106, [0xA1, 0x9F, 0x4F, 0x27, 0x04, 0xF6, 0x89, 0xF0]};
+extern(C) const GUID IID_ID3D10Buffer				= {0x9B7E4C02, 0x342C, 0x4106, [0xA1, 0x9F, 0x4F, 0x27, 0x04, 0xF6, 0x89, 0xF0]};
+extern(C) const GUID IID_ID3D10Texture1D			= {0x9B7E4C03, 0x342C, 0x4106, [0xA1, 0x9F, 0x4F, 0x27, 0x04, 0xF6, 0x89, 0xF0]};
+extern(C) const GUID IID_ID3D10Texture2D			= {0x9B7E4C04, 0x342C, 0x4106, [0xA1, 0x9F, 0x4F, 0x27, 0x04, 0xF6, 0x89, 0xF0]};
+extern(C) const GUID IID_ID3D10Texture3D			= {0x9B7E4C05, 0x342C, 0x4106, [0xA1, 0x9F, 0x4F, 0x27, 0x04, 0xF6, 0x89, 0xF0]};
+extern(C) const GUID IID_ID3D10View					= {0xC902B03F, 0x60A7, 0x49BA, [0x99, 0x36, 0x2A, 0x3A, 0xB3, 0x7A, 0x7E, 0x33]};
+extern(C) const GUID IID_ID3D10ShaderResourceView	= {0x9B7E4C07, 0x342C, 0x4106, [0xA1, 0x9F, 0x4F, 0x27, 0x04, 0xF6, 0x89, 0xF0]};
+extern(C) const GUID IID_ID3D10RenderTargetView		= {0x9B7E4C08, 0x342C, 0x4106, [0xA1, 0x9F, 0x4F, 0x27, 0x04, 0xF6, 0x89, 0xF0]};
+extern(C) const GUID IID_ID3D10DepthStencilView		= {0x9B7E4C09, 0x342C, 0x4106, [0xA1, 0x9F, 0x4F, 0x27, 0x04, 0xF6, 0x89, 0xF0]};
+extern(C) const GUID IID_ID3D10VertexShader			= {0x9B7E4C0A, 0x342C, 0x4106, [0xA1, 0x9F, 0x4F, 0x27, 0x04, 0xF6, 0x89, 0xF0]};
+extern(C) const GUID IID_ID3D10GeometryShader		= {0x6316BE88, 0x54CD, 0x4040, [0xAB, 0x44, 0x20, 0x46, 0x1B, 0xC8, 0x1F, 0x68]};
+extern(C) const GUID IID_ID3D10PixelShader			= {0x4968B601, 0x9D00, 0x4cde, [0x83, 0x46, 0x8E, 0x7F, 0x67, 0x58, 0x19, 0xB6]};
+extern(C) const GUID IID_ID3D10InputLayout			= {0x9B7E4C0B, 0x342C, 0x4106, [0xA1, 0x9F, 0x4F, 0x27, 0x04, 0xF6, 0x89, 0xF0]};
+extern(C) const GUID IID_ID3D10SamplerState			= {0x9B7E4C0C, 0x342C, 0x4106, [0xA1, 0x9F, 0x4F, 0x27, 0x04, 0xF6, 0x89, 0xF0]};
+extern(C) const GUID IID_ID3D10Asynchronous			= {0x9B7E4C0D, 0x342C, 0x4106, [0xA1, 0x9F, 0x4F, 0x27, 0x04, 0xF6, 0x89, 0xF0]};
+extern(C) const GUID IID_ID3D10Query				= {0x9B7E4C0E, 0x342C, 0x4106, [0xA1, 0x9F, 0x4F, 0x27, 0x04, 0xF6, 0x89, 0xF0]};
+extern(C) const GUID IID_ID3D10Predicate			= {0x9B7E4C10, 0x342C, 0x4106, [0xA1, 0x9F, 0x4F, 0x27, 0x04, 0xF6, 0x89, 0xF0]};
+extern(C) const GUID IID_ID3D10Counter				= {0x9B7E4C11, 0x342C, 0x4106, [0xA1, 0x9F, 0x4F, 0x27, 0x04, 0xF6, 0x89, 0xF0]};
+extern(C) const GUID IID_ID3D10Device				= {0x9B7E4C0F, 0x342C, 0x4106, [0xA1, 0x9F, 0x4F, 0x27, 0x04, 0xF6, 0x89, 0xF0]};
+extern(C) const GUID IID_ID3D10Multithread			= {0x9B7E4E00, 0x342C, 0x4106, [0xA1, 0x9F, 0x4F, 0x27, 0x04, 0xF6, 0x89, 0xF0]};
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/d3d10effect.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,798 @@
+/***********************************************************************\
+*                             d3d10effect.d                             *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.directx.d3d10effect;
+
+private import win32.windows;
+private import win32.directx.d3d10;
+
+// some forward references...
+enum D3D10_SHADER_VARIABLE_CLASS;
+enum D3D10_SHADER_VARIABLE_TYPE;
+
+enum D3D10_DEVICE_STATE_TYPES {
+	D3D10_DST_SO_BUFFERS = 1,
+	D3D10_DST_OM_RENDER_TARGETS,
+	D3D10_DST_OM_DEPTH_STENCIL_STATE,
+	D3D10_DST_OM_BLEND_STATE,
+	D3D10_DST_VS,
+	D3D10_DST_VS_SAMPLERS,
+	D3D10_DST_VS_SHADER_RESOURCES,
+	D3D10_DST_VS_CONSTANT_BUFFERS,
+	D3D10_DST_GS,
+	D3D10_DST_GS_SAMPLERS,
+	D3D10_DST_GS_SHADER_RESOURCES,
+	D3D10_DST_GS_CONSTANT_BUFFERS,
+	D3D10_DST_PS,
+	D3D10_DST_PS_SAMPLERS,
+	D3D10_DST_PS_SHADER_RESOURCES,
+	D3D10_DST_PS_CONSTANT_BUFFERS,
+	D3D10_DST_IA_VERTEX_BUFFERS,
+	D3D10_DST_IA_INDEX_BUFFER,
+	D3D10_DST_IA_INPUT_LAYOUT,
+	D3D10_DST_IA_PRIMITIVE_TOPOLOGY,
+	D3D10_DST_RS_VIEWPORTS,
+	D3D10_DST_RS_SCISSOR_RECTS,
+	D3D10_DST_RS_RASTERIZER_STATE,
+	D3D10_DST_PREDICATION
+}
+
+struct D3D10_STATE_BLOCK_MASK {
+	BYTE VS;
+	BYTE[2] VSSamplers;
+	BYTE[16] VSShaderResources;
+	BYTE[2] VSConstantBuffers;
+	BYTE GS;
+	BYTE[2] GSSamplers;
+	BYTE[16] GSShaderResources;
+	BYTE[2] GSConstantBuffers;
+	BYTE PS;
+	BYTE[2] PSSamplers;
+	BYTE[16] PSShaderResources;
+	BYTE[2] PSConstantBuffers;
+	BYTE[2] IAVertexBuffers;
+	BYTE IAIndexBuffer;
+	BYTE IAInputLayout;
+	BYTE IAPrimitiveTopology;
+	BYTE OMRenderTargets;
+	BYTE OMDepthStencilState;
+	BYTE OMBlendState;
+	BYTE RSViewports;
+	BYTE RSScissorRects;
+	BYTE RSRasterizerState;
+	BYTE SOBuffers;
+	BYTE Predication;
+}
+
+extern (C) const GUID IID_ID3D10StateBlock = {0x803425a, 0x57f5, 0x4dd6, [0x94, 0x65, 0xa8, 0x75, 0x70, 0x83, 0x4a, 0x08]};
+
+interface ID3D10StateBlock : IUnknown {
+	extern(Windows) :
+	HRESULT Capture();
+	HRESULT Apply();
+	HRESULT ReleaseAllDeviceObjects();
+	HRESULT GetDevice(ID3D10Device ppDevice);
+}
+
+HRESULT D3D10StateBlockMaskUnion(D3D10_STATE_BLOCK_MASK* pA, D3D10_STATE_BLOCK_MASK* pB, D3D10_STATE_BLOCK_MASK* pResult);
+HRESULT D3D10StateBlockMaskIntersect(D3D10_STATE_BLOCK_MASK* pA, D3D10_STATE_BLOCK_MASK* pB, D3D10_STATE_BLOCK_MASK* pResult);
+HRESULT D3D10StateBlockMaskDifference(D3D10_STATE_BLOCK_MASK* pA, D3D10_STATE_BLOCK_MASK* pB, D3D10_STATE_BLOCK_MASK* pResult);
+HRESULT D3D10StateBlockMaskEnableCapture(D3D10_STATE_BLOCK_MASK* pMask, D3D10_DEVICE_STATE_TYPES StateType, UINT RangeStart, UINT RangeLength);
+HRESULT D3D10StateBlockMaskDisableCapture(D3D10_STATE_BLOCK_MASK* pMask, D3D10_DEVICE_STATE_TYPES StateType, UINT RangeStart, UINT RangeLength);
+HRESULT D3D10StateBlockMaskEnableAll(D3D10_STATE_BLOCK_MASK* pMask);
+HRESULT D3D10StateBlockMaskDisableAll(D3D10_STATE_BLOCK_MASK* pMask);
+BOOL D3D10StateBlockMaskGetSetting(D3D10_STATE_BLOCK_MASK* pMask, D3D10_DEVICE_STATE_TYPES StateType, UINT Entry);
+HRESULT D3D10CreateStateBlock(ID3D10Device pDevice, D3D10_STATE_BLOCK_MASK* pStateBlockMask, ID3D10StateBlock ppStateBlock);
+
+const D3D10_EFFECT_COMPILE_CHILD_EFFECT			= 1 << 0;
+const D3D10_EFFECT_COMPILE_ALLOW_SLOW_OPS		= 1 << 1;
+const D3D10_EFFECT_SINGLE_THREADED				= 1 << 3;
+const D3D10_EFFECT_VARIABLE_POOLED				= 1 << 0;
+const D3D10_EFFECT_VARIABLE_ANNOTATION			= 1 << 1;
+const D3D10_EFFECT_VARIABLE_EXPLICIT_BIND_POINT	= 1 << 2;
+
+struct D3D10_EFFECT_TYPE_DESC {
+	LPCSTR	TypeName;
+	D3D10_SHADER_VARIABLE_CLASS	Class;
+	D3D10_SHADER_VARIABLE_TYPE	Type;
+	UINT	Elements;
+	UINT	Members;
+	UINT	Rows;
+	UINT	Columns;
+	UINT	PackedSize;
+	UINT	UnpackedSize;
+	UINT	Stride;
+}
+
+extern (C) const GUID IID_ID3D10EffectType = {0x4e9e1ddc, 0xcd9d, 0x4772, [0xa8, 0x37, 0x0, 0x18, 0x0b, 0x9b, 0x88, 0xfd]};
+
+interface ID3D10EffectType {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	BOOL IsValid();
+	HRESULT GetDesc(D3D10_EFFECT_TYPE_DESC* pDesc);
+	ID3D10EffectType GetMemberTypeByIndex(UINT Index);
+	ID3D10EffectType GetMemberTypeByName(LPCSTR Name);
+	ID3D10EffectType GetMemberTypeBySemantic(LPCSTR Semantic);
+	LPCSTR GetMemberName(UINT Index);
+	LPCSTR GetMemberSemantic(UINT Index);
+	*/
+}
+
+struct D3D10_EFFECT_VARIABLE_DESC {
+	LPCSTR	Name;
+	LPCSTR	Semantic;
+	UINT	Flags;
+	UINT	Annotations;
+	UINT	BufferOffset;
+	UINT	ExplicitBindPoint;
+}
+
+extern (C) const GUID IID_ID3D10EffectVariable = {0xae897105, 0x00e6, 0x45bf, [0xbb, 0x8e, 0x28, 0x1d, 0xd6, 0xdb, 0x8e, 0x1b]};
+
+interface ID3D10EffectVariable {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	BOOL IsValid();
+	ID3D10EffectType GetType();
+	HRESULT GetDesc(D3D10_EFFECT_VARIABLE_DESC* pDesc);
+	ID3D10EffectVariable GetAnnotationByIndex(UINT Index);
+	ID3D10EffectVariable GetAnnotationByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberByIndex(UINT Index);
+	ID3D10EffectVariable GetMemberByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberBySemantic(LPCSTR Semantic);
+	ID3D10EffectVariable GetElement(UINT Index);
+	ID3D10EffectConstantBuffer GetParentConstantBuffer();
+	ID3D10EffectScalarVariable AsScalar();
+	ID3D10EffectVectorVariable AsVector();
+	ID3D10EffectMatrixVariable AsMatrix();
+	ID3D10EffectStringVariable AsString();
+	ID3D10EffectShaderResourceVariable AsShaderResource();
+	ID3D10EffectRenderTargetViewVariable AsRenderTargetView();
+	ID3D10EffectDepthStencilViewVariable AsDepthStencilView();
+	ID3D10EffectConstantBuffer AsConstantBuffer();
+	ID3D10EffectShaderVariable AsShader();
+	ID3D10EffectBlendVariable AsBlend();
+	ID3D10EffectDepthStencilVariable AsDepthStencil();
+	ID3D10EffectRasterizerVariable AsRasterizer();
+	ID3D10EffectSamplerVariable AsSampler();
+	HRESULT SetRawValue(void* pData, UINT Offset, UINT Count);
+	HRESULT GetRawValue(void* pData, UINT Offset, UINT Count);
+	*/
+}
+
+extern (C) const GUID IID_ID3D10EffectScalarVariable = {0xe48f7b, 0xd2c8, 0x49e8, [0xa8, 0x6c, 0x2, 0x2d, 0xee, 0x53, 0x43, 0x1f]};
+
+interface ID3D10EffectScalarVariable : ID3D10EffectVariable {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	BOOL IsValid();
+	ID3D10EffectType GetType();
+	HRESULT GetDesc(D3D10_EFFECT_VARIABLE_DESC* pDesc);
+	ID3D10EffectVariable GetAnnotationByIndex(UINT Index);
+	ID3D10EffectVariable GetAnnotationByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberByIndex(UINT Index);
+	ID3D10EffectVariable GetMemberByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberBySemantic(LPCSTR Semantic);
+	ID3D10EffectVariable GetElement(UINT Index);
+	ID3D10EffectConstantBuffer GetParentConstantBuffer();
+	ID3D10EffectScalarVariable AsScalar();
+	ID3D10EffectVectorVariable AsVector();
+	ID3D10EffectMatrixVariable AsMatrix();
+	ID3D10EffectStringVariable AsString();
+	ID3D10EffectShaderResourceVariable AsShaderResource();
+	ID3D10EffectRenderTargetViewVariable AsRenderTargetView();
+	ID3D10EffectDepthStencilViewVariable AsDepthStencilView();
+	ID3D10EffectConstantBuffer AsConstantBuffer();
+	ID3D10EffectShaderVariable AsShader();
+	ID3D10EffectBlendVariable AsBlend();
+	ID3D10EffectDepthStencilVariable AsDepthStencil();
+	ID3D10EffectRasterizerVariable AsRasterizer();
+	ID3D10EffectSamplerVariable AsSampler();
+	HRESULT SetRawValue(void* pData, UINT ByteOffset, UINT ByteCount);
+	HRESULT GetRawValue(void* pData, UINT ByteOffset, UINT ByteCount);
+	HRESULT SetFloat(float Value);
+	HRESULT GetFloat(float* pValue);    
+	HRESULT SetFloatArray(float* pData, UINT Offset, UINT Count);
+	HRESULT GetFloatArray(float* pData, UINT Offset, UINT Count);
+	HRESULT SetInt(int Value);
+	HRESULT GetInt(int* pValue);
+	HRESULT SetIntArray(int* pData, UINT Offset, UINT Count);
+	HRESULT GetIntArray(int* pData, UINT Offset, UINT Count);
+	HRESULT SetBool(BOOL Value);
+	HRESULT GetBool(BOOL* pValue);
+	HRESULT SetBoolArray(BOOL* pData, UINT Offset, UINT Count);
+	HRESULT GetBoolArray(BOOL* pData, UINT Offset, UINT Count);
+	*/
+}
+
+extern (C) const GUID IID_ID3D10EffectVectorVariable = {0x62b98c44, 0x1f82, 0x4c67, [0xbc, 0xd0, 0x72, 0xcf, 0x8f, 0x21, 0x7e, 0x81]};
+
+interface ID3D10EffectVectorVariable : ID3D10EffectVariable {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	BOOL IsValid();
+	ID3D10EffectType GetType();
+	HRESULT GetDesc(D3D10_EFFECT_VARIABLE_DESC* pDesc);
+	ID3D10EffectVariable GetAnnotationByIndex(UINT Index);
+	ID3D10EffectVariable GetAnnotationByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberByIndex(UINT Index);
+	ID3D10EffectVariable GetMemberByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberBySemantic(LPCSTR Semantic);
+	ID3D10EffectVariable GetElement(UINT Index);
+	ID3D10EffectConstantBuffer GetParentConstantBuffer();
+	ID3D10EffectScalarVariable AsScalar();
+	ID3D10EffectVectorVariable AsVector();
+	ID3D10EffectMatrixVariable AsMatrix();
+	ID3D10EffectStringVariable AsString(); 
+	ID3D10EffectShaderResourceVariable AsShaderResource();
+	ID3D10EffectRenderTargetViewVariable AsRenderTargetView();
+	ID3D10EffectDepthStencilViewVariable AsDepthStencilView();
+	ID3D10EffectConstantBuffer AsConstantBuffer();
+	ID3D10EffectShaderVariable AsShader();
+	ID3D10EffectBlendVariable AsBlend();
+	ID3D10EffectDepthStencilVariable AsDepthStencil();
+	ID3D10EffectRasterizerVariable AsRasterizer();
+	ID3D10EffectSamplerVariable AsSampler();
+	HRESULT SetRawValue(void* pData, UINT ByteOffset, UINT ByteCount);
+	HRESULT GetRawValue(void* pData, UINT ByteOffset, UINT ByteCount);
+	HRESULT SetBoolVector (BOOL* pData);
+	HRESULT SetIntVector  (int* pData);
+	HRESULT SetFloatVector(float* pData);
+	HRESULT GetBoolVector (BOOL* pData);
+	HRESULT GetIntVector  (int* pData);
+	HRESULT GetFloatVector(float* pData);
+	HRESULT SetBoolVectorArray (BOOL* pData, UINT Offset, UINT Count);
+	HRESULT SetIntVectorArray  (int* pData, UINT Offset, UINT Count);
+	HRESULT SetFloatVectorArray(float* pData, UINT Offset, UINT Count);
+	HRESULT GetBoolVectorArray (BOOL* pData, UINT Offset, UINT Count);
+	HRESULT GetIntVectorArray  (int* pData, UINT Offset, UINT Count);
+	HRESULT GetFloatVectorArray(float* pData, UINT Offset, UINT Count);
+	*/
+}
+
+extern (C) const GUID IID_ID3D10EffectMatrixVariable = {0x50666c24, 0xb82f, 0x4eed, [0xa1, 0x72, 0x5b, 0x6e, 0x7e, 0x85, 0x22, 0xe0]};
+
+interface ID3D10EffectMatrixVariable : ID3D10EffectVariable {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	BOOL IsValid();
+	ID3D10EffectType GetType();
+	HRESULT GetDesc(D3D10_EFFECT_VARIABLE_DESC* pDesc);
+	ID3D10EffectVariable GetAnnotationByIndex(UINT Index);
+	ID3D10EffectVariable GetAnnotationByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberByIndex(UINT Index);
+	ID3D10EffectVariable GetMemberByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberBySemantic(LPCSTR Semantic);
+	ID3D10EffectVariable GetElement(UINT Index);
+	ID3D10EffectConstantBuffer GetParentConstantBuffer();
+	ID3D10EffectScalarVariable AsScalar();
+	ID3D10EffectVectorVariable AsVector();
+	ID3D10EffectMatrixVariable AsMatrix();
+	ID3D10EffectStringVariable AsString();
+	ID3D10EffectShaderResourceVariable AsShaderResource();
+	ID3D10EffectRenderTargetViewVariable AsRenderTargetView();
+	ID3D10EffectDepthStencilViewVariable AsDepthStencilView();
+	ID3D10EffectConstantBuffer AsConstantBuffer();
+	ID3D10EffectShaderVariable AsShader();
+	ID3D10EffectBlendVariable AsBlend();
+	ID3D10EffectDepthStencilVariable AsDepthStencil();
+	ID3D10EffectRasterizerVariable AsRasterizer();
+	ID3D10EffectSamplerVariable AsSampler();
+	HRESULT SetRawValue(void* pData, UINT ByteOffset, UINT ByteCount);
+	HRESULT GetRawValue(void* pData, UINT ByteOffset, UINT ByteCount);
+	HRESULT SetMatrix(float* pData);
+	HRESULT GetMatrix(float* pData);
+	HRESULT SetMatrixArray(float* pData, UINT Offset, UINT Count);
+	HRESULT GetMatrixArray(float* pData, UINT Offset, UINT Count);
+	HRESULT SetMatrixTranspose(float* pData);
+	HRESULT GetMatrixTranspose(float* pData);
+	HRESULT SetMatrixTransposeArray(float* pData, UINT Offset, UINT Count);
+	HRESULT GetMatrixTransposeArray(float* pData, UINT Offset, UINT Count);
+	*/
+}
+
+extern (C) const GUID IID_ID3D10EffectStringVariable = {0x71417501, 0x8df9, 0x4e0a, [0xa7, 0x8a, 0x25, 0x5f, 0x97, 0x56, 0xba, 0xff]};
+
+interface ID3D10EffectStringVariable : ID3D10EffectVariable {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	BOOL IsValid();
+	ID3D10EffectType GetType();
+	HRESULT GetDesc(D3D10_EFFECT_VARIABLE_DESC* pDesc);
+	ID3D10EffectVariable GetAnnotationByIndex(UINT Index);
+	ID3D10EffectVariable GetAnnotationByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberByIndex(UINT Index);
+	ID3D10EffectVariable GetMemberByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberBySemantic(LPCSTR Semantic);
+	ID3D10EffectVariable GetElement(UINT Index);
+	ID3D10EffectConstantBuffer GetParentConstantBuffer();
+	ID3D10EffectScalarVariable AsScalar();
+	ID3D10EffectVectorVariable AsVector();
+	ID3D10EffectMatrixVariable AsMatrix();
+	ID3D10EffectStringVariable AsString();
+	ID3D10EffectShaderResourceVariable AsShaderResource();
+	ID3D10EffectRenderTargetViewVariable AsRenderTargetView();
+	ID3D10EffectDepthStencilViewVariable AsDepthStencilView();
+	ID3D10EffectConstantBuffer AsConstantBuffer();
+	ID3D10EffectShaderVariable AsShader();
+	ID3D10EffectBlendVariable AsBlend();
+	ID3D10EffectDepthStencilVariable AsDepthStencil();
+	ID3D10EffectRasterizerVariable AsRasterizer();
+	ID3D10EffectSamplerVariable AsSampler();
+	HRESULT SetRawValue(void* pData, UINT Offset, UINT Count);
+	HRESULT GetRawValue(void* pData, UINT Offset, UINT Count);
+	HRESULT GetString(LPCSTR* ppString);
+	HRESULT GetStringArray(LPCSTR* ppStrings, UINT Offset, UINT Count);
+	*/
+}
+
+extern (C) const GUID IID_ID3D10EffectShaderResourceVariable = {0xc0a7157b, 0xd872, 0x4b1d, [0x80, 0x73, 0xef, 0xc2, 0xac, 0xd4, 0xb1, 0xfc]};
+
+interface ID3D10EffectShaderResourceVariable : ID3D10EffectVariable {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	BOOL IsValid();
+	ID3D10EffectType GetType();
+	HRESULT GetDesc(D3D10_EFFECT_VARIABLE_DESC* pDesc);
+	ID3D10EffectVariable GetAnnotationByIndex(UINT Index);
+	ID3D10EffectVariable GetAnnotationByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberByIndex(UINT Index);
+	ID3D10EffectVariable GetMemberByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberBySemantic(LPCSTR Semantic);
+	ID3D10EffectVariable GetElement(UINT Index);
+	ID3D10EffectConstantBuffer GetParentConstantBuffer();
+	ID3D10EffectScalarVariable AsScalar();
+	ID3D10EffectVectorVariable AsVector();
+	ID3D10EffectMatrixVariable AsMatrix();
+	ID3D10EffectStringVariable AsString();
+	ID3D10EffectShaderResourceVariable AsShaderResource();
+	ID3D10EffectRenderTargetViewVariable AsRenderTargetView();
+	ID3D10EffectDepthStencilViewVariable AsDepthStencilView();
+	ID3D10EffectConstantBuffer AsConstantBuffer();
+	ID3D10EffectShaderVariable AsShader();
+	ID3D10EffectBlendVariable AsBlend();
+	ID3D10EffectDepthStencilVariable AsDepthStencil();
+	ID3D10EffectRasterizerVariable AsRasterizer();
+	ID3D10EffectSamplerVariable AsSampler();
+	HRESULT SetRawValue(void* pData, UINT Offset, UINT Count);
+	HRESULT GetRawValue(void* pData, UINT Offset, UINT Count);
+	HRESULT SetResource(ID3D10ShaderResourceView pResource);
+	HRESULT GetResource(ID3D10ShaderResourceView* ppResource);
+	HRESULT SetResourceArray(ID3D10ShaderResourceView* ppResources, UINT Offset, UINT Count);
+	HRESULT GetResourceArray(ID3D10ShaderResourceView* ppResources, UINT Offset, UINT Count);
+	*/
+}
+
+extern (C) const GUID IID_ID3D10EffectRenderTargetViewVariable = {0x28ca0cc3, 0xc2c9, 0x40bb, [0xb5, 0x7f, 0x67, 0xb7, 0x37, 0x12, 0x2b, 0x17]};
+
+interface ID3D10EffectRenderTargetViewVariable : ID3D10EffectVariable {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	BOOL IsValid();
+	ID3D10EffectType GetType();
+	HRESULT GetDesc(D3D10_EFFECT_VARIABLE_DESC* pDesc);
+	ID3D10EffectVariable GetAnnotationByIndex(UINT Index);
+	ID3D10EffectVariable GetAnnotationByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberByIndex(UINT Index);
+	ID3D10EffectVariable GetMemberByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberBySemantic(LPCSTR Semantic);
+	ID3D10EffectVariable GetElement(UINT Index);
+	ID3D10EffectConstantBuffer GetParentConstantBuffer();
+	ID3D10EffectScalarVariable AsScalar();
+	ID3D10EffectVectorVariable AsVector();
+	ID3D10EffectMatrixVariable AsMatrix();
+	ID3D10EffectStringVariable AsString();
+	ID3D10EffectShaderResourceVariable AsShaderResource();
+	ID3D10EffectRenderTargetViewVariable AsRenderTargetView();
+	ID3D10EffectDepthStencilViewVariable AsDepthStencilView();
+	ID3D10EffectConstantBuffer AsConstantBuffer();
+	ID3D10EffectShaderVariable AsShader();
+	ID3D10EffectBlendVariable AsBlend();
+	ID3D10EffectDepthStencilVariable AsDepthStencil();
+	ID3D10EffectRasterizerVariable AsRasterizer();
+	ID3D10EffectSamplerVariable AsSampler();
+	HRESULT SetRawValue(void* pData, UINT Offset, UINT Count);
+	HRESULT GetRawValue(void* pData, UINT Offset, UINT Count);
+	HRESULT SetRenderTarget(ID3D10RenderTargetView pResource);
+	HRESULT GetRenderTarget(ID3D10RenderTargetView* ppResource);
+	HRESULT SetRenderTargetArray(ID3D10RenderTargetView* ppResources, UINT Offset, UINT Count);
+	HRESULT GetRenderTargetArray(ID3D10RenderTargetView* ppResources, UINT Offset, UINT Count);
+	*/
+}
+
+extern (C) const GUID IID_ID3D10EffectDepthStencilViewVariable = {0x3e02c918, 0xcc79, 0x4985, [0xb6, 0x22, 0x2d, 0x92, 0xad, 0x70, 0x16, 0x23]};
+
+interface ID3D10EffectDepthStencilViewVariable : ID3D10EffectVariable {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	BOOL IsValid();
+	ID3D10EffectType GetType();
+	HRESULT GetDesc(D3D10_EFFECT_VARIABLE_DESC* pDesc);
+	ID3D10EffectVariable GetAnnotationByIndex(UINT Index);
+	ID3D10EffectVariable GetAnnotationByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberByIndex(UINT Index);
+	ID3D10EffectVariable GetMemberByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberBySemantic(LPCSTR Semantic);
+	ID3D10EffectVariable GetElement(UINT Index);
+	ID3D10EffectConstantBuffer GetParentConstantBuffer();
+	ID3D10EffectScalarVariable AsScalar();
+	ID3D10EffectVectorVariable AsVector();
+	ID3D10EffectMatrixVariable AsMatrix();
+	ID3D10EffectStringVariable AsString();
+	ID3D10EffectShaderResourceVariable AsShaderResource();
+	ID3D10EffectRenderTargetViewVariable AsRenderTargetView();
+	ID3D10EffectDepthStencilViewVariable AsDepthStencilView();
+	ID3D10EffectConstantBuffer AsConstantBuffer();
+	ID3D10EffectShaderVariable AsShader();
+	ID3D10EffectBlendVariable AsBlend();
+	ID3D10EffectDepthStencilVariable AsDepthStencil();
+	ID3D10EffectRasterizerVariable AsRasterizer();
+	ID3D10EffectSamplerVariable AsSampler();
+	HRESULT SetRawValue(void* pData, UINT Offset, UINT Count);
+	HRESULT GetRawValue(void* pData, UINT Offset, UINT Count);
+	HRESULT SetDepthStencil(ID3D10DepthStencilView pResource);
+	HRESULT GetDepthStencil(ID3D10DepthStencilView* ppResource);
+	HRESULT SetDepthStencilArray(ID3D10DepthStencilView* ppResources, UINT Offset, UINT Count);
+	HRESULT GetDepthStencilArray(ID3D10DepthStencilView* ppResources, UINT Offset, UINT Count);
+	*/
+}
+
+extern (C) const GUID IID_ID3D10EffectConstantBuffer = {0x56648f4d, 0xcc8b, 0x4444, [0xa5, 0xad, 0xb5, 0xa3, 0xd7, 0x6e, 0x91, 0xb3]};
+
+interface ID3D10EffectConstantBuffer : ID3D10EffectVariable {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	ID3D10EffectType GetType();
+	HRESULT GetDesc(D3D10_EFFECT_VARIABLE_DESC* pDesc);
+	ID3D10EffectVariable GetAnnotationByIndex(UINT Index);
+	ID3D10EffectVariable GetAnnotationByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberByIndex(UINT Index);
+	ID3D10EffectVariable GetMemberByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberBySemantic(LPCSTR Semantic);
+	ID3D10EffectVariable GetElement(UINT Index);
+	ID3D10EffectConstantBuffer GetParentConstantBuffer();
+	ID3D10EffectScalarVariable AsScalar();
+	ID3D10EffectVectorVariable AsVector();
+	ID3D10EffectMatrixVariable AsMatrix();
+	ID3D10EffectStringVariable AsString();
+	ID3D10EffectShaderResourceVariable AsShaderResource();
+	ID3D10EffectRenderTargetViewVariable AsRenderTargetView();
+	ID3D10EffectDepthStencilViewVariable AsDepthStencilView();
+	ID3D10EffectConstantBuffer AsConstantBuffer();
+	ID3D10EffectShaderVariable AsShader();
+	ID3D10EffectBlendVariable AsBlend();
+	ID3D10EffectDepthStencilVariable AsDepthStencil();
+	ID3D10EffectRasterizerVariable AsRasterizer();
+	ID3D10EffectSamplerVariable AsSampler();
+	HRESULT SetRawValue(void* pData, UINT Offset, UINT Count);
+	HRESULT GetRawValue(void* pData, UINT Offset, UINT Count);
+	HRESULT SetConstantBuffer(ID3D10Buffer pConstantBuffer);
+	HRESULT GetConstantBuffer(ID3D10Buffer* ppConstantBuffer);
+	HRESULT SetTextureBuffer(ID3D10ShaderResourceView pTextureBuffer);
+	HRESULT GetTextureBuffer(ID3D10ShaderResourceView* ppTextureBuffer);
+	*/
+}
+
+struct D3D10_EFFECT_SHADER_DESC {
+	BYTE*	pInputSignature;
+	BOOL	IsInline;
+	BYTE*	pBytecode;
+	UINT	BytecodeLength;
+	LPCSTR	SODecl;
+	UINT	NumInputSignatureEntries;
+	UINT	NumOutputSignatureEntries;
+}
+
+extern (C) const GUID IID_ID3D10EffectShaderVariable = {0x80849279, 0xc799, 0x4797, [0x8c, 0x33, 0x4, 0x7, 0xa0, 0x7d, 0x9e, 0x6]};
+
+interface ID3D10EffectShaderVariable : ID3D10EffectVariable {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	ID3D10EffectType GetType();
+	HRESULT GetDesc(D3D10_EFFECT_VARIABLE_DESC* pDesc);
+	ID3D10EffectVariable GetAnnotationByIndex(UINT Index);
+	ID3D10EffectVariable GetAnnotationByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberByIndex(UINT Index);
+	ID3D10EffectVariable GetMemberByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberBySemantic(LPCSTR Semantic);
+	ID3D10EffectVariable GetElement(UINT Index);
+	ID3D10EffectConstantBuffer GetParentConstantBuffer();
+	ID3D10EffectScalarVariable AsScalar();
+	ID3D10EffectVectorVariable AsVector();
+	ID3D10EffectMatrixVariable AsMatrix();
+	ID3D10EffectStringVariable AsString();
+	ID3D10EffectShaderResourceVariable AsShaderResource();
+	ID3D10EffectRenderTargetViewVariable AsRenderTargetView();
+	ID3D10EffectDepthStencilViewVariable AsDepthStencilView();
+	ID3D10EffectConstantBuffer AsConstantBuffer();
+	ID3D10EffectShaderVariable AsShader();
+	ID3D10EffectBlendVariable AsBlend();
+	ID3D10EffectDepthStencilVariable AsDepthStencil();
+	ID3D10EffectRasterizerVariable AsRasterizer();
+	ID3D10EffectSamplerVariable AsSampler();
+	HRESULT SetRawValue(void* pData, UINT Offset, UINT Count);
+	HRESULT GetRawValue(void* pData, UINT Offset, UINT Count);
+	HRESULT GetShaderDesc(UINT ShaderIndex, D3D10_EFFECT_SHADER_DESC* pDesc);
+	HRESULT GetVertexShader(UINT ShaderIndex, ID3D10VertexShader* ppVS);
+	HRESULT GetGeometryShader(UINT ShaderIndex, ID3D10GeometryShader* ppGS);
+	HRESULT GetPixelShader(UINT ShaderIndex, ID3D10PixelShader* ppPS);
+	HRESULT GetInputSignatureElementDesc(UINT ShaderIndex, UINT Element, D3D10_SIGNATURE_PARAMETER_DESC* pDesc);
+	HRESULT GetOutputSignatureElementDesc(UINT ShaderIndex, UINT Element, D3D10_SIGNATURE_PARAMETER_DESC* pDesc);
+	*/
+}
+
+extern (C) const GUID IID_ID3D10EffectBlendVariable = {0x1fcd2294, 0xdf6d, 0x4eae, [0x86, 0xb3, 0xe, 0x91, 0x60, 0xcf, 0xb0, 0x7b]};
+
+interface ID3D10EffectBlendVariable : ID3D10EffectVariable {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	ID3D10EffectType GetType();
+	HRESULT GetDesc(D3D10_EFFECT_VARIABLE_DESC* pDesc);
+	ID3D10EffectVariable GetAnnotationByIndex(UINT Index);
+	ID3D10EffectVariable GetAnnotationByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberByIndex(UINT Index);
+	ID3D10EffectVariable GetMemberByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberBySemantic(LPCSTR Semantic);
+	ID3D10EffectVariable GetElement(UINT Index);
+	ID3D10EffectConstantBuffer GetParentConstantBuffer();
+	ID3D10EffectScalarVariable AsScalar();
+	ID3D10EffectVectorVariable AsVector();
+	ID3D10EffectMatrixVariable AsMatrix();
+	ID3D10EffectStringVariable AsString();
+	ID3D10EffectShaderResourceVariable AsShaderResource();
+	ID3D10EffectRenderTargetViewVariable AsRenderTargetView();
+	ID3D10EffectDepthStencilViewVariable AsDepthStencilView();
+	ID3D10EffectConstantBuffer AsConstantBuffer();
+	ID3D10EffectShaderVariable AsShader();
+	ID3D10EffectBlendVariable AsBlend();
+	ID3D10EffectDepthStencilVariable AsDepthStencil();
+	ID3D10EffectRasterizerVariable AsRasterizer();
+	ID3D10EffectSamplerVariable AsSampler();
+	HRESULT SetRawValue(void* pData, UINT Offset, UINT Count);
+	HRESULT GetRawValue(void* pData, UINT Offset, UINT Count);
+	HRESULT GetBlendState(UINT Index, ID3D10BlendState* ppBlendState);
+	HRESULT GetBackingStore(UINT Index, D3D10_BLEND_DESC* pBlendDesc);
+	*/
+}
+
+extern (C) const GUID IID_ID3D10EffectDepthStencilVariable = {0xaf482368, 0x330a, 0x46a5, [0x9a, 0x5c, 0x1, 0xc7, 0x1a, 0xf2, 0x4c, 0x8d]};
+
+interface ID3D10EffectDepthStencilVariable : ID3D10EffectVariable {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	ID3D10EffectType GetType();
+	HRESULT GetDesc(D3D10_EFFECT_VARIABLE_DESC* pDesc);
+	ID3D10EffectVariable GetAnnotationByIndex(UINT Index);
+	ID3D10EffectVariable GetAnnotationByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberByIndex(UINT Index);
+	ID3D10EffectVariable GetMemberByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberBySemantic(LPCSTR Semantic);
+	ID3D10EffectVariable GetElement(UINT Index);
+	ID3D10EffectConstantBuffer GetParentConstantBuffer();
+	ID3D10EffectScalarVariable AsScalar();
+	ID3D10EffectVectorVariable AsVector();
+	ID3D10EffectMatrixVariable AsMatrix();
+	ID3D10EffectStringVariable AsString();
+	ID3D10EffectShaderResourceVariable AsShaderResource();
+	ID3D10EffectRenderTargetViewVariable AsRenderTargetView();
+	ID3D10EffectDepthStencilViewVariable AsDepthStencilView();
+	ID3D10EffectConstantBuffer AsConstantBuffer();
+	ID3D10EffectShaderVariable AsShader();
+	ID3D10EffectBlendVariable AsBlend();
+	ID3D10EffectDepthStencilVariable AsDepthStencil();
+	ID3D10EffectRasterizerVariable AsRasterizer();
+	ID3D10EffectSamplerVariable AsSampler();
+	HRESULT SetRawValue(void* pData, UINT Offset, UINT Count);
+	HRESULT GetRawValue(void* pData, UINT Offset, UINT Count);
+	HRESULT GetDepthStencilState(UINT Index, ID3D10DepthStencilState* ppDepthStencilState);
+	HRESULT GetBackingStore(UINT Index, D3D10_DEPTH_STENCIL_DESC* pDepthStencilDesc);
+	*/
+}
+
+extern (C) const GUID IID_ID3D10EffectRasterizerVariable = {0x21af9f0e, 0x4d94, 0x4ea9, [0x97, 0x85, 0x2c, 0xb7, 0x6b, 0x8c, 0xb, 0x34]};
+
+interface ID3D10EffectRasterizerVariable : ID3D10EffectVariable {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	ID3D10EffectType GetType();
+	HRESULT GetDesc(D3D10_EFFECT_VARIABLE_DESC* pDesc);
+	ID3D10EffectVariable GetAnnotationByIndex(UINT Index);
+	ID3D10EffectVariable GetAnnotationByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberByIndex(UINT Index);
+	ID3D10EffectVariable GetMemberByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberBySemantic(LPCSTR Semantic);
+	ID3D10EffectVariable GetElement(UINT Index);
+	ID3D10EffectConstantBuffer GetParentConstantBuffer();
+	ID3D10EffectScalarVariable AsScalar();
+	ID3D10EffectVectorVariable AsVector();
+	ID3D10EffectMatrixVariable AsMatrix();
+	ID3D10EffectStringVariable AsString();
+	ID3D10EffectShaderResourceVariable AsShaderResource();
+	ID3D10EffectRenderTargetViewVariable AsRenderTargetView();
+	ID3D10EffectDepthStencilViewVariable AsDepthStencilView();
+	ID3D10EffectConstantBuffer AsConstantBuffer();
+	ID3D10EffectShaderVariable AsShader();
+	ID3D10EffectBlendVariable AsBlend();
+	ID3D10EffectDepthStencilVariable AsDepthStencil();
+	ID3D10EffectRasterizerVariable AsRasterizer();
+	ID3D10EffectSamplerVariable AsSampler();
+	HRESULT SetRawValue(void* pData, UINT Offset, UINT Count);
+	HRESULT GetRawValue(void* pData, UINT Offset, UINT Count);
+	HRESULT GetRasterizerState(UINT Index, ID3D10RasterizerState* ppRasterizerState);
+	HRESULT GetBackingStore(UINT Index, D3D10_RASTERIZER_DESC* pRasterizerDesc);
+	*/
+}
+
+extern (C) const GUID IID_ID3D10EffectSamplerVariable = {0x6530d5c7, 0x07e9, 0x4271, [0xa4, 0x18, 0xe7, 0xce, 0x4b, 0xd1, 0xe4, 0x80]};
+
+interface ID3D10EffectSamplerVariable : ID3D10EffectVariable {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	ID3D10EffectType GetType();
+	HRESULT GetDesc(D3D10_EFFECT_VARIABLE_DESC* pDesc);
+	ID3D10EffectVariable GetAnnotationByIndex(UINT Index);
+	ID3D10EffectVariable GetAnnotationByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberByIndex(UINT Index);
+	ID3D10EffectVariable GetMemberByName(LPCSTR Name);
+	ID3D10EffectVariable GetMemberBySemantic(LPCSTR Semantic);
+	ID3D10EffectVariable GetElement(UINT Index);
+	ID3D10EffectConstantBuffer GetParentConstantBuffer();
+	ID3D10EffectScalarVariable AsScalar();
+	ID3D10EffectVectorVariable AsVector();
+	ID3D10EffectMatrixVariable AsMatrix();
+	ID3D10EffectStringVariable AsString();
+	ID3D10EffectShaderResourceVariable AsShaderResource();
+	ID3D10EffectRenderTargetViewVariable AsRenderTargetView();
+	ID3D10EffectDepthStencilViewVariable AsDepthStencilView();
+	ID3D10EffectConstantBuffer AsConstantBuffer();
+	ID3D10EffectShaderVariable AsShader();
+	ID3D10EffectBlendVariable AsBlend();
+	ID3D10EffectDepthStencilVariable AsDepthStencil();
+	ID3D10EffectRasterizerVariable AsRasterizer();
+	ID3D10EffectSamplerVariable AsSampler();
+	HRESULT SetRawValue(void* pData, UINT Offset, UINT Count);
+	HRESULT GetRawValue(void* pData, UINT Offset, UINT Count);
+	HRESULT GetSampler(UINT Index, ID3D10SamplerState* ppSampler);
+	HRESULT GetBackingStore(UINT Index, D3D10_SAMPLER_DESC* pSamplerDesc);
+	*/
+}
+
+struct D3D10_PASS_DESC {
+	LPCSTR		Name;
+	UINT		Annotations;
+	BYTE*		pIAInputSignature;
+	SIZE_T		IAInputSignatureSize;
+	UINT		StencilRef;
+	UINT		SampleMask;
+	FLOAT[4]	BlendFactor;
+}
+
+struct D3D10_PASS_SHADER_DESC {
+	ID3D10EffectShaderVariable	pShaderVariable;
+	UINT						ShaderIndex;
+}
+
+extern (C) const GUID IID_ID3D10EffectPass = {0x5cfbeb89, 0x1a06, 0x46e0, [0xb2, 0x82, 0xe3, 0xf9, 0xbf, 0xa3, 0x6a, 0x54]};
+
+/+interface ID3D10EffectPass {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	BOOL IsValid();
+	HRESULT GetDesc(D3D10_PASS_DESC* pDesc);
+	HRESULT GetVertexShaderDesc(D3D10_PASS_SHADER_DESC* pDesc);
+	HRESULT GetGeometryShaderDesc(D3D10_PASS_SHADER_DESC* pDesc);
+	HRESULT GetPixelShaderDesc(D3D10_PASS_SHADER_DESC* pDesc);
+	ID3D10EffectVariable GetAnnotationByIndex(UINT Index);
+	ID3D10EffectVariable GetAnnotationByName(LPCSTR Name);
+	HRESULT Apply(UINT Flags);
+	HRESULT ComputeStateBlockMask(D3D10_STATE_BLOCK_MASK* pStateBlockMask);
+	*/
+}+/
+/**
+ * HACK to FIX vtbl[0] bug:
+ * This is an example HACK how to fix all interfaces which are NOT derived from
+ * IUnknown. They need the first entry in their vtbl[] point to the first
+ * virtual function.
+ * See:
+ * http://www.digitalmars.com/d/cpp_interface.html
+ * http://d.puremagic.com/issues/show_bug.cgi?id=1687
+ */
+struct ID3D10EffectPassVtbl { 
+	extern(Windows) :
+	BOOL function(ID3D10EffectPass) IsValid;
+	HRESULT function(ID3D10EffectPass, D3D10_PASS_DESC* pDesc) GetDesc;
+	HRESULT function(ID3D10EffectPass, D3D10_PASS_SHADER_DESC* pDesc) GetVertexShaderDesc;
+	HRESULT function(ID3D10EffectPass, D3D10_PASS_SHADER_DESC* pDesc) GetGeometryShaderDesc;
+	HRESULT function(ID3D10EffectPass, D3D10_PASS_SHADER_DESC* pDesc) GetPixelShaderDesc;
+	ID3D10EffectVariable function(ID3D10EffectPass, UINT Index) GetAnnotationByIndex;
+	ID3D10EffectVariable function(ID3D10EffectPass, LPCSTR Name) GetAnnotationByName;
+	HRESULT function(ID3D10EffectPass, UINT Flags) Apply;
+	HRESULT function(ID3D10EffectPass, D3D10_STATE_BLOCK_MASK* pStateBlockMask) ComputeStateBlockMask;
+}
+alias ID3D10EffectPassVtbl** ID3D10EffectPass;
+
+struct D3D10_TECHNIQUE_DESC {
+	LPCSTR	Name;
+	UINT	Passes;
+	UINT	Annotations;
+}
+
+extern (C) const GUID IID_ID3D10EffectTechnique = {0xdb122ce8, 0xd1c9, 0x4292, [0xb2, 0x37, 0x24, 0xed, 0x3d, 0xe8, 0xb1, 0x75]};
+
+/+interface ID3D10EffectTechnique {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	BOOL IsValid();
+	HRESULT GetDesc(D3D10_TECHNIQUE_DESC* pDesc);
+	ID3D10EffectVariable GetAnnotationByIndex(UINT Index);
+	ID3D10EffectVariable GetAnnotationByName(LPCSTR Name);
+	ID3D10EffectPass GetPassByIndex(UINT Index);
+	ID3D10EffectPass GetPassByName(LPCSTR Name);
+	HRESULT ComputeStateBlockMask(D3D10_STATE_BLOCK_MASK* pStateBlockMask);
+	*/
+}+/
+/**
+ * HACK to FIX vtbl[0] bug:
+ * This is an example HACK how to fix all interfaces which are NOT derived from
+ * IUnknown. They need the first entry in their vtbl[] point to the first
+ * virtual function.
+ * See:
+ * http://www.digitalmars.com/d/cpp_interface.html
+ * http://d.puremagic.com/issues/show_bug.cgi?id=1687
+ */
+struct ID3D10EffectTechniqueVtbl {
+	extern(Windows) :
+	BOOL function(ID3D10EffectTechnique) IsValid;
+	HRESULT function(ID3D10EffectTechnique, D3D10_TECHNIQUE_DESC* pDesc) GetDesc;
+	ID3D10EffectVariable function(ID3D10EffectTechnique, UINT Index) GetAnnotationByIndex;
+	ID3D10EffectVariable function(ID3D10EffectTechnique, LPCSTR Name) GetAnnotationByName;
+	ID3D10EffectPass function(ID3D10EffectTechnique, UINT Index) GetPassByIndex;
+	ID3D10EffectPass function(ID3D10EffectTechnique, LPCSTR Name) GetPassByName;
+	HRESULT function(ID3D10EffectTechnique, D3D10_STATE_BLOCK_MASK* pStateBlockMask) ComputeStateBlockMask;
+}
+alias ID3D10EffectTechniqueVtbl** ID3D10EffectTechnique;
+
+struct D3D10_EFFECT_DESC {
+	BOOL	IsChildEffect;
+	UINT	ConstantBuffers;
+	UINT	SharedConstantBuffers;
+	UINT	GlobalVariables;
+	UINT	SharedGlobalVariables;
+	UINT	Techniques;
+}
+
+extern (C) const GUID IID_ID3D10Effect = {0x51b0ca8b, 0xec0b, 0x4519, [0x87, 0xd, 0x8e, 0xe1, 0xcb, 0x50, 0x17, 0xc7]};
+
+interface ID3D10Effect : IUnknown {
+	extern(Windows) :
+	BOOL IsValid();
+	BOOL IsPool();
+	HRESULT GetDevice(ID3D10Device* ppDevice);
+	HRESULT GetDesc(D3D10_EFFECT_DESC* pDesc);
+	ID3D10EffectConstantBuffer GetConstantBufferByIndex(UINT Index);
+	ID3D10EffectConstantBuffer GetConstantBufferByName(LPCSTR Name);
+	ID3D10EffectVariable GetVariableByIndex(UINT Index);
+	ID3D10EffectVariable GetVariableByName(LPCSTR Name);
+	ID3D10EffectVariable GetVariableBySemantic(LPCSTR Semantic);
+	ID3D10EffectTechnique GetTechniqueByIndex(UINT Index);
+	ID3D10EffectTechnique GetTechniqueByName(LPCSTR Name);
+	HRESULT Optimize();
+	BOOL IsOptimized();
+}
+
+extern (C) const GUID IID_ID3D10EffectPool = {0x9537ab04, 0x3250, 0x412e, [0x82, 0x13, 0xfc, 0xd2, 0xf8, 0x67, 0x79, 0x33]};
+
+interface ID3D10EffectPool : IUnknown {
+	extern(Windows) :
+	ID3D10Effect AsEffect();
+}
+
+HRESULT D3D10CompileEffectFromMemory(void* pData, SIZE_T DataLength, LPCSTR pSrcFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, UINT HLSLFlags, UINT FXFlags, ID3D10Blob* ppCompiledEffect, ID3D10Blob* ppErrors);
+HRESULT D3D10CreateEffectFromMemory(void* pData, SIZE_T DataLength, UINT FXFlags, ID3D10Device pDevice, ID3D10EffectPool pEffectPool, ID3D10Effect* ppEffect);
+HRESULT D3D10CreateEffectPoolFromMemory(void* pData, SIZE_T DataLength, UINT FXFlags, ID3D10Device pDevice, ID3D10EffectPool* ppEffectPool);
+HRESULT D3D10DisassembleEffect(ID3D10Effect pEffect, BOOL EnableColorCode, ID3D10Blob* ppDisassembly);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/d3d10misc.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,45 @@
+/***********************************************************************\
+*                               d3d10misc.d                             *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.directx.d3d10misc;
+
+private import win32.windows;
+
+private import win32.directx.dxgi;
+private import win32.directx.d3d10;
+
+extern (C) const GUID IID_ID3D10Blob = {
+	0x8BA5FB08, 0x5195, 0x40E2, [0xAC, 0x58, 0x0D, 0x98, 0x9C, 0x3A, 0x01, 0x02]
+};
+
+interface ID3D10Blob : IUnknown {
+	extern(Windows) :
+	LPVOID GetBufferPointer();
+	SIZE_T GetBufferSize();
+}
+
+enum D3D10_DRIVER_TYPE {
+	D3D10_DRIVER_TYPE_HARDWARE  = 0,
+	D3D10_DRIVER_TYPE_REFERENCE = 1,
+	D3D10_DRIVER_TYPE_NULL      = 2,
+	D3D10_DRIVER_TYPE_SOFTWARE  = 3
+}
+
+extern (C) const GUID GUID_DeviceType = {
+	0xD722FB4D, 0x7A68, 0x437A, [0xB2, 0x0C, 0x58, 0x04, 0xEE, 0x24, 0x94, 0xA6]
+};
+
+extern(Windows) {
+	HRESULT D3D10CreateDevice(IDXGIAdapter pAdapter,
+	  D3D10_DRIVER_TYPE DriverType, HMODULE Software, UINT Flags,
+	  UINT SDKVersion, ID3D10Device* ppDevice);
+	HRESULT D3D10CreateDeviceAndSwapChain(IDXGIAdapter pAdapter,
+	  D3D10_DRIVER_TYPE DriverType, HMODULE Software, UINT Flags,
+	  UINT SDKVersion, DXGI_SWAP_CHAIN_DESC* pSwapChainDesc,
+	  IDXGISwapChain* ppSwapChain, ID3D10Device* ppDevice);
+	HRESULT D3D10CreateBlob(SIZE_T NumBytes, ID3D10Blob* ppBuffer);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/d3d10shader.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,304 @@
+/***********************************************************************\
+*                             d3d10shader.d                             *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.directx.d3d10shader;
+
+private import win32.windows;
+private import win32.directx.d3d10;
+
+// some forward references...
+enum D3D10_PRIMITIVE_TOPOLOGY;
+enum D3D10_SRV_DIMENSION;
+
+uint D3D10_TX_VERSION(uint _Major, uint _Minor) {
+	return ('T' << 24) | ('X' << 16) | (_Major << 8) | _Minor;
+}
+
+const D3D10_SHADER_DEBUG							= 1 << 0;
+const D3D10_SHADER_SKIP_VALIDATION					= 1 << 1;
+const D3D10_SHADER_SKIP_OPTIMIZATION				= 1 << 2;
+const D3D10_SHADER_PACK_MATRIX_ROW_MAJOR			= 1 << 3;
+const D3D10_SHADER_PACK_MATRIX_COLUMN_MAJOR			= 1 << 4;
+const D3D10_SHADER_PARTIAL_PRECISION				= 1 << 5;
+const D3D10_SHADER_FORCE_VS_SOFTWARE_NO_OPT			= 1 << 6;
+const D3D10_SHADER_FORCE_PS_SOFTWARE_NO_OPT			= 1 << 7;
+const D3D10_SHADER_NO_PRESHADER						= 1 << 8;
+const D3D10_SHADER_AVOID_FLOW_CONTROL				= 1 << 9;
+const D3D10_SHADER_PREFER_FLOW_CONTROL				= 1 << 10;
+const D3D10_SHADER_ENABLE_STRICTNESS				= 1 << 11;
+const D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY	= 1 << 12;
+const D3D10_SHADER_IEEE_STRICTNESS					= 1 << 13;
+const D3D10_SHADER_OPTIMIZATION_LEVEL0				= 1 << 14;
+const D3D10_SHADER_OPTIMIZATION_LEVEL1				= 0;
+const D3D10_SHADER_OPTIMIZATION_LEVEL2				= (1 << 14) | (1 << 15);
+const D3D10_SHADER_OPTIMIZATION_LEVEL3				= 1 << 15;
+
+struct D3D10_SHADER_MACRO {
+	LPCSTR Name;
+	LPCSTR Definition;
+}
+
+enum D3D10_SHADER_VARIABLE_CLASS {
+	D3D10_SVC_SCALAR,
+	D3D10_SVC_VECTOR,
+	D3D10_SVC_MATRIX_ROWS,
+	D3D10_SVC_MATRIX_COLUMNS,
+	D3D10_SVC_OBJECT,
+	D3D10_SVC_STRUCT,
+	D3D10_SVC_FORCE_DWORD = 0x7fffffff
+}
+
+enum D3D10_SHADER_VARIABLE_FLAGS {
+	D3D10_SVF_USERPACKED	= 1,
+	D3D10_SVF_USED			= 2,
+	D3D10_SVF_FORCE_DWORD	= 0x7fffffff
+}
+
+enum D3D10_SHADER_VARIABLE_TYPE {
+	D3D10_SVT_VOID = 0,
+	D3D10_SVT_BOOL = 1,
+	D3D10_SVT_INT = 2,
+	D3D10_SVT_FLOAT = 3,
+	D3D10_SVT_STRING = 4,
+	D3D10_SVT_TEXTURE = 5,
+	D3D10_SVT_TEXTURE1D = 6,
+	D3D10_SVT_TEXTURE2D = 7,
+	D3D10_SVT_TEXTURE3D = 8,
+	D3D10_SVT_TEXTURECUBE = 9,
+	D3D10_SVT_SAMPLER = 10,
+	D3D10_SVT_PIXELSHADER = 15,
+	D3D10_SVT_VERTEXSHADER = 16,
+	D3D10_SVT_UINT = 19,
+	D3D10_SVT_UINT8 = 20,
+	D3D10_SVT_GEOMETRYSHADER = 21,
+	D3D10_SVT_RASTERIZER = 22,
+	D3D10_SVT_DEPTHSTENCIL = 23,
+	D3D10_SVT_BLEND = 24,
+	D3D10_SVT_BUFFER = 25,
+	D3D10_SVT_CBUFFER = 26,
+	D3D10_SVT_TBUFFER = 27,
+	D3D10_SVT_TEXTURE1DARRAY = 28,
+	D3D10_SVT_TEXTURE2DARRAY = 29,
+	D3D10_SVT_RENDERTARGETVIEW = 30,
+	D3D10_SVT_DEPTHSTENCILVIEW = 31,
+	D3D10_SVT_TEXTURE2DMS = 32,
+	D3D10_SVT_TEXTURE2DMSARRAY = 33,
+	D3D10_SVT_TEXTURECUBEARRAY = 34,
+	D3D10_SVT_FORCE_DWORD = 0x7fffffff
+}
+
+enum D3D10_SHADER_INPUT_FLAGS {
+	D3D10_SIF_USERPACKED = 1,
+	D3D10_SIF_COMPARISON_SAMPLER = 2,
+	D3D10_SIF_TEXTURE_COMPONENT_0 = 4,
+	D3D10_SIF_TEXTURE_COMPONENT_1 = 8,
+	D3D10_SIF_TEXTURE_COMPONENTS = 12,
+	D3D10_SIF_FORCE_DWORD = 0x7fffffff
+}
+
+enum D3D10_SHADER_INPUT_TYPE {
+	D3D10_SIT_CBUFFER,
+	D3D10_SIT_TBUFFER,
+	D3D10_SIT_TEXTURE,
+	D3D10_SIT_SAMPLER
+}
+
+enum D3D10_SHADER_CBUFFER_FLAGS {
+	D3D10_CBF_USERPACKED = 1,
+	D3D10_CBF_FORCE_DWORD = 0x7fffffff
+}
+
+enum D3D10_CBUFFER_TYPE {
+	D3D10_CT_CBUFFER,
+	D3D10_CT_TBUFFER
+}
+
+enum D3D10_NAME {
+	D3D10_NAME_UNDEFINED = 0,
+	D3D10_NAME_POSITION = 1,
+	D3D10_NAME_CLIP_DISTANCE = 2,
+	D3D10_NAME_CULL_DISTANCE = 3,
+	D3D10_NAME_RENDER_TARGET_ARRAY_INDEX = 4,
+	D3D10_NAME_VIEWPORT_ARRAY_INDEX = 5,
+	D3D10_NAME_VERTEX_ID = 6,
+	D3D10_NAME_PRIMITIVE_ID = 7,
+	D3D10_NAME_INSTANCE_ID = 8,
+	D3D10_NAME_IS_FRONT_FACE = 9,
+	D3D10_NAME_SAMPLE_INDEX = 10,
+	D3D10_NAME_TARGET = 64,
+	D3D10_NAME_DEPTH = 65,
+	D3D10_NAME_COVERAGE = 66
+}
+
+enum D3D10_RESOURCE_RETURN_TYPE {
+	D3D10_RETURN_TYPE_UNORM = 1,
+	D3D10_RETURN_TYPE_SNORM,
+	D3D10_RETURN_TYPE_SINT,
+	D3D10_RETURN_TYPE_UINT,
+	D3D10_RETURN_TYPE_FLOAT,
+	D3D10_RETURN_TYPE_MIXED
+}
+
+enum D3D10_REGISTER_COMPONENT_TYPE {
+	D3D10_REGISTER_COMPONENT_UNKNOWN = 0,
+	D3D10_REGISTER_COMPONENT_UINT32,
+	D3D10_REGISTER_COMPONENT_SINT32,
+	D3D10_REGISTER_COMPONENT_FLOAT32
+}
+
+enum D3D10_INCLUDE_TYPE {
+    D3D10_INCLUDE_LOCAL,
+    D3D10_INCLUDE_SYSTEM,
+    D3D10_INCLUDE_FORCE_DWORD = 0x7fffffff
+}
+
+interface ID3D10Include {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	HRESULT Open(D3D10_INCLUDE_TYPE IncludeType, LPCSTR pFileName, LPCVOID pParentData, LPCVOID* ppData, UINT* pBytes);
+	HRESULT Close(LPCVOID pData);
+	*/
+}
+
+struct D3D10_SHADER_DESC {
+	UINT	Version;
+	LPCSTR	Creator;
+	UINT	Flags;
+	UINT	ConstantBuffers;
+	UINT	BoundResources;
+	UINT	InputParameters;
+	UINT	OutputParameters;
+	UINT	InstructionCount;
+	UINT	TempRegisterCount;
+	UINT	TempArrayCount;
+	UINT	DefCount;
+	UINT	DclCount;
+	UINT	TextureNormalInstructions;
+	UINT	TextureLoadInstructions;
+	UINT	TextureCompInstructions;
+	UINT	TextureBiasInstructions;
+	UINT	TextureGradientInstructions;
+	UINT	FloatInstructionCount;
+	UINT	IntInstructionCount;
+	UINT	UintInstructionCount;
+	UINT	StaticFlowControlCount;
+	UINT	DynamicFlowControlCount;
+	UINT	MacroInstructionCount;
+	UINT	ArrayInstructionCount;
+	UINT	CutInstructionCount;
+	UINT	EmitInstructionCount;
+	D3D10_PRIMITIVE_TOPOLOGY	GSOutputTopology;
+	UINT	GSMaxOutputVertexCount;
+}
+
+struct D3D10_SHADER_BUFFER_DESC {
+	LPCSTR				Name;
+	D3D10_CBUFFER_TYPE	Type;
+	UINT				Variables;
+	UINT				Size;
+	UINT				uFlags;
+}
+
+struct D3D10_SHADER_VARIABLE_DESC {
+	LPCSTR	Name;
+	UINT	StartOffset;
+	UINT	Size;
+	UINT	uFlags;
+	LPVOID	DefaultValue;
+}
+
+struct D3D10_SHADER_TYPE_DESC {
+	D3D10_SHADER_VARIABLE_CLASS	Class;
+	D3D10_SHADER_VARIABLE_TYPE	Type;
+	UINT	Rows;
+	UINT	Columns;
+	UINT	Elements;
+	UINT	Members;
+	UINT	Offset;
+}
+
+struct D3D10_SHADER_INPUT_BIND_DESC {
+	LPCSTR	Name;
+	D3D10_SHADER_INPUT_TYPE	Type;
+	UINT	BindPoint;
+	UINT	BindCount;
+	UINT	uFlags;
+	D3D10_RESOURCE_RETURN_TYPE	ReturnType;
+	D3D10_SRV_DIMENSION	Dimension;
+	UINT	NumSamples;
+}
+
+struct D3D10_SIGNATURE_PARAMETER_DESC {
+    LPCSTR	SemanticName;
+    UINT	SemanticIndex;
+    UINT	Register;
+    D3D10_NAME	SystemValueType;
+    D3D10_REGISTER_COMPONENT_TYPE	ComponentType;
+    BYTE	Mask;
+    BYTE	ReadWriteMask;
+}
+
+extern(C) const GUID IID_ID3D10ShaderReflectionType = {0xc530ad7d, 0x9b16, 0x4395, [0xa9, 0x79, 0xba, 0x2e, 0xcf, 0xf8, 0x3a, 0xdd]};
+
+interface ID3D10ShaderReflectionType {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	HRESULT GetDesc(D3D10_SHADER_TYPE_DESC* pDesc);
+	ID3D10ShaderReflectionType* GetMemberTypeByIndex(UINT Index);
+	ID3D10ShaderReflectionType* GetMemberTypeByName(LPCSTR Name);
+	LPCSTR GetMemberTypeName(UINT Index);
+	*/
+}
+
+extern(C) const GUID IID_ID3D10ShaderReflectionVariable = {0x1bf63c95, 0x2650, 0x405d, [0x99, 0xc1, 0x36, 0x36, 0xbd, 0x1d, 0xa0, 0xa1]};
+
+interface ID3D10ShaderReflectionVariable {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	HRESULT GetDesc(D3D10_SHADER_VARIABLE_DESC* pDesc);
+	ID3D10ShaderReflectionType* GetType();
+	*/
+}
+
+extern(C) const GUID IID_ID3D10ShaderReflectionConstantBuffer = {0x66c66a94, 0xdddd, 0x4b62, [0xa6, 0x6a, 0xf0, 0xda, 0x33, 0xc2, 0xb4, 0xd0]};
+
+interface ID3D10ShaderReflectionConstantBuffer {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	HRESULT GetDesc(D3D10_SHADER_BUFFER_DESC* pDesc);
+	ID3D10ShaderReflectionVariable* GetVariableByIndex(UINT Index);
+	ID3D10ShaderReflectionVariable* GetVariableByName(LPCSTR Name);
+	*/
+}
+
+extern(C) const GUID IID_ID3D10ShaderReflection = {0xd40e20b6, 0xf8f7, 0x42ad, [0xab, 0x20, 0x4b, 0xaf, 0x8f, 0x15, 0xdf, 0xaa]};
+
+interface ID3D10ShaderReflection : IUnknown {
+	extern(Windows) :
+	HRESULT QueryInterface(REFIID iid, LPVOID* ppv);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT GetDesc(D3D10_SHADER_DESC* pDesc);
+	ID3D10ShaderReflectionConstantBuffer* GetConstantBufferByIndex(UINT Index);
+	ID3D10ShaderReflectionConstantBuffer* GetConstantBufferByName(LPCSTR Name);
+	HRESULT GetResourceBindingDesc(UINT ResourceIndex, D3D10_SHADER_INPUT_BIND_DESC* pDesc);
+	HRESULT GetInputParameterDesc(UINT ParameterIndex, D3D10_SIGNATURE_PARAMETER_DESC* pDesc);
+	HRESULT GetOutputParameterDesc(UINT ParameterIndex, D3D10_SIGNATURE_PARAMETER_DESC* pDesc);
+}
+
+HRESULT D3D10CompileShader(LPCSTR pSrcData, SIZE_T SrcDataLen, LPCSTR pFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, LPCSTR pFunctionName, LPCSTR pProfile, UINT Flags, ID3D10Blob* ppShader, ID3D10Blob* ppErrorMsgs);
+HRESULT D3D10DisassembleShader(void* pShader, SIZE_T BytecodeLength, BOOL EnableColorCode, LPCSTR pComments, ID3D10Blob* ppDisassembly);
+LPCSTR D3D10GetPixelShaderProfile(ID3D10Device pDevice);
+LPCSTR D3D10GetVertexShaderProfile(ID3D10Device pDevice);
+LPCSTR D3D10GetGeometryShaderProfile(ID3D10Device pDevice);
+HRESULT D3D10ReflectShader(void* pShaderBytecode, SIZE_T BytecodeLength, ID3D10ShaderReflection* ppReflector);
+HRESULT D3D10PreprocessShader(LPCSTR pSrcData, SIZE_T SrcDataSize, LPCSTR pFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, ID3D10Blob* ppShaderText, ID3D10Blob* ppErrorMsgs);
+HRESULT D3D10GetInputSignatureBlob(void* pShaderBytecode, SIZE_T BytecodeLength, ID3D10Blob* ppSignatureBlob);
+HRESULT D3D10GetOutputSignatureBlob(void* pShaderBytecode, SIZE_T BytecodeLength, ID3D10Blob* ppSignatureBlob);
+HRESULT D3D10GetInputAndOutputSignatureBlob(void* pShaderBytecode, SIZE_T BytecodeLength, ID3D10Blob* ppSignatureBlob);
+HRESULT D3D10GetShaderDebugInfo(void* pShaderBytecode, SIZE_T BytecodeLength, ID3D10Blob* ppDebugInfo);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/d3d9.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,837 @@
+/*==========================================================================;
+ *
+ *  Copyright (C) Microsoft Corporation.  All Rights Reserved.
+ *
+ *  File:   d3d9.h
+ *  Content:    Direct3D include file
+ *
+ ****************************************************************************/
+module win32.directx.d3d9;
+
+import win32.windows;
+public import win32.directx.d3d9types;
+public import win32.directx.d3d9caps;
+
+const DIRECT3D_VERSION = 0x0900;
+
+/**This identifier is passed to Direct3DCreate9 in order to ensure that an
+ * application was built against the correct header files. This number is
+ * incremented whenever a header (or other) change would require applications
+ * to be rebuilt. If the version doesn't match, Direct3DCreate9 will fail.
+ * (The number itself has no meaning.)*/
+
+debug {
+    const D3D_SDK_VERSION = (32 | 0x80000000);
+    const D3D9b_SDK_VERSION = (31 | 0x80000000);
+}
+else {
+    const D3D_SDK_VERSION = 32;
+    const D3D9b_SDK_VERSION = 31;
+}
+
+/* IID_IDirect3D9 */
+/* {81BDCBCA-64D4-426d-AE8D-AD0147F4275C} */
+extern (C) const GUID IID_IDirect3D9 = { 0x81bdcbca, 0x64d4, 0x426d, [0xae, 0x8d, 0xad, 0x1, 0x47, 0xf4, 0x27, 0x5c] };
+
+/* IID_IDirect3DDevice9 */
+// {D0223B96-BF7A-43fd-92BD-A43B0D82B9EB} */
+extern (C) const GUID IID_IDirect3DDevice9 = { 0xd0223b96, 0xbf7a, 0x43fd, [0x92, 0xbd, 0xa4, 0x3b, 0xd, 0x82, 0xb9, 0xeb] };
+
+/* IID_IDirect3DResource9 */
+// {05EEC05D-8F7D-4362-B999-D1BAF357C704}
+extern (C) const GUID IID_IDirect3DResource9 = { 0x05eec05d, 0x8f7d, 0x4362, [0xb9, 0x99, 0xd1, 0xba, 0xf3, 0x57, 0xc7, 0x04] };
+
+/* IID_IDirect3DBaseTexture9 */
+/* {580CA87E-1D3C-4d54-991D-B7D3E3C298CE} */
+extern (C) const GUID IID_IDirect3DBaseTexture9 = { 0x580ca87e, 0x1d3c, 0x4d54, [0x99, 0x1d, 0xb7, 0xd3, 0xe3, 0xc2, 0x98, 0xce] };
+
+/* IID_IDirect3DTexture9 */
+/* {85C31227-3DE5-4f00-9B3A-F11AC38C18B5} */
+extern (C) const GUID IID_IDirect3DTexture9 = { 0x85c31227, 0x3de5, 0x4f00, [0x9b, 0x3a, 0xf1, 0x1a, 0xc3, 0x8c, 0x18, 0xb5] };
+
+/* IID_IDirect3DCubeTexture9 */
+/* {FFF32F81-D953-473a-9223-93D652ABA93F} */
+extern (C) const GUID IID_IDirect3DCubeTexture9 = { 0xfff32f81, 0xd953, 0x473a, [0x92, 0x23, 0x93, 0xd6, 0x52, 0xab, 0xa9, 0x3f] };
+
+/* IID_IDirect3DVolumeTexture9 */
+/* {2518526C-E789-4111-A7B9-47EF328D13E6} */
+extern (C) const GUID IID_IDirect3DVolumeTexture9 = { 0x2518526c, 0xe789, 0x4111, [0xa7, 0xb9, 0x47, 0xef, 0x32, 0x8d, 0x13, 0xe6] };
+
+/* IID_IDirect3DVertexBuffer9 */
+/* {B64BB1B5-FD70-4df6-BF91-19D0A12455E3} */
+extern (C) const GUID IID_IDirect3DVertexBuffer9 = { 0xb64bb1b5, 0xfd70, 0x4df6, [0xbf, 0x91, 0x19, 0xd0, 0xa1, 0x24, 0x55, 0xe3] };
+
+/* IID_IDirect3DIndexBuffer9 */
+/* {7C9DD65E-D3F7-4529-ACEE-785830ACDE35} */
+extern (C) const GUID IID_IDirect3DIndexBuffer9 = { 0x7c9dd65e, 0xd3f7, 0x4529, [0xac, 0xee, 0x78, 0x58, 0x30, 0xac, 0xde, 0x35] };
+
+/* IID_IDirect3DSurface9 */
+/* {0CFBAF3A-9FF6-429a-99B3-A2796AF8B89B} */
+extern (C) const GUID IID_IDirect3DSurface9 = { 0xcfbaf3a,, 0x9ff6, 0x429a, [0x99, 0xb3, 0xa2, 0x79, 0x6a, 0xf8, 0xb8, 0x9b] };
+
+/* IID_IDirect3DVolume9 */
+/* {24F416E6-1F67-4aa7-B88E-D33F6F3128A1} */
+extern (C) const GUID IID_IDirect3DVolume9 = { 0x24f416e6, 0x1f67, 0x4aa7, [0xb8, 0x8e, 0xd3, 0x3f, 0x6f, 0x31, 0x28, 0xa1] };
+
+/* IID_IDirect3DSwapChain9 */
+/* {794950F2-ADFC-458a-905E-10A10B0B503B} */
+extern (C) const GUID IID_IDirect3DSwapChain9 = { 0x794950f2, 0xadfc, 0x458a, [0x90, 0x5e, 0x10, 0xa1, 0xb, 0xb, 0x50, 0x3b] };
+
+/* IID_IDirect3DVertexDeclaration9 */
+/* {DD13C59C-36FA-4098-A8FB-C7ED39DC8546} */
+extern (C) const GUID IID_IDirect3DVertexDeclaration9 = { 0xdd13c59c, 0x36fa, 0x4098, [0xa8, 0xfb, 0xc7, 0xed, 0x39, 0xdc, 0x85, 0x46] };
+
+/* IID_IDirect3DVertexShader9 */
+/* {EFC5557E-6265-4613-8A94-43857889EB36} */
+extern (C) const GUID IID_IDirect3DVertexShader9 = { 0xefc5557e, 0x6265, 0x4613, [0x8a, 0x94, 0x43, 0x85, 0x78, 0x89, 0xeb, 0x36] };
+
+/* IID_IDirect3DPixelShader9 */
+/* {6D3BDBDC-5B02-4415-B852-CE5E8BCCB289} */
+extern (C) const GUID IID_IDirect3DPixelShader9 = { 0x6d3bdbdc, 0x5b02, 0x4415, [0xb8, 0x52, 0xce, 0x5e, 0x8b, 0xcc, 0xb2, 0x89] };
+
+/* IID_IDirect3DStateBlock9 */
+/* {B07C4FE5-310D-4ba8-A23C-4F0F206F218B} */
+extern (C) const GUID IID_IDirect3DStateBlock9 = { 0xb07c4fe5, 0x310d, 0x4ba8, [0xa2, 0x3c, 0x4f, 0xf, 0x20, 0x6f, 0x21, 0x8b] };
+
+/* IID_IDirect3DQuery9 */
+/* {d9771460-a695-4f26-bbd3-27b840b541cc} */
+extern (C) const GUID IID_IDirect3DQuery9 = { 0xd9771460, 0xa695, 0x4f26, [0xbb, 0xd3, 0x27, 0xb8, 0x40, 0xb5, 0x41, 0xcc] };
+
+
+/* IID_HelperName */
+/* {E4A36723-FDFE-4b22-B146-3C04C07F4CC8} */
+extern (C) const GUID IID_HelperName = { 0xe4a36723, 0xfdfe, 0x4b22, [0xb1, 0x46, 0x3c, 0x4, 0xc0, 0x7f, 0x4c, 0xc8] };
+
+/* IID_IDirect3D9Ex */
+/* {02177241-69FC-400C-8FF1-93A44DF6861D} */
+extern (C) const GUID IID_IDirect3D9Ex = { 0x02177241, 0x69FC, 0x400C, [0x8F, 0xF1, 0x93, 0xA4, 0x4D, 0xF6, 0x86, 0x1D] };
+
+/* IID_IDirect3DDevice9Ex */
+// {B18B10CE-2649-405a-870F-95F777D4313A}
+extern (C) const GUID IID_IDirect3DDevice9Ex = { 0xb18b10ce, 0x2649, 0x405a, [0x87, 0xf, 0x95, 0xf7, 0x77, 0xd4, 0x31, 0x3a] };
+
+/* IID_IDirect3DSwapChain9Ex */
+/* {91886CAF-1C3D-4d2e-A0AB-3E4C7D8D3303} */
+extern (C) const GUID IID_IDirect3DSwapChain9Ex = { 0x91886caf, 0x1c3d, 0x4d2e, [0xa0, 0xab, 0x3e, 0x4c, 0x7d, 0x8d, 0x33, 0x03] };
+
+
+
+extern (C):
+/**
+ * DLL Function for creating a Direct3D9 object. This object supports
+ * enumeration and allows the creation of Direct3DDevice9 objects.
+ * Pass the value of the constant D3D_SDK_VERSION to this function, so
+ * that the run-time can validate that your application was compiled
+ * against the right headers.
+ */
+
+extern (Windows) LPDIRECT3D9 Direct3DCreate9(UINT SDKVersion);
+
+/**
+ * Stubs for graphics profiling.
+ */
+extern (Windows) int D3DPERF_BeginEvent( D3DCOLOR col, LPCWSTR wszName );
+extern (Windows) int D3DPERF_EndEvent();
+extern (Windows) void D3DPERF_SetMarker( D3DCOLOR col, LPCWSTR wszName );
+extern (Windows) void D3DPERF_SetRegion( D3DCOLOR col, LPCWSTR wszName );
+extern (Windows) BOOL D3DPERF_QueryRepeatFrame();
+
+extern (Windows) void D3DPERF_SetOptions( DWORD dwOptions );
+extern (Windows) DWORD D3DPERF_GetStatus();
+
+
+interface LPDIRECT3D9 : public IUnknown
+{
+    HRESULT RegisterSoftwareDevice(void* pInitializeFunction);
+    UINT GetAdapterCount();
+    HRESULT GetAdapterIdentifier( UINT Adapter,DWORD Flags,D3DADAPTER_IDENTIFIER9* pIdentifier);
+    UINT GetAdapterModeCount(UINT Adapter,D3DFORMAT Format);
+    HRESULT EnumAdapterModes( UINT Adapter,D3DFORMAT Format,UINT Mode,D3DDISPLAYMODE* pMode);
+    HRESULT GetAdapterDisplayMode( UINT Adapter,D3DDISPLAYMODE* pMode);
+    HRESULT CheckDeviceType( UINT Adapter,D3DDEVTYPE DevType,D3DFORMAT AdapterFormat,D3DFORMAT BackBufferFormat,BOOL bWindowed);
+    HRESULT CheckDeviceFormat( UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,DWORD Usage,D3DRESOURCETYPE RType,D3DFORMAT CheckFormat);
+    HRESULT CheckDeviceMultiSampleType( UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SurfaceFormat,BOOL Windowed,D3DMULTISAMPLE_TYPE MultiSampleType,DWORD* pQualityLevels);
+    HRESULT CheckDepthStencilMatch( UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,D3DFORMAT RenderTargetFormat,D3DFORMAT DepthStencilFormat);
+    HRESULT CheckDeviceFormatConversion( UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SourceFormat,D3DFORMAT TargetFormat);
+    HRESULT GetDeviceCaps( UINT Adapter,D3DDEVTYPE DeviceType,D3DCAPS9* pCaps);
+    HMONITOR GetAdapterMonitor(UINT Adapter);
+    HRESULT CreateDevice( UINT Adapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS* pPresentationParameters,LPDIRECT3DDEVICE9* ppReturnedDeviceInterface);
+/*
+    debug {
+        LPCWSTR Version;
+    }
+*/
+}
+alias LPDIRECT3D9 IDirect3D9;
+
+interface LPDIRECT3DDEVICE9 : public IUnknown
+{
+    HRESULT TestCooperativeLevel();
+    UINT GetAvailableTextureMem();
+    HRESULT EvictManagedResources();
+    HRESULT GetDirect3D( LPDIRECT3D9* ppD3D9);
+    HRESULT GetDeviceCaps( D3DCAPS9* pCaps);
+    HRESULT GetDisplayMode( UINT iSwapChain,D3DDISPLAYMODE* pMode);
+    HRESULT GetCreationParameters( D3DDEVICE_CREATION_PARAMETERS *pParameters);
+    HRESULT SetCursorProperties( UINT XHotSpot,UINT YHotSpot,LPDIRECT3DSURFACE9 pCursorBitmap);
+    void SetCursorPosition(int X,int Y,DWORD Flags);
+    BOOL ShowCursor(BOOL bShow);
+    HRESULT CreateAdditionalSwapChain( D3DPRESENT_PARAMETERS* pPresentationParameters,LPDIRECT3DSWAPCHAIN9* pSwapChain);
+    HRESULT GetSwapChain( UINT iSwapChain,LPDIRECT3DSWAPCHAIN9* pSwapChain);
+    UINT GetNumberOfSwapChains();
+    HRESULT Reset( D3DPRESENT_PARAMETERS* pPresentationParameters);
+    HRESULT Present(RECT* pSourceRect,RECT* pDestRect,HWND hDestWindowOverride, RGNDATA* pDirtyRegion);
+    HRESULT GetBackBuffer( UINT iSwapChain,UINT iBackBuffer,D3DBACKBUFFER_TYPE Type,LPDIRECT3DSURFACE9* ppBackBuffer);
+    HRESULT GetRasterStatus( UINT iSwapChain,D3DRASTER_STATUS* pRasterStatus);
+    HRESULT SetDialogBoxMode( BOOL bEnableDialogs);
+    void SetGammaRamp(UINT iSwapChain,DWORD Flags, D3DGAMMARAMP* pRamp);
+    void GetGammaRamp(UINT iSwapChain,D3DGAMMARAMP* pRamp);
+    HRESULT CreateTexture( UINT Width,UINT Height,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,LPDIRECT3DTEXTURE9* ppTexture,HANDLE* pSharedHandle);
+    HRESULT CreateVolumeTexture( UINT Width,UINT Height,UINT Depth,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,LPDIRECT3DVOLUMETEXTURE9* ppVolumeTexture,HANDLE* pSharedHandle);
+    HRESULT CreateCubeTexture( UINT EdgeLength,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,LPDIRECT3DCUBETEXTURE9* ppCubeTexture,HANDLE* pSharedHandle);
+    HRESULT CreateVertexBuffer( UINT Length,DWORD Usage,DWORD FVF,D3DPOOL Pool,LPDIRECT3DVERTEXBUFFER9* ppVertexBuffer,HANDLE* pSharedHandle);
+    HRESULT CreateIndexBuffer( UINT Length,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,LPDIRECT3DINDEXBUFFER9* ppIndexBuffer,HANDLE* pSharedHandle);
+    HRESULT CreateRenderTarget( UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,DWORD MultisampleQuality,BOOL Lockable,LPDIRECT3DSURFACE9* ppSurface,HANDLE* pSharedHandle);
+    HRESULT CreateDepthStencilSurface( UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,DWORD MultisampleQuality,BOOL Discard,LPDIRECT3DSURFACE9* ppSurface,HANDLE* pSharedHandle);
+    HRESULT UpdateSurface( LPDIRECT3DSURFACE9 pSourceSurface, RECT* pSourceRect,LPDIRECT3DSURFACE9 pDestinationSurface, POINT* pDestPoint);
+    HRESULT UpdateTexture( LPDIRECT3DBASETEXTURE9 pSourceTexture,LPDIRECT3DBASETEXTURE9 pDestinationTexture);
+    HRESULT GetRenderTargetData( LPDIRECT3DSURFACE9 pRenderTarget,LPDIRECT3DSURFACE9 pDestSurface);
+    HRESULT GetFrontBufferData( UINT iSwapChain,LPDIRECT3DSURFACE9 pDestSurface);
+    HRESULT StretchRect( LPDIRECT3DSURFACE9 pSourceSurface, RECT* pSourceRect,LPDIRECT3DSURFACE9 pDestSurface, RECT* pDestRect,D3DTEXTUREFILTERTYPE Filter);
+    HRESULT ColorFill( LPDIRECT3DSURFACE9 pSurface, RECT* pRect,D3DCOLOR color);
+    HRESULT CreateOffscreenPlainSurface( UINT Width,UINT Height,D3DFORMAT Format,D3DPOOL Pool,LPDIRECT3DSURFACE9* ppSurface,HANDLE* pSharedHandle);
+    HRESULT SetRenderTarget( DWORD RenderTargetIndex,LPDIRECT3DSURFACE9 pRenderTarget);
+    HRESULT GetRenderTarget( DWORD RenderTargetIndex,LPDIRECT3DSURFACE9* ppRenderTarget);
+    HRESULT SetDepthStencilSurface( LPDIRECT3DSURFACE9 pNewZStencil);
+    HRESULT GetDepthStencilSurface( LPDIRECT3DSURFACE9* ppZStencilSurface);
+    HRESULT BeginScene();
+    HRESULT EndScene();
+    HRESULT Clear( DWORD Count, D3DRECT* pRects,DWORD Flags,D3DCOLOR Color,float Z,DWORD Stencil);
+    HRESULT SetTransform( D3DTRANSFORMSTATETYPE State, D3DMATRIX* pMatrix);
+    HRESULT GetTransform( D3DTRANSFORMSTATETYPE State,D3DMATRIX* pMatrix);
+    HRESULT MultiplyTransform( D3DTRANSFORMSTATETYPE, D3DMATRIX*);
+    HRESULT SetViewport( D3DVIEWPORT9* pViewport);
+    HRESULT GetViewport( D3DVIEWPORT9* pViewport);
+    HRESULT SetMaterial( D3DMATERIAL9* pMaterial);
+    HRESULT GetMaterial( D3DMATERIAL9* pMaterial);
+    HRESULT SetLight( DWORD Index, D3DLIGHT9*);
+    HRESULT GetLight( DWORD Index,D3DLIGHT9*);
+    HRESULT LightEnable( DWORD Index,BOOL Enable);
+    HRESULT GetLightEnable( DWORD Index,BOOL* pEnable);
+    HRESULT SetClipPlane( DWORD Index, float* pPlane);
+    HRESULT GetClipPlane( DWORD Index,float* pPlane);
+    HRESULT SetRenderState( D3DRENDERSTATETYPE State,DWORD Value);
+    HRESULT GetRenderState( D3DRENDERSTATETYPE State,DWORD* pValue);
+    HRESULT CreateStateBlock( D3DSTATEBLOCKTYPE Type,LPDIRECT3DSTATEBLOCK9* ppSB);
+    HRESULT BeginStateBlock();
+    HRESULT EndStateBlock( LPDIRECT3DSTATEBLOCK9* ppSB);
+    HRESULT SetClipStatus( D3DCLIPSTATUS9* pClipStatus);
+    HRESULT GetClipStatus( D3DCLIPSTATUS9* pClipStatus);
+    HRESULT GetTexture( DWORD Stage,LPDIRECT3DBASETEXTURE9* ppTexture);
+    HRESULT SetTexture( DWORD Stage,LPDIRECT3DBASETEXTURE9 pTexture);
+    HRESULT GetTextureStageState( DWORD Stage,D3DTEXTURESTAGESTATETYPE Type,DWORD* pValue);
+    HRESULT SetTextureStageState( DWORD Stage,D3DTEXTURESTAGESTATETYPE Type,DWORD Value);
+    HRESULT GetSamplerState( DWORD Sampler,D3DSAMPLERSTATETYPE Type,DWORD* pValue);
+    HRESULT SetSamplerState( DWORD Sampler,D3DSAMPLERSTATETYPE Type,DWORD Value);
+    HRESULT ValidateDevice( DWORD* pNumPasses);
+    HRESULT SetPaletteEntries( UINT PaletteNumber, PALETTEENTRY* pEntries);
+    HRESULT GetPaletteEntries( UINT PaletteNumber,PALETTEENTRY* pEntries);
+    HRESULT SetCurrentTexturePalette( UINT PaletteNumber);
+    HRESULT GetCurrentTexturePalette( UINT *PaletteNumber);
+    HRESULT SetScissorRect( RECT* pRect);
+    HRESULT GetScissorRect( RECT* pRect);
+    HRESULT SetSoftwareVertexProcessing( BOOL bSoftware);
+    BOOL GetSoftwareVertexProcessing();
+    HRESULT SetNPatchMode( float nSegments);
+    float GetNPatchMode();
+    HRESULT DrawPrimitive( D3DPRIMITIVETYPE PrimitiveType,UINT StartVertex,UINT PrimitiveCount);
+    HRESULT DrawIndexedPrimitive( D3DPRIMITIVETYPE,INT BaseVertexIndex,UINT MinVertexIndex,UINT NumVertices,UINT startIndex,UINT primCount);
+    HRESULT DrawPrimitiveUP( D3DPRIMITIVETYPE PrimitiveType,UINT PrimitiveCount, void* pVertexStreamZeroData,UINT VertexStreamZeroStride);
+    HRESULT DrawIndexedPrimitiveUP( D3DPRIMITIVETYPE PrimitiveType,UINT MinVertexIndex,UINT NumVertices,UINT PrimitiveCount, void* pIndexData,D3DFORMAT IndexDataFormat, void* pVertexStreamZeroData,UINT VertexStreamZeroStride);
+    HRESULT ProcessVertices( UINT SrcStartIndex,UINT DestIndex,UINT VertexCount,LPDIRECT3DVERTEXBUFFER9 pDestBuffer,LPDIRECT3DVERTEXDECLARATION9 pVertexDecl,DWORD Flags);
+    HRESULT CreateVertexDeclaration( D3DVERTEXELEMENT9* pVertexElements,LPDIRECT3DVERTEXDECLARATION9* ppDecl);
+    HRESULT SetVertexDeclaration(LPDIRECT3DVERTEXDECLARATION9 pDecl);
+    HRESULT GetVertexDeclaration(LPDIRECT3DVERTEXDECLARATION9* ppDecl);
+    HRESULT SetFVF( DWORD FVF);
+    HRESULT GetFVF( DWORD* pFVF);
+    HRESULT CreateVertexShader( DWORD* pFunction,LPDIRECT3DVERTEXSHADER9* ppShader);
+    HRESULT SetVertexShader( LPDIRECT3DVERTEXSHADER9 pShader);
+    HRESULT GetVertexShader( LPDIRECT3DVERTEXSHADER9* ppShader);
+    HRESULT SetVertexShaderConstantF( UINT StartRegister, float* pConstantData,UINT Vector4fCount);
+    HRESULT GetVertexShaderConstantF( UINT StartRegister,float* pConstantData,UINT Vector4fCount);
+    HRESULT SetVertexShaderConstantI( UINT StartRegister, int* pConstantData,UINT Vector4iCount);
+    HRESULT GetVertexShaderConstantI( UINT StartRegister,int* pConstantData,UINT Vector4iCount);
+    HRESULT SetVertexShaderConstantB( UINT StartRegister, BOOL* pConstantData,UINT  BoolCount);
+    HRESULT GetVertexShaderConstantB( UINT StartRegister,BOOL* pConstantData,UINT BoolCount);
+    HRESULT SetStreamSource( UINT StreamNumber,LPDIRECT3DVERTEXBUFFER9 pStreamData,UINT OffsetInBytes,UINT Stride);
+    HRESULT GetStreamSource( UINT StreamNumber,LPDIRECT3DVERTEXBUFFER9* ppStreamData,UINT* pOffsetInBytes,UINT* pStride);
+    HRESULT SetStreamSourceFreq( UINT StreamNumber,UINT Setting);
+    HRESULT GetStreamSourceFreq( UINT StreamNumber,UINT* pSetting);
+    HRESULT SetIndices( LPDIRECT3DINDEXBUFFER9 pIndexData);
+    HRESULT GetIndices( LPDIRECT3DINDEXBUFFER9* ppIndexData);
+    HRESULT CreatePixelShader( DWORD* pFunction,LPDIRECT3DPIXELSHADER9* ppShader);
+    HRESULT SetPixelShader(LPDIRECT3DPIXELSHADER9 pShader);
+    HRESULT GetPixelShader(LPDIRECT3DPIXELSHADER9* ppShader);
+    HRESULT SetPixelShaderConstantF( UINT StartRegister, float* pConstantData,UINT Vector4fCount);
+    HRESULT GetPixelShaderConstantF( UINT StartRegister,float* pConstantData,UINT Vector4fCount);
+    HRESULT SetPixelShaderConstantI( UINT StartRegister, int* pConstantData,UINT Vector4iCount);
+    HRESULT GetPixelShaderConstantI( UINT StartRegister,int* pConstantData,UINT Vector4iCount);
+    HRESULT SetPixelShaderConstantB( UINT StartRegister, BOOL* pConstantData,UINT  BoolCount);
+    HRESULT GetPixelShaderConstantB( UINT StartRegister,BOOL* pConstantData,UINT BoolCount);
+    HRESULT DrawRectPatch( UINT Handle, float* pNumSegs, D3DRECTPATCH_INFO* pRectPatchInfo);
+    HRESULT DrawTriPatch( UINT Handle, float* pNumSegs, D3DTRIPATCH_INFO* pTriPatchInfo);
+    HRESULT DeletePatch( UINT Handle);
+    HRESULT CreateQuery( D3DQUERYTYPE Type,LPDIRECT3DQUERY9* ppQuery);
+/*
+    debug {
+        D3DDEVICE_CREATION_PARAMETERS CreationParameters;
+        D3DPRESENT_PARAMETERS PresentParameters;
+        D3DDISPLAYMODE DisplayMode;
+        D3DCAPS9 Caps;
+
+        UINT AvailableTextureMem;
+        UINT SwapChains;
+        UINT Textures;
+        UINT VertexBuffers;
+        UINT IndexBuffers;
+        UINT VertexShaders;
+        UINT PixelShaders;
+
+        D3DVIEWPORT9 Viewport;
+        D3DMATRIX ProjectionMatrix;
+        D3DMATRIX ViewMatrix;
+        D3DMATRIX WorldMatrix;
+        D3DMATRIX TextureMatrices[8];
+
+        DWORD FVF;
+        UINT VertexSize;
+        DWORD VertexShaderVersion;
+        DWORD PixelShaderVersion;
+        BOOL SoftwareVertexProcessing;
+
+        D3DMATERIAL9 Material;
+        D3DLIGHT9 Lights[16];
+        BOOL LightsEnabled[16];
+
+        D3DGAMMARAMP GammaRamp;
+        RECT ScissorRect;
+        BOOL DialogBoxMode;
+    }
+*/
+}
+
+alias LPDIRECT3DDEVICE9 IDirect3DDevice9;
+
+
+interface LPDIRECT3DSTATEBLOCK9 : public IUnknown
+{
+    HRESULT GetDevice(LPDIRECT3DDEVICE9* ppDevice);
+    HRESULT Capture();
+    HRESULT Apply();
+/*
+    debug {
+        LPCWSTR CreationCallStack;
+    }
+*/
+}
+
+alias LPDIRECT3DSTATEBLOCK9 IDirect3DStateBlock9;
+
+interface LPDIRECT3DSWAPCHAIN9 : public IUnknown
+{
+    HRESULT Present( RECT* pSourceRect, RECT* pDestRect,HWND hDestWindowOverride, RGNDATA* pDirtyRegion,DWORD dwFlags);
+    HRESULT GetFrontBufferData( LPDIRECT3DSURFACE9 pDestSurface);
+    HRESULT GetBackBuffer( UINT iBackBuffer,D3DBACKBUFFER_TYPE Type,LPDIRECT3DSURFACE9* ppBackBuffer);
+    HRESULT GetRasterStatus( D3DRASTER_STATUS* pRasterStatus);
+    HRESULT GetDisplayMode( D3DDISPLAYMODE* pMode);
+    HRESULT GetDevice( LPDIRECT3DDEVICE9 * ppDevice);
+    HRESULT GetPresentParameters( D3DPRESENT_PARAMETERS* pPresentationParameters);
+/*
+    debug {
+        D3DPRESENT_PARAMETERS PresentParameters;
+        D3DDISPLAYMODE DisplayMode;
+        LPCWSTR CreationCallStack;
+    }
+*/
+}
+
+alias LPDIRECT3DSWAPCHAIN9 IDirect3DSwapChain9;
+
+interface LPDIRECT3DRESOURCE9 : public IUnknown
+{
+    HRESULT GetDevice( LPDIRECT3DDEVICE9* ppDevice);
+    HRESULT SetPrivateData( REFGUID refguid, void* pData,DWORD SizeOfData,DWORD Flags);
+    HRESULT GetPrivateData( REFGUID refguid,void* pData,DWORD* pSizeOfData);
+    HRESULT FreePrivateData( REFGUID refguid);
+    DWORD SetPriority(DWORD PriorityNew);
+    DWORD GetPriority();
+    void PreLoad();
+    D3DRESOURCETYPE GetType();
+}
+
+alias LPDIRECT3DRESOURCE9 IDirect3DResource9;
+
+interface LPDIRECT3DVERTEXDECLARATION9 : public IUnknown
+{
+    HRESULT GetDevice( LPDIRECT3DDEVICE9* ppDevice);
+    HRESULT GetDeclaration( D3DVERTEXELEMENT9* pElement,UINT* pNumElements);
+/*
+    debug {
+        LPCWSTR CreationCallStack;
+    }
+*/
+}
+
+alias LPDIRECT3DVERTEXDECLARATION9 IDirect3DVertexDeclaration9;
+
+interface LPDIRECT3DVERTEXSHADER9 : public IUnknown
+{
+    HRESULT GetDevice( LPDIRECT3DDEVICE9 * ppDevice);
+    HRESULT GetFunction( void*,UINT* pSizeOfData);
+/*
+    debug {
+        DWORD Version;
+        LPCWSTR CreationCallStack;
+    }
+*/
+}
+
+alias LPDIRECT3DVERTEXSHADER9 IDirect3DVertexShader9;
+
+interface LPDIRECT3DPIXELSHADER9 : public IUnknown
+{
+    HRESULT GetDevice( LPDIRECT3DDEVICE9 * ppDevice);
+    HRESULT GetFunction( void*,UINT* pSizeOfData);
+/*
+    debug {
+        DWORD Version;
+        LPCWSTR CreationCallStack;
+    }
+*/
+}
+
+alias LPDIRECT3DPIXELSHADER9 IDirect3DPixelShader9;
+
+interface LPDIRECT3DBASETEXTURE9 : public LPDIRECT3DRESOURCE9
+{
+    DWORD SetLOD(DWORD LODNew);
+    DWORD GetLOD();
+    DWORD GetLevelCount();
+    HRESULT SetAutoGenFilterType( D3DTEXTUREFILTERTYPE FilterType);
+    D3DTEXTUREFILTERTYPE GetAutoGenFilterType();
+    void GenerateMipSubLevels();
+}
+
+alias LPDIRECT3DBASETEXTURE9 IDirect3DBaseTexture9;
+
+interface LPDIRECT3DTEXTURE9 : public LPDIRECT3DBASETEXTURE9
+{
+    HRESULT GetLevelDesc( UINT Level,D3DSURFACE_DESC *pDesc);
+    HRESULT GetSurfaceLevel( UINT Level,LPDIRECT3DSURFACE9* ppSurfaceLevel);
+    HRESULT LockRect( UINT Level,D3DLOCKED_RECT* pLockedRect,RECT* pRect,DWORD Flags);
+    HRESULT UnlockRect( UINT Level);
+    HRESULT AddDirtyRect(RECT* pDirtyRect);
+/*
+    debug {
+        LPCWSTR Name;
+        UINT Width;
+        UINT Height;
+        UINT Levels;
+        DWORD Usage;
+        D3DFORMAT Format;
+        D3DPOOL Pool;
+        DWORD Priority;
+        DWORD LOD;
+        D3DTEXTUREFILTERTYPE FilterType;
+        UINT LockCount;
+        LPCWSTR CreationCallStack;
+    }
+*/
+}
+
+alias LPDIRECT3DTEXTURE9 IDirect3DTexture9;
+
+interface LPDIRECT3DVOLUMETEXTURE9 : public LPDIRECT3DBASETEXTURE9
+{
+    HRESULT GetLevelDesc( UINT Level,D3DVOLUME_DESC *pDesc);
+    HRESULT GetVolumeLevel( UINT Level,LPDIRECT3DVOLUME9* ppVolumeLevel);
+    HRESULT LockBox( UINT Level,D3DLOCKED_BOX* pLockedVolume, D3DBOX* pBox,DWORD Flags);
+    HRESULT UnlockBox( UINT Level);
+    HRESULT AddDirtyBox( D3DBOX* pDirtyBox);
+/*
+    debug {
+        LPCWSTR Name;
+        UINT Width;
+        UINT Height;
+        UINT Depth;
+        UINT Levels;
+        DWORD Usage;
+        D3DFORMAT Format;
+        D3DPOOL Pool;
+        DWORD Priority;
+        DWORD LOD;
+        D3DTEXTUREFILTERTYPE FilterType;
+        UINT LockCount;
+        LPCWSTR CreationCallStack;
+    }
+*/
+}
+
+alias LPDIRECT3DVOLUMETEXTURE9 IDirect3DVolumeTexture9;
+
+interface LPDIRECT3DCUBETEXTURE9 : public LPDIRECT3DBASETEXTURE9
+{
+    HRESULT GetLevelDesc( UINT Level,D3DSURFACE_DESC *pDesc);
+    HRESULT GetCubeMapSurface( D3DCUBEMAP_FACES FaceType,UINT Level,LPDIRECT3DSURFACE9* ppCubeMapSurface);
+    HRESULT LockRect( D3DCUBEMAP_FACES FaceType,UINT Level,D3DLOCKED_RECT* pLockedRect, RECT* pRect,DWORD Flags);
+    HRESULT UnlockRect( D3DCUBEMAP_FACES FaceType,UINT Level);
+    HRESULT AddDirtyRect( D3DCUBEMAP_FACES FaceType, RECT* pDirtyRect);
+/*
+    debug {
+        LPCWSTR Name;
+        UINT Width;
+        UINT Height;
+        UINT Levels;
+        DWORD Usage;
+        D3DFORMAT Format;
+        D3DPOOL Pool;
+        DWORD Priority;
+        DWORD LOD;
+        D3DTEXTUREFILTERTYPE FilterType;
+        UINT LockCount;
+        LPCWSTR CreationCallStack;
+    }
+*/
+}
+
+alias LPDIRECT3DCUBETEXTURE9 IDirect3DCubeTexture9;
+
+interface LPDIRECT3DVERTEXBUFFER9 : public LPDIRECT3DRESOURCE9
+{
+    HRESULT Lock( UINT OffsetToLock,UINT SizeToLock,void** ppbData,DWORD Flags);
+    HRESULT Unlock();
+    HRESULT GetDesc( D3DVERTEXBUFFER_DESC *pDesc);
+/*
+    debug {
+        LPCWSTR Name;
+        UINT Length;
+        DWORD Usage;
+        DWORD FVF;
+        D3DPOOL Pool;
+        DWORD Priority;
+        UINT LockCount;
+        LPCWSTR CreationCallStack;
+    }
+*/
+}
+
+alias LPDIRECT3DVERTEXBUFFER9 IDirect3DVertexBuffer9;
+
+interface LPDIRECT3DINDEXBUFFER9 : public LPDIRECT3DRESOURCE9
+{
+    HRESULT Lock( UINT OffsetToLock,UINT SizeToLock,void** ppbData,DWORD Flags);
+    HRESULT Unlock();
+    HRESULT GetDesc( D3DINDEXBUFFER_DESC *pDesc);
+/*
+    debug {
+        LPCWSTR Name;
+        UINT Length;
+        DWORD Usage;
+        D3DFORMAT Format;
+        D3DPOOL Pool;
+        DWORD Priority;
+        UINT LockCount;
+        LPCWSTR CreationCallStack;
+    }
+*/
+}
+
+alias LPDIRECT3DINDEXBUFFER9 IDirect3DIndexBuffer9;
+
+interface LPDIRECT3DSURFACE9 : public LPDIRECT3DRESOURCE9
+{
+    HRESULT GetContainer( REFIID riid,void** ppContainer);
+    HRESULT GetDesc( D3DSURFACE_DESC *pDesc);
+    HRESULT LockRect( D3DLOCKED_RECT* pLockedRect, RECT* pRect,DWORD Flags);
+    HRESULT UnlockRect();
+    HRESULT GetDC( HDC *phdc);
+    HRESULT ReleaseDC( HDC hdc);
+/*
+    debug {
+        LPCWSTR Name;
+        UINT Width;
+        UINT Height;
+        DWORD Usage;
+        D3DFORMAT Format;
+        D3DPOOL Pool;
+        D3DMULTISAMPLE_TYPE MultiSampleType;
+        DWORD MultiSampleQuality;
+        DWORD Priority;
+        UINT LockCount;
+        UINT DCCount;
+        LPCWSTR CreationCallStack;
+    }
+*/
+}
+
+alias LPDIRECT3DSURFACE9 IDirect3DSurface9;
+
+interface LPDIRECT3DVOLUME9 : public IUnknown
+{
+    HRESULT GetDevice( LPDIRECT3DDEVICE9 * ppDevice);
+    HRESULT SetPrivateData( REFGUID refguid, void* pData,DWORD SizeOfData,DWORD Flags);
+    HRESULT GetPrivateData( REFGUID refguid,void* pData,DWORD* pSizeOfData);
+    HRESULT FreePrivateData( REFGUID refguid);
+    HRESULT GetContainer( REFIID riid,void** ppContainer);
+    HRESULT GetDesc( D3DVOLUME_DESC *pDesc);
+    HRESULT LockBox( D3DLOCKED_BOX * pLockedVolume, D3DBOX* pBox,DWORD Flags);
+    HRESULT UnlockBox();
+/*
+    debug {
+        LPCWSTR Name;
+        UINT Width;
+        UINT Height;
+        UINT Depth;
+        DWORD Usage;
+        D3DFORMAT Format;
+        D3DPOOL Pool;
+        UINT LockCount;
+        LPCWSTR CreationCallStack;
+    }
+*/
+}
+
+alias LPDIRECT3DVOLUME9 IDirect3DVolume9;
+
+interface LPDIRECT3DQUERY9 : public IUnknown
+{
+    HRESULT GetDevice( LPDIRECT3DDEVICE9* ppDevice);
+    D3DQUERYTYPE GetType();
+    DWORD GetDataSize();
+    HRESULT Issue( DWORD dwIssueFlags);
+    HRESULT GetData( void* pData,DWORD dwSize,DWORD dwGetDataFlags);
+/*
+    debug {
+        D3DQUERYTYPE Type;
+        DWORD DataSize;
+        LPCWSTR CreationCallStack;
+    }
+*/
+}
+
+alias LPDIRECT3DQUERY9 IDirect3DQuery9;
+
+/****************************************************************************
+ * Flags for SetPrivateData method on all D3D9 interfaces
+ *
+ * The passed pointer is an IUnknown ptr. The SizeOfData argument to SetPrivateData
+ * must be set to sizeof(IUnknown*). Direct3D will call AddRef through this
+ * pointer and Release when the private data is destroyed. The data will be
+ * destroyed when another SetPrivateData with the same GUID is set, when
+ * FreePrivateData is called, or when the D3D9 object is freed.
+ ****************************************************************************/
+const D3DSPD_IUNKNOWN = 0x00000001L;
+
+/****************************************************************************
+ *
+ * Flags for IDirect3D9::CreateDevice's BehaviorFlags
+ *
+ ****************************************************************************/
+
+const D3DCREATE_FPU_PRESERVE = 0x00000002L;
+const D3DCREATE_MULTITHREADED = 0x00000004L;
+
+const D3DCREATE_PUREDEVICE = 0x00000010L;
+const D3DCREATE_SOFTWARE_VERTEXPROCESSING = 0x00000020L;
+const D3DCREATE_HARDWARE_VERTEXPROCESSING = 0x00000040L;
+const D3DCREATE_MIXED_VERTEXPROCESSING = 0x00000080L;
+
+const D3DCREATE_DISABLE_DRIVER_MANAGEMENT = 0x00000100L;
+const D3DCREATE_ADAPTERGROUP_DEVICE = 0x00000200L;
+const D3DCREATE_DISABLE_DRIVER_MANAGEMENT_EX = 0x00000400L;
+
+// This flag causes the D3D runtime not to alter the focus
+// window in any way. Use with caution- the burden of supporting
+// focus management events (alt-tab, etc.) falls on the
+// application, and appropriate responses (switching display
+// mode, etc.) should be coded.
+const D3DCREATE_NOWINDOWCHANGES = 0x00000800L;
+
+// Disable multithreading for software vertex processing
+const D3DCREATE_DISABLE_PSGP_THREADING = 0x00002000L;
+// This flag enables present statistics on device.
+const D3DCREATE_ENABLE_PRESENTSTATS = 0x00004000L;
+// This flag disables printscreen support in the runtime for this device
+const D3DCREATE_DISABLE_PRINTSCREEN = 0x00008000L;
+
+const D3DCREATE_SCREENSAVER = 0x10000000L;
+
+
+/****************************************************************************
+ *
+ * Parameter for IDirect3D9::CreateDevice's Adapter argument
+ *
+ ****************************************************************************/
+
+const D3DADAPTER_DEFAULT = 0;
+
+/****************************************************************************
+ *
+ * Flags for IDirect3D9::EnumAdapters
+ *
+ ****************************************************************************/
+
+/*
+ * The D3DENUM_WHQL_LEVEL value has been retired for 9Ex and future versions,
+ * but it needs to be defined here for compatibility with DX9 and earlier versions.
+ * See the DirectX SDK for sample code on discovering driver signatures.
+ */
+const D3DENUM_WHQL_LEVEL = 0x00000002L;
+
+/* NO_DRIVERVERSION will not fill out the DriverVersion field, nor will the
+   DriverVersion be incorporated into the DeviceIdentifier GUID. WINNT only */
+const D3DENUM_NO_DRIVERVERSION = 0x00000004L;
+
+
+/****************************************************************************
+ *
+ * Maximum number of back-buffers supported in DX9
+ *
+ ****************************************************************************/
+
+const D3DPRESENT_BACK_BUFFERS_MAX = 3L;
+
+/****************************************************************************
+ *
+ * Maximum number of back-buffers supported when apps use CreateDeviceEx
+ *
+ ****************************************************************************/
+const D3DPRESENT_BACK_BUFFERS_MAX_EX = 30L;
+
+/****************************************************************************
+ *
+ * Flags for IDirect3DDevice9::SetGammaRamp
+ *
+ ****************************************************************************/
+
+const D3DSGR_NO_CALIBRATION = 0x00000000L;
+const D3DSGR_CALIBRATE = 0x00000001L;
+
+/****************************************************************************
+ *
+ * Flags for IDirect3DDevice9::SetCursorPosition
+ *
+ ****************************************************************************/
+
+const D3DCURSOR_IMMEDIATE_UPDATE = 0x00000001L;
+
+/****************************************************************************
+ *
+ * Flags for IDirect3DSwapChain9::Present
+ *
+ ****************************************************************************/
+
+const D3DPRESENT_DONOTWAIT = 0x00000001L;
+const D3DPRESENT_LINEAR_CONTENT = 0x00000002L;
+const D3DPRESENT_DONOTFLIP = 0x00000004L;
+const D3DPRESENT_FLIPRESTART = 0x00000008L;
+const D3DPRESENT_VIDEO_RESTRICT_TO_MONITOR = 0x00000010L;
+
+/****************************************************************************
+ *
+ * Flags for DrawPrimitive/DrawIndexedPrimitive
+ *   Also valid for Begin/BeginIndexed
+ *   Also valid for VertexBuffer::CreateVertexBuffer
+ ****************************************************************************/
+
+
+/*
+ *  DirectDraw error codes
+ */
+const _FACD3D = 0x876;
+HRESULT MAKE_D3DHRESULT(T)(T code) { return MAKE_HRESULT( 1, _FACD3D, code ); }
+HRESULT MAKE_D3DSTATUS(T)(T code) { return MAKE_HRESULT( 0, _FACD3D, code ); }
+
+/*
+ * Direct3D Errors
+ */
+const HRESULT D3D_OK = S_OK;
+
+const HRESULT D3DERR_WRONGTEXTUREFORMAT = MAKE_D3DHRESULT(2072);
+const HRESULT D3DERR_UNSUPPORTEDCOLOROPERATION = MAKE_D3DHRESULT(2073);
+const HRESULT D3DERR_UNSUPPORTEDCOLORARG = MAKE_D3DHRESULT(2074);
+const HRESULT D3DERR_UNSUPPORTEDALPHAOPERATION = MAKE_D3DHRESULT(2075);
+const HRESULT D3DERR_UNSUPPORTEDALPHAARG = MAKE_D3DHRESULT(2076);
+const HRESULT D3DERR_TOOMANYOPERATIONS = MAKE_D3DHRESULT(2077);
+const HRESULT D3DERR_CONFLICTINGTEXTUREFILTER = MAKE_D3DHRESULT(2078);
+const HRESULT D3DERR_UNSUPPORTEDFACTORVALUE = MAKE_D3DHRESULT(2079);
+const HRESULT D3DERR_CONFLICTINGRENDERSTATE = MAKE_D3DHRESULT(2081);
+const HRESULT D3DERR_UNSUPPORTEDTEXTUREFILTER = MAKE_D3DHRESULT(2082);
+const HRESULT D3DERR_CONFLICTINGTEXTUREPALETTE = MAKE_D3DHRESULT(2086);
+const HRESULT D3DERR_DRIVERINTERNALERROR = MAKE_D3DHRESULT(2087);
+
+const HRESULT D3DERR_NOTFOUND = MAKE_D3DHRESULT(2150);
+const HRESULT D3DERR_MOREDATA = MAKE_D3DHRESULT(2151);
+const HRESULT D3DERR_DEVICELOST = MAKE_D3DHRESULT(2152);
+const HRESULT D3DERR_DEVICENOTRESET = MAKE_D3DHRESULT(2153);
+const HRESULT D3DERR_NOTAVAILABLE = MAKE_D3DHRESULT(2154);
+const HRESULT D3DERR_OUTOFVIDEOMEMORY = MAKE_D3DHRESULT(380);
+const HRESULT D3DERR_INVALIDDEVICE = MAKE_D3DHRESULT(2155);
+const HRESULT D3DERR_INVALIDCALL = MAKE_D3DHRESULT(2156);
+const HRESULT D3DERR_DRIVERINVALIDCALL = MAKE_D3DHRESULT(2157);
+const HRESULT D3DERR_WASSTILLDRAWING = MAKE_D3DHRESULT(540);
+const HRESULT D3DOK_NOAUTOGEN = MAKE_D3DSTATUS(2159);
+const HRESULT D3DERR_DEVICEREMOVED = MAKE_D3DHRESULT(2160);
+const HRESULT S_NOT_RESIDENT = MAKE_D3DSTATUS(2165);
+const HRESULT S_RESIDENT_IN_SHARED_MEMORY = MAKE_D3DSTATUS(2166);
+const HRESULT S_PRESENT_MODE_CHANGED = MAKE_D3DSTATUS(2167);
+const HRESULT S_PRESENT_OCCLUDED = MAKE_D3DSTATUS(2168);
+const HRESULT D3DERR_DEVICEHUNG = MAKE_D3DHRESULT(2164);
+
+
+/*********************
+/* D3D9Ex interfaces
+/*********************/
+
+extern (Windows) HRESULT Direct3DCreate9Ex(UINT SDKVersion, LPDIRECT3D9EX*);
+
+interface LPDIRECT3D9EX : public LPDIRECT3D9
+{
+    UINT GetAdapterModeCountEx(UINT Adapter, D3DDISPLAYMODEFILTER* pFilter );
+    HRESULT EnumAdapterModesEx( UINT Adapter, D3DDISPLAYMODEFILTER* pFilter,UINT Mode,D3DDISPLAYMODEEX* pMode);
+    HRESULT GetAdapterDisplayModeEx( UINT Adapter,D3DDISPLAYMODEEX* pMode,D3DDISPLAYROTATION* pRotation);
+    HRESULT CreateDeviceEx( UINT Adapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS* pPresentationParameters,D3DDISPLAYMODEEX* pFullscreenDisplayMode,LPDIRECT3DDEVICE9EX* ppReturnedDeviceInterface);
+    HRESULT GetAdapterLUID( UINT Adapter,LUID * pLUID);
+}
+
+alias LPDIRECT3D9EX IDirect3D9Ex;
+
+interface LPDIRECT3DDEVICE9EX : public LPDIRECT3DDEVICE9
+{
+    HRESULT SetConvolutionMonoKernel( UINT width,UINT height,float* rows,float* columns);
+    HRESULT ComposeRects( LPDIRECT3DSURFACE9 pSrc,LPDIRECT3DSURFACE9 pDst,LPDIRECT3DVERTEXBUFFER9 pSrcRectDescs,UINT NumRects,LPDIRECT3DVERTEXBUFFER9 pDstRectDescs,D3DCOMPOSERECTSOP Operation,int Xoffset,int Yoffset);
+    HRESULT PresentEx( RECT* pSourceRect, RECT* pDestRect,HWND hDestWindowOverride, RGNDATA* pDirtyRegion,DWORD dwFlags);
+    HRESULT GetGPUThreadPriority( INT* pPriority);
+    HRESULT SetGPUThreadPriority( INT Priority);
+    HRESULT WaitForVBlank( UINT iSwapChain);
+    HRESULT CheckResourceResidency( LPDIRECT3DRESOURCE9* pResourceArray,UINT32 NumResources);
+    HRESULT SetMaximumFrameLatency( UINT MaxLatency);
+    HRESULT GetMaximumFrameLatency( UINT* pMaxLatency);
+    HRESULT CheckDeviceState( HWND hDestinationWindow);
+    HRESULT CreateRenderTargetEx( UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,DWORD MultisampleQuality,BOOL Lockable,LPDIRECT3DSURFACE9* ppSurface,HANDLE* pSharedHandle,DWORD Usage);
+    HRESULT CreateOffscreenPlainSurfaceEx( UINT Width,UINT Height,D3DFORMAT Format,D3DPOOL Pool,LPDIRECT3DSURFACE9* ppSurface,HANDLE* pSharedHandle,DWORD Usage);
+    HRESULT CreateDepthStencilSurfaceEx( UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,DWORD MultisampleQuality,BOOL Discard,LPDIRECT3DSURFACE9* ppSurface,HANDLE* pSharedHandle,DWORD Usage);
+    HRESULT ResetEx( D3DPRESENT_PARAMETERS* pPresentationParameters,D3DDISPLAYMODEEX *pFullscreenDisplayMode);
+    HRESULT GetDisplayModeEx( UINT iSwapChain,D3DDISPLAYMODEEX* pMode,D3DDISPLAYROTATION* pRotation);
+}
+
+alias LPDIRECT3DDEVICE9EX IDirect3DDevice9Ex;
+
+interface LPDIRECT3DSWAPCHAIN9EX : public LPDIRECT3DSWAPCHAIN9
+{
+    HRESULT GetLastPresentCount( UINT* pLastPresentCount);
+    HRESULT GetPresentStats( D3DPRESENTSTATS* pPresentationStatistics);
+    HRESULT GetDisplayModeEx( D3DDISPLAYMODEEX* pMode,D3DDISPLAYROTATION* pRotation);
+}
+
+alias LPDIRECT3DSWAPCHAIN9EX IDirect3DSwapChain9Ex;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/d3d9.def	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,2 @@
+IMPORTS
+_Direct3DCreate9@4 = d3d9.Direct3DCreate9
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/d3d9caps.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,472 @@
+/*==========================================================================;
+ *
+ *  Copyright (C) Microsoft Corporation.  All Rights Reserved.
+ *
+ *  File:       d3d9caps.h
+ *  Content:    Direct3D capabilities include file
+ *
+ ***************************************************************************/
+
+module win32.directx.d3d9caps;
+
+private import win32.windows,
+               win32.directx.d3d9types;
+
+align(4):
+
+struct D3DVSHADERCAPS2_0
+{
+        DWORD Caps;
+        INT DynamicFlowControlDepth;
+        INT NumTemps;
+        INT StaticFlowControlDepth;
+}
+
+const D3DVS20CAPS_PREDICATION = (1<<0);
+
+const D3DVS20_MAX_DYNAMICFLOWCONTROLDEPTH = 24;
+const D3DVS20_MIN_DYNAMICFLOWCONTROLDEPTH = 0;
+const D3DVS20_MAX_NUMTEMPS = 32;
+const D3DVS20_MIN_NUMTEMPS = 12;
+const D3DVS20_MAX_STATICFLOWCONTROLDEPTH = 4;
+const D3DVS20_MIN_STATICFLOWCONTROLDEPTH = 1;
+
+struct D3DPSHADERCAPS2_0
+{
+    DWORD Caps;
+    INT DynamicFlowControlDepth;
+    INT NumTemps;
+    INT StaticFlowControlDepth;
+    INT NumInstructionSlots;
+}
+
+const D3DPS20CAPS_ARBITRARYSWIZZLE = (1<<0);
+const D3DPS20CAPS_GRADIENTINSTRUCTIONS = (1<<1);
+const D3DPS20CAPS_PREDICATION = (1<<2);
+const D3DPS20CAPS_NODEPENDENTREADLIMIT = (1<<3);
+const D3DPS20CAPS_NOTEXINSTRUCTIONLIMIT = (1<<4);
+
+const D3DPS20_MAX_DYNAMICFLOWCONTROLDEPTH = 24;
+const D3DPS20_MIN_DYNAMICFLOWCONTROLDEPTH = 0;
+const D3DPS20_MAX_NUMTEMPS = 32;
+const D3DPS20_MIN_NUMTEMPS = 12;
+const D3DPS20_MAX_STATICFLOWCONTROLDEPTH = 4;
+const D3DPS20_MIN_STATICFLOWCONTROLDEPTH = 0;
+const D3DPS20_MAX_NUMINSTRUCTIONSLOTS = 512;
+const D3DPS20_MIN_NUMINSTRUCTIONSLOTS = 96;
+
+const D3DMIN30SHADERINSTRUCTIONS = 512;
+const D3DMAX30SHADERINSTRUCTIONS = 32768;
+
+struct D3DCAPS9
+{
+    /* Device Info */
+    D3DDEVTYPE  DeviceType;
+    UINT        AdapterOrdinal;
+
+    /* Caps from DX7 Draw */
+    DWORD   Caps;
+    DWORD   Caps2;
+    DWORD   Caps3;
+    DWORD   PresentationIntervals;
+
+    /* Cursor Caps */
+    DWORD   CursorCaps;
+
+    /* 3D Device Caps */
+    DWORD   DevCaps;
+
+    DWORD   PrimitiveMiscCaps;
+    DWORD   RasterCaps;
+    DWORD   ZCmpCaps;
+    DWORD   SrcBlendCaps;
+    DWORD   DestBlendCaps;
+    DWORD   AlphaCmpCaps;
+    DWORD   ShadeCaps;
+    DWORD   TextureCaps;
+    DWORD   TextureFilterCaps;          // D3DPTFILTERCAPS for IDirect3DTexture9's
+    DWORD   CubeTextureFilterCaps;      // D3DPTFILTERCAPS for IDirect3DCubeTexture9's
+    DWORD   VolumeTextureFilterCaps;    // D3DPTFILTERCAPS for IDirect3DVolumeTexture9's
+    DWORD   TextureAddressCaps;         // D3DPTADDRESSCAPS for IDirect3DTexture9's
+    DWORD   VolumeTextureAddressCaps;   // D3DPTADDRESSCAPS for IDirect3DVolumeTexture9's
+
+    DWORD   LineCaps;                   // D3DLINECAPS
+
+    DWORD   MaxTextureWidth, MaxTextureHeight;
+    DWORD   MaxVolumeExtent;
+
+    DWORD   MaxTextureRepeat;
+    DWORD   MaxTextureAspectRatio;
+    DWORD   MaxAnisotropy;
+    float   MaxVertexW;
+
+    float   GuardBandLeft;
+    float   GuardBandTop;
+    float   GuardBandRight;
+    float   GuardBandBottom;
+
+    float   ExtentsAdjust;
+    DWORD   StencilCaps;
+
+    DWORD   FVFCaps;
+    DWORD   TextureOpCaps;
+    DWORD   MaxTextureBlendStages;
+    DWORD   MaxSimultaneousTextures;
+
+    DWORD   VertexProcessingCaps;
+    DWORD   MaxActiveLights;
+    DWORD   MaxUserClipPlanes;
+    DWORD   MaxVertexBlendMatrices;
+    DWORD   MaxVertexBlendMatrixIndex;
+
+    float   MaxPointSize;
+
+    DWORD   MaxPrimitiveCount;          // max number of primitives per DrawPrimitive call
+    DWORD   MaxVertexIndex;
+    DWORD   MaxStreams;
+    DWORD   MaxStreamStride;            // max stride for SetStreamSource
+
+    DWORD   VertexShaderVersion;
+    DWORD   MaxVertexShaderConst;       // number of vertex shader constant registers
+
+    DWORD   PixelShaderVersion;
+    float   PixelShader1xMaxValue;      // max value storable in registers of ps.1.x shaders
+
+    // Here are the DX9 specific ones
+    DWORD   DevCaps2;
+
+    float   MaxNpatchTessellationLevel;
+    DWORD   Reserved5;
+
+    UINT    MasterAdapterOrdinal;       // ordinal of master adaptor for adapter group
+    UINT    AdapterOrdinalInGroup;      // ordinal inside the adapter group
+    UINT    NumberOfAdaptersInGroup;    // number of adapters in this adapter group (only if master)
+    DWORD   DeclTypes;                  // Data types, supported in vertex declarations
+    DWORD   NumSimultaneousRTs;         // Will be at least 1
+    DWORD   StretchRectFilterCaps;      // Filter caps supported by StretchRect
+    D3DVSHADERCAPS2_0 VS20Caps;
+    D3DPSHADERCAPS2_0 PS20Caps;
+    DWORD   VertexTextureFilterCaps;    // D3DPTFILTERCAPS for IDirect3DTexture9's for texture, used in vertex shaders
+    DWORD   MaxVShaderInstructionsExecuted; // maximum number of vertex shader instructions that can be executed
+    DWORD   MaxPShaderInstructionsExecuted; // maximum number of pixel shader instructions that can be executed
+    DWORD   MaxVertexShader30InstructionSlots; 
+    DWORD   MaxPixelShader30InstructionSlots;
+}
+
+//
+// BIT DEFINES FOR D3DCAPS9 DWORD MEMBERS
+//
+
+//
+// Caps
+//
+const D3DCAPS_READ_SCANLINE = 0x00020000L;
+
+//
+// Caps2
+//
+const D3DCAPS2_FULLSCREENGAMMA = 0x00020000L;
+const D3DCAPS2_CANCALIBRATEGAMMA = 0x00100000L;
+const D3DCAPS2_RESERVED = 0x02000000L;
+const D3DCAPS2_CANMANAGERESOURCE = 0x10000000L;
+const D3DCAPS2_DYNAMICTEXTURES = 0x20000000L;
+const D3DCAPS2_CANAUTOGENMIPMAP = 0x40000000L;
+
+const D3DCAPS2_CANSHARERESOURCE = 0x80000000L;
+
+//
+// Caps3
+//
+const D3DCAPS3_RESERVED = 0x8000001fL;
+
+// Indicates that the device can respect the ALPHABLENDENABLE render state
+// when fullscreen while using the FLIP or DISCARD swap effect.
+// COPY and COPYVSYNC swap effects work whether or not this flag is set.
+const D3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD = 0x00000020L;
+
+// Indicates that the device can perform a gamma correction from 
+// a windowed back buffer containing linear content to the sRGB desktop.
+const D3DCAPS3_LINEAR_TO_SRGB_PRESENTATION = 0x00000080L;
+
+const D3DCAPS3_COPY_TO_VIDMEM = 0x00000100L; /* Device can acclerate copies from sysmem to local vidmem */
+const D3DCAPS3_COPY_TO_SYSTEMMEM = 0x00000200L; /* Device can acclerate copies from local vidmem to sysmem */
+
+
+//
+// PresentationIntervals
+//
+const D3DPRESENT_INTERVAL_DEFAULT = 0x00000000L;
+const D3DPRESENT_INTERVAL_ONE = 0x00000001L;
+const D3DPRESENT_INTERVAL_TWO = 0x00000002L;
+const D3DPRESENT_INTERVAL_THREE = 0x00000004L;
+const D3DPRESENT_INTERVAL_FOUR = 0x00000008L;
+const D3DPRESENT_INTERVAL_IMMEDIATE = 0x80000000L;
+
+//
+// CursorCaps
+//
+// Driver supports HW color cursor in at least hi-res modes(height >=400)
+const D3DCURSORCAPS_COLOR = 0x00000001L;
+// Driver supports HW cursor also in low-res modes(height < 400)
+const D3DCURSORCAPS_LOWRES = 0x00000002L;
+
+//
+// DevCaps
+//
+const D3DDEVCAPS_EXECUTESYSTEMMEMORY = 0x00000010L; /* Device can use execute buffers from system memory */
+const D3DDEVCAPS_EXECUTEVIDEOMEMORY = 0x00000020L; /* Device can use execute buffers from video memory */
+const D3DDEVCAPS_TLVERTEXSYSTEMMEMORY = 0x00000040L; /* Device can use TL buffers from system memory */
+const D3DDEVCAPS_TLVERTEXVIDEOMEMORY = 0x00000080L; /* Device can use TL buffers from video memory */
+const D3DDEVCAPS_TEXTURESYSTEMMEMORY = 0x00000100L; /* Device can texture from system memory */
+const D3DDEVCAPS_TEXTUREVIDEOMEMORY = 0x00000200L; /* Device can texture from device memory */
+const D3DDEVCAPS_DRAWPRIMTLVERTEX = 0x00000400L; /* Device can draw TLVERTEX primitives */
+const D3DDEVCAPS_CANRENDERAFTERFLIP = 0x00000800L; /* Device can render without waiting for flip to complete */
+const D3DDEVCAPS_TEXTURENONLOCALVIDMEM = 0x00001000L; /* Device can texture from nonlocal video memory */
+const D3DDEVCAPS_DRAWPRIMITIVES2 = 0x00002000L; /* Device can support DrawPrimitives2 */
+const D3DDEVCAPS_SEPARATETEXTUREMEMORIES = 0x00004000L; /* Device is texturing from separate memory pools */
+const D3DDEVCAPS_DRAWPRIMITIVES2EX = 0x00008000L; /* Device can support Extended DrawPrimitives2 i.e. DX7 compliant driver*/
+const D3DDEVCAPS_HWTRANSFORMANDLIGHT = 0x00010000L; /* Device can support transformation and lighting in hardware and DRAWPRIMITIVES2EX must be also */
+const D3DDEVCAPS_CANBLTSYSTONONLOCAL = 0x00020000L; /* Device supports a Tex Blt from system memory to non-local vidmem */
+const D3DDEVCAPS_HWRASTERIZATION = 0x00080000L; /* Device has HW acceleration for rasterization */
+const D3DDEVCAPS_PUREDEVICE = 0x00100000L; /* Device supports D3DCREATE_PUREDEVICE */
+const D3DDEVCAPS_QUINTICRTPATCHES = 0x00200000L; /* Device supports quintic Beziers and BSplines */
+const D3DDEVCAPS_RTPATCHES = 0x00400000L; /* Device supports Rect and Tri patches */
+const D3DDEVCAPS_RTPATCHHANDLEZERO = 0x00800000L; /* Indicates that RT Patches may be drawn efficiently using handle 0 */
+const D3DDEVCAPS_NPATCHES = 0x01000000L; /* Device supports N-Patches */
+
+//
+// PrimitiveMiscCaps
+//
+const D3DPMISCCAPS_MASKZ = 0x00000002L;
+const D3DPMISCCAPS_CULLNONE = 0x00000010L;
+const D3DPMISCCAPS_CULLCW = 0x00000020L;
+const D3DPMISCCAPS_CULLCCW = 0x00000040L;
+const D3DPMISCCAPS_COLORWRITEENABLE = 0x00000080L;
+const D3DPMISCCAPS_CLIPPLANESCALEDPOINTS = 0x00000100L; /* Device correctly clips scaled points to clip planes */
+const D3DPMISCCAPS_CLIPTLVERTS = 0x00000200L; /* device will clip post-transformed vertex primitives */
+const D3DPMISCCAPS_TSSARGTEMP = 0x00000400L; /* device supports D3DTA_TEMP for temporary register */
+const D3DPMISCCAPS_BLENDOP = 0x00000800L; /* device supports D3DRS_BLENDOP */
+const D3DPMISCCAPS_NULLREFERENCE = 0x00001000L; /* Reference Device that doesnt render */
+const D3DPMISCCAPS_INDEPENDENTWRITEMASKS = 0x00004000L; /* Device supports independent write masks for MET or MRT */
+const D3DPMISCCAPS_PERSTAGECONSTANT = 0x00008000L; /* Device supports per-stage constants */
+const D3DPMISCCAPS_FOGANDSPECULARALPHA = 0x00010000L; /* Device supports separate fog and specular alpha (many devices
+                                                          use the specular alpha channel to store fog factor) */
+const D3DPMISCCAPS_SEPARATEALPHABLEND = 0x00020000L; /* Device supports separate blend settings for the alpha channel */
+const D3DPMISCCAPS_MRTINDEPENDENTBITDEPTHS = 0x00040000L; /* Device supports different bit depths for MRT */
+const D3DPMISCCAPS_MRTPOSTPIXELSHADERBLENDING = 0x00080000L; /* Device supports post-pixel shader operations for MRT */
+const D3DPMISCCAPS_FOGVERTEXCLAMPED = 0x00100000L; /* Device clamps fog blend factor per vertex */
+
+const D3DPMISCCAPS_POSTBLENDSRGBCONVERT = 0x00200000L; /* Indicates device can perform conversion to sRGB after blending. */
+
+//
+// LineCaps
+//
+const D3DLINECAPS_TEXTURE = 0x00000001L;
+const D3DLINECAPS_ZTEST = 0x00000002L;
+const D3DLINECAPS_BLEND = 0x00000004L;
+const D3DLINECAPS_ALPHACMP = 0x00000008L;
+const D3DLINECAPS_FOG = 0x00000010L;
+const D3DLINECAPS_ANTIALIAS = 0x00000020L;
+
+//
+// RasterCaps
+//
+const D3DPRASTERCAPS_DITHER = 0x00000001L;
+const D3DPRASTERCAPS_ZTEST = 0x00000010L;
+const D3DPRASTERCAPS_FOGVERTEX = 0x00000080L;
+const D3DPRASTERCAPS_FOGTABLE = 0x00000100L;
+const D3DPRASTERCAPS_MIPMAPLODBIAS = 0x00002000L;
+const D3DPRASTERCAPS_ZBUFFERLESSHSR = 0x00008000L;
+const D3DPRASTERCAPS_FOGRANGE = 0x00010000L;
+const D3DPRASTERCAPS_ANISOTROPY = 0x00020000L;
+const D3DPRASTERCAPS_WBUFFER = 0x00040000L;
+const D3DPRASTERCAPS_WFOG = 0x00100000L;
+const D3DPRASTERCAPS_ZFOG = 0x00200000L;
+const D3DPRASTERCAPS_COLORPERSPECTIVE = 0x00400000L; /* Device iterates colors perspective correct */
+const D3DPRASTERCAPS_SCISSORTEST = 0x01000000L;
+const D3DPRASTERCAPS_SLOPESCALEDEPTHBIAS = 0x02000000L;
+const D3DPRASTERCAPS_DEPTHBIAS = 0x04000000L; 
+const D3DPRASTERCAPS_MULTISAMPLE_TOGGLE = 0x08000000L;
+
+//
+// ZCmpCaps, AlphaCmpCaps
+//
+const D3DPCMPCAPS_NEVER = 0x00000001L;
+const D3DPCMPCAPS_LESS = 0x00000002L;
+const D3DPCMPCAPS_EQUAL = 0x00000004L;
+const D3DPCMPCAPS_LESSEQUAL = 0x00000008L;
+const D3DPCMPCAPS_GREATER = 0x00000010L;
+const D3DPCMPCAPS_NOTEQUAL = 0x00000020L;
+const D3DPCMPCAPS_GREATEREQUAL = 0x00000040L;
+const D3DPCMPCAPS_ALWAYS = 0x00000080L;
+
+//
+// SourceBlendCaps, DestBlendCaps
+//
+const D3DPBLENDCAPS_ZERO = 0x00000001L;
+const D3DPBLENDCAPS_ONE = 0x00000002L;
+const D3DPBLENDCAPS_SRCCOLOR = 0x00000004L;
+const D3DPBLENDCAPS_INVSRCCOLOR = 0x00000008L;
+const D3DPBLENDCAPS_SRCALPHA = 0x00000010L;
+const D3DPBLENDCAPS_INVSRCALPHA = 0x00000020L;
+const D3DPBLENDCAPS_DESTALPHA = 0x00000040L;
+const D3DPBLENDCAPS_INVDESTALPHA = 0x00000080L;
+const D3DPBLENDCAPS_DESTCOLOR = 0x00000100L;
+const D3DPBLENDCAPS_INVDESTCOLOR = 0x00000200L;
+const D3DPBLENDCAPS_SRCALPHASAT = 0x00000400L;
+const D3DPBLENDCAPS_BOTHSRCALPHA = 0x00000800L;
+const D3DPBLENDCAPS_BOTHINVSRCALPHA = 0x00001000L;
+const D3DPBLENDCAPS_BLENDFACTOR = 0x00002000L; /* Supports both D3DBLEND_BLENDFACTOR and D3DBLEND_INVBLENDFACTOR */
+
+const D3DPBLENDCAPS_SRCCOLOR2 = 0x00004000L;
+const D3DPBLENDCAPS_INVSRCCOLOR2 = 0x00008000L;
+
+//
+// ShadeCaps
+//
+const D3DPSHADECAPS_COLORGOURAUDRGB = 0x00000008L;
+const D3DPSHADECAPS_SPECULARGOURAUDRGB = 0x00000200L;
+const D3DPSHADECAPS_ALPHAGOURAUDBLEND = 0x00004000L;
+const D3DPSHADECAPS_FOGGOURAUD = 0x00080000L;
+
+//
+// TextureCaps
+//
+const D3DPTEXTURECAPS_PERSPECTIVE = 0x00000001L; /* Perspective-correct texturing is supported */
+const D3DPTEXTURECAPS_POW2 = 0x00000002L; /* Power-of-2 texture dimensions are required - applies to non-Cube/Volume textures only. */
+const D3DPTEXTURECAPS_ALPHA = 0x00000004L; /* Alpha in texture pixels is supported */
+const D3DPTEXTURECAPS_SQUAREONLY = 0x00000020L; /* Only square textures are supported */
+const D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE = 0x00000040L; /* Texture indices are not scaled by the texture size prior to interpolation */
+const D3DPTEXTURECAPS_ALPHAPALETTE = 0x00000080L; /* Device can draw alpha from texture palettes */
+// Device can use non-POW2 textures if:
+//  1) D3DTEXTURE_ADDRESS is set to CLAMP for this texture's stage
+//  2) D3DRS_WRAP(N) is zero for this texture's coordinates
+//  3) mip mapping is not enabled (use magnification filter only)
+const D3DPTEXTURECAPS_NONPOW2CONDITIONAL = 0x00000100L;
+const D3DPTEXTURECAPS_PROJECTED = 0x00000400L; /* Device can do D3DTTFF_PROJECTED */
+const D3DPTEXTURECAPS_CUBEMAP = 0x00000800L; /* Device can do cubemap textures */
+const D3DPTEXTURECAPS_VOLUMEMAP = 0x00002000L; /* Device can do volume textures */
+const D3DPTEXTURECAPS_MIPMAP = 0x00004000L; /* Device can do mipmapped textures */
+const D3DPTEXTURECAPS_MIPVOLUMEMAP = 0x00008000L; /* Device can do mipmapped volume textures */
+const D3DPTEXTURECAPS_MIPCUBEMAP = 0x00010000L; /* Device can do mipmapped cube maps */
+const D3DPTEXTURECAPS_CUBEMAP_POW2 = 0x00020000L; /* Device requires that cubemaps be power-of-2 dimension */
+const D3DPTEXTURECAPS_VOLUMEMAP_POW2 = 0x00040000L; /* Device requires that volume maps be power-of-2 dimension */
+const D3DPTEXTURECAPS_NOPROJECTEDBUMPENV = 0x00200000L; /* Device does not support projected bump env lookup operation 
+                                                           in programmable and fixed function pixel shaders */
+
+//
+// TextureFilterCaps, StretchRectFilterCaps
+//
+const D3DPTFILTERCAPS_MINFPOINT = 0x00000100L; /* Min Filter */
+const D3DPTFILTERCAPS_MINFLINEAR = 0x00000200L;
+const D3DPTFILTERCAPS_MINFANISOTROPIC = 0x00000400L;
+const D3DPTFILTERCAPS_MINFPYRAMIDALQUAD = 0x00000800L;
+const D3DPTFILTERCAPS_MINFGAUSSIANQUAD = 0x00001000L;
+const D3DPTFILTERCAPS_MIPFPOINT = 0x00010000L; /* Mip Filter */
+const D3DPTFILTERCAPS_MIPFLINEAR = 0x00020000L;
+
+const D3DPTFILTERCAPS_CONVOLUTIONMONO = 0x00040000L; /* Min and Mag for the convolution mono filter */
+
+const D3DPTFILTERCAPS_MAGFPOINT = 0x01000000L; /* Mag Filter */
+const D3DPTFILTERCAPS_MAGFLINEAR = 0x02000000L;
+const D3DPTFILTERCAPS_MAGFANISOTROPIC = 0x04000000L;
+const D3DPTFILTERCAPS_MAGFPYRAMIDALQUAD = 0x08000000L;
+const D3DPTFILTERCAPS_MAGFGAUSSIANQUAD = 0x10000000L;
+
+//
+// TextureAddressCaps
+//
+const D3DPTADDRESSCAPS_WRAP = 0x00000001L;
+const D3DPTADDRESSCAPS_MIRROR = 0x00000002L;
+const D3DPTADDRESSCAPS_CLAMP = 0x00000004L;
+const D3DPTADDRESSCAPS_BORDER = 0x00000008L;
+const D3DPTADDRESSCAPS_INDEPENDENTUV = 0x00000010L;
+const D3DPTADDRESSCAPS_MIRRORONCE = 0x00000020L;
+
+//
+// StencilCaps
+//
+const D3DSTENCILCAPS_KEEP = 0x00000001L;
+const D3DSTENCILCAPS_ZERO = 0x00000002L;
+const D3DSTENCILCAPS_REPLACE = 0x00000004L;
+const D3DSTENCILCAPS_INCRSAT = 0x00000008L;
+const D3DSTENCILCAPS_DECRSAT = 0x00000010L;
+const D3DSTENCILCAPS_INVERT = 0x00000020L;
+const D3DSTENCILCAPS_INCR = 0x00000040L;
+const D3DSTENCILCAPS_DECR = 0x00000080L;
+const D3DSTENCILCAPS_TWOSIDED = 0x00000100L;
+
+//
+// TextureOpCaps
+//
+const D3DTEXOPCAPS_DISABLE = 0x00000001L;
+const D3DTEXOPCAPS_SELECTARG1 = 0x00000002L;
+const D3DTEXOPCAPS_SELECTARG2 = 0x00000004L;
+const D3DTEXOPCAPS_MODULATE = 0x00000008L;
+const D3DTEXOPCAPS_MODULATE2X = 0x00000010L;
+const D3DTEXOPCAPS_MODULATE4X = 0x00000020L;
+const D3DTEXOPCAPS_ADD = 0x00000040L;
+const D3DTEXOPCAPS_ADDSIGNED = 0x00000080L;
+const D3DTEXOPCAPS_ADDSIGNED2X = 0x00000100L;
+const D3DTEXOPCAPS_SUBTRACT = 0x00000200L;
+const D3DTEXOPCAPS_ADDSMOOTH = 0x00000400L;
+const D3DTEXOPCAPS_BLENDDIFFUSEALPHA = 0x00000800L;
+const D3DTEXOPCAPS_BLENDTEXTUREALPHA = 0x00001000L;
+const D3DTEXOPCAPS_BLENDFACTORALPHA = 0x00002000L;
+const D3DTEXOPCAPS_BLENDTEXTUREALPHAPM = 0x00004000L;
+const D3DTEXOPCAPS_BLENDCURRENTALPHA = 0x00008000L;
+const D3DTEXOPCAPS_PREMODULATE = 0x00010000L;
+const D3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR = 0x00020000L;
+const D3DTEXOPCAPS_MODULATECOLOR_ADDALPHA = 0x00040000L;
+const D3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR = 0x00080000L;
+const D3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA = 0x00100000L;
+const D3DTEXOPCAPS_BUMPENVMAP = 0x00200000L;
+const D3DTEXOPCAPS_BUMPENVMAPLUMINANCE = 0x00400000L;
+const D3DTEXOPCAPS_DOTPRODUCT3 = 0x00800000L;
+const D3DTEXOPCAPS_MULTIPLYADD = 0x01000000L;
+const D3DTEXOPCAPS_LERP = 0x02000000L;
+
+//
+// FVFCaps
+//
+const D3DFVFCAPS_TEXCOORDCOUNTMASK = 0x0000ffffL; /* mask for texture coordinate count field */
+const D3DFVFCAPS_DONOTSTRIPELEMENTS = 0x00080000L; /* Device prefers that vertex elements not be stripped */
+const D3DFVFCAPS_PSIZE = 0x00100000L; /* Device can receive point size */
+
+//
+// VertexProcessingCaps
+//
+const D3DVTXPCAPS_TEXGEN = 0x00000001L; /* device can do texgen */
+const D3DVTXPCAPS_MATERIALSOURCE7 = 0x00000002L; /* device can do DX7-level colormaterialsource ops */
+const D3DVTXPCAPS_DIRECTIONALLIGHTS = 0x00000008L; /* device can do directional lights */
+const D3DVTXPCAPS_POSITIONALLIGHTS = 0x00000010L; /* device can do positional lights (includes point and spot) */
+const D3DVTXPCAPS_LOCALVIEWER = 0x00000020L; /* device can do local viewer */
+const D3DVTXPCAPS_TWEENING = 0x00000040L; /* device can do vertex tweening */
+const D3DVTXPCAPS_TEXGEN_SPHEREMAP = 0x00000100L; /* device supports D3DTSS_TCI_SPHEREMAP */
+const D3DVTXPCAPS_NO_TEXGEN_NONLOCALVIEWER = 0x00000200L; /* device does not support TexGen in non-local
+                                                            viewer mode */
+
+//
+// DevCaps2
+//
+const D3DDEVCAPS2_STREAMOFFSET = 0x00000001L; /* Device supports offsets in streams. Must be set by DX9 drivers */
+const D3DDEVCAPS2_DMAPNPATCH = 0x00000002L; /* Device supports displacement maps for N-Patches*/
+const D3DDEVCAPS2_ADAPTIVETESSRTPATCH = 0x00000004L; /* Device supports adaptive tesselation of RT-patches*/
+const D3DDEVCAPS2_ADAPTIVETESSNPATCH = 0x00000008L; /* Device supports adaptive tesselation of N-patches*/
+const D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES = 0x00000010L; /* Device supports StretchRect calls with a texture as the source*/
+const D3DDEVCAPS2_PRESAMPLEDDMAPNPATCH = 0x00000020L; /* Device supports presampled displacement maps for N-Patches */
+const D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET = 0x00000040L; /* Vertex elements in a vertex declaration can share the same stream offset */
+
+//
+// DeclTypes
+//
+const D3DDTCAPS_UBYTE4 = 0x00000001L;
+const D3DDTCAPS_UBYTE4N = 0x00000002L;
+const D3DDTCAPS_SHORT2N = 0x00000004L;
+const D3DDTCAPS_SHORT4N = 0x00000008L;
+const D3DDTCAPS_USHORT2N = 0x00000010L;
+const D3DDTCAPS_USHORT4N = 0x00000020L;
+const D3DDTCAPS_UDEC3 = 0x00000040L;
+const D3DDTCAPS_DEC3N = 0x00000080L;
+const D3DDTCAPS_FLOAT16_2 = 0x00000100L;
+const D3DDTCAPS_FLOAT16_4 = 0x00000200L;
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/d3d9types.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,1846 @@
+/*==========================================================================;
+ *
+ *  Copyright (C) Microsoft Corporation.  All Rights Reserved.
+ *
+ *  File:       d3d9types.h
+ *  Content:    Direct3D capabilities include file
+ *
+ ***************************************************************************/
+
+module win32.directx.d3d9types;
+
+private import win32.windows;
+
+// Alignment compatibility
+align(4):
+
+// D3DCOLOR is equivalent to D3DFMT_A8R8G8B8
+typedef uint D3DCOLOR;
+
+// maps unsigned 8 bits/channel to D3DCOLOR
+D3DCOLOR D3DCOLOR_ARGB(ubyte a,ubyte r,ubyte g,ubyte b) { return cast(D3DCOLOR)((a<<24)|(r<<16)|(g<<8)|b); }
+D3DCOLOR D3DCOLOR_RGBA(ubyte r,ubyte g,ubyte b,ubyte a) { return D3DCOLOR_ARGB(a,r,g,b); }
+D3DCOLOR D3DCOLOR_XRGB(ubyte r,ubyte g,ubyte b) { return D3DCOLOR_ARGB(0xff,r,g,b); }
+
+D3DCOLOR D3DCOLOR_XYUV(ubyte y, ubyte u, ubyte v) { return D3DCOLOR_ARGB(0xff,y,u,v); }
+D3DCOLOR D3DCOLOR_AYUV( ubyte a, ubyte y, ubyte u, ubyte v) { return D3DCOLOR_ARGB(a,y,u,v); }
+
+// maps floating point channels (0.f to 1.f range) to D3DCOLOR
+D3DCOLOR D3DCOLOR_COLORVALUE(float r, float g, float b, float a) { return D3DCOLOR_RGBA(cast(ubyte)(r*255.0f),cast(ubyte)(g*255.0f),cast(ubyte)(b*255.0f),cast(ubyte)(a*255.0f)); }
+
+struct D3DVECTOR {
+    float x;
+    float y;
+    float z;
+}
+
+struct D3DCOLORVALUE {
+    float r;
+    float g;
+    float b;
+    float a;
+}
+
+struct D3DRECT {
+    LONG x1;
+    LONG y1;
+    LONG x2;
+    LONG y2;
+}
+
+struct D3DMATRIX {
+    union {
+        struct {
+            float        _11, _12, _13, _14;
+            float        _21, _22, _23, _24;
+            float        _31, _32, _33, _34;
+            float        _41, _42, _43, _44;
+        }
+        float[4][4] m;
+    }
+}
+
+struct D3DVIEWPORT9 {
+    uint        X;
+    uint        Y;            /* Viewport Top left */
+    uint        Width;
+    uint        Height;       /* Viewport Dimensions */
+    float       MinZ;         /* Min/max of clip Volume */
+    float       MaxZ;
+}
+
+/*
+ * Values for clip fields.
+ */
+
+// Max number of user clipping planes, supported in D3D.
+const D3DMAXUSERCLIPPLANES = 32;
+
+// These bits could be ORed together to use with D3DRS_CLIPPLANEENABLE
+//
+const D3DCLIPPLANE0 = (1<<0);
+const D3DCLIPPLANE1 = (1<<1);
+const D3DCLIPPLANE2 = (1<<2);
+const D3DCLIPPLANE3 = (1<<3);
+const D3DCLIPPLANE4 = (1<<4);
+const D3DCLIPPLANE5 = (1<<5);
+
+// The following bits are used in the ClipUnion and ClipIntersection
+// members of the D3DCLIPSTATUS9
+//
+
+const D3DCS_LEFT = 0x00000001L;
+const D3DCS_RIGHT = 0x00000002L;
+const D3DCS_TOP = 0x00000004L;
+const D3DCS_BOTTOM = 0x00000008L;
+const D3DCS_FRONT = 0x00000010L;
+const D3DCS_BACK = 0x00000020L;
+const D3DCS_PLANE0 = 0x00000040L;
+const D3DCS_PLANE1 = 0x00000080L;
+const D3DCS_PLANE2 = 0x00000100L;
+const D3DCS_PLANE3 = 0x00000200L;
+const D3DCS_PLANE4 = 0x00000400L;
+const D3DCS_PLANE5 = 0x00000800L;
+
+const D3DCS_ALL = D3DCS_LEFT   |
+                  D3DCS_RIGHT  |
+                  D3DCS_TOP    |
+                  D3DCS_BOTTOM |
+                  D3DCS_FRONT  |
+                  D3DCS_BACK   |
+                  D3DCS_PLANE0 |
+                  D3DCS_PLANE1 |
+                  D3DCS_PLANE2 |
+                  D3DCS_PLANE3 |
+                  D3DCS_PLANE4 |
+                  D3DCS_PLANE5;
+
+struct D3DCLIPSTATUS9 {
+    uint ClipUnion;
+    uint ClipIntersection;
+}
+
+struct D3DMATERIAL9 {
+    D3DCOLORVALUE   Diffuse;        /* Diffuse color RGBA */
+    D3DCOLORVALUE   Ambient;        /* Ambient color RGB */
+    D3DCOLORVALUE   Specular;       /* Specular 'shininess' */
+    D3DCOLORVALUE   Emissive;       /* Emissive color RGB */
+    float           Power;          /* Sharpness if specular highlight */
+}
+
+enum : uint {
+    D3DLIGHT_POINT          = 1,
+    D3DLIGHT_SPOT           = 2,
+    D3DLIGHT_DIRECTIONAL    = 3
+}
+typedef uint D3DLIGHTTYPE;
+
+struct D3DLIGHT9 {
+    D3DLIGHTTYPE    Type;            /* Type of light source */
+    D3DCOLORVALUE   Diffuse;         /* Diffuse color of light */
+    D3DCOLORVALUE   Specular;        /* Specular color of light */
+    D3DCOLORVALUE   Ambient;         /* Ambient color of light */
+    D3DVECTOR       Position;         /* Position in world space */
+    D3DVECTOR       Direction;        /* Direction in world space */
+    float           Range;            /* Cutoff range */
+    float           Falloff;          /* Falloff */
+    float           Attenuation0;     /* Constant attenuation */
+    float           Attenuation1;     /* Linear attenuation */
+    float           Attenuation2;     /* Quadratic attenuation */
+    float           Theta;            /* Inner angle of spotlight cone */
+    float           Phi;              /* Outer angle of spotlight cone */
+}
+
+/*
+ * Options for clearing
+ */
+const D3DCLEAR_TARGET = 0x00000001L;  /* Clear target surface */
+const D3DCLEAR_ZBUFFER = 0x00000002L;  /* Clear target z buffer */
+const D3DCLEAR_STENCIL = 0x00000004L;  /* Clear stencil planes */
+
+/*
+ * The following defines the rendering states
+ */
+
+enum : D3DSHADEMODE {
+    D3DSHADE_FLAT               = 1,
+    D3DSHADE_GOURAUD            = 2,
+    D3DSHADE_PHONG              = 3
+} 
+typedef uint D3DSHADEMODE;
+
+enum : D3DFILLMODE {
+    D3DFILL_POINT               = 1,
+    D3DFILL_WIREFRAME           = 2,
+    D3DFILL_SOLID               = 3
+}
+typedef uint D3DFILLMODE;
+
+enum : D3DBLEND {
+    D3DBLEND_ZERO               = 1,
+    D3DBLEND_ONE                = 2,
+    D3DBLEND_SRCCOLOR           = 3,
+    D3DBLEND_INVSRCCOLOR        = 4,
+    D3DBLEND_SRCALPHA           = 5,
+    D3DBLEND_INVSRCALPHA        = 6,
+    D3DBLEND_DESTALPHA          = 7,
+    D3DBLEND_INVDESTALPHA       = 8,
+    D3DBLEND_DESTCOLOR          = 9,
+    D3DBLEND_INVDESTCOLOR       = 10,
+    D3DBLEND_SRCALPHASAT        = 11,
+    D3DBLEND_BOTHSRCALPHA       = 12,
+    D3DBLEND_BOTHINVSRCALPHA    = 13,
+    D3DBLEND_BLENDFACTOR        = 14, /* Only supported if D3DPBLENDCAPS_BLENDFACTOR is on */
+    D3DBLEND_INVBLENDFACTOR     = 15, /* Only supported if D3DPBLENDCAPS_BLENDFACTOR is on */
+    D3DBLEND_SRCCOLOR2          = 16,
+    D3DBLEND_INVSRCCOLOR2       = 17
+}
+typedef uint D3DBLEND;
+
+enum : D3DBLENDOP {
+    D3DBLENDOP_ADD              = 1,
+    D3DBLENDOP_SUBTRACT         = 2,
+    D3DBLENDOP_REVSUBTRACT      = 3,
+    D3DBLENDOP_MIN              = 4,
+    D3DBLENDOP_MAX              = 5
+}
+typedef uint D3DBLENDOP;
+
+enum : D3DTEXTUREADDRESS {
+    D3DTADDRESS_WRAP            = 1,
+    D3DTADDRESS_MIRROR          = 2,
+    D3DTADDRESS_CLAMP           = 3,
+    D3DTADDRESS_BORDER          = 4,
+    D3DTADDRESS_MIRRORONCE      = 5
+}
+typedef uint D3DTEXTUREADDRESS;
+
+enum : D3DCULL {
+    D3DCULL_NONE                = 1,
+    D3DCULL_CW                  = 2,
+    D3DCULL_CCW                 = 3
+}
+typedef uint D3DCULL;
+
+enum : D3DCMPFUNC {
+    D3DCMP_NEVER                = 1,
+    D3DCMP_LESS                 = 2,
+    D3DCMP_EQUAL                = 3,
+    D3DCMP_LESSEQUAL            = 4,
+    D3DCMP_GREATER              = 5,
+    D3DCMP_NOTEQUAL             = 6,
+    D3DCMP_GREATEREQUAL         = 7,
+    D3DCMP_ALWAYS               = 8
+}
+typedef uint D3DCMPFUNC;
+
+enum : D3DSTENCILOP {
+    D3DSTENCILOP_KEEP           = 1,
+    D3DSTENCILOP_ZERO           = 2,
+    D3DSTENCILOP_REPLACE        = 3,
+    D3DSTENCILOP_INCRSAT        = 4,
+    D3DSTENCILOP_DECRSAT        = 5,
+    D3DSTENCILOP_INVERT         = 6,
+    D3DSTENCILOP_INCR           = 7,
+    D3DSTENCILOP_DECR           = 8
+}
+typedef uint D3DSTENCILOP;
+
+enum : D3DFOGMODE {
+    D3DFOG_NONE                 = 0,
+    D3DFOG_EXP                  = 1,
+    D3DFOG_EXP2                 = 2,
+    D3DFOG_LINEAR               = 3
+}
+typedef uint D3DFOGMODE;
+
+enum : D3DZBUFFERTYPE {
+    D3DZB_FALSE                 = 0,
+    D3DZB_TRUE                  = 1, // Z buffering
+    D3DZB_USEW                  = 2 // W buffering
+}
+typedef uint D3DZBUFFERTYPE;
+
+// Primitives supported by draw-primitive API
+enum : D3DPRIMITIVETYPE {
+    D3DPT_POINTLIST             = 1,
+    D3DPT_LINELIST              = 2,
+    D3DPT_LINESTRIP             = 3,
+    D3DPT_TRIANGLELIST          = 4,
+    D3DPT_TRIANGLESTRIP         = 5,
+    D3DPT_TRIANGLEFAN           = 6
+}
+typedef uint D3DPRIMITIVETYPE;
+
+D3DTRANSFORMSTATETYPE D3DTS_WORLDMATRIX(uint index) { return cast(D3DTRANSFORMSTATETYPE)(index + 256); }
+template T_D3DTS_WORLDMATRIX(uint index) {
+    const D3DTRANSFORMSTATETYPE T_D3DTS_WORLDMATRIX = index + 256;
+}
+
+enum : D3DTRANSFORMSTATETYPE {
+    D3DTS_VIEW          = 2,
+    D3DTS_PROJECTION    = 3,
+    D3DTS_TEXTURE0      = 16,
+    D3DTS_TEXTURE1      = 17,
+    D3DTS_TEXTURE2      = 18,
+    D3DTS_TEXTURE3      = 19,
+    D3DTS_TEXTURE4      = 20,
+    D3DTS_TEXTURE5      = 21,
+    D3DTS_TEXTURE6      = 22,
+    D3DTS_TEXTURE7      = 23,
+    D3DTS_WORLD         = T_D3DTS_WORLDMATRIX!(0),
+    D3DTS_WORLD1        = T_D3DTS_WORLDMATRIX!(1),
+    D3DTS_WORLD2        = T_D3DTS_WORLDMATRIX!(2),
+    D3DTS_WORLD3        = T_D3DTS_WORLDMATRIX!(3)
+}
+typedef uint D3DTRANSFORMSTATETYPE;
+
+enum : D3DRENDERSTATETYPE {
+    D3DRS_ZENABLE                   = 7,    /* D3DZBUFFERTYPE (or TRUE/FALSE for legacy) */
+    D3DRS_FILLMODE                  = 8,    /* D3DFILLMODE */
+    D3DRS_SHADEMODE                 = 9,    /* D3DSHADEMODE */
+    D3DRS_ZWRITEENABLE              = 14,   /* TRUE to enable z writes */
+    D3DRS_ALPHATESTENABLE           = 15,   /* TRUE to enable alpha tests */
+    D3DRS_LASTPIXEL                 = 16,   /* TRUE for last-pixel on lines */
+    D3DRS_SRCBLEND                  = 19,   /* D3DBLEND */
+    D3DRS_DESTBLEND                 = 20,   /* D3DBLEND */
+    D3DRS_CULLMODE                  = 22,   /* D3DCULL */
+    D3DRS_ZFUNC                     = 23,   /* D3DCMPFUNC */
+    D3DRS_ALPHAREF                  = 24,   /* D3DFIXED */
+    D3DRS_ALPHAFUNC                 = 25,   /* D3DCMPFUNC */
+    D3DRS_DITHERENABLE              = 26,   /* TRUE to enable dithering */
+    D3DRS_ALPHABLENDENABLE          = 27,   /* TRUE to enable alpha blending */
+    D3DRS_FOGENABLE                 = 28,   /* TRUE to enable fog blending */
+    D3DRS_SPECULARENABLE            = 29,   /* TRUE to enable specular */
+    D3DRS_FOGCOLOR                  = 34,   /* D3DCOLOR */
+    D3DRS_FOGTABLEMODE              = 35,   /* D3DFOGMODE */
+    D3DRS_FOGSTART                  = 36,   /* Fog start (for both vertex and pixel fog) */
+    D3DRS_FOGEND                    = 37,   /* Fog end      */
+    D3DRS_FOGDENSITY                = 38,   /* Fog density  */
+    D3DRS_RANGEFOGENABLE            = 48,   /* Enables range-based fog */
+    D3DRS_STENCILENABLE             = 52,   /* BOOL enable/disable stenciling */
+    D3DRS_STENCILFAIL               = 53,   /* D3DSTENCILOP to do if stencil test fails */
+    D3DRS_STENCILZFAIL              = 54,   /* D3DSTENCILOP to do if stencil test passes and Z test fails */
+    D3DRS_STENCILPASS               = 55,   /* D3DSTENCILOP to do if both stencil and Z tests pass */
+    D3DRS_STENCILFUNC               = 56,   /* D3DCMPFUNC fn.  Stencil Test passes if ((ref & mask) stencilfn (stencil & mask)) is true */
+    D3DRS_STENCILREF                = 57,   /* Reference value used in stencil test */
+    D3DRS_STENCILMASK               = 58,   /* Mask value used in stencil test */
+    D3DRS_STENCILWRITEMASK          = 59,   /* Write mask applied to values written to stencil buffer */
+    D3DRS_TEXTUREFACTOR             = 60,   /* D3DCOLOR used for multi-texture blend */
+    D3DRS_WRAP0                     = 128,  /* wrap for 1st texture coord. set */
+    D3DRS_WRAP1                     = 129,  /* wrap for 2nd texture coord. set */
+    D3DRS_WRAP2                     = 130,  /* wrap for 3rd texture coord. set */
+    D3DRS_WRAP3                     = 131,  /* wrap for 4th texture coord. set */
+    D3DRS_WRAP4                     = 132,  /* wrap for 5th texture coord. set */
+    D3DRS_WRAP5                     = 133,  /* wrap for 6th texture coord. set */
+    D3DRS_WRAP6                     = 134,  /* wrap for 7th texture coord. set */
+    D3DRS_WRAP7                     = 135,  /* wrap for 8th texture coord. set */
+    D3DRS_CLIPPING                  = 136,
+    D3DRS_LIGHTING                  = 137,
+    D3DRS_AMBIENT                   = 139,
+    D3DRS_FOGVERTEXMODE             = 140,
+    D3DRS_COLORVERTEX               = 141,
+    D3DRS_LOCALVIEWER               = 142,
+    D3DRS_NORMALIZENORMALS          = 143,
+    D3DRS_DIFFUSEMATERIALSOURCE     = 145,
+    D3DRS_SPECULARMATERIALSOURCE    = 146,
+    D3DRS_AMBIENTMATERIALSOURCE     = 147,
+    D3DRS_EMISSIVEMATERIALSOURCE    = 148,
+    D3DRS_VERTEXBLEND               = 151,
+    D3DRS_CLIPPLANEENABLE           = 152,
+    D3DRS_POINTSIZE                 = 154,   /* float point size */
+    D3DRS_POINTSIZE_MIN             = 155,   /* float point size min threshold */
+    D3DRS_POINTSPRITEENABLE         = 156,   /* BOOL point texture coord control */
+    D3DRS_POINTSCALEENABLE          = 157,   /* BOOL point size scale enable */
+    D3DRS_POINTSCALE_A              = 158,   /* float point attenuation A value */
+    D3DRS_POINTSCALE_B              = 159,   /* float point attenuation B value */
+    D3DRS_POINTSCALE_C              = 160,   /* float point attenuation C value */
+    D3DRS_MULTISAMPLEANTIALIAS      = 161,  // BOOL - set to do FSAA with multisample buffer
+    D3DRS_MULTISAMPLEMASK           = 162,  // DWORD - per-sample enable/disable
+    D3DRS_PATCHEDGESTYLE            = 163,  // Sets whether patch edges will use float style tessellation
+    D3DRS_DEBUGMONITORTOKEN         = 165,  // DEBUG ONLY - token to debug monitor
+    D3DRS_POINTSIZE_MAX             = 166,   /* float point size max threshold */
+    D3DRS_INDEXEDVERTEXBLENDENABLE  = 167,
+    D3DRS_COLORWRITEENABLE          = 168,  // per-channel write enable
+    D3DRS_TWEENFACTOR               = 170,   // float tween factor
+    D3DRS_BLENDOP                   = 171,   // D3DBLENDOP setting
+    D3DRS_POSITIONDEGREE            = 172,   // NPatch position interpolation degree. D3DDEGREE_LINEAR or D3DDEGREE_CUBIC (default)
+    D3DRS_NORMALDEGREE              = 173,   // NPatch normal interpolation degree. D3DDEGREE_LINEAR (default) or D3DDEGREE_QUADRATIC
+    D3DRS_SCISSORTESTENABLE         = 174,
+    D3DRS_SLOPESCALEDEPTHBIAS       = 175,
+    D3DRS_ANTIALIASEDLINEENABLE     = 176,
+    D3DRS_MINTESSELLATIONLEVEL      = 178,
+    D3DRS_MAXTESSELLATIONLEVEL      = 179,
+    D3DRS_ADAPTIVETESS_X            = 180,
+    D3DRS_ADAPTIVETESS_Y            = 181,
+    D3DRS_ADAPTIVETESS_Z            = 182,
+    D3DRS_ADAPTIVETESS_W            = 183,
+    D3DRS_ENABLEADAPTIVETESSELLATION = 184,
+    D3DRS_TWOSIDEDSTENCILMODE       = 185,   /* BOOL enable/disable 2 sided stenciling */
+    D3DRS_CCW_STENCILFAIL           = 186,   /* D3DSTENCILOP to do if ccw stencil test fails */
+    D3DRS_CCW_STENCILZFAIL          = 187,   /* D3DSTENCILOP to do if ccw stencil test passes and Z test fails */
+    D3DRS_CCW_STENCILPASS           = 188,   /* D3DSTENCILOP to do if both ccw stencil and Z tests pass */
+    D3DRS_CCW_STENCILFUNC           = 189,   /* D3DCMPFUNC fn.  ccw Stencil Test passes if ((ref & mask) stencilfn (stencil & mask)) is true */
+    D3DRS_COLORWRITEENABLE1         = 190,   /* Additional ColorWriteEnables for the devices that support D3DPMISCCAPS_INDEPENDENTWRITEMASKS */
+    D3DRS_COLORWRITEENABLE2         = 191,   /* Additional ColorWriteEnables for the devices that support D3DPMISCCAPS_INDEPENDENTWRITEMASKS */
+    D3DRS_COLORWRITEENABLE3         = 192,   /* Additional ColorWriteEnables for the devices that support D3DPMISCCAPS_INDEPENDENTWRITEMASKS */
+    D3DRS_BLENDFACTOR               = 193,   /* D3DCOLOR used for a constant blend factor during alpha blending for devices that support D3DPBLENDCAPS_BLENDFACTOR */
+    D3DRS_SRGBWRITEENABLE           = 194,   /* Enable rendertarget writes to be DE-linearized to SRGB (for formats that expose D3DUSAGE_QUERY_SRGBWRITE) */
+    D3DRS_DEPTHBIAS                 = 195,
+    D3DRS_WRAP8                     = 198,   /* Additional wrap states for vs_3_0+ attributes with D3DDECLUSAGE_TEXCOORD */
+    D3DRS_WRAP9                     = 199,
+    D3DRS_WRAP10                    = 200,
+    D3DRS_WRAP11                    = 201,
+    D3DRS_WRAP12                    = 202,
+    D3DRS_WRAP13                    = 203,
+    D3DRS_WRAP14                    = 204,
+    D3DRS_WRAP15                    = 205,
+    D3DRS_SEPARATEALPHABLENDENABLE  = 206,  /* TRUE to enable a separate blending function for the alpha channel */
+    D3DRS_SRCBLENDALPHA             = 207,  /* SRC blend factor for the alpha channel when D3DRS_SEPARATEDESTALPHAENABLE is TRUE */
+    D3DRS_DESTBLENDALPHA            = 208,  /* DST blend factor for the alpha channel when D3DRS_SEPARATEDESTALPHAENABLE is TRUE */
+    D3DRS_BLENDOPALPHA              = 209   /* Blending operation for the alpha channel when D3DRS_SEPARATEDESTALPHAENABLE is TRUE */
+}
+typedef uint D3DRENDERSTATETYPE;
+
+// Maximum number of simultaneous render targets D3D supports
+const D3D_MAX_SIMULTANEOUS_RENDERTARGETS = 4;
+
+// Values for material source
+enum : D3DMATERIALCOLORSOURCE {
+    D3DMCS_MATERIAL         = 0,            // Color from material is used
+    D3DMCS_COLOR1           = 1,            // Diffuse vertex color is used
+    D3DMCS_COLOR2           = 2             // Specular vertex color is used
+}
+typedef uint D3DMATERIALCOLORSOURCE;
+
+// Bias to apply to the texture coordinate set to apply a wrap to.
+const D3DRENDERSTATE_WRAPBIAS = 128UL;
+
+/* Flags to construct the WRAP render states */
+const D3DWRAP_U = 0x00000001L;
+const D3DWRAP_V = 0x00000002L;
+const D3DWRAP_W = 0x00000004L;
+
+/* Flags to construct the WRAP render states for 1D thru 4D texture coordinates */
+const D3DWRAPCOORD_0 = 0x00000001L;    // same as D3DWRAP_U
+const D3DWRAPCOORD_1 = 0x00000002L;    // same as D3DWRAP_V
+const D3DWRAPCOORD_2 = 0x00000004L;    // same as D3DWRAP_W
+const D3DWRAPCOORD_3 = 0x00000008L;
+
+/* Flags to construct D3DRS_COLORWRITEENABLE */
+const D3DCOLORWRITEENABLE_RED = (1L<<0);
+const D3DCOLORWRITEENABLE_GREEN = (1L<<1);
+const D3DCOLORWRITEENABLE_BLUE = (1L<<2);
+const D3DCOLORWRITEENABLE_ALPHA = (1L<<3);
+
+/*
+ * State enumerants for per-stage processing of fixed function pixel processing
+ * Two of these affect fixed function vertex processing as well: TEXTURETRANSFORMFLAGS and TEXCOORDINDEX.
+ */
+enum : D3DTEXTURESTAGESTATETYPE {
+    D3DTSS_COLOROP        =  1, /* D3DTEXTUREOP - per-stage blending controls for color channels */
+    D3DTSS_COLORARG1      =  2, /* D3DTA_* (texture arg) */
+    D3DTSS_COLORARG2      =  3, /* D3DTA_* (texture arg) */
+    D3DTSS_ALPHAOP        =  4, /* D3DTEXTUREOP - per-stage blending controls for alpha channel */
+    D3DTSS_ALPHAARG1      =  5, /* D3DTA_* (texture arg) */
+    D3DTSS_ALPHAARG2      =  6, /* D3DTA_* (texture arg) */
+    D3DTSS_BUMPENVMAT00   =  7, /* float (bump mapping matrix) */
+    D3DTSS_BUMPENVMAT01   =  8, /* float (bump mapping matrix) */
+    D3DTSS_BUMPENVMAT10   =  9, /* float (bump mapping matrix) */
+    D3DTSS_BUMPENVMAT11   = 10, /* float (bump mapping matrix) */
+    D3DTSS_TEXCOORDINDEX  = 11, /* identifies which set of texture coordinates index this texture */
+    D3DTSS_BUMPENVLSCALE  = 22, /* float scale for bump map luminance */
+    D3DTSS_BUMPENVLOFFSET = 23, /* float offset for bump map luminance */
+    D3DTSS_TEXTURETRANSFORMFLAGS = 24, /* D3DTEXTURETRANSFORMFLAGS controls texture transform */
+    D3DTSS_COLORARG0      = 26, /* D3DTA_* third arg for triadic ops */
+    D3DTSS_ALPHAARG0      = 27, /* D3DTA_* third arg for triadic ops */
+    D3DTSS_RESULTARG      = 28, /* D3DTA_* arg for result (CURRENT or TEMP) */
+    D3DTSS_CONSTANT       = 32  /* Per-stage constant D3DTA_CONSTANT */
+}
+typedef uint D3DTEXTURESTAGESTATETYPE;
+
+/*
+ * State enumerants for per-sampler texture processing.
+ */
+enum : D3DSAMPLERSTATETYPE {
+    D3DSAMP_ADDRESSU       = 1,  /* D3DTEXTUREADDRESS for U coordinate */
+    D3DSAMP_ADDRESSV       = 2,  /* D3DTEXTUREADDRESS for V coordinate */
+    D3DSAMP_ADDRESSW       = 3,  /* D3DTEXTUREADDRESS for W coordinate */
+    D3DSAMP_BORDERCOLOR    = 4,  /* D3DCOLOR */
+    D3DSAMP_MAGFILTER      = 5,  /* D3DTEXTUREFILTER filter to use for magnification */
+    D3DSAMP_MINFILTER      = 6,  /* D3DTEXTUREFILTER filter to use for minification */
+    D3DSAMP_MIPFILTER      = 7,  /* D3DTEXTUREFILTER filter to use between mipmaps during minification */
+    D3DSAMP_MIPMAPLODBIAS  = 8,  /* float Mipmap LOD bias */
+    D3DSAMP_MAXMIPLEVEL    = 9,  /* DWORD 0..(n-1) LOD index of largest map to use (0 == largest) */
+    D3DSAMP_MAXANISOTROPY  = 10, /* DWORD maximum anisotropy */
+    D3DSAMP_SRGBTEXTURE    = 11, /* Default = 0 (which means Gamma 1.0,
+                                   no correction required.) else correct for
+                                   Gamma = 2.2 */
+    D3DSAMP_ELEMENTINDEX   = 12, /* When multi-element texture is assigned to sampler, this
+                                    indicates which element index to use.  Default = 0.  */
+    D3DSAMP_DMAPOFFSET     = 13  /* Offset in vertices in the pre-sampled displacement map.
+                                    Only valid for D3DDMAPSAMPLER sampler  */
+}
+typedef uint D3DSAMPLERSTATETYPE;
+
+/* Special sampler which is used in the tesselator */
+const D3DDMAPSAMPLER = 256;
+
+// Samplers used in vertex shaders
+const D3DVERTEXTEXTURESAMPLER0 = (D3DDMAPSAMPLER+1);
+const D3DVERTEXTEXTURESAMPLER1 = (D3DDMAPSAMPLER+2);
+const D3DVERTEXTEXTURESAMPLER2 = (D3DDMAPSAMPLER+3);
+const D3DVERTEXTEXTURESAMPLER3 = (D3DDMAPSAMPLER+4);
+
+// Values, used with D3DTSS_TEXCOORDINDEX, to specify that the vertex data(position
+// and normal in the camera space) should be taken as texture coordinates
+// Low 16 bits are used to specify texture coordinate index, to take the WRAP mode from
+//
+const D3DTSS_TCI_PASSTHRU = 0x00000000;
+const D3DTSS_TCI_CAMERASPACENORMAL = 0x00010000;
+const D3DTSS_TCI_CAMERASPACEPOSITION = 0x00020000;
+const D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR = 0x00030000;
+const D3DTSS_TCI_SPHEREMAP = 0x00040000;
+
+/*
+ * Enumerations for COLOROP and ALPHAOP texture blending operations set in
+ * texture processing stage controls in D3DTSS.
+ */
+enum : D3DTEXTUREOP {
+    // Control
+    D3DTOP_DISABLE              = 1,      // disables stage
+    D3DTOP_SELECTARG1           = 2,      // the default
+    D3DTOP_SELECTARG2           = 3,
+
+    // Modulate
+    D3DTOP_MODULATE             = 4,      // multiply args together
+    D3DTOP_MODULATE2X           = 5,      // multiply and  1 bit
+    D3DTOP_MODULATE4X           = 6,      // multiply and  2 bits
+
+    // Add
+    D3DTOP_ADD                  =  7,   // add arguments together
+    D3DTOP_ADDSIGNED            =  8,   // add with -0.5 bias
+    D3DTOP_ADDSIGNED2X          =  9,   // as above but left  1 bit
+    D3DTOP_SUBTRACT             = 10,   // Arg1 - Arg2, with no saturation
+    D3DTOP_ADDSMOOTH            = 11,   // add 2 args, subtract product
+                                        // Arg1 + Arg2 - Arg1*Arg2
+                                        // = Arg1 + (1-Arg1)*Arg2
+
+    // Linear alpha blend: Arg1*(Alpha) + Arg2*(1-Alpha)
+    D3DTOP_BLENDDIFFUSEALPHA    = 12, // iterated alpha
+    D3DTOP_BLENDTEXTUREALPHA    = 13, // texture alpha
+    D3DTOP_BLENDFACTORALPHA     = 14, // alpha from D3DRS_TEXTUREFACTOR
+
+    // Linear alpha blend with pre-multiplied arg1 input: Arg1 + Arg2*(1-Alpha)
+    D3DTOP_BLENDTEXTUREALPHAPM  = 15, // texture alpha
+    D3DTOP_BLENDCURRENTALPHA    = 16, // by alpha of current color
+
+    // Specular mapping
+    D3DTOP_PREMODULATE            = 17,     // modulate with next texture before use
+    D3DTOP_MODULATEALPHA_ADDCOLOR = 18,     // Arg1.RGB + Arg1.A*Arg2.RGB
+                                            // COLOROP only
+    D3DTOP_MODULATECOLOR_ADDALPHA = 19,     // Arg1.RGB*Arg2.RGB + Arg1.A
+                                            // COLOROP only
+    D3DTOP_MODULATEINVALPHA_ADDCOLOR = 20,  // (1-Arg1.A)*Arg2.RGB + Arg1.RGB
+                                            // COLOROP only
+    D3DTOP_MODULATEINVCOLOR_ADDALPHA = 21,  // (1-Arg1.RGB)*Arg2.RGB + Arg1.A
+                                            // COLOROP only
+
+    // Bump mapping
+    D3DTOP_BUMPENVMAP           = 22, // per pixel env map perturbation
+    D3DTOP_BUMPENVMAPLUMINANCE  = 23, // with luminance channel
+
+    // This can do either diffuse or specular bump mapping with correct input.
+    // Performs the function (Arg1.R*Arg2.R + Arg1.G*Arg2.G + Arg1.B*Arg2.B)
+    // where each component has been scaled and offset to make it signed.
+    // The result is replicated into all four (including alpha) channels.
+    // This is a valid COLOROP only.
+    D3DTOP_DOTPRODUCT3          = 24,
+
+    // Triadic ops
+    D3DTOP_MULTIPLYADD          = 25, // Arg0 + Arg1*Arg2
+    D3DTOP_LERP                 = 26  // (Arg0)*Arg1 + (1-Arg0)*Arg2
+}
+typedef uint D3DTEXTUREOP;
+
+/*
+ * Values for COLORARG0,1,2, ALPHAARG0,1,2, and RESULTARG texture blending
+ * operations set in texture processing stage controls in D3DRENDERSTATE.
+ */
+const D3DTA_SELECTMASK = 0x0000000f;  // mask for arg selector
+const D3DTA_DIFFUSE = 0x00000000;  // select diffuse color (read only)
+const D3DTA_CURRENT = 0x00000001;  // select stage destination register (read/write)
+const D3DTA_TEXTURE = 0x00000002;  // select texture color (read only)
+const D3DTA_TFACTOR = 0x00000003;  // select D3DRS_TEXTUREFACTOR (read only)
+const D3DTA_SPECULAR = 0x00000004;  // select specular color (read only)
+const D3DTA_TEMP = 0x00000005;  // select temporary register color (read/write)
+const D3DTA_CONSTANT = 0x00000006;  // select texture stage constant
+const D3DTA_COMPLEMENT = 0x00000010;  // take 1.0 - x (read modifier)
+const D3DTA_ALPHAREPLICATE = 0x00000020;  // replicate alpha to color components (read modifier)
+
+//
+// Values for D3DSAMP_***FILTER texture stage states
+//
+enum : D3DTEXTUREFILTERTYPE {
+    D3DTEXF_NONE            = 0,    // filtering disabled (valid for mip filter only)
+    D3DTEXF_POINT           = 1,    // nearest
+    D3DTEXF_LINEAR          = 2,    // linear interpolation
+    D3DTEXF_ANISOTROPIC     = 3,    // anisotropic
+    D3DTEXF_PYRAMIDALQUAD   = 6,    // 4-sample tent
+    D3DTEXF_GAUSSIANQUAD    = 7,    // 4-sample gaussian
+    D3DTEXF_CONVOLUTIONMONO = 8    // Convolution filter for monochrome textures
+}
+typedef uint D3DTEXTUREFILTERTYPE;
+
+/* Bits for Flags in ProcessVertices call */
+
+const D3DPV_DONOTCOPYDATA = (1 << 0);
+
+//-------------------------------------------------------------------
+
+// Flexible vertex format bits
+//
+const D3DFVF_RESERVED0 = 0x001;
+const D3DFVF_POSITION_MASK = 0x400E;
+const D3DFVF_XYZ = 0x002;
+const D3DFVF_XYZRHW = 0x004;
+const D3DFVF_XYZB1 = 0x006;
+const D3DFVF_XYZB2 = 0x008;
+const D3DFVF_XYZB3 = 0x00a;
+const D3DFVF_XYZB4 = 0x00c;
+const D3DFVF_XYZB5 = 0x00e;
+const D3DFVF_XYZW = 0x4002;
+
+const D3DFVF_NORMAL = 0x010;
+const D3DFVF_PSIZE = 0x020;
+const D3DFVF_DIFFUSE = 0x040;
+const D3DFVF_SPECULAR = 0x080;
+
+const D3DFVF_TEXCOUNT_MASK = 0xf00;
+const D3DFVF_TEXCOUNT_SHIFT = 8;
+const D3DFVF_TEX0 = 0x000;
+const D3DFVF_TEX1 = 0x100;
+const D3DFVF_TEX2 = 0x200;
+const D3DFVF_TEX3 = 0x300;
+const D3DFVF_TEX4 = 0x400;
+const D3DFVF_TEX5 = 0x500;
+const D3DFVF_TEX6 = 0x600;
+const D3DFVF_TEX7 = 0x700;
+const D3DFVF_TEX8 = 0x800;
+
+const D3DFVF_LASTBETA_UBYTE4 = 0x1000;
+const D3DFVF_LASTBETA_D3DCOLOR = 0x8000;
+
+const D3DFVF_RESERVED2 = 0x6000;  // 2 reserved bits
+
+//---------------------------------------------------------------------
+// Vertex Shaders
+//
+
+// Vertex shader declaration
+
+// Vertex element semantics
+//
+enum : D3DDECLUSAGE {
+    D3DDECLUSAGE_POSITION = 0,
+    D3DDECLUSAGE_BLENDWEIGHT,   // 1
+    D3DDECLUSAGE_BLENDINDICES,  // 2
+    D3DDECLUSAGE_NORMAL,        // 3
+    D3DDECLUSAGE_PSIZE,         // 4
+    D3DDECLUSAGE_TEXCOORD,      // 5
+    D3DDECLUSAGE_TANGENT,       // 6
+    D3DDECLUSAGE_BINORMAL,      // 7
+    D3DDECLUSAGE_TESSFACTOR,    // 8
+    D3DDECLUSAGE_POSITIONT,     // 9
+    D3DDECLUSAGE_COLOR,         // 10
+    D3DDECLUSAGE_FOG,           // 11
+    D3DDECLUSAGE_DEPTH,         // 12
+    D3DDECLUSAGE_SAMPLE         // 13
+}
+typedef uint D3DDECLUSAGE;
+
+const MAXD3DDECLUSAGE = D3DDECLUSAGE_SAMPLE;
+const MAXD3DDECLUSAGEINDEX = 15;
+const MAXD3DDECLLENGTH = 64; // does not include "end" marker vertex element
+
+enum : D3DDECLMETHOD {
+    D3DDECLMETHOD_DEFAULT = 0,
+    D3DDECLMETHOD_PARTIALU,
+    D3DDECLMETHOD_PARTIALV,
+    D3DDECLMETHOD_CROSSUV,    // Normal
+    D3DDECLMETHOD_UV,
+    D3DDECLMETHOD_LOOKUP,               // Lookup a displacement map
+    D3DDECLMETHOD_LOOKUPPRESAMPLED      // Lookup a pre-sampled displacement map
+}
+typedef uint D3DDECLMETHOD;
+
+const MAXD3DDECLMETHOD = D3DDECLMETHOD_LOOKUPPRESAMPLED;
+
+// Declarations for _Type fields
+//
+enum : D3DDECLTYPE {
+    D3DDECLTYPE_FLOAT1    =  0,  // 1D float expanded to (value, 0., 0., 1.)
+    D3DDECLTYPE_FLOAT2    =  1,  // 2D float expanded to (value, value, 0., 1.)
+    D3DDECLTYPE_FLOAT3    =  2,  // 3D float expanded to (value, value, value, 1.)
+    D3DDECLTYPE_FLOAT4    =  3,  // 4D float
+    D3DDECLTYPE_D3DCOLOR  =  4,  // 4D packed unsigned bytes mapped to 0. to 1. range
+                                 // Input is in D3DCOLOR format (ARGB) expanded to (R, G, B, A)
+    D3DDECLTYPE_UBYTE4    =  5,  // 4D unsigned byte
+    D3DDECLTYPE_SHORT2    =  6,  // 2D signed short expanded to (value, value, 0., 1.)
+    D3DDECLTYPE_SHORT4    =  7,  // 4D signed short
+
+// The following types are valid only with vertex shaders >= 2.0
+
+
+    D3DDECLTYPE_UBYTE4N   =  8,  // Each of 4 bytes is normalized by dividing to 255.0
+    D3DDECLTYPE_SHORT2N   =  9,  // 2D signed short normalized (v[0]/32767.0,v[1]/32767.0,0,1)
+    D3DDECLTYPE_SHORT4N   = 10,  // 4D signed short normalized (v[0]/32767.0,v[1]/32767.0,v[2]/32767.0,v[3]/32767.0)
+    D3DDECLTYPE_USHORT2N  = 11,  // 2D unsigned short normalized (v[0]/65535.0,v[1]/65535.0,0,1)
+    D3DDECLTYPE_USHORT4N  = 12,  // 4D unsigned short normalized (v[0]/65535.0,v[1]/65535.0,v[2]/65535.0,v[3]/65535.0)
+    D3DDECLTYPE_UDEC3     = 13,  // 3D unsigned 10 10 10 format expanded to (value, value, value, 1)
+    D3DDECLTYPE_DEC3N     = 14,  // 3D signed 10 10 10 format normalized and expanded to (v[0]/511.0, v[1]/511.0, v[2]/511.0, 1)
+    D3DDECLTYPE_FLOAT16_2 = 15,  // Two 16-bit floating point values, expanded to (value, value, 0, 1)
+    D3DDECLTYPE_FLOAT16_4 = 16,  // Four 16-bit floating point values
+    D3DDECLTYPE_UNUSED    = 17   // When the type field in a decl is unused.
+}
+typedef uint D3DDECLTYPE;
+
+const MAXD3DDECLTYPE = D3DDECLTYPE_UNUSED;
+
+struct D3DVERTEXELEMENT9
+{
+    ushort    Stream;     // Stream index
+    ushort    Offset;     // Offset in the stream in bytes
+    ubyte    Type;       // Data type
+    ubyte    Method;     // Processing method
+    ubyte    Usage;      // Semantics
+    ubyte    UsageIndex; // Semantic index
+}
+alias D3DVERTEXELEMENT9 *LPD3DVERTEXELEMENT9;
+
+// This is used to initialize the last vertex element in a vertex declaration
+// array
+//
+template D3DDECL_END() {
+    static const D3DVERTEXELEMENT9 D3DDECL_END = { 0xFF,0,D3DDECLTYPE_UNUSED,0,0,0 };
+}
+
+// Maximum supported number of texture coordinate sets
+const D3DDP_MAXTEXCOORD = 8;
+
+//---------------------------------------------------------------------
+// Values for IDirect3DDevice9::SetStreamSourceFreq's Setting parameter
+//---------------------------------------------------------------------
+const D3DSTREAMSOURCE_INDEXEDDATA = (1<<30);
+const D3DSTREAMSOURCE_INSTANCEDATA = (2<<30);
+
+
+
+//---------------------------------------------------------------------
+//
+// The internal format of Pixel Shader (PS) & Vertex Shader (VS)
+// Instruction Tokens is defined in the Direct3D Device Driver Kit
+//
+//---------------------------------------------------------------------
+
+//
+// Instruction Token Bit Definitions
+//
+const D3DSI_OPCODE_MASK = 0x0000FFFF;
+
+const D3DSI_INSTLENGTH_MASK = 0x0F000000;
+const D3DSI_INSTLENGTH_SHIFT = 24;
+
+enum : D3DSHADER_INSTRUCTION_OPCODE_TYPE {
+    D3DSIO_NOP          = 0,
+    D3DSIO_MOV          ,
+    D3DSIO_ADD          ,
+    D3DSIO_SUB          ,
+    D3DSIO_MAD          ,
+    D3DSIO_MUL          ,
+    D3DSIO_RCP          ,
+    D3DSIO_RSQ          ,
+    D3DSIO_DP3          ,
+    D3DSIO_DP4          ,
+    D3DSIO_MIN          ,
+    D3DSIO_MAX          ,
+    D3DSIO_SLT          ,
+    D3DSIO_SGE          ,
+    D3DSIO_EXP          ,
+    D3DSIO_LOG          ,
+    D3DSIO_LIT          ,
+    D3DSIO_DST          ,
+    D3DSIO_LRP          ,
+    D3DSIO_FRC          ,
+    D3DSIO_M4x4         ,
+    D3DSIO_M4x3         ,
+    D3DSIO_M3x4         ,
+    D3DSIO_M3x3         ,
+    D3DSIO_M3x2         ,
+    D3DSIO_CALL         ,
+    D3DSIO_CALLNZ       ,
+    D3DSIO_LOOP         ,
+    D3DSIO_RET          ,
+    D3DSIO_ENDLOOP      ,
+    D3DSIO_LABEL        ,
+    D3DSIO_DCL          ,
+    D3DSIO_POW          ,
+    D3DSIO_CRS          ,
+    D3DSIO_SGN          ,
+    D3DSIO_ABS          ,
+    D3DSIO_NRM          ,
+    D3DSIO_SINCOS       ,
+    D3DSIO_REP          ,
+    D3DSIO_ENDREP       ,
+    D3DSIO_IF           ,
+    D3DSIO_IFC          ,
+    D3DSIO_ELSE         ,
+    D3DSIO_ENDIF        ,
+    D3DSIO_BREAK        ,
+    D3DSIO_BREAKC       ,
+    D3DSIO_MOVA         ,
+    D3DSIO_DEFB         ,
+    D3DSIO_DEFI         ,
+
+    D3DSIO_TEXCOORD     = 64,
+    D3DSIO_TEXKILL      ,
+    D3DSIO_TEX          ,
+    D3DSIO_TEXBEM       ,
+    D3DSIO_TEXBEML      ,
+    D3DSIO_TEXREG2AR    ,
+    D3DSIO_TEXREG2GB    ,
+    D3DSIO_TEXM3x2PAD   ,
+    D3DSIO_TEXM3x2TEX   ,
+    D3DSIO_TEXM3x3PAD   ,
+    D3DSIO_TEXM3x3TEX   ,
+    D3DSIO_RESERVED0    ,
+    D3DSIO_TEXM3x3SPEC  ,
+    D3DSIO_TEXM3x3VSPEC ,
+    D3DSIO_EXPP         ,
+    D3DSIO_LOGP         ,
+    D3DSIO_CND          ,
+    D3DSIO_DEF          ,
+    D3DSIO_TEXREG2RGB   ,
+    D3DSIO_TEXDP3TEX    ,
+    D3DSIO_TEXM3x2DEPTH ,
+    D3DSIO_TEXDP3       ,
+    D3DSIO_TEXM3x3      ,
+    D3DSIO_TEXDEPTH     ,
+    D3DSIO_CMP          ,
+    D3DSIO_BEM          ,
+    D3DSIO_DP2ADD       ,
+    D3DSIO_DSX          ,
+    D3DSIO_DSY          ,
+    D3DSIO_TEXLDD       ,
+    D3DSIO_SETP         ,
+    D3DSIO_TEXLDL       ,
+    D3DSIO_BREAKP       ,
+
+    D3DSIO_PHASE        = 0xFFFD,
+    D3DSIO_COMMENT      = 0xFFFE,
+    D3DSIO_END          = 0xFFFF
+}
+typedef uint D3DSHADER_INSTRUCTION_OPCODE_TYPE;
+
+//---------------------------------------------------------------------
+// Use these constants with D3DSIO_SINCOS macro as SRC2, SRC3
+//
+const float[4] D3DSINCOSCONST1 = [-1.5500992e-006f, -2.1701389e-005f,  0.0026041667f, 0.00026041668f];
+const float[4] D3DSINCOSCONST2 = [-0.020833334f, -0.12500000f, 1.0f, 0.50000000f];
+
+//---------------------------------------------------------------------
+// Co-Issue Instruction Modifier - if set then this instruction is to be
+// issued in parallel with the previous instruction(s) for which this bit
+// is not set.
+//
+const D3DSI_COISSUE = 0x40000000;
+
+//---------------------------------------------------------------------
+// Opcode specific controls
+
+const D3DSP_OPCODESPECIFICCONTROL_MASK = 0x00ff0000;
+const D3DSP_OPCODESPECIFICCONTROL_SHIFT = 16;
+
+// ps_2_0 texld controls
+const D3DSI_TEXLD_PROJECT = (0x01 << D3DSP_OPCODESPECIFICCONTROL_SHIFT);
+const D3DSI_TEXLD_BIAS = (0x02 << D3DSP_OPCODESPECIFICCONTROL_SHIFT);
+
+// Comparison for dynamic conditional instruction opcodes (i.e. if, breakc)
+enum : D3DSHADER_COMPARISON {
+                         // < = >
+    D3DSPC_RESERVED0= 0, // 0 0 0
+    D3DSPC_GT       = 1, // 0 0 1
+    D3DSPC_EQ       = 2, // 0 1 0
+    D3DSPC_GE       = 3, // 0 1 1
+    D3DSPC_LT       = 4, // 1 0 0
+    D3DSPC_NE       = 5, // 1 0 1
+    D3DSPC_LE       = 6, // 1 1 0
+    D3DSPC_RESERVED1= 7  // 1 1 1
+}
+typedef uint D3DSHADER_COMPARISON;
+
+// Comparison is part of instruction opcode token:
+const D3DSHADER_COMPARISON_SHIFT = D3DSP_OPCODESPECIFICCONTROL_SHIFT;
+const D3DSHADER_COMPARISON_MASK = (0x7<<D3DSHADER_COMPARISON_SHIFT);
+
+//---------------------------------------------------------------------
+// Predication flags on instruction token
+const D3DSHADER_INSTRUCTION_PREDICATED = (0x1 << 28);
+
+//---------------------------------------------------------------------
+// DCL Info Token Controls
+
+// For dcl info tokens requiring a semantic (usage + index)
+const D3DSP_DCL_USAGE_SHIFT = 0;
+const D3DSP_DCL_USAGE_MASK = 0x0000000f;
+
+const D3DSP_DCL_USAGEINDEX_SHIFT = 16;
+const D3DSP_DCL_USAGEINDEX_MASK = 0x000f0000;
+
+// DCL pixel shader sampler info token.
+const D3DSP_TEXTURETYPE_SHIFT = 27;
+const D3DSP_TEXTURETYPE_MASK = 0x78000000;
+
+enum : D3DSAMPLER_TEXTURE_TYPE {
+    D3DSTT_UNKNOWN = 0<<D3DSP_TEXTURETYPE_SHIFT, // uninitialized value
+    D3DSTT_2D      = 2<<D3DSP_TEXTURETYPE_SHIFT, // dcl_2d s# (for declaring a 2-D texture)
+    D3DSTT_CUBE    = 3<<D3DSP_TEXTURETYPE_SHIFT, // dcl_cube s# (for declaring a cube texture)
+    D3DSTT_VOLUME  = 4<<D3DSP_TEXTURETYPE_SHIFT  // dcl_volume s# (for declaring a volume texture)
+}
+typedef uint D3DSAMPLER_TEXTURE_TYPE;
+
+//---------------------------------------------------------------------
+// Parameter Token Bit Definitions
+//
+const D3DSP_REGNUM_MASK = 0x000007FF;
+
+// destination parameter write mask
+const D3DSP_WRITEMASK_0 = 0x00010000;  // Component 0 (X;Red)
+const D3DSP_WRITEMASK_1 = 0x00020000;  // Component 1 (Y;Green)
+const D3DSP_WRITEMASK_2 = 0x00040000;  // Component 2 (Z;Blue)
+const D3DSP_WRITEMASK_3 = 0x00080000;  // Component 3 (W;Alpha)
+const D3DSP_WRITEMASK_ALL = 0x000F0000;  // All Components
+
+// destination parameter modifiers
+const D3DSP_DSTMOD_SHIFT = 20;
+const D3DSP_DSTMOD_MASK = 0x00F00000;
+
+// Bit masks for destination parameter modifiers
+const D3DSPDM_NONE = (0<<D3DSP_DSTMOD_SHIFT); // nop
+const D3DSPDM_SATURATE = (1<<D3DSP_DSTMOD_SHIFT); // clamp to 0. to 1. range
+const D3DSPDM_PARTIALPRECISION = (2<<D3DSP_DSTMOD_SHIFT); // Partial precision hint
+const D3DSPDM_MSAMPCENTROID = (4<<D3DSP_DSTMOD_SHIFT); // Relevant to multisampling only:
+                                                                //      When the pixel center is not covered, sample
+                                                                //      attribute or compute gradients/LOD
+                                                                //      using multisample "centroid" location.
+                                                                //      "Centroid" is some location within the covered
+                                                                //      region of the pixel.
+
+// destination parameter 
+const D3DSP_DSTSHIFT_SHIFT = 24;
+const D3DSP_DSTSHIFT_MASK = 0x0F000000;
+
+// destination/source parameter register type
+const D3DSP_REGTYPE_SHIFT = 28;
+const D3DSP_REGTYPE_SHIFT2 = 8;
+const D3DSP_REGTYPE_MASK = 0x70000000;
+const D3DSP_REGTYPE_MASK2 = 0x00001800;
+
+enum : D3DSHADER_PARAM_REGISTER_TYPE {
+    D3DSPR_TEMP           =  0, // Temporary Register File
+    D3DSPR_INPUT          =  1, // Input Register File
+    D3DSPR_CONST          =  2, // Constant Register File
+    D3DSPR_ADDR           =  3, // Address Register (VS)
+    D3DSPR_TEXTURE        =  3, // Texture Register File (PS)
+    D3DSPR_RASTOUT        =  4, // Rasterizer Register File
+    D3DSPR_ATTROUT        =  5, // Attribute Output Register File
+    D3DSPR_TEXCRDOUT      =  6, // Texture Coordinate Output Register File
+    D3DSPR_OUTPUT         =  6, // Output register file for VS3.0+
+    D3DSPR_CONSTINT       =  7, // Constant Integer Vector Register File
+    D3DSPR_COLOROUT       =  8, // Color Output Register File
+    D3DSPR_DEPTHOUT       =  9, // Depth Output Register File
+    D3DSPR_SAMPLER        = 10, // Sampler State Register File
+    D3DSPR_CONST2         = 11, // Constant Register File  2048 - 4095
+    D3DSPR_CONST3         = 12, // Constant Register File  4096 - 6143
+    D3DSPR_CONST4         = 13, // Constant Register File  6144 - 8191
+    D3DSPR_CONSTBOOL      = 14, // Constant Boolean register file
+    D3DSPR_LOOP           = 15, // Loop counter register file
+    D3DSPR_TEMPFLOAT16    = 16, // 16-bit float temp register file
+    D3DSPR_MISCTYPE       = 17, // Miscellaneous (single) registers.
+    D3DSPR_LABEL          = 18, // Label
+    D3DSPR_PREDICATE      = 19  // Predicate register
+}
+typedef uint D3DSHADER_PARAM_REGISTER_TYPE;
+
+// The miscellaneous register file (D3DSPR_MISCTYPES)
+// contains register types for which there is only ever one
+// register (i.e. the register # is not needed).
+// Rather than use up additional register types for such
+// registers, they are defined
+// as particular offsets into the misc. register file:
+enum : D3DSHADER_MISCTYPE_OFFSETS {
+    D3DSMO_POSITION   = 0, // Input position x,y,z,rhw (PS)
+    D3DSMO_FACE   = 1, // Floating point primitive area (PS)
+}
+typedef uint D3DSHADER_MISCTYPE_OFFSETS;
+
+// Register offsets in the Rasterizer Register File
+//
+enum : D3DVS_RASTOUT_OFFSETS {
+    D3DSRO_POSITION = 0,
+    D3DSRO_FOG,
+    D3DSRO_POINT_SIZE
+}
+typedef uint D3DVS_RASTOUT_OFFSETS;
+
+// Source operand addressing modes
+
+const D3DVS_ADDRESSMODE_SHIFT = 13;
+const D3DVS_ADDRESSMODE_MASK = (1 << D3DVS_ADDRESSMODE_SHIFT);
+
+enum : D3DVS_ADDRESSMODE_TYPE {
+    D3DVS_ADDRMODE_ABSOLUTE  = (0 << D3DVS_ADDRESSMODE_SHIFT),
+    D3DVS_ADDRMODE_RELATIVE  = (1 << D3DVS_ADDRESSMODE_SHIFT)
+}
+typedef uint D3DVS_ADDRESSMODE_TYPE;
+
+const D3DSHADER_ADDRESSMODE_SHIFT = 13;
+const D3DSHADER_ADDRESSMODE_MASK = (1 << D3DSHADER_ADDRESSMODE_SHIFT);
+
+enum : D3DSHADER_ADDRESSMODE_TYPE {
+    D3DSHADER_ADDRMODE_ABSOLUTE  = (0 << D3DSHADER_ADDRESSMODE_SHIFT),
+    D3DSHADER_ADDRMODE_RELATIVE  = (1 << D3DSHADER_ADDRESSMODE_SHIFT)
+}
+typedef uint D3DSHADER_ADDRESSMODE_TYPE;
+
+// Source operand swizzle definitions
+//
+const D3DVS_SWIZZLE_SHIFT = 16;
+const D3DVS_SWIZZLE_MASK = 0x00FF0000;
+
+// The following bits define where to take component X from:
+
+const D3DVS_X_X = (0<<D3DVS_SWIZZLE_SHIFT);
+const D3DVS_X_Y = (1<<D3DVS_SWIZZLE_SHIFT);
+const D3DVS_X_Z = (2<<D3DVS_SWIZZLE_SHIFT);
+const D3DVS_X_W = (3<<D3DVS_SWIZZLE_SHIFT);
+
+// The following bits define where to take component Y from:
+
+const D3DVS_Y_X = (0<<(D3DVS_SWIZZLE_SHIFT+2));
+const D3DVS_Y_Y = (1<<(D3DVS_SWIZZLE_SHIFT+2));
+const D3DVS_Y_Z = (2<<(D3DVS_SWIZZLE_SHIFT+2));
+const D3DVS_Y_W = (3<<(D3DVS_SWIZZLE_SHIFT+2));
+
+// The following bits define where to take component Z from:
+
+const D3DVS_Z_X = (0<<(D3DVS_SWIZZLE_SHIFT+4));
+const D3DVS_Z_Y = (1<<(D3DVS_SWIZZLE_SHIFT+4));
+const D3DVS_Z_Z = (2<<(D3DVS_SWIZZLE_SHIFT+4));
+const D3DVS_Z_W = (3<<(D3DVS_SWIZZLE_SHIFT+4));
+
+// The following bits define where to take component W from:
+
+const D3DVS_W_X = (0<<(D3DVS_SWIZZLE_SHIFT+6));
+const D3DVS_W_Y = (1<<(D3DVS_SWIZZLE_SHIFT+6));
+const D3DVS_W_Z = (2<<(D3DVS_SWIZZLE_SHIFT+6));
+const D3DVS_W_W = (3<<(D3DVS_SWIZZLE_SHIFT+6));
+
+// Value when there is no swizzle (X is taken from X, Y is taken from Y,
+// Z is taken from Z, W is taken from W
+//
+const D3DVS_NOSWIZZLE = (D3DVS_X_X|D3DVS_Y_Y|D3DVS_Z_Z|D3DVS_W_W);
+
+// source parameter swizzle
+const D3DSP_SWIZZLE_SHIFT = 16;
+const D3DSP_SWIZZLE_MASK = 0x00FF0000;
+
+const D3DSP_NOSWIZZLE = ( (0 << (D3DSP_SWIZZLE_SHIFT + 0)) |
+      (1 << (D3DSP_SWIZZLE_SHIFT + 2)) |
+      (2 << (D3DSP_SWIZZLE_SHIFT + 4)) |
+      (3 << (D3DSP_SWIZZLE_SHIFT + 6)) );
+
+// pixel-shader swizzle ops
+const D3DSP_REPLICATERED =
+    ( (0 << (D3DSP_SWIZZLE_SHIFT + 0)) |
+      (0 << (D3DSP_SWIZZLE_SHIFT + 2)) |
+      (0 << (D3DSP_SWIZZLE_SHIFT + 4)) |
+      (0 << (D3DSP_SWIZZLE_SHIFT + 6)) );
+
+const D3DSP_REPLICATEGREEN =
+    ( (1 << (D3DSP_SWIZZLE_SHIFT + 0)) |
+      (1 << (D3DSP_SWIZZLE_SHIFT + 2)) |
+      (1 << (D3DSP_SWIZZLE_SHIFT + 4)) |
+      (1 << (D3DSP_SWIZZLE_SHIFT + 6)) );
+
+const D3DSP_REPLICATEBLUE =
+    ( (2 << (D3DSP_SWIZZLE_SHIFT + 0)) |
+      (2 << (D3DSP_SWIZZLE_SHIFT + 2)) |
+      (2 << (D3DSP_SWIZZLE_SHIFT + 4)) |
+      (2 << (D3DSP_SWIZZLE_SHIFT + 6)) );
+
+const D3DSP_REPLICATEALPHA =
+    ( (3 << (D3DSP_SWIZZLE_SHIFT + 0)) |
+      (3 << (D3DSP_SWIZZLE_SHIFT + 2)) |
+      (3 << (D3DSP_SWIZZLE_SHIFT + 4)) |
+      (3 << (D3DSP_SWIZZLE_SHIFT + 6)) );
+
+// source parameter modifiers
+const D3DSP_SRCMOD_SHIFT = 24;
+const D3DSP_SRCMOD_MASK = 0x0F000000;
+
+enum : D3DSHADER_PARAM_SRCMOD_TYPE {
+    D3DSPSM_NONE    = 0<<D3DSP_SRCMOD_SHIFT, // nop
+    D3DSPSM_NEG     = 1<<D3DSP_SRCMOD_SHIFT, // negate
+    D3DSPSM_BIAS    = 2<<D3DSP_SRCMOD_SHIFT, // bias
+    D3DSPSM_BIASNEG = 3<<D3DSP_SRCMOD_SHIFT, // bias and negate
+    D3DSPSM_SIGN    = 4<<D3DSP_SRCMOD_SHIFT, // sign
+    D3DSPSM_SIGNNEG = 5<<D3DSP_SRCMOD_SHIFT, // sign and negate
+    D3DSPSM_COMP    = 6<<D3DSP_SRCMOD_SHIFT, // complement
+    D3DSPSM_X2      = 7<<D3DSP_SRCMOD_SHIFT, // *2
+    D3DSPSM_X2NEG   = 8<<D3DSP_SRCMOD_SHIFT, // *2 and negate
+    D3DSPSM_DZ      = 9<<D3DSP_SRCMOD_SHIFT, // divide through by z component
+    D3DSPSM_DW      = 10<<D3DSP_SRCMOD_SHIFT, // divide through by w component
+    D3DSPSM_ABS     = 11<<D3DSP_SRCMOD_SHIFT, // abs()
+    D3DSPSM_ABSNEG  = 12<<D3DSP_SRCMOD_SHIFT, // -abs()
+    D3DSPSM_NOT     = 13<<D3DSP_SRCMOD_SHIFT  // for predicate register: "!p0"
+}
+typedef uint D3DSHADER_PARAM_SRCMOD_TYPE;
+
+// pixel shader version token
+uint D3DPS_VERSION(ubyte _Major, ubyte _Minor) { return (0xFFFF0000|(_Major<<8)|_Minor); }
+
+// vertex shader version token
+uint D3DVS_VERSION(ubyte _Major, ubyte _Minor) { return (0xFFFE0000|(_Major<<8)|_Minor); }
+
+// extract major/minor from version cap
+ubyte D3DSHADER_VERSION_MAJOR(uint _Version) { return cast(ubyte)((_Version>>8)&0xFF); }
+ubyte D3DSHADER_VERSION_MINOR(uint _Version) { return cast(ubyte)((_Version>>0)&0xFF); }
+
+// destination/source parameter register type
+const D3DSI_COMMENTSIZE_SHIFT = 16;
+const D3DSI_COMMENTSIZE_MASK = 0x7FFF0000;
+uint D3DSHADER_COMMENT(ushort _DWordSize) { return (((_DWordSize<<D3DSI_COMMENTSIZE_SHIFT)&D3DSI_COMMENTSIZE_MASK)|D3DSIO_COMMENT); }
+
+// pixel/vertex shader end token
+const D3DPS_END = 0x0000FFFF;
+const D3DVS_END = 0x0000FFFF;
+
+
+//---------------------------------------------------------------------
+
+// High order surfaces
+//
+enum : D3DBASISTYPE {
+   D3DBASIS_BEZIER      = 0,
+   D3DBASIS_BSPLINE     = 1,
+   D3DBASIS_CATMULL_ROM = 2  /* In D3D8 this used to be D3DBASIS_INTERPOLATE */
+}
+typedef uint D3DBASISTYPE;
+
+enum : D3DDEGREETYPE {
+   D3DDEGREE_LINEAR      = 1,
+   D3DDEGREE_QUADRATIC   = 2,
+   D3DDEGREE_CUBIC       = 3,
+   D3DDEGREE_QUINTIC     = 5
+}
+typedef uint D3DDEGREETYPE;
+
+enum : D3DPATCHEDGESTYLE {
+   D3DPATCHEDGE_DISCRETE    = 0,
+   D3DPATCHEDGE_CONTINUOUS  = 1
+}
+typedef uint D3DPATCHEDGESTYLE;
+
+enum : D3DSTATEBLOCKTYPE {
+    D3DSBT_ALL           = 1, // capture all state
+    D3DSBT_PIXELSTATE    = 2, // capture pixel state
+    D3DSBT_VERTEXSTATE   = 3  // capture vertex state
+}
+typedef uint D3DSTATEBLOCKTYPE;
+
+// The D3DVERTEXBLENDFLAGS type is used with D3DRS_VERTEXBLEND state.
+//
+enum : D3DVERTEXBLENDFLAGS {
+    D3DVBF_DISABLE  = 0,     // Disable vertex blending
+    D3DVBF_1WEIGHTS = 1,     // 2 matrix blending
+    D3DVBF_2WEIGHTS = 2,     // 3 matrix blending
+    D3DVBF_3WEIGHTS = 3,     // 4 matrix blending
+    D3DVBF_TWEENING = 255,   // blending using D3DRS_TWEENFACTOR
+    D3DVBF_0WEIGHTS = 256    // one matrix is used with weight 1.0
+}
+typedef uint D3DVERTEXBLENDFLAGS;
+
+enum : D3DTEXTURETRANSFORMFLAGS {
+    D3DTTFF_DISABLE         = 0,    // texture coordinates are passed directly
+    D3DTTFF_COUNT1          = 1,    // rasterizer should expect 1-D texture coords
+    D3DTTFF_COUNT2          = 2,    // rasterizer should expect 2-D texture coords
+    D3DTTFF_COUNT3          = 3,    // rasterizer should expect 3-D texture coords
+    D3DTTFF_COUNT4          = 4,    // rasterizer should expect 4-D texture coords
+    D3DTTFF_PROJECTED       = 256   // texcoords to be divided by COUNTth element
+}
+typedef uint D3DTEXTURETRANSFORMFLAGS;
+
+// Macros to set texture coordinate format bits in the FVF id
+
+const D3DFVF_TEXTUREFORMAT2 = 0;         // Two floating point values
+const D3DFVF_TEXTUREFORMAT1 = 3;         // One floating point value
+const D3DFVF_TEXTUREFORMAT3 = 1;         // Three floating point values
+const D3DFVF_TEXTUREFORMAT4 = 2;         // Four floating point values
+
+uint D3DFVF_TEXCOORDSIZE3(uint CoordIndex) { return (D3DFVF_TEXTUREFORMAT3 << (CoordIndex*2 + 16)); }
+uint D3DFVF_TEXCOORDSIZE2(uint CoordIndex) { return (D3DFVF_TEXTUREFORMAT2); }
+uint D3DFVF_TEXCOORDSIZE4(uint CoordIndex) { return (D3DFVF_TEXTUREFORMAT4 << (CoordIndex*2 + 16)); }
+uint D3DFVF_TEXCOORDSIZE1(uint CoordIndex) { return (D3DFVF_TEXTUREFORMAT1 << (CoordIndex*2 + 16)); }
+
+
+//---------------------------------------------------------------------
+
+/* Direct3D9 Device types */
+enum : D3DDEVTYPE {
+    D3DDEVTYPE_HAL         = 1,
+    D3DDEVTYPE_REF         = 2,
+    D3DDEVTYPE_SW          = 3,
+
+    D3DDEVTYPE_NULLREF     = 4
+}
+typedef uint D3DDEVTYPE;
+
+/* Multi-Sample buffer types */
+enum : D3DMULTISAMPLE_TYPE {
+    D3DMULTISAMPLE_NONE            =  0,
+    D3DMULTISAMPLE_NONMASKABLE     =  1,
+    D3DMULTISAMPLE_2_SAMPLES       =  2,
+    D3DMULTISAMPLE_3_SAMPLES       =  3,
+    D3DMULTISAMPLE_4_SAMPLES       =  4,
+    D3DMULTISAMPLE_5_SAMPLES       =  5,
+    D3DMULTISAMPLE_6_SAMPLES       =  6,
+    D3DMULTISAMPLE_7_SAMPLES       =  7,
+    D3DMULTISAMPLE_8_SAMPLES       =  8,
+    D3DMULTISAMPLE_9_SAMPLES       =  9,
+    D3DMULTISAMPLE_10_SAMPLES      = 10,
+    D3DMULTISAMPLE_11_SAMPLES      = 11,
+    D3DMULTISAMPLE_12_SAMPLES      = 12,
+    D3DMULTISAMPLE_13_SAMPLES      = 13,
+    D3DMULTISAMPLE_14_SAMPLES      = 14,
+    D3DMULTISAMPLE_15_SAMPLES      = 15,
+    D3DMULTISAMPLE_16_SAMPLES      = 16
+}
+typedef uint D3DMULTISAMPLE_TYPE;
+
+/* Formats
+ * Most of these names have the following convention:
+ *      A = Alpha
+ *      R = Red
+ *      G = Green
+ *      B = Blue
+ *      X = Unused Bits
+ *      P = Palette
+ *      L = Luminance
+ *      U = dU coordinate for BumpMap
+ *      V = dV coordinate for BumpMap
+ *      S = Stencil
+ *      D = Depth (e.g. Z or W buffer)
+ *      C = Computed from other channels (typically on certain read operations)
+ *
+ *      Further, the order of the pieces are from MSB first; hence
+ *      D3DFMT_A8L8 indicates that the high byte of this two byte
+ *      format is alpha.
+ *
+ *      D3DFMT_D16_LOCKABLE indicates:
+ *           - An integer 16-bit value.
+ *           - An app-lockable surface.
+ *
+ *      D3DFMT_D32F_LOCKABLE indicates:
+ *           - An IEEE 754 floating-point value.
+ *           - An app-lockable surface.
+ *
+ *      All Depth/Stencil formats except D3DFMT_D16_LOCKABLE and D3DFMT_D32F_LOCKABLE indicate:
+ *          - no particular bit ordering per pixel, and
+ *          - are not app lockable, and
+ *          - the driver is allowed to consume more than the indicated
+ *            number of bits per Depth channel (but not Stencil channel).
+ */
+uint MAKEFOURCC(ubyte ch0, ubyte ch1, ubyte ch2, ubyte ch3) {
+    return cast(uint)ch0 | cast(uint)(ch1 << 8) | cast(uint)(ch2 << 16) | cast(uint)(ch3 << 24 );
+}
+template T_MAKEFOURCC(ubyte ch0, ubyte ch1, ubyte ch2, ubyte ch3) {
+    const T_MAKEFOURCC = cast(uint)ch0 | cast(uint)(ch1 << 8) | cast(uint)(ch2 << 16) | cast(uint)(ch3 << 24 );
+}
+
+enum : D3DFORMAT {
+    D3DFMT_UNKNOWN              =  0,
+
+    D3DFMT_R8G8B8               = 20,
+    D3DFMT_A8R8G8B8             = 21,
+    D3DFMT_X8R8G8B8             = 22,
+    D3DFMT_R5G6B5               = 23,
+    D3DFMT_X1R5G5B5             = 24,
+    D3DFMT_A1R5G5B5             = 25,
+    D3DFMT_A4R4G4B4             = 26,
+    D3DFMT_R3G3B2               = 27,
+    D3DFMT_A8                   = 28,
+    D3DFMT_A8R3G3B2             = 29,
+    D3DFMT_X4R4G4B4             = 30,
+    D3DFMT_A2B10G10R10          = 31,
+    D3DFMT_A8B8G8R8             = 32,
+    D3DFMT_X8B8G8R8             = 33,
+    D3DFMT_G16R16               = 34,
+    D3DFMT_A2R10G10B10          = 35,
+    D3DFMT_A16B16G16R16         = 36,
+
+    D3DFMT_A8P8                 = 40,
+    D3DFMT_P8                   = 41,
+
+    D3DFMT_L8                   = 50,
+    D3DFMT_A8L8                 = 51,
+    D3DFMT_A4L4                 = 52,
+
+    D3DFMT_V8U8                 = 60,
+    D3DFMT_L6V5U5               = 61,
+    D3DFMT_X8L8V8U8             = 62,
+    D3DFMT_Q8W8V8U8             = 63,
+    D3DFMT_V16U16               = 64,
+    D3DFMT_A2W10V10U10          = 67,
+
+    D3DFMT_UYVY                 = T_MAKEFOURCC!('U', 'Y', 'V', 'Y'),
+    D3DFMT_R8G8_B8G8            = T_MAKEFOURCC!('R', 'G', 'B', 'G'),
+    D3DFMT_YUY2                 = T_MAKEFOURCC!('Y', 'U', 'Y', '2'),
+    D3DFMT_G8R8_G8B8            = T_MAKEFOURCC!('G', 'R', 'G', 'B'),
+    D3DFMT_DXT1                 = T_MAKEFOURCC!('D', 'X', 'T', '1'),
+    D3DFMT_DXT2                 = T_MAKEFOURCC!('D', 'X', 'T', '2'),
+    D3DFMT_DXT3                 = T_MAKEFOURCC!('D', 'X', 'T', '3'),
+    D3DFMT_DXT4                 = T_MAKEFOURCC!('D', 'X', 'T', '4'),
+    D3DFMT_DXT5                 = T_MAKEFOURCC!('D', 'X', 'T', '5'),
+
+    D3DFMT_D16_LOCKABLE         = 70,
+    D3DFMT_D32                  = 71,
+    D3DFMT_D15S1                = 73,
+    D3DFMT_D24S8                = 75,
+    D3DFMT_D24X8                = 77,
+    D3DFMT_D24X4S4              = 79,
+    D3DFMT_D16                  = 80,
+
+    D3DFMT_D32F_LOCKABLE        = 82,
+    D3DFMT_D24FS8               = 83,
+
+    /* Z-Stencil formats valid for CPU access */
+    D3DFMT_D32_LOCKABLE         = 84,
+    D3DFMT_S8_LOCKABLE          = 85,
+
+    D3DFMT_L16                  = 81,
+
+    D3DFMT_VERTEXDATA           =100,
+    D3DFMT_INDEX16              =101,
+    D3DFMT_INDEX32              =102,
+
+    D3DFMT_Q16W16V16U16         =110,
+
+    D3DFMT_MULTI2_ARGB8         = T_MAKEFOURCC!('M','E','T','1'),
+
+    // Floating point surface formats
+
+    // s10e5 formats (16-bits per channel)
+    D3DFMT_R16F                 = 111,
+    D3DFMT_G16R16F              = 112,
+    D3DFMT_A16B16G16R16F        = 113,
+
+    // IEEE s23e8 formats (32-bits per channel)
+    D3DFMT_R32F                 = 114,
+    D3DFMT_G32R32F              = 115,
+    D3DFMT_A32B32G32R32F        = 116,
+
+    D3DFMT_CxV8U8               = 117,
+
+    // Monochrome 1 bit per pixel format
+    D3DFMT_A1                   = 118,
+
+
+    // Binary format indicating that the data has no inherent type
+    D3DFMT_BINARYBUFFER         = 199
+}
+typedef uint D3DFORMAT;
+
+/* Display Modes */
+struct D3DDISPLAYMODE {
+    uint            Width;
+    uint            Height;
+    uint            RefreshRate;
+    D3DFORMAT       Format;
+}
+
+/* Creation Parameters */
+struct D3DDEVICE_CREATION_PARAMETERS
+{
+    UINT            AdapterOrdinal;
+    D3DDEVTYPE      DeviceType;
+    HWND            hFocusWindow;
+    DWORD           BehaviorFlags;
+}
+
+
+/* SwapEffects */
+enum : D3DSWAPEFFECT {
+    D3DSWAPEFFECT_DISCARD           = 1,
+    D3DSWAPEFFECT_FLIP              = 2,
+    D3DSWAPEFFECT_COPY              = 3
+}
+typedef uint D3DSWAPEFFECT;
+
+/* Pool types */
+enum : D3DPOOL {
+    D3DPOOL_DEFAULT                 = 0,
+    D3DPOOL_MANAGED                 = 1,
+    D3DPOOL_SYSTEMMEM               = 2,
+    D3DPOOL_SCRATCH                 = 3
+}
+typedef uint D3DPOOL;
+
+
+/* RefreshRate pre-defines */
+const D3DPRESENT_RATE_DEFAULT = 0x00000000;
+
+
+/* Resize Optional Parameters */
+struct D3DPRESENT_PARAMETERS
+{
+    UINT                BackBufferWidth;
+    UINT                BackBufferHeight;
+    D3DFORMAT           BackBufferFormat;
+    UINT                BackBufferCount;
+
+    D3DMULTISAMPLE_TYPE MultiSampleType;
+    DWORD               MultiSampleQuality;
+
+    D3DSWAPEFFECT       SwapEffect;
+    HWND                hDeviceWindow;
+    BOOL                Windowed;
+    BOOL                EnableAutoDepthStencil;
+    D3DFORMAT           AutoDepthStencilFormat;
+    DWORD               Flags;
+
+    /* FullScreen_RefreshRateInHz must be zero for Windowed mode */
+    UINT                FullScreen_RefreshRateInHz;
+    UINT                PresentationInterval;
+}
+
+// Values for D3DPRESENT_PARAMETERS.Flags
+
+const D3DPRESENTFLAG_LOCKABLE_BACKBUFFER = 0x00000001;
+const D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL = 0x00000002;
+const D3DPRESENTFLAG_DEVICECLIP = 0x00000004;
+const D3DPRESENTFLAG_VIDEO = 0x00000010;
+
+const D3DPRESENTFLAG_NOAUTOROTATE = 0x00000020;
+const D3DPRESENTFLAG_UNPRUNEDMODE = 0x00000040;
+
+/* Gamma Ramp: Same as DX7 */
+
+struct D3DGAMMARAMP
+{
+    ushort[256] red;
+    ushort[256] green;
+    ushort[256] blue;
+}
+
+/* Back buffer types */
+enum : D3DBACKBUFFER_TYPE {
+    D3DBACKBUFFER_TYPE_MONO         = 0,
+    D3DBACKBUFFER_TYPE_LEFT         = 1,
+    D3DBACKBUFFER_TYPE_RIGHT        = 2
+}
+typedef uint D3DBACKBUFFER_TYPE;
+
+/* Types */
+enum : D3DRESOURCETYPE {
+    D3DRTYPE_SURFACE                =  1,
+    D3DRTYPE_VOLUME                 =  2,
+    D3DRTYPE_TEXTURE                =  3,
+    D3DRTYPE_VOLUMETEXTURE          =  4,
+    D3DRTYPE_CUBETEXTURE            =  5,
+    D3DRTYPE_VERTEXBUFFER           =  6,
+    D3DRTYPE_INDEXBUFFER            =  7            //if this changes, change _D3DDEVINFO_RESOURCEMANAGER definition
+}
+typedef uint D3DRESOURCETYPE;
+
+/* Usages */
+const D3DUSAGE_RENDERTARGET = 0x00000001L;
+const D3DUSAGE_DEPTHSTENCIL = 0x00000002L;
+const D3DUSAGE_DYNAMIC = 0x00000200L;
+const D3DUSAGE_NONSECURE = 0x00800000L;
+
+// When passed to CheckDeviceFormat, D3DUSAGE_AUTOGENMIPMAP may return
+// D3DOK_NOAUTOGEN if the device doesn't support autogeneration for that format.
+// D3DOK_NOAUTOGEN is a success code, not a failure code... the SUCCEEDED and FAILED macros
+// will return true and false respectively for this code.
+const D3DUSAGE_AUTOGENMIPMAP = 0x00000400L;
+const D3DUSAGE_DMAP = 0x00004000L;
+
+// The following usages are valid only for querying CheckDeviceFormat
+const D3DUSAGE_QUERY_LEGACYBUMPMAP = 0x00008000L;
+const D3DUSAGE_QUERY_SRGBREAD = 0x00010000L;
+const D3DUSAGE_QUERY_FILTER = 0x00020000L;
+const D3DUSAGE_QUERY_SRGBWRITE = 0x00040000L;
+const D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING = 0x00080000L;
+const D3DUSAGE_QUERY_VERTEXTEXTURE = 0x00100000L;
+const D3DUSAGE_QUERY_WRAPANDMIP = 0x00200000L;
+
+/* Usages for Vertex/Index buffers */
+const D3DUSAGE_WRITEONLY = 0x00000008L;
+const D3DUSAGE_SOFTWAREPROCESSING = 0x00000010L;
+const D3DUSAGE_DONOTCLIP = 0x00000020L;
+const D3DUSAGE_POINTS = 0x00000040L;
+const D3DUSAGE_RTPATCHES = 0x00000080L;
+const D3DUSAGE_NPATCHES = 0x00000100L;
+const D3DUSAGE_TEXTAPI = 0x10000000L;
+
+/* CubeMap Face identifiers */
+enum : D3DCUBEMAP_FACES {
+    D3DCUBEMAP_FACE_POSITIVE_X     = 0,
+    D3DCUBEMAP_FACE_NEGATIVE_X     = 1,
+    D3DCUBEMAP_FACE_POSITIVE_Y     = 2,
+    D3DCUBEMAP_FACE_NEGATIVE_Y     = 3,
+    D3DCUBEMAP_FACE_POSITIVE_Z     = 4,
+    D3DCUBEMAP_FACE_NEGATIVE_Z     = 5
+}
+typedef uint D3DCUBEMAP_FACES;
+
+/* Lock flags */
+const D3DLOCK_READONLY = 0x00000010L;
+const D3DLOCK_DISCARD = 0x00002000L;
+const D3DLOCK_NOOVERWRITE = 0x00001000L;
+const D3DLOCK_NOSYSLOCK = 0x00000800L;
+const D3DLOCK_DONOTWAIT = 0x00004000L;                  
+const D3DLOCK_NO_DIRTY_UPDATE = 0x00008000L;
+
+/* Vertex Buffer Description */
+struct D3DVERTEXBUFFER_DESC {
+    D3DFORMAT           Format;
+    D3DRESOURCETYPE     Type;
+    DWORD               Usage;
+    D3DPOOL             Pool;
+    UINT                Size;
+    DWORD               FVF;
+}
+
+/* Index Buffer Description */
+struct D3DINDEXBUFFER_DESC {
+    D3DFORMAT           Format;
+    D3DRESOURCETYPE     Type;
+    DWORD               Usage;
+    D3DPOOL             Pool;
+    UINT                Size;
+}
+
+
+/* Surface Description */
+struct D3DSURFACE_DESC {
+    D3DFORMAT           Format;
+    D3DRESOURCETYPE     Type;
+    DWORD               Usage;
+    D3DPOOL             Pool;
+
+    D3DMULTISAMPLE_TYPE MultiSampleType;
+    DWORD               MultiSampleQuality;
+    UINT                Width;
+    UINT                Height;
+}
+
+struct D3DVOLUME_DESC {
+    D3DFORMAT           Format;
+    D3DRESOURCETYPE     Type;
+    DWORD               Usage;
+    D3DPOOL             Pool;
+
+    UINT                Width;
+    UINT                Height;
+    UINT                Depth;
+}
+
+/* Structure for LockRect */
+struct D3DLOCKED_RECT {
+    INT                 Pitch;
+    void*               pBits;
+}
+
+/* Structures for LockBox */
+struct D3DBOX {
+    UINT                Left;
+    UINT                Top;
+    UINT                Right;
+    UINT                Bottom;
+    UINT                Front;
+    UINT                Back;
+}
+
+struct D3DLOCKED_BOX
+{
+    INT                 RowPitch;
+    INT                 SlicePitch;
+    void*               pBits;
+}
+
+/* Structures for LockRange */
+struct D3DRANGE
+{
+    UINT                Offset;
+    UINT                Size;
+}
+
+/* Structures for high order primitives */
+struct D3DRECTPATCH_INFO
+{
+    UINT                StartVertexOffsetWidth;
+    UINT                StartVertexOffsetHeight;
+    UINT                Width;
+    UINT                Height;
+    UINT                Stride;
+    D3DBASISTYPE        Basis;
+    D3DDEGREETYPE       Degree;
+}
+
+struct D3DTRIPATCH_INFO
+{
+    UINT                StartVertexOffset;
+    UINT                NumVertices;
+    D3DBASISTYPE        Basis;
+    D3DDEGREETYPE       Degree;
+}
+
+/* Adapter Identifier */
+
+const MAX_DEVICE_IDENTIFIER_STRING = 512;
+struct D3DADAPTER_IDENTIFIER9
+{
+    char[MAX_DEVICE_IDENTIFIER_STRING] Driver;
+    char[MAX_DEVICE_IDENTIFIER_STRING] Description;
+    char[32] DeviceName;         /* Device name for GDI (ex. \\.\DISPLAY1) */
+
+    LARGE_INTEGER   DriverVersion;          /* Defined for 32 bit components */
+
+    DWORD           VendorId;
+    DWORD           DeviceId;
+    DWORD           SubSysId;
+    DWORD           Revision;
+
+    GUID            DeviceIdentifier;
+
+    DWORD           WHQLLevel;
+}
+
+
+/* Raster Status structure returned by GetRasterStatus */
+struct D3DRASTER_STATUS
+{
+    BOOL InVBlank;
+    UINT ScanLine;
+}
+
+
+
+/* Debug monitor tokens (DEBUG only)
+
+   Note that if D3DRS_DEBUGMONITORTOKEN is set, the call is treated as
+   passing a token to the debug monitor.  For example, if, after passing
+   D3DDMT_ENABLE/DISABLE to D3DRS_DEBUGMONITORTOKEN other token values
+   are passed in, the enabled/disabled state of the debug
+   monitor will still persist.
+
+   The debug monitor defaults to enabled.
+
+   Calling GetRenderState on D3DRS_DEBUGMONITORTOKEN is not of any use.
+*/
+enum : D3DDEBUGMONITORTOKENS {
+    D3DDMT_ENABLE            = 0,    // enable debug monitor
+    D3DDMT_DISABLE           = 1     // disable debug monitor
+}
+typedef uint D3DDEBUGMONITORTOKENS;
+
+// Async feedback
+
+enum : D3DQUERYTYPE {
+    D3DQUERYTYPE_VCACHE                 = 4, /* D3DISSUE_END */
+    D3DQUERYTYPE_RESOURCEMANAGER        = 5, /* D3DISSUE_END */
+    D3DQUERYTYPE_VERTEXSTATS            = 6, /* D3DISSUE_END */
+    D3DQUERYTYPE_EVENT                  = 8, /* D3DISSUE_END */
+    D3DQUERYTYPE_OCCLUSION              = 9, /* D3DISSUE_BEGIN, D3DISSUE_END */
+    D3DQUERYTYPE_TIMESTAMP              = 10, /* D3DISSUE_END */
+    D3DQUERYTYPE_TIMESTAMPDISJOINT      = 11, /* D3DISSUE_BEGIN, D3DISSUE_END */
+    D3DQUERYTYPE_TIMESTAMPFREQ          = 12, /* D3DISSUE_END */
+    D3DQUERYTYPE_PIPELINETIMINGS        = 13, /* D3DISSUE_BEGIN, D3DISSUE_END */
+    D3DQUERYTYPE_INTERFACETIMINGS       = 14, /* D3DISSUE_BEGIN, D3DISSUE_END */
+    D3DQUERYTYPE_VERTEXTIMINGS          = 15, /* D3DISSUE_BEGIN, D3DISSUE_END */
+    D3DQUERYTYPE_PIXELTIMINGS           = 16, /* D3DISSUE_BEGIN, D3DISSUE_END */
+    D3DQUERYTYPE_BANDWIDTHTIMINGS       = 17, /* D3DISSUE_BEGIN, D3DISSUE_END */
+    D3DQUERYTYPE_CACHEUTILIZATION       = 18, /* D3DISSUE_BEGIN, D3DISSUE_END */
+}
+typedef uint D3DQUERYTYPE;
+
+// Flags field for Issue
+const D3DISSUE_END = (1 << 0); // Tells the runtime to issue the end of a query, changing it's state to "non-signaled".
+const D3DISSUE_BEGIN = (1 << 1); // Tells the runtime to issue the beginng of a query.
+
+
+// Flags field for GetData
+const D3DGETDATA_FLUSH = (1 << 0); // Tells the runtime to flush if the query is outstanding.
+
+
+struct D3DRESOURCESTATS
+{
+// Data collected since last Present()
+    BOOL    bThrashing;             /* indicates if thrashing */
+    DWORD   ApproxBytesDownloaded;  /* Approximate number of bytes downloaded by resource manager */
+    DWORD   NumEvicts;              /* number of objects evicted */
+    DWORD   NumVidCreates;          /* number of objects created in video memory */
+    DWORD   LastPri;                /* priority of last object evicted */
+    DWORD   NumUsed;                /* number of objects set to the device */
+    DWORD   NumUsedInVidMem;        /* number of objects set to the device, which are already in video memory */
+// Persistent data
+    DWORD   WorkingSet;             /* number of objects in video memory */
+    DWORD   WorkingSetBytes;        /* number of bytes in video memory */
+    DWORD   TotalManaged;           /* total number of managed objects */
+    DWORD   TotalBytes;             /* total number of bytes of managed objects */
+}
+
+const D3DRTYPECOUNT = D3DRTYPE_INDEXBUFFER+1;
+
+struct D3DDEVINFO_RESOURCEMANAGER
+{
+//#ifndef WOW64_ENUM_WORKAROUND
+//    D3DRESOURCESTATS    stats[D3DRTYPECOUNT];
+    D3DRESOURCESTATS    stats[8];
+}
+alias D3DDEVINFO_RESOURCEMANAGER* LPD3DDEVINFO_RESOURCEMANAGER;
+
+struct D3DDEVINFO_D3DVERTEXSTATS
+{
+    DWORD   NumRenderedTriangles;       /* total number of triangles that are not clipped in this frame */
+    DWORD   NumExtraClippingTriangles;  /* Number of new triangles generated by clipping */
+}
+alias D3DDEVINFO_D3DVERTEXSTATS *LPD3DDEVINFO_D3DVERTEXSTATS;
+
+
+struct D3DDEVINFO_VCACHE {
+    DWORD   Pattern;                    /* bit pattern, return value must be FOUR_CC('C', 'A', 'C', 'H') */
+    DWORD   OptMethod;                  /* optimization method 0 means longest strips, 1 means vertex cache based */
+    DWORD   CacheSize;                  /* cache size to optimize for  (only required if type is 1) */
+    DWORD   MagicNumber;                /* used to determine when to restart strips (only required if type is 1)*/
+}
+alias D3DDEVINFO_VCACHE *LPD3DDEVINFO_VCACHE;
+
+struct D3DDEVINFO_D3D9PIPELINETIMINGS
+{
+    FLOAT VertexProcessingTimePercent;
+    FLOAT PixelProcessingTimePercent;
+    FLOAT OtherGPUProcessingTimePercent;
+    FLOAT GPUIdleTimePercent;
+}
+
+struct D3DDEVINFO_D3D9INTERFACETIMINGS
+{
+    FLOAT WaitingForGPUToUseApplicationResourceTimePercent;
+    FLOAT WaitingForGPUToAcceptMoreCommandsTimePercent;
+    FLOAT WaitingForGPUToStayWithinLatencyTimePercent;
+    FLOAT WaitingForGPUExclusiveResourceTimePercent;
+    FLOAT WaitingForGPUOtherTimePercent;
+}
+
+struct D3DDEVINFO_D3D9STAGETIMINGS
+{
+    FLOAT MemoryProcessingPercent;
+    FLOAT ComputationProcessingPercent;
+}
+
+struct D3DDEVINFO_D3D9BANDWIDTHTIMINGS
+{
+    FLOAT MaxBandwidthUtilized;
+    FLOAT FrontEndUploadMemoryUtilizedPercent;
+    FLOAT VertexRateUtilizedPercent;
+    FLOAT TriangleSetupRateUtilizedPercent;
+    FLOAT FillRateUtilizedPercent;
+}
+
+struct D3DDEVINFO_D3D9CACHEUTILIZATION
+{
+    FLOAT TextureCacheHitRate; // Percentage of cache hits
+    FLOAT PostTransformVertexCacheHitRate;
+}
+
+enum : D3DCOMPOSERECTSOP {
+    D3DCOMPOSERECTS_COPY     = 1,
+    D3DCOMPOSERECTS_OR       = 2,
+    D3DCOMPOSERECTS_AND      = 3,
+    D3DCOMPOSERECTS_NEG      = 4
+}
+typedef uint D3DCOMPOSERECTSOP;
+
+struct D3DCOMPOSERECTDESC
+{
+    USHORT  X, Y;           // Top-left coordinates of a rect in the source surface
+    USHORT  Width, Height;  // Dimensions of the rect
+}
+
+struct D3DCOMPOSERECTDESTINATION
+{
+    USHORT SrcRectIndex;    // Index of D3DCOMPOSERECTDESC
+    USHORT Reserved;        // For alignment
+    SHORT  X, Y;            // Top-left coordinates of the rect in the destination surface
+}
+
+const D3DCOMPOSERECTS_MAXNUMRECTS = 0xFFFF;
+const D3DCONVOLUTIONMONO_MAXWIDTH = 7;
+const D3DCONVOLUTIONMONO_MAXHEIGHT = D3DCONVOLUTIONMONO_MAXWIDTH;
+const D3DFMT_A1_SURFACE_MAXWIDTH = 8192;
+const D3DFMT_A1_SURFACE_MAXHEIGHT = 2048;
+
+
+struct D3DPRESENTSTATS {
+    UINT PresentCount;
+    UINT PresentRefreshCount;
+    UINT SyncRefreshCount;
+    LARGE_INTEGER SyncQPCTime;
+    LARGE_INTEGER SyncGPUTime;
+}
+
+enum : D3DSCANLINEORDERING
+{
+    D3DSCANLINEORDERING_UNKNOWN                    = 0, 
+    D3DSCANLINEORDERING_PROGRESSIVE                = 1,
+    D3DSCANLINEORDERING_INTERLACED                 = 2
+}
+typedef uint D3DSCANLINEORDERING;
+
+
+struct D3DDISPLAYMODEEX
+{
+    UINT                    Size;
+    UINT                    Width;
+    UINT                    Height;
+    UINT                    RefreshRate;
+    D3DFORMAT               Format;
+    D3DSCANLINEORDERING     ScanLineOrdering;
+}
+
+struct D3DDISPLAYMODEFILTER
+{
+    UINT                    Size;
+    D3DFORMAT               Format;
+    D3DSCANLINEORDERING     ScanLineOrdering;
+}
+
+
+enum : D3DDISPLAYROTATION
+{
+    D3DDISPLAYROTATION_IDENTITY = 1, // No rotation.           
+    D3DDISPLAYROTATION_90       = 2, // Rotated 90 degrees.
+    D3DDISPLAYROTATION_180      = 3, // Rotated 180 degrees.
+    D3DDISPLAYROTATION_270      = 4  // Rotated 270 degrees.
+}
+typedef uint D3DDISPLAYROTATION;
+
+/* For use in ID3DResource9::SetPriority calls */
+const D3D9_RESOURCE_PRIORITY_MINIMUM = 0x28000000;
+const D3D9_RESOURCE_PRIORITY_LOW = 0x50000000;
+const D3D9_RESOURCE_PRIORITY_NORMAL = 0x78000000;
+const D3D9_RESOURCE_PRIORITY_HIGH = 0xa0000000;
+const D3D9_RESOURCE_PRIORITY_MAXIMUM = 0xc8000000;
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/d3dx10.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,39 @@
+/***********************************************************************\
+*                                d3dx10.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.directx.d3dx10;
+
+private import win32.windows;
+
+public import win32.directx.d3d10;
+public import win32.directx.d3dx10math;
+public import win32.directx.d3dx10core;
+public import win32.directx.d3dx10tex;
+public import win32.directx.d3dx10mesh;
+public import win32.directx.d3dx10async;
+
+pragma(lib, "d3dx10.lib");
+
+const UINT D3DX10_DEFAULT = -1;
+const UINT D3DX10_FROM_FILE = -3;
+const DXGI_FORMAT DXGI_FORMAT_FROM_FILE = cast(DXGI_FORMAT)-3;
+
+const _FACDD = 0x876;
+HRESULT MAKE_DDHRESULT(T)(T code) {
+	return MAKE_HRESULT(1, _FACDD, code);
+}
+
+alias HRESULT _D3DX10_ERR;
+_D3DX10_ERR D3DX10_ERR_CANNOT_MODIFY_INDEX_BUFFER	= MAKE_DDHRESULT(2900);
+_D3DX10_ERR D3DX10_ERR_INVALID_MESH					= MAKE_DDHRESULT(2901);
+_D3DX10_ERR D3DX10_ERR_CANNOT_ATTR_SORT				= MAKE_DDHRESULT(2902);
+_D3DX10_ERR D3DX10_ERR_SKINNING_NOT_SUPPORTED		= MAKE_DDHRESULT(2903);
+_D3DX10_ERR D3DX10_ERR_TOO_MANY_INFLUENCES			= MAKE_DDHRESULT(2904);
+_D3DX10_ERR D3DX10_ERR_INVALID_DATA					= MAKE_DDHRESULT(2905);
+_D3DX10_ERR D3DX10_ERR_LOADED_MESH_HAS_NO_DATA		= MAKE_DDHRESULT(2906);
+_D3DX10_ERR D3DX10_ERR_DUPLICATE_NAMED_FRAGMENT		= MAKE_DDHRESULT(2907);
+_D3DX10_ERR D3DX10_ERR_CANNOT_REMOVE_LAST_ITEM		= MAKE_DDHRESULT(2908);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/d3dx10async.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,112 @@
+/***********************************************************************\
+*                             d3dx10async.d                             *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.directx.d3dx10async;
+
+private import win32.windows;
+private import win32.directx.d3d10;
+private import win32.directx.d3d10shader;
+private import win32.directx.d3d10effect;
+private import win32.directx.d3dx10;
+private import win32.directx.d3dx10async;
+
+extern(Windows) {
+	HRESULT D3DX10CompileFromFileA(LPCSTR pSrcFile, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, LPCSTR pFunctionName, LPCSTR pProfile, UINT Flags1, UINT Flags2, ID3DX10ThreadPump pPump, ID3D10Blob* ppShader, ID3D10Blob* ppErrorMsgs, HRESULT* pHResult);
+	HRESULT D3DX10CompileFromFileW(LPCWSTR pSrcFile, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, LPCSTR pFunctionName, LPCSTR pProfile, UINT Flags1, UINT Flags2, ID3DX10ThreadPump pPump, ID3D10Blob* ppShader, ID3D10Blob* ppErrorMsgs, HRESULT* pHResult);
+}
+
+version(Unicode) {
+	alias D3DX10CompileFromFileW D3DX10CompileFromFile;
+} else {
+	alias D3DX10CompileFromFileA D3DX10CompileFromFile;
+}
+
+extern(Windows) {
+	HRESULT D3DX10CompileFromResourceA(HMODULE hSrcModule, LPCSTR pSrcResource, LPCSTR pSrcFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, LPCSTR pFunctionName, LPCSTR pProfile, UINT Flags1, UINT Flags2, ID3DX10ThreadPump pPump, ID3D10Blob* ppShader, ID3D10Blob* ppErrorMsgs, HRESULT* pHResult);
+	HRESULT D3DX10CompileFromResourceW(HMODULE hSrcModule, LPCWSTR pSrcResource, LPCWSTR pSrcFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, LPCSTR pFunctionName, LPCSTR pProfile, UINT Flags1, UINT Flags2, ID3DX10ThreadPump pPump, ID3D10Blob* ppShader, ID3D10Blob* ppErrorMsgs, HRESULT* pHResult);
+}
+
+version(Unicode) {
+	alias D3DX10CompileFromResourceW D3DX10CompileFromResource;
+} else {
+	alias D3DX10CompileFromResourceA D3DX10CompileFromResource;
+}
+
+extern(Windows) {
+	HRESULT D3DX10CompileFromMemory(LPCSTR pSrcData, SIZE_T SrcDataLen, LPCSTR pFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, LPCSTR pFunctionName, LPCSTR pProfile, UINT Flags1, UINT Flags2, ID3DX10ThreadPump pPump, ID3D10Blob* ppShader, ID3D10Blob* ppErrorMsgs, HRESULT* pHResult);
+	HRESULT D3DX10CreateEffectFromFileA(LPCSTR pFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, LPCSTR pProfile, UINT HLSLFlags, UINT FXFlags, ID3D10Device pDevice, ID3D10EffectPool pEffectPool, ID3DX10ThreadPump pPump, ID3D10Effect* ppEffect, ID3D10Blob* ppErrors, HRESULT* pHResult);
+	HRESULT D3DX10CreateEffectFromFileW(LPCWSTR pFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, LPCSTR pProfile, UINT HLSLFlags, UINT FXFlags, ID3D10Device pDevice, ID3D10EffectPool pEffectPool, ID3DX10ThreadPump pPump, ID3D10Effect* ppEffect, ID3D10Blob* ppErrors, HRESULT* pHResult);
+	HRESULT D3DX10CreateEffectFromMemory(LPCVOID pData, SIZE_T DataLength, LPCSTR pSrcFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, LPCSTR pProfile, UINT HLSLFlags, UINT FXFlags, ID3D10Device pDevice, ID3D10EffectPool pEffectPool, ID3DX10ThreadPump pPump, ID3D10Effect* ppEffect, ID3D10Blob* ppErrors, HRESULT* pHResult);
+	HRESULT D3DX10CreateEffectFromResourceA(HMODULE hModule, LPCSTR pResourceName, LPCSTR pSrcFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, LPCSTR pProfile, UINT HLSLFlags, UINT FXFlags, ID3D10Device pDevice, ID3D10EffectPool pEffectPool, ID3DX10ThreadPump pPump, ID3D10Effect* ppEffect, ID3D10Blob* ppErrors, HRESULT* pHResult);
+	HRESULT D3DX10CreateEffectFromResourceW(HMODULE hModule, LPCWSTR pResourceName, LPCWSTR pSrcFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, LPCSTR pProfile, UINT HLSLFlags, UINT FXFlags, ID3D10Device pDevice, ID3D10EffectPool pEffectPool, ID3DX10ThreadPump pPump, ID3D10Effect* ppEffect, ID3D10Blob* ppErrors, HRESULT* pHResult);
+}
+
+version(Unicode) {
+	alias D3DX10CreateEffectFromFileW D3DX10CreateEffectFromFile;
+	alias D3DX10CreateEffectFromResourceW D3DX10CreateEffectFromResource;
+} else {
+	alias D3DX10CreateEffectFromFileA D3DX10CreateEffectFromFile;
+	alias D3DX10CreateEffectFromResourceA D3DX10CreateEffectFromResource;
+}
+
+extern(Windows) {
+	HRESULT D3DX10CreateEffectPoolFromFileA(LPCSTR pFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, LPCSTR pProfile, UINT HLSLFlags, UINT FXFlags, ID3D10Device pDevice, ID3DX10ThreadPump pPump, ID3D10EffectPool* ppEffectPool, ID3D10Blob* ppErrors, HRESULT* pHResult);
+	HRESULT D3DX10CreateEffectPoolFromFileW(LPCWSTR pFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, LPCSTR pProfile, UINT HLSLFlags, UINT FXFlags, ID3D10Device pDevice, ID3DX10ThreadPump pPump, ID3D10EffectPool* ppEffectPool, ID3D10Blob* ppErrors, HRESULT* pHResult);
+	HRESULT D3DX10CreateEffectPoolFromMemory(LPCVOID pData, SIZE_T DataLength, LPCSTR pSrcFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, LPCSTR pProfile, UINT HLSLFlags, UINT FXFlags, ID3D10Device pDevice, ID3DX10ThreadPump pPump, ID3D10EffectPool* ppEffectPool, ID3D10Blob* ppErrors, HRESULT* pHResult);
+	HRESULT D3DX10CreateEffectPoolFromResourceA(HMODULE hModule, LPCSTR pResourceName, LPCSTR pSrcFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, LPCSTR pProfile, UINT HLSLFlags, UINT FXFlags, ID3D10Device pDevice, ID3DX10ThreadPump pPump, ID3D10EffectPool* ppEffectPool, ID3D10Blob* ppErrors, HRESULT* pHResult);
+	HRESULT D3DX10CreateEffectPoolFromResourceW(HMODULE hModule, LPCWSTR pResourceName, LPCWSTR pSrcFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, LPCSTR pProfile, UINT HLSLFlags, UINT FXFlags, ID3D10Device pDevice, ID3DX10ThreadPump pPump, ID3D10EffectPool* ppEffectPool, ID3D10Blob* ppErrors, HRESULT* pHResult);
+}
+
+version(Unicode) {
+	alias D3DX10CreateEffectPoolFromFileW D3DX10CreateEffectPoolFromFile;
+	alias D3DX10CreateEffectPoolFromResourceW D3DX10CreateEffectPoolFromResource;
+} else {
+	alias D3DX10CreateEffectPoolFromFileA D3DX10CreateEffectPoolFromFile;
+	alias D3DX10CreateEffectPoolFromResourceA D3DX10CreateEffectPoolFromResource;
+}
+
+extern(Windows) {
+	HRESULT D3DX10PreprocessShaderFromFileA(LPCSTR pFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, ID3DX10ThreadPump pPump, ID3D10Blob* ppShaderText, ID3D10Blob* ppErrorMsgs, HRESULT* pHResult);
+	HRESULT D3DX10PreprocessShaderFromFileW(LPCWSTR pFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, ID3DX10ThreadPump pPump, ID3D10Blob* ppShaderText, ID3D10Blob* ppErrorMsgs, HRESULT* pHResult);
+	HRESULT D3DX10PreprocessShaderFromMemory(LPCSTR pSrcData, SIZE_T SrcDataSize, LPCSTR pFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, ID3DX10ThreadPump pPump, ID3D10Blob* ppShaderText, ID3D10Blob* ppErrorMsgs, HRESULT* pHResult);
+	HRESULT D3DX10PreprocessShaderFromResourceA(HMODULE hModule, LPCSTR pResourceName, LPCSTR pSrcFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, ID3DX10ThreadPump pPump, ID3D10Blob* ppShaderText, ID3D10Blob* ppErrorMsgs, HRESULT* pHResult);
+	HRESULT D3DX10PreprocessShaderFromResourceW(HMODULE hModule, LPCWSTR pResourceName, LPCWSTR pSrcFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, ID3DX10ThreadPump pPump, ID3D10Blob* ppShaderText, ID3D10Blob* ppErrorMsgs, HRESULT* pHResult);
+}
+
+version(Unicode) {
+	alias D3DX10PreprocessShaderFromFileW D3DX10PreprocessShaderFromFile;
+	alias D3DX10PreprocessShaderFromResourceW D3DX10PreprocessShaderFromResource;
+} else {
+	alias D3DX10PreprocessShaderFromFileA D3DX10PreprocessShaderFromFile;
+	alias D3DX10PreprocessShaderFromResourceA D3DX10PreprocessShaderFromResource;
+}
+
+extern(Windows) {
+	HRESULT D3DX10CreateAsyncCompilerProcessor(LPCSTR pFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, LPCSTR pFunctionName, LPCSTR pProfile, UINT Flags1, UINT Flags2, ID3D10Blob* ppCompiledShader, ID3D10Blob* ppErrorBuffer, ID3DX10DataProcessor* ppProcessor);
+	HRESULT D3DX10CreateAsyncEffectCreateProcessor(LPCSTR pFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, LPCSTR pProfile, UINT Flags, UINT FXFlags, ID3D10Device pDevice, ID3D10EffectPool pPool, ID3D10Blob* ppErrorBuffer, ID3DX10DataProcessor* ppProcessor);
+	HRESULT D3DX10CreateAsyncEffectPoolCreateProcessor(LPCSTR pFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, LPCSTR pProfile, UINT Flags, UINT FXFlags, ID3D10Device pDevice, ID3D10Blob* ppErrorBuffer, ID3DX10DataProcessor* ppProcessor);
+	HRESULT D3DX10CreateAsyncShaderPreprocessProcessor(LPCSTR pFileName, D3D10_SHADER_MACRO* pDefines, ID3D10Include pInclude, ID3D10Blob* ppShaderText, ID3D10Blob* ppErrorBuffer, ID3DX10DataProcessor* ppProcessor);
+	HRESULT D3DX10CreateAsyncFileLoaderW(LPCWSTR pFileName, ID3DX10DataLoader* ppDataLoader);
+	HRESULT D3DX10CreateAsyncFileLoaderA(LPCSTR pFileName, ID3DX10DataLoader* ppDataLoader);
+	HRESULT D3DX10CreateAsyncMemoryLoader(LPCVOID pData, SIZE_T cbData, ID3DX10DataLoader* ppDataLoader);
+	HRESULT D3DX10CreateAsyncResourceLoaderW(HMODULE hSrcModule, LPCWSTR pSrcResource, ID3DX10DataLoader* ppDataLoader);
+	HRESULT D3DX10CreateAsyncResourceLoaderA(HMODULE hSrcModule, LPCSTR pSrcResource, ID3DX10DataLoader* ppDataLoader);
+}
+
+version(Unicode) {
+	alias D3DX10CreateAsyncFileLoaderW D3DX10CreateAsyncFileLoader;
+	alias D3DX10CreateAsyncResourceLoaderW D3DX10CreateAsyncResourceLoader;
+} else {
+	alias D3DX10CreateAsyncFileLoaderA D3DX10CreateAsyncFileLoader;
+	alias D3DX10CreateAsyncResourceLoaderA D3DX10CreateAsyncResourceLoader;
+}
+
+extern(Windows) {
+	HRESULT D3DX10CreateAsyncTextureProcessor(ID3D10Device pDevice, D3DX10_IMAGE_LOAD_INFO* pLoadInfo, ID3DX10DataProcessor* ppDataProcessor);
+	HRESULT D3DX10CreateAsyncTextureInfoProcessor(D3DX10_IMAGE_INFO* pImageInfo, ID3DX10DataProcessor* ppDataProcessor);
+	HRESULT D3DX10CreateAsyncShaderResourceViewProcessor(ID3D10Device pDevice, D3DX10_IMAGE_LOAD_INFO* pLoadInfo, ID3DX10DataProcessor* ppDataProcessor);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/d3dx10core.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,214 @@
+/***********************************************************************\
+*                              d3dx10core.d                             *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.directx.d3dx10core;
+
+private import win32.windows;
+
+private import win32.directx.d3d10;
+private import win32.directx.d3d10effect;
+private import win32.directx.d3dx10math;
+
+const D3DX10_DLL_W = "d3dx10_36.dll";
+const D3DX10_DLL_A = "d3dx10_36.dll";
+
+version(Unicode) {
+	alias D3DX10_DLL_W D3DX10_DLL;
+} else {
+	alias D3DX10_DLL_A D3DX10_DLL;
+}
+
+const D3DX10_SDK_VERSION = 36;
+
+extern(Windows) {
+	HRESULT D3DX10CreateDevice(IDXGIAdapter pAdapter, D3D10_DRIVER_TYPE DriverType,
+		HMODULE Software, UINT Flags, ID3D10Device* ppDevice);
+	HRESULT D3DX10CreateDeviceAndSwapChain(IDXGIAdapter pAdapter, D3D10_DRIVER_TYPE DriverType,
+		HMODULE Software, UINT Flags, DXGI_SWAP_CHAIN_DESC* pSwapChainDesc, IDXGISwapChain* ppSwapChain,    
+		ID3D10Device* ppDevice);
+//TODO	HRESULT D3DX10GetFeatureLevel1(ID3D10Device pDevice, ID3D10Device1* ppDevice1);
+
+	debug(D3D10_DEBUG) {
+		BOOL D3DX10DebugMute(BOOL Mute);
+	}
+
+	HRESULT D3DX10CheckVersion(UINT D3DSdkVersion, UINT D3DX10SdkVersion);
+	UINT D3DX10GetDriverLevel(ID3D10Device pDevice);
+}
+
+enum D3DX10_SPRITE_FLAG {
+	D3DX10_SPRITE_SORT_TEXTURE				= 0x01,
+	D3DX10_SPRITE_SORT_DEPTH_BACK_TO_FRONT	= 0x02,
+	D3DX10_SPRITE_SORT_DEPTH_FRONT_TO_BACK	= 0x04,
+	D3DX10_SPRITE_SAVE_STATE				= 0x08,
+	D3DX10_SPRITE_ADDREF_TEXTURES			= 0x10
+}
+
+struct D3DX10_SPRITE {
+	D3DXMATRIX					matWorld;
+	D3DXVECTOR2					TexCoord;
+	D3DXVECTOR2					TexSize;
+	D3DXCOLOR					ColorModulate;
+	ID3D10ShaderResourceView	pTexture;
+	UINT						TextureIndex;
+}
+
+extern(C) const GUID IID_ID3DX10Sprite = {0xba0b762d, 0x8d28, 0x43ec, [0xb9, 0xdc, 0x2f, 0x84, 0x44, 0x3b, 0x06, 0x14]};
+
+interface ID3DX10Sprite : IUnknown {
+	extern(Windows) :
+	HRESULT Begin(UINT flags);
+	HRESULT DrawSpritesBuffered(D3DX10_SPRITE* pSprites, UINT cSprites);
+	HRESULT Flush();
+	HRESULT DrawSpritesImmediate(D3DX10_SPRITE* pSprites, UINT cSprites, UINT cbSprite, UINT flags);
+	HRESULT End();
+	HRESULT GetViewTransform(D3DXMATRIX* pViewTransform);
+	HRESULT SetViewTransform(D3DXMATRIX* pViewTransform);
+	HRESULT GetProjectionTransform(D3DXMATRIX* pProjectionTransform);
+	HRESULT SetProjectionTransform(D3DXMATRIX* pProjectionTransform);
+	HRESULT GetDevice(ID3D10Device* ppDevice);
+}
+
+extern(Windows) HRESULT D3DX10CreateSprite(ID3D10Device pDevice, UINT cDeviceBufferSize, ID3DX10Sprite* ppSprite);
+
+interface ID3DX10DataLoader {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	HRESULT Load();
+	HRESULT Decompress(void** ppData, SIZE_T* pcBytes);
+	HRESULT Destroy();
+	*/
+}
+
+interface ID3DX10DataProcessor {
+/* TODO: fix vtbl[0] bug
+	extern(Windows) :
+	HRESULT Process(void* pData, SIZE_T cBytes);
+	HRESULT CreateDeviceObject(void** ppDataObject);
+	HRESULT Destroy();
+	*/
+}
+
+extern(C) const GUID IID_ID3DX10ThreadPump = {0xc93fecfa, 0x6967, 0x478a, [0xab, 0xbc, 0x40, 0x2d, 0x90, 0x62, 0x1f, 0xcb]};
+
+interface ID3DX10ThreadPump : IUnknown {
+	extern(Windows) :
+	HRESULT AddWorkItem(ID3DX10DataLoader pDataLoader, ID3DX10DataProcessor pDataProcessor, HRESULT *pHResult, void **ppDeviceObject);
+	UINT GetWorkItemCount();
+	HRESULT WaitForAllItems();
+	HRESULT ProcessDeviceWorkItems(UINT iWorkItemCount);
+	HRESULT PurgeAllItems();
+	HRESULT GetQueueStatus(UINT* pIoQueue, UINT* pProcessQueue, UINT* pDeviceQueue);
+}
+
+extern(Windows) HRESULT D3DX10CreateThreadPump(UINT cIoThreads, UINT cProcThreads,
+	ID3DX10ThreadPump *ppThreadPump);
+
+struct D3DX10_FONT_DESCA {
+	INT Height;
+	UINT Width;
+	UINT Weight;
+	UINT MipLevels;
+	BOOL Italic;
+	BYTE CharSet;
+	BYTE OutputPrecision;
+	BYTE Quality;
+	BYTE PitchAndFamily;
+	CHAR[LF_FACESIZE] FaceName;
+}
+
+struct D3DX10_FONT_DESCW {
+	INT Height;
+	UINT Width;
+	UINT Weight;
+	UINT MipLevels;
+	BOOL Italic;
+	BYTE CharSet;
+	BYTE OutputPrecision;
+	BYTE Quality;
+	BYTE PitchAndFamily;
+	WCHAR[LF_FACESIZE] FaceName;
+}
+
+version(Unicode) {
+	alias D3DX10_FONT_DESCW D3DX10_FONT_DESC;
+} else {
+	alias D3DX10_FONT_DESCA D3DX10_FONT_DESC;
+}
+
+extern(C) const GUID IID_ID3DX10Font = {0xd79dbb70, 0x5f21, 0x4d36, [0xbb, 0xc2, 0xff, 0x52, 0x5c, 0x21, 0x3c, 0xdc]};
+
+interface ID3DX10Font : IUnknown {
+	extern(Windows) :
+	HRESULT GetDevice(ID3D10Device* ppDevice);
+	HRESULT GetDescA(D3DX10_FONT_DESCA* pDesc);
+	HRESULT GetDescW(D3DX10_FONT_DESCW* pDesc);
+	BOOL GetTextMetricsA(TEXTMETRICA* pTextMetrics);
+	BOOL GetTextMetricsW(TEXTMETRICW* pTextMetrics);
+	HDC GetDC();
+	HRESULT GetGlyphData(UINT Glyph, ID3D10ShaderResourceView* ppTexture, RECT* pBlackBox, POINT* pCellInc);
+	HRESULT PreloadCharacters(UINT First, UINT Last);
+	HRESULT PreloadGlyphs(UINT First, UINT Last);
+	HRESULT PreloadTextA(LPCSTR pString, INT Count);
+	HRESULT PreloadTextW(LPCWSTR pString, INT Count);
+	INT DrawTextA(ID3DX10Sprite pSprite, LPCSTR pString, INT Count, LPRECT pRect, UINT Format, D3DXCOLOR Color);
+	INT DrawTextW(ID3DX10Sprite pSprite, LPCWSTR pString, INT Count, LPRECT pRect, UINT Format, D3DXCOLOR Color);
+	version(Unicode) {
+		alias GetTextMetricsW GetTextMetrics;
+		alias DrawTextW DrawText;
+	} else {
+		alias GetTextMetricsA GetTextMetrics;
+		alias DrawTextA DrawText;
+	}
+}
+
+extern(Windows) {
+	HRESULT D3DX10CreateFontA(ID3D10Device pDevice, INT Height, UINT Width, UINT Weight,
+		UINT MipLevels, BOOL Italic, UINT CharSet, UINT OutputPrecision, UINT Quality,
+		UINT PitchAndFamily, LPCSTR pFaceName, ID3DX10Font* ppFont);
+	HRESULT D3DX10CreateFontW(ID3D10Device pDevice, INT Height, UINT Width, UINT Weight,
+		UINT MipLevels, BOOL Italic, UINT CharSet, UINT OutputPrecision, UINT Quality,
+		UINT PitchAndFamily, LPCWSTR pFaceName, ID3DX10Font* ppFont);
+}
+
+version(Unicode) {
+	alias D3DX10CreateFontW D3DX10CreateFont;
+} else {
+	alias D3DX10CreateFontA D3DX10CreateFont;
+}
+
+extern(Windows) {
+	HRESULT D3DX10CreateFontIndirectA(ID3D10Device pDevice, D3DX10_FONT_DESCA* pDesc, ID3DX10Font* ppFont);
+	HRESULT D3DX10CreateFontIndirectW(ID3D10Device pDevice, D3DX10_FONT_DESCW* pDesc, ID3DX10Font* ppFont);
+}
+
+version(Unicode) {
+	alias D3DX10CreateFontIndirectW D3DX10CreateFontIndirect;
+} else {
+	alias D3DX10CreateFontIndirectA D3DX10CreateFontIndirect;
+}
+
+extern(Windows) {
+	HRESULT D3DX10UnsetAllDeviceObjects(ID3D10Device pDevice);
+//TODO 	HRESULT D3DX10ReflectShader(void *pShaderBytecode, SIZE_T BytecodeLength, ID3D10ShaderReflection1 *ppReflector);
+	HRESULT D3DX10DisassembleShader(void *pShader, SIZE_T BytecodeLength, BOOL EnableColorCode,
+		LPCSTR pComments, ID3D10Blob* ppDisassembly);
+	HRESULT D3DX10DisassembleEffect(ID3D10Effect pEffect, BOOL EnableColorCode, ID3D10Blob* ppDisassembly);
+}
+
+const _FACD3D = 0x876;
+
+HRESULT MAKE_D3DHRESULT(T)(T code) {
+	return MAKE_HRESULT(1, _FACD3D, code);
+}
+
+HRESULT MAKE_D3DSTATUS(T)(T code) {
+	return MAKE_HRESULT(0, _FACD3D, code);
+}
+
+const D3DERR_INVALIDCALL = MAKE_D3DHRESULT(2156);
+const D3DERR_WASSTILLDRAWING = MAKE_D3DHRESULT(540);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/d3dx10math.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,728 @@
+/***********************************************************************\
+*                              d3dx10math.d                             *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.directx.d3dx10math;
+
+version(Tango) {
+    import tango.math.Math;
+    alias sqrt sqrtf;
+} else {
+    import std.c.math;
+}
+
+private import win32.windows;
+private import win32.directx.d3dx10;
+
+struct D3DVECTOR {
+	float x;
+	float y;
+	float z;
+}
+
+struct D3DMATRIX {
+	union {
+		struct {
+			float _11, _12, _13, _14;
+			float _21, _22, _23, _24;
+			float _31, _32, _33, _34;
+			float _41, _42, _43, _44;
+		}
+		float[4][4] m;
+	}
+}
+
+const D3DX_PI = 3.14159265358979323846;
+const D3DX_1BYPI = 1.0 / D3DX_PI;
+
+float D3DXToRadian(float degree) {
+	return degree * (D3DX_PI / 180.0);
+}
+
+float D3DXToDegree(float radian) {
+	return radian * (180.0 / D3DX_PI);
+}
+
+const D3DX_16F_DIG			= 3;
+const D3DX_16F_EPSILON		= 4.8875809e-4f;
+const D3DX_16F_MANT_DIG		= 11;
+const D3DX_16F_MAX			= 6.550400e+004;
+const D3DX_16F_MAX_10_EXP	= 4;
+const D3DX_16F_MAX_EXP		= 15;
+const D3DX_16F_MIN			= 6.1035156e-5f;
+const D3DX_16F_MIN_10_EXP	= -4;
+const D3DX_16F_MIN_EXP		= -14;
+const D3DX_16F_RADIX		= 2;
+const D3DX_16F_ROUNDS		= 1;
+const D3DX_16F_SIGN_MASK	= 0x8000;
+const D3DX_16F_EXP_MASK		= 0x7C00;
+const D3DX_16F_FRAC_MASK	= 0x03FF;
+
+struct D3DXFLOAT16 {
+	//TODO
+protected:
+    WORD value;
+}
+
+struct D3DXVECTOR2 {
+	//TODO
+	float x, y;
+}
+
+struct D3DXVECTOR2_16F {
+	//TODO
+	D3DXFLOAT16 x, y;
+}
+
+struct D3DXVECTOR3 {
+	//TODO
+	float x, y, z;
+}
+
+struct D3DXVECTOR3_16F {
+	//TODO
+	D3DXFLOAT16 x, y, z;
+}
+
+struct D3DXVECTOR4 {
+	//TODO
+	float x, y, z, w;
+}
+
+struct D3DXVECTOR4_16F {
+	//TODO
+	D3DXFLOAT16 x, y, z, w;
+}
+
+struct D3DXMATRIX {
+	//TODO
+	union {
+		struct {
+			float _11, _12, _13, _14;
+			float _21, _22, _23, _24;
+			float _31, _32, _33, _34;
+			float _41, _42, _43, _44;
+		}
+		float[4][4] m;
+	}
+}
+
+//TODO struct _D3DXMATRIXA16 : D3DXMATRIX
+
+struct D3DXQUATERNION {
+	//TODO
+	float x, y, z, w;
+}
+
+struct D3DXPLANE {
+	//TODO
+	float a, b, c, d;
+}
+
+struct D3DXCOLOR {
+	//TODO
+	float r, g, b, a;
+}
+
+extern(Windows) {
+	D3DXFLOAT16* D3DXFloat32To16Array(D3DXFLOAT16* pOut, float* pIn, UINT n);
+	float* D3DXFloat16To32Array(float* pOut, D3DXFLOAT16* pIn, UINT n);
+}
+
+float D3DXVec2Length(D3DXVECTOR2* pV) {
+	debug(D3DX10_DEBUG) {
+		if (pV is null) return 0.0;
+	}
+	return sqrtf((pV.x * pV.x) + (pV.y * pV.y));
+}
+
+float D3DXVec2LengthSq(D3DXVECTOR2* pV) {
+	debug(D3DX10_DEBUG) {
+		if (pV is null) return 0.0;
+	}
+	return (pV.x * pV.x) + (pV.y * pV.y);
+}
+
+float D3DXVec2Dot(D3DXVECTOR2* pV1, D3DXVECTOR2* pV2) {
+	debug(D3DX10_DEBUG) {
+		if ((pV1 is null) || (pV2 is null)) return 0.0;
+	}
+	return (pV1.x * pV2.x) + (pV1.y * pV2.y);
+}
+
+float D3DXVec2CCW(D3DXVECTOR2* pV1, D3DXVECTOR2* pV2) {
+	debug(D3DX10_DEBUG) {
+		if ((pV1 is null) || (pV2 is null)) return 0.0;
+	}
+	return (pV1.x * pV2.y) + (pV1.y * pV2.x);
+}
+
+D3DXVECTOR2* D3DXVec2Add(D3DXVECTOR2* pOut, D3DXVECTOR2* pV1, D3DXVECTOR2* pV2) {
+	debug(D3DX10_DEBUG) {
+		if ((pOut is null) || (pV1 is null) || (pV2 is null)) return null;
+	}
+	pOut.x = pV1.x + pV2.x;
+	pOut.y = pV1.y + pV2.y;
+	return pOut;
+}
+
+D3DXVECTOR2* D3DXVec2Subtract(D3DXVECTOR2* pOut, D3DXVECTOR2* pV1, D3DXVECTOR2* pV2) {
+	debug(D3DX10_DEBUG) {
+		if ((pOut is null) || (pV1 is null) || (pV2 is null)) return null;
+	}
+	pOut.x = pV1.x - pV2.x;
+	pOut.y = pV1.y - pV2.y;
+	return pOut;
+}
+
+D3DXVECTOR2* D3DXVec2Minimize(D3DXVECTOR2* pOut, D3DXVECTOR2* pV1, D3DXVECTOR2* pV2) {
+	debug(D3DX10_DEBUG) {
+		if ((pOut is null) || (pV1 is null) || (pV2 is null)) return null;
+	}
+	pOut.x = pV1.x < pV2.x ? pV1.x : pV2.x;
+	pOut.y = pV1.y < pV2.y ? pV1.y : pV2.y;
+	return pOut;
+}
+
+D3DXVECTOR2* D3DXVec2Maximize(D3DXVECTOR2* pOut, D3DXVECTOR2* pV1, D3DXVECTOR2* pV2) {
+	debug(D3DX10_DEBUG) {
+		if ((pOut is null) || (pV1 is null) || (pV2 is null)) return null;
+	}
+	pOut.x = pV1.x > pV2.x ? pV1.x : pV2.x;
+	pOut.y = pV1.y > pV2.y ? pV1.y : pV2.y;
+	return pOut;
+}
+
+D3DXVECTOR2* D3DXVec2Scale(D3DXVECTOR2* pOut, D3DXVECTOR2* pV, float s) {
+	debug(D3DX10_DEBUG) {
+		if ((pOut is null) || (pV is null)) return null;
+	}
+	pOut.x = pV.x * s;
+	pOut.y = pV.y * s;
+	return pOut;
+}
+
+D3DXVECTOR2* D3DXVec2Lerp(D3DXVECTOR2* pOut, D3DXVECTOR2* pV1, D3DXVECTOR2* pV2, float s) {
+	debug(D3DX10_DEBUG) {
+		if ((pOut is null) || (pV1 is null) || (pV2 is null)) return null;
+	}
+	pOut.x = pV1.x + s * (pV2.x - pV1.x);
+	pOut.y = pV1.y + s * (pV2.y - pV1.y);
+	return pOut;
+}
+
+extern(Windows) {
+	D3DXVECTOR2* D3DXVec2Normalize(D3DXVECTOR2* pOut, D3DXVECTOR2* pV);
+	D3DXVECTOR2* D3DXVec2Hermite(D3DXVECTOR2* pOut, D3DXVECTOR2* pV1, D3DXVECTOR2* pT1, D3DXVECTOR2* pV2, D3DXVECTOR2* pT2, float s);
+	D3DXVECTOR2* D3DXVec2CatmullRom(D3DXVECTOR2* pOut, D3DXVECTOR2* pV0, D3DXVECTOR2* pV1, D3DXVECTOR2* pV2, D3DXVECTOR2* pV3, float s);
+	D3DXVECTOR2* D3DXVec2BaryCentric(D3DXVECTOR2* pOut, D3DXVECTOR2* pV1, D3DXVECTOR2* pV2, D3DXVECTOR2* pV3, float f, float g);
+	D3DXVECTOR4* D3DXVec2Transform(D3DXVECTOR4* pOut, D3DXVECTOR2* pV, D3DXMATRIX* pM);
+	D3DXVECTOR2* D3DXVec2TransformCoord(D3DXVECTOR2* pOut, D3DXVECTOR2* pV, D3DXMATRIX* pM);
+	D3DXVECTOR2* D3DXVec2TransformNormal(D3DXVECTOR2* pOut, D3DXVECTOR2* pV, D3DXMATRIX* pM);
+	D3DXVECTOR4* D3DXVec2TransformArray(D3DXVECTOR4* pOut, UINT OutStride, D3DXVECTOR2* pV, UINT VStride, D3DXMATRIX* pM, UINT n);
+	D3DXVECTOR2* D3DXVec2TransformCoordArray(D3DXVECTOR2* pOut, UINT OutStride, D3DXVECTOR2* pV, UINT VStride, D3DXMATRIX* pM, UINT n);
+	D3DXVECTOR2* D3DXVec2TransformNormalArray(D3DXVECTOR2* pOut, UINT OutStride, D3DXVECTOR2* pV, UINT VStride, D3DXMATRIX* pM, UINT n);
+}
+
+float D3DXVec3Length(D3DXVECTOR3* pV) {
+	debug(D3DX10_DEBUG) {
+		if (pV is null) return 0.0;
+	}
+	return sqrtf((pV.x * pV.x) + (pV.y * pV.y) + (pV.z * pV.z));
+}
+
+float D3DXVec3LengthSq(D3DXVECTOR3* pV) {
+	debug(D3DX10_DEBUG) {
+		if (pV is null) return 0.0;
+	}
+	return (pV.x * pV.x) + (pV.y * pV.y) + (pV.z * pV.z);
+}
+
+float D3DXVec3Dot(D3DXVECTOR3* pV1, D3DXVECTOR3* pV2) {
+	debug(D3DX10_DEBUG) {
+		if ((pV1 is null) || (pV2 is null)) return 0.0;
+	}
+	return (pV1.x * pV2.x) + (pV1.y * pV2.y) + (pV1.z * pV2.z);
+}
+
+D3DXVECTOR3* D3DXVec3Cross(D3DXVECTOR3* pOut, D3DXVECTOR3* pV1, D3DXVECTOR3* pV2) {
+	debug(D3DX10_DEBUG) {
+		if ((pOut is null) || (pV1 is null) || (pV2 is null)) return 0.0;
+	}
+	D3DXVECTOR3 v;
+	v.x = (pV1.y * pV2.z) - (pV1.z * pV2.y);
+	v.y = (pV1.z * pV2.x) - (pV1.x * pV2.z);
+	v.z = (pV1.x * pV2.y) - (pV1.y * pV2.x);
+	*pOut = v;
+	return pOut;
+}
+
+D3DXVECTOR3* D3DXVec3Add(D3DXVECTOR3* pOut, D3DXVECTOR3* pV1, D3DXVECTOR3* pV2) {
+	debug(D3DX10_DEBUG) {
+		if ((pOut is null) || (pV1 is null) || (pV2 is null)) return null;
+	}
+	pOut.x = pV1.x + pV2.x;
+	pOut.y = pV1.y + pV2.y;
+	pOut.z = pV1.z + pV2.z;
+	return pOut;
+}
+
+D3DXVECTOR3* D3DXVec3Subtract(D3DXVECTOR3* pOut, D3DXVECTOR3* pV1, D3DXVECTOR3* pV2) {
+	debug(D3DX10_DEBUG) {
+		if ((pOut is null) || (pV1 is null) || (pV2 is null)) return null;
+	}
+	pOut.x = pV1.x - pV2.x;
+	pOut.y = pV1.y - pV2.y;
+	pOut.z = pV1.z - pV2.z;
+	return pOut;
+}
+
+D3DXVECTOR3* D3DXVec3Minimize(D3DXVECTOR3* pOut, D3DXVECTOR3* pV1, D3DXVECTOR3* pV2) {
+	debug(D3DX10_DEBUG) {
+		if ((pOut is null) || (pV1 is null) || (pV2 is null)) return null;
+	}
+	pOut.x = pV1.x < pV2.x ? pV1.x : pV2.x;
+	pOut.y = pV1.y < pV2.y ? pV1.y : pV2.y;
+	pOut.z = pV1.z < pV2.z ? pV1.z : pV2.z;
+	return pOut;
+}
+
+D3DXVECTOR3* D3DXVec3Maximize(D3DXVECTOR3* pOut, D3DXVECTOR3* pV1, D3DXVECTOR3* pV2) {
+	debug(D3DX10_DEBUG) {
+		if ((pOut is null) || (pV1 is null) || (pV2 is null)) return null;
+	}
+	pOut.x = pV1.x > pV2.x ? pV1.x : pV2.x;
+	pOut.y = pV1.y > pV2.y ? pV1.y : pV2.y;
+	pOut.z = pV1.z > pV2.z ? pV1.z : pV2.z;
+	return pOut;
+}
+
+D3DXVECTOR3* D3DXVec3Scale(D3DXVECTOR3* pOut, D3DXVECTOR3* pV, float s) {
+	debug(D3DX10_DEBUG) {
+		if ((pOut is null) || (pV is null)) return null;
+	}
+	pOut.x = pV.x * s;
+	pOut.y = pV.y * s;
+	pOut.z = pV.z * s;
+	return pOut;
+}
+
+D3DXVECTOR3* D3DXVec3Lerp(D3DXVECTOR3* pOut, D3DXVECTOR3* pV1, D3DXVECTOR3* pV2, float s) {
+	debug(D3DX10_DEBUG) {
+		if ((pOut is null) || (pV1 is null) || (pV2 is null)) return null;
+	}
+	pOut.x = pV1.x + s * (pV2.x - pV1.x);
+	pOut.y = pV1.y + s * (pV2.y - pV1.y);
+	pOut.z = pV1.z + s * (pV2.z - pV1.z);
+	return pOut;
+}
+
+extern(Windows) {
+	D3DXVECTOR3* D3DXVec3Normalize(D3DXVECTOR3* pOut, D3DXVECTOR3* pV);
+	D3DXVECTOR3* D3DXVec3Hermite(D3DXVECTOR3* pOut, D3DXVECTOR3* pV1, D3DXVECTOR3* pT1, D3DXVECTOR3* pV2, D3DXVECTOR3* pT2, FLOAT s);
+	D3DXVECTOR3* D3DXVec3CatmullRom(D3DXVECTOR3* pOut, D3DXVECTOR3* pV0, D3DXVECTOR3* pV1, D3DXVECTOR3* pV2, D3DXVECTOR3* pV3, FLOAT s);
+	D3DXVECTOR3* D3DXVec3BaryCentric(D3DXVECTOR3* pOut, D3DXVECTOR3* pV1, D3DXVECTOR3* pV2, D3DXVECTOR3* pV3, FLOAT f, FLOAT g);
+	D3DXVECTOR4* D3DXVec3Transform(D3DXVECTOR4* pOut, D3DXVECTOR3* pV, D3DXMATRIX* pM);
+	D3DXVECTOR3* D3DXVec3TransformCoord(D3DXVECTOR3* pOut, D3DXVECTOR3* pV, D3DXMATRIX* pM);
+	D3DXVECTOR3* D3DXVec3TransformNormal(D3DXVECTOR3* pOut, D3DXVECTOR3* pV, D3DXMATRIX* pM);
+	D3DXVECTOR4* D3DXVec3TransformArray(D3DXVECTOR4* pOut, UINT OutStride, D3DXVECTOR3* pV, UINT VStride, D3DXMATRIX* pM, UINT n);
+	D3DXVECTOR3* D3DXVec3TransformCoordArray(D3DXVECTOR3* pOut, UINT OutStride, D3DXVECTOR3* pV, UINT VStride, D3DXMATRIX* pM, UINT n);
+	D3DXVECTOR3* D3DXVec3TransformNormalArray(D3DXVECTOR3* pOut, UINT OutStride, D3DXVECTOR3* pV, UINT VStride, D3DXMATRIX* pM, UINT n);
+	D3DXVECTOR3* D3DXVec3Project(D3DXVECTOR3* pOut, D3DXVECTOR3* pV, D3D10_VIEWPORT* pViewport, D3DXMATRIX* pProjection, D3DXMATRIX* pView, D3DXMATRIX* pWorld);
+	D3DXVECTOR3* D3DXVec3Unproject(D3DXVECTOR3* pOut, D3DXVECTOR3* pV, D3D10_VIEWPORT* pViewport, D3DXMATRIX* pProjection, D3DXMATRIX* pView, D3DXMATRIX* pWorld);
+	D3DXVECTOR3* D3DXVec3ProjectArray(D3DXVECTOR3* pOut, UINT OutStride,D3DXVECTOR3* pV, UINT VStride,D3D10_VIEWPORT* pViewport, D3DXMATRIX* pProjection, D3DXMATRIX* pView, D3DXMATRIX* pWorld, UINT n);
+	D3DXVECTOR3* D3DXVec3UnprojectArray(D3DXVECTOR3* pOut, UINT OutStride, D3DXVECTOR3* pV, UINT VStride, D3D10_VIEWPORT* pViewport, D3DXMATRIX* pProjection, D3DXMATRIX* pView, D3DXMATRIX* pWorld, UINT n);
+}
+
+float D3DXVec4Length(D3DXVECTOR4* pV) {
+	debug(D3DX10_DEBUG) {
+		if (pV is null) return 0.0;
+	}
+	return sqrtf((pV.x * pV.x) + (pV.y * pV.y) + (pV.z * pV.z) + (pV.w * pV.w));
+}
+
+float D3DXVec4LengthSq(D3DXVECTOR4* pV) {
+	debug(D3DX10_DEBUG) {
+		if (pV is null) return 0.0;
+	}
+	return (pV.x * pV.x) + (pV.y * pV.y) + (pV.z * pV.z) + (pV.w * pV.w);
+}
+
+float D3DXVec4Dot(D3DXVECTOR4* pV1, D3DXVECTOR4* pV2) {
+	debug(D3DX10_DEBUG) {
+		if ((pV1 is null) || (pV2 is null)) return 0.0;
+	}
+	return (pV1.x * pV2.x) + (pV1.y * pV2.y) + (pV1.z * pV2.z) + (pV1.w * pV2.w);
+}
+
+D3DXVECTOR4* D3DXVec4Add(D3DXVECTOR4* pOut, D3DXVECTOR4* pV1, D3DXVECTOR4* pV2) {
+	debug(D3DX10_DEBUG) {
+		if ((pOut is null) || (pV1 is null) || (pV2 is null)) return null;
+	}
+	pOut.x = pV1.x + pV2.x;
+	pOut.y = pV1.y + pV2.y;
+	pOut.z = pV1.z + pV2.z;
+	pOut.w = pV1.w + pV2.w;
+	return pOut;
+}
+
+D3DXVECTOR4* D3DXVec4Subtract(D3DXVECTOR4* pOut, D3DXVECTOR4* pV1, D3DXVECTOR4* pV2) {
+	debug(D3DX10_DEBUG) {
+		if ((pOut is null) || (pV1 is null) || (pV2 is null)) return null;
+	}
+	pOut.x = pV1.x - pV2.x;
+	pOut.y = pV1.y - pV2.y;
+	pOut.z = pV1.z - pV2.z;
+	pOut.w = pV1.w - pV2.w;
+	return pOut;
+}
+
+D3DXVECTOR4* D3DXVec4Minimize(D3DXVECTOR4* pOut, D3DXVECTOR4* pV1, D3DXVECTOR4* pV2) {
+	debug(D3DX10_DEBUG) {
+		if ((pOut is null) || (pV1 is null) || (pV2 is null)) return null;
+	}
+	pOut.x = pV1.x < pV2.x ? pV1.x : pV2.x;
+	pOut.y = pV1.y < pV2.y ? pV1.y : pV2.y;
+	pOut.z = pV1.z < pV2.z ? pV1.z : pV2.z;
+	pOut.w = pV1.w < pV2.w ? pV1.w : pV2.w;
+	return pOut;
+}
+
+D3DXVECTOR4* D3DXVec4Maximize(D3DXVECTOR4* pOut, D3DXVECTOR4* pV1, D3DXVECTOR4* pV2) {
+	debug(D3DX10_DEBUG) {
+		if ((pOut is null) || (pV1 is null) || (pV2 is null)) return null;
+	}
+	pOut.x = pV1.x > pV2.x ? pV1.x : pV2.x;
+	pOut.y = pV1.y > pV2.y ? pV1.y : pV2.y;
+	pOut.z = pV1.z > pV2.z ? pV1.z : pV2.z;
+	pOut.w = pV1.w > pV2.w ? pV1.w : pV2.w;
+	return pOut;
+}
+
+D3DXVECTOR4* D3DXVec4Scale(D3DXVECTOR4* pOut, D3DXVECTOR4* pV, float s) {
+	debug(D3DX10_DEBUG) {
+		if ((pOut is null) || (pV is null)) return null;
+	}
+	pOut.x = pV.x * s;
+	pOut.y = pV.y * s;
+	pOut.z = pV.z * s;
+	pOut.w = pV.w * s;
+	return pOut;
+}
+
+D3DXVECTOR4* D3DXVec4Lerp(D3DXVECTOR4* pOut, D3DXVECTOR4* pV1, D3DXVECTOR4* pV2, float s) {
+	debug(D3DX10_DEBUG) {
+		if ((pOut is null) || (pV1 is null) || (pV2 is null)) return null;
+	}
+	pOut.x = pV1.x + s * (pV2.x - pV1.x);
+	pOut.y = pV1.y + s * (pV2.y - pV1.y);
+	pOut.z = pV1.z + s * (pV2.z - pV1.z);
+	pOut.w = pV1.w + s * (pV2.w - pV1.w);
+	return pOut;
+}
+
+extern(Windows) {
+	D3DXVECTOR4* D3DXVec4Cross(D3DXVECTOR4* pOut, D3DXVECTOR4* pV1, D3DXVECTOR4* pV2, D3DXVECTOR4* pV3);
+	D3DXVECTOR4* D3DXVec4Normalize(D3DXVECTOR4* pOut, D3DXVECTOR4* pV);
+	D3DXVECTOR4* D3DXVec4Hermite(D3DXVECTOR4* pOut, D3DXVECTOR4* pV1, D3DXVECTOR4* pT1, D3DXVECTOR4* pV2, D3DXVECTOR4* pT2, FLOAT s);
+	D3DXVECTOR4* D3DXVec4CatmullRom(D3DXVECTOR4* pOut, D3DXVECTOR4* pV0, D3DXVECTOR4* pV1, D3DXVECTOR4* pV2, D3DXVECTOR4* pV3, FLOAT s);
+	D3DXVECTOR4* D3DXVec4BaryCentric(D3DXVECTOR4* pOut, D3DXVECTOR4* pV1, D3DXVECTOR4* pV2, D3DXVECTOR4* pV3, FLOAT f, FLOAT g);
+	D3DXVECTOR4* D3DXVec4Transform(D3DXVECTOR4* pOut, D3DXVECTOR4* pV, D3DXMATRIX* pM);
+	D3DXVECTOR4* D3DXVec4TransformArray(D3DXVECTOR4* pOut, UINT OutStride, D3DXVECTOR4* pV, UINT VStride, D3DXMATRIX* pM, UINT n);
+}
+
+D3DXMATRIX* D3DXMatrixIdentity(D3DXMATRIX *pOut) {
+	debug(D3DX10_DEBUG) {
+		if (pOut is null) return NULL;
+	}
+	pOut.m[0][1] = pOut.m[0][2] = pOut.m[0][3] =
+	pOut.m[1][0] = pOut.m[1][2] = pOut.m[1][3] =
+	pOut.m[2][0] = pOut.m[2][1] = pOut.m[2][3] =
+	pOut.m[3][0] = pOut.m[3][1] = pOut.m[3][2] = 0.0;
+	pOut.m[0][0] = pOut.m[1][1] = pOut.m[2][2] = pOut.m[3][3] = 1.0;
+	return pOut;
+}
+
+
+BOOL D3DXMatrixIsIdentity(D3DXMATRIX *pM) {
+	debug(D3DX10_DEBUG) {
+		if(pM is null) return FALSE;
+	}
+	return (pM.m[0][0] == 1.0f) && (pM.m[0][1] == 0.0f) && (pM.m[0][2] == 0.0f) && (pM.m[0][3] == 0.0f) &&
+	       (pM.m[1][0] == 0.0f) && (pM.m[1][1] == 1.0f) && (pM.m[1][2] == 0.0f) && (pM.m[1][3] == 0.0f) &&
+	       (pM.m[2][0] == 0.0f) && (pM.m[2][1] == 0.0f) && (pM.m[2][2] == 1.0f) && (pM.m[2][3] == 0.0f) &&
+	       (pM.m[3][0] == 0.0f) && (pM.m[3][1] == 0.0f) && (pM.m[3][2] == 0.0f) && (pM.m[3][3] == 1.0f);
+}
+
+extern(Windows) {
+	FLOAT D3DXMatrixDeterminant(D3DXMATRIX* pM);
+	HRESULT D3DXMatrixDecompose(D3DXVECTOR3* pOutScale, D3DXQUATERNION* pOutRotation, D3DXVECTOR3* pOutTranslation, D3DXMATRIX* pM);
+	D3DXMATRIX* D3DXMatrixTranspose(D3DXMATRIX* pOut, D3DXMATRIX* pM);
+	D3DXMATRIX* D3DXMatrixMultiply(D3DXMATRIX* pOut, D3DXMATRIX* pM1, D3DXMATRIX* pM2);
+	D3DXMATRIX* D3DXMatrixMultiplyTranspose(D3DXMATRIX* pOut, D3DXMATRIX* pM1, D3DXMATRIX* pM2);
+	D3DXMATRIX* D3DXMatrixInverse(D3DXMATRIX* pOut, FLOAT* pDeterminant, D3DXMATRIX* pM);
+	D3DXMATRIX* D3DXMatrixScaling(D3DXMATRIX* pOut, FLOAT sx, FLOAT sy, FLOAT sz);
+	D3DXMATRIX* D3DXMatrixTranslation(D3DXMATRIX* pOut, FLOAT x, FLOAT y, FLOAT z);
+	D3DXMATRIX* D3DXMatrixRotationX(D3DXMATRIX* pOut, FLOAT Angle);
+	D3DXMATRIX* D3DXMatrixRotationY(D3DXMATRIX* pOut, FLOAT Angle);
+	D3DXMATRIX* D3DXMatrixRotationZ(D3DXMATRIX* pOut, FLOAT Angle);
+	D3DXMATRIX* D3DXMatrixRotationAxis(D3DXMATRIX* pOut, D3DXVECTOR3* pV, FLOAT Angle);
+	D3DXMATRIX* D3DXMatrixRotationQuaternion(D3DXMATRIX* pOut, D3DXQUATERNION* pQ);
+	D3DXMATRIX* D3DXMatrixRotationYawPitchRoll(D3DXMATRIX* pOut, FLOAT Yaw, FLOAT Pitch, FLOAT Roll);
+	D3DXMATRIX* D3DXMatrixTransformation(D3DXMATRIX* pOut, D3DXVECTOR3* pScalingCenter, D3DXQUATERNION* pScalingRotation, D3DXVECTOR3* pScaling, D3DXVECTOR3* pRotationCenter, D3DXQUATERNION* pRotation, D3DXVECTOR3* pTranslation);
+	D3DXMATRIX* D3DXMatrixTransformation2D(D3DXMATRIX* pOut, D3DXVECTOR2* pScalingCenter, FLOAT ScalingRotation, D3DXVECTOR2* pScaling, D3DXVECTOR2* pRotationCenter, FLOAT Rotation, D3DXVECTOR2* pTranslation);
+	D3DXMATRIX* D3DXMatrixAffineTransformation(D3DXMATRIX* pOut, FLOAT Scaling, D3DXVECTOR3* pRotationCenter, D3DXQUATERNION* pRotation, D3DXVECTOR3* pTranslation);
+	D3DXMATRIX* D3DXMatrixAffineTransformation2D(D3DXMATRIX* pOut, FLOAT Scaling, D3DXVECTOR2* pRotationCenter, FLOAT Rotation, D3DXVECTOR2* pTranslation);
+	D3DXMATRIX* D3DXMatrixLookAtRH(D3DXMATRIX* pOut, D3DXVECTOR3* pEye, D3DXVECTOR3* pAt, D3DXVECTOR3* pUp);
+	D3DXMATRIX* D3DXMatrixLookAtLH(D3DXMATRIX* pOut, D3DXVECTOR3* pEye, D3DXVECTOR3* pAt, D3DXVECTOR3* pUp);
+	D3DXMATRIX* D3DXMatrixPerspectiveRH(D3DXMATRIX* pOut, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf);
+	D3DXMATRIX* D3DXMatrixPerspectiveLH(D3DXMATRIX* pOut, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf);
+	D3DXMATRIX* D3DXMatrixPerspectiveFovRH(D3DXMATRIX* pOut, FLOAT fovy, FLOAT Aspect, FLOAT zn, FLOAT zf);
+	D3DXMATRIX* D3DXMatrixPerspectiveFovLH(D3DXMATRIX* pOut, FLOAT fovy, FLOAT Aspect, FLOAT zn, FLOAT zf);
+	D3DXMATRIX* D3DXMatrixPerspectiveOffCenterRH(D3DXMATRIX* pOut, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, FLOAT zf);
+	D3DXMATRIX* D3DXMatrixPerspectiveOffCenterLH(D3DXMATRIX* pOut, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, FLOAT zf);
+	D3DXMATRIX* D3DXMatrixOrthoRH(D3DXMATRIX* pOut, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf);
+	D3DXMATRIX* D3DXMatrixOrthoLH(D3DXMATRIX* pOut, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf);
+	D3DXMATRIX* D3DXMatrixOrthoOffCenterRH(D3DXMATRIX* pOut, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, FLOAT zf);
+	D3DXMATRIX* D3DXMatrixOrthoOffCenterLH(D3DXMATRIX* pOut, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, FLOAT zf);
+	D3DXMATRIX* D3DXMatrixShadow(D3DXMATRIX* pOut, D3DXVECTOR4* pLight, D3DXPLANE* pPlane);
+	D3DXMATRIX* D3DXMatrixReflect(D3DXMATRIX* pOut, D3DXPLANE* pPlane);
+}
+
+float D3DXQuaternionLength(D3DXQUATERNION *pQ) {
+	debug(D3DX10_DEBUG) {
+		if (pQ is null) return 0.0f;
+	}
+    return sqrtf((pQ.x * pQ.x) + (pQ.y * pQ.y) + (pQ.z * pQ.z) + (pQ.w * pQ.w));
+}
+
+float D3DXQuaternionLengthSq(D3DXQUATERNION *pQ) {
+	debug(D3DX10_DEBUG) {
+		if(pQ is null) return 0.0f;
+	}
+    return (pQ.x * pQ.x) + (pQ.y * pQ.y) + (pQ.z * pQ.z) + (pQ.w * pQ.w);
+}
+
+float D3DXQuaternionDot(D3DXQUATERNION *pQ1, D3DXQUATERNION *pQ2) {
+	debug(D3DX10_DEBUG) {
+		if((pQ1 is null) || (pQ2 is null)) return 0.0f;
+	}
+    return (pQ1.x * pQ2.x) + (pQ1.y * pQ2.y) + (pQ1.z * pQ2.z) + (pQ1.w * pQ2.w);
+}
+
+D3DXQUATERNION* D3DXQuaternionIdentity(D3DXQUATERNION *pOut) {
+	debug(D3DX10_DEBUG) {
+		if(pOut is null) return null;
+	}
+    pOut.x = pOut.y = pOut.z = 0.0f;
+    pOut.w = 1.0f;
+    return pOut;
+}
+
+bool D3DXQuaternionIsIdentity(D3DXQUATERNION *pQ) {
+	debug(D3DX10_DEBUG) {
+		if(pQ is null) return false;
+	}
+    return (pQ.x == 0.0f) && (pQ.y == 0.0f) && (pQ.z == 0.0f) && (pQ.w == 1.0f);
+}
+
+D3DXQUATERNION* D3DXQuaternionConjugate(D3DXQUATERNION *pOut, D3DXQUATERNION *pQ) {
+	debug(D3DX10_DEBUG) {
+		if((pOut is null) || (pQis is null)) return null;
+	}
+    pOut.x = -pQ.x;
+    pOut.y = -pQ.y;
+    pOut.z = -pQ.z;
+    pOut.w =  pQ.w;
+    return pOut;
+}
+
+extern(Windows) {
+	void D3DXQuaternionToAxisAngle(D3DXQUATERNION* pQ, D3DXVECTOR3* pAxis, FLOAT* pAngle);
+	D3DXQUATERNION* D3DXQuaternionRotationMatrix(D3DXQUATERNION* pOut, D3DXMATRIX* pM);
+	D3DXQUATERNION* D3DXQuaternionRotationAxis(D3DXQUATERNION* pOut, D3DXVECTOR3* pV, FLOAT Angle);
+	D3DXQUATERNION* D3DXQuaternionRotationYawPitchRoll(D3DXQUATERNION* pOut, FLOAT Yaw, FLOAT Pitch, FLOAT Roll);
+	D3DXQUATERNION* D3DXQuaternionMultiply(D3DXQUATERNION* pOut, D3DXQUATERNION* pQ1, D3DXQUATERNION* pQ2);
+	D3DXQUATERNION* D3DXQuaternionNormalize(D3DXQUATERNION* pOut, D3DXQUATERNION* pQ);
+	D3DXQUATERNION* D3DXQuaternionInverse(D3DXQUATERNION* pOut, D3DXQUATERNION* pQ);
+	D3DXQUATERNION* D3DXQuaternionLn(D3DXQUATERNION* pOut, D3DXQUATERNION* pQ);
+	D3DXQUATERNION* D3DXQuaternionExp(D3DXQUATERNION* pOut, D3DXQUATERNION* pQ);
+	D3DXQUATERNION* D3DXQuaternionSlerp(D3DXQUATERNION* pOut, D3DXQUATERNION* pQ1, D3DXQUATERNION* pQ2, FLOAT t);
+	D3DXQUATERNION* D3DXQuaternionSquad(D3DXQUATERNION* pOut, D3DXQUATERNION* pQ1, D3DXQUATERNION* pA, D3DXQUATERNION* pB, D3DXQUATERNION* pC, FLOAT t);
+	void D3DXQuaternionSquadSetup(D3DXQUATERNION* pAOut, D3DXQUATERNION* pBOut, D3DXQUATERNION* pCOut, D3DXQUATERNION* pQ0, D3DXQUATERNION* pQ1, D3DXQUATERNION* pQ2, D3DXQUATERNION* pQ3);
+	D3DXQUATERNION* D3DXQuaternionBaryCentric(D3DXQUATERNION* pOut, D3DXQUATERNION* pQ1, D3DXQUATERNION* pQ2, D3DXQUATERNION* pQ3, FLOAT f, FLOAT g);
+}
+
+float D3DXPlaneDot(D3DXPLANE *pP, D3DXVECTOR4 *pV) {
+	debug(D3DX10_DEBUG) {
+		if((pP is null) || (pV is null)) return 0.0f;
+	}
+    return (pP.a * pV.x) + (pP.b * pV.y) + (pP.c * pV.z) + (pP.d * pV.w);
+}
+
+float D3DXPlaneDotCoord(D3DXPLANE *pP, D3DXVECTOR3 *pV) {
+	debug(D3DX10_DEBUG) {
+		if((pP is null) || (pV is null)) return 0.0f;
+	}
+    return (pP.a * pV.x) + (pP.b * pV.y) + (pP.c * pV.z) + pP.d;
+}
+
+float D3DXPlaneDotNormal(D3DXPLANE *pP, D3DXVECTOR3 *pV) {
+	debug(D3DX10_DEBUG) {
+		if((pP is null) || (pV is null)) return 0.0f;
+	}
+    return (pP.a * pV.x) + (pP.b * pV.y) + (pP.c * pV.z);
+}
+
+D3DXPLANE* D3DXPlaneScale(D3DXPLANE *pOut, D3DXPLANE *pP, float s) {
+	debug(D3DX10_DEBUG) {
+		if((pOut is null) || (pP is null)) return null;
+	}
+    pOut.a = pP.a * s;
+    pOut.b = pP.b * s;
+    pOut.c = pP.c * s;
+    pOut.d = pP.d * s;
+    return pOut;
+}
+
+extern(Windows) {
+	D3DXPLANE* D3DXPlaneNormalize(D3DXPLANE* pOut, D3DXPLANE* pP);
+	D3DXVECTOR3* D3DXPlaneIntersectLine(D3DXVECTOR3* pOut, D3DXPLANE* pP, D3DXVECTOR3* pV1, D3DXVECTOR3* pV2);
+	D3DXPLANE* D3DXPlaneFromPointNormal(D3DXPLANE* pOut, D3DXVECTOR3* pPoint, D3DXVECTOR3* pNormal);
+	D3DXPLANE* D3DXPlaneFromPoints(D3DXPLANE* pOut, D3DXVECTOR3* pV1, D3DXVECTOR3* pV2, D3DXVECTOR3* pV3);
+	D3DXPLANE* D3DXPlaneTransform(D3DXPLANE* pOut, D3DXPLANE* pP, D3DXMATRIX* pM);
+	D3DXPLANE* D3DXPlaneTransformArray(D3DXPLANE* pOut, UINT OutStride, D3DXPLANE* pP, UINT PStride, D3DXMATRIX* pM, UINT n);
+}
+
+D3DXCOLOR* D3DXColorNegative(D3DXCOLOR* pOut, D3DXCOLOR* pC) {
+	debug(D3DX10_DEBUG) {
+		if((pOut is null) || (pC is null)) return null;
+	}
+    pOut.r = 1.0f - pC.r;
+    pOut.g = 1.0f - pC.g;
+    pOut.b = 1.0f - pC.b;
+    pOut.a = pC.a;
+    return pOut;
+}
+
+D3DXCOLOR* D3DXColorAdd(D3DXCOLOR* pOut, D3DXCOLOR* pC1, D3DXCOLOR* pC2) {
+	debug(D3DX10_DEBUG) {
+		if((pOut is null) || (pC1 is null) || (pC2 is null)) return null;
+	}
+    pOut.r = pC1.r + pC2.r;
+    pOut.g = pC1.g + pC2.g;
+    pOut.b = pC1.b + pC2.b;
+    pOut.a = pC1.a + pC2.a;
+    return pOut;
+}
+
+D3DXCOLOR* D3DXColorSubtract(D3DXCOLOR* pOut, D3DXCOLOR* pC1, D3DXCOLOR* pC2) {
+	debug(D3DX10_DEBUG) {
+		if((pOut is null) || (pC1 is null) || (pC2 is null)) return null;
+	}
+    pOut.r = pC1.r - pC2.r;
+    pOut.g = pC1.g - pC2.g;
+    pOut.b = pC1.b - pC2.b;
+    pOut.a = pC1.a - pC2.a;
+    return pOut;
+}
+
+D3DXCOLOR* D3DXColorScale(D3DXCOLOR* pOut, D3DXCOLOR* pC, float s) {
+	debug(D3DX10_DEBUG) {
+		if((pOut is null) || (pC is null)) return null;
+	}
+    pOut.r = pC.r * s;
+    pOut.g = pC.g * s;
+    pOut.b = pC.b * s;
+    pOut.a = pC.a * s;
+    return pOut;
+}
+
+D3DXCOLOR* D3DXColorModulate(D3DXCOLOR* pOut, D3DXCOLOR* pC1, D3DXCOLOR* pC2) {
+	debug(D3DX10_DEBUG) {
+		if((pOut is null) || (pC1 is null) || (pC2 is null)) return null;
+	}
+    pOut.r = pC1.r * pC2.r;
+    pOut.g = pC1.g * pC2.g;
+    pOut.b = pC1.b * pC2.b;
+    pOut.a = pC1.a * pC2.a;
+    return pOut;
+}
+
+D3DXCOLOR* D3DXColorLerp(D3DXCOLOR* pOut, D3DXCOLOR* pC1, D3DXCOLOR* pC2, float s) {
+	debug(D3DX10_DEBUG) {
+		if((pOut is null) || (pC1 is null) || (pC2 is null)) return null;
+	}
+    pOut.r = pC1.r + s * (pC2.r - pC1.r);
+    pOut.g = pC1.g + s * (pC2.g - pC1.g);
+    pOut.b = pC1.b + s * (pC2.b - pC1.b);
+    pOut.a = pC1.a + s * (pC2.a - pC1.a);
+    return pOut;
+}
+
+extern(Windows) {
+	D3DXCOLOR* D3DXColorAdjustSaturation(D3DXCOLOR* pOut, D3DXCOLOR* pC, float s);
+	D3DXCOLOR* D3DXColorAdjustContrast(D3DXCOLOR* pOut, D3DXCOLOR* pC, float c);
+	FLOAT D3DXFresnelTerm(float CosTheta, float RefractionIndex);     
+}
+
+extern (C) const GUID IID_ID3DXMatrixStack = {0xc7885ba7, 0xf990, 0x4fe7, [0x92, 0x2d, 0x85, 0x15, 0xe4, 0x77, 0xdd, 0x85]};
+
+interface ID3DXMatrixStack : IUnknown {
+	extern(Windows) :
+	HRESULT Pop();
+	HRESULT Push();
+	HRESULT LoadIdentity();
+	HRESULT LoadMatrix(D3DXMATRIX* pM );
+	HRESULT MultMatrix(D3DXMATRIX* pM );
+	HRESULT MultMatrixLocal(D3DXMATRIX* pM );
+	HRESULT RotateAxis(D3DXVECTOR3* pV, float Angle);
+	HRESULT RotateAxisLocal(D3DXVECTOR3* pV, float Angle);
+	HRESULT RotateYawPitchRoll(float Yaw, float Pitch, float Roll);
+	HRESULT RotateYawPitchRollLocal(float Yaw, float Pitch, float Roll);
+	HRESULT Scale(float x, float y, float z);
+	HRESULT ScaleLocal(float x, float y, float z);
+	HRESULT Translate(float x, float y, float z );
+	HRESULT TranslateLocal(float x, float y, float z);
+	D3DXMATRIX* GetTop();
+}
+
+//TODO extern(Windows) HRESULT D3DXCreateMatrixStack(UINT Flags, D3DXMATRIXSTACK* ppStack);
+
+const D3DXSH_MINORDER = 2;
+const D3DXSH_MAXORDER = 6;
+
+extern(Windows) {
+	float* D3DXSHEvalDirection(float* pOut, UINT Order, D3DXVECTOR3* pDir);
+	float* D3DXSHRotate(float* pOut, UINT Order, D3DXMATRIX* pMatrix, float* pIn);
+	float* D3DXSHRotateZ(float* pOut, UINT Order, float Angle, float* pIn);
+	float* D3DXSHAdd(float* pOut, UINT Order, float* pA, float* pB);
+	float* D3DXSHScale(float* pOut, UINT Order, float* pIn, float Scale);
+	float D3DXSHDot(UINT Order, float* pA, float* pB);
+	float* D3DXSHMultiply2(float* pOut, float* pF, float* pG);
+	float* D3DXSHMultiply3(float* pOut, float* pF, float* pG);
+	float* D3DXSHMultiply4(float* pOut, float* pF, float* pG);
+	float* D3DXSHMultiply5(float* pOut, float* pF, float* pG);
+	float* D3DXSHMultiply6(float* pOut, float* pF, float* pG);
+	HRESULT D3DXSHEvalDirectionalLight(UINT Order, D3DXVECTOR3* pDir, float RIntensity, float GIntensity, float BIntensity, float* pROut, float* pGOut, float* pBOut);
+	HRESULT D3DXSHEvalSphericalLight(UINT Order, D3DXVECTOR3* pPos, float Radius, float RIntensity, float GIntensity, float BIntensity, float* pROut, float* pGOut, float* pBOut);
+	HRESULT D3DXSHEvalConeLight(UINT Order, D3DXVECTOR3* pDir, float Radius, float RIntensity, float GIntensity, float BIntensity, float* pROut, float* pGOut, float* pBOut);
+	HRESULT D3DXSHEvalHemisphereLight(UINT Order, D3DXVECTOR3* pDir, D3DXCOLOR Top, D3DXCOLOR Bottom, float* pROut, float* pGOut, float* pBOut);
+	BOOL D3DXIntersectTri(D3DXVECTOR3* p0, D3DXVECTOR3* p1, D3DXVECTOR3* p2, D3DXVECTOR3* pRayPos, D3DXVECTOR3* pRayDir, float* pU, float* pV, float* pDist);
+	BOOL D3DXSphereBoundProbe(D3DXVECTOR3* pCenter, float Radius, D3DXVECTOR3* pRayPosition, D3DXVECTOR3* pRayDirection);
+	BOOL D3DXBoxBoundProbe(D3DXVECTOR3* pMin, D3DXVECTOR3* pMax, D3DXVECTOR3* pRayPosition, D3DXVECTOR3* pRayDirection);
+	HRESULT D3DXComputeBoundingSphere(D3DXVECTOR3* pFirstPosition, DWORD NumVertices, DWORD dwStride, D3DXVECTOR3* pCenter, float* pRadius);
+	HRESULT D3DXComputeBoundingBox(D3DXVECTOR3* pFirstPosition, DWORD NumVertices, DWORD dwStride, D3DXVECTOR3* pMin, D3DXVECTOR3* pMax);
+}
+
+enum D3DX_CPU_OPTIMIZATION {
+	D3DX_NOT_OPTIMIZED = 0,
+	D3DX_3DNOW_OPTIMIZED,
+	D3DX_SSE2_OPTIMIZED,
+	D3DX_SSE_OPTIMIZED
+}
+
+extern(Windows) D3DX_CPU_OPTIMIZATION D3DXCpuOptimizations(bool Enable);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/d3dx10mesh.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,163 @@
+/***********************************************************************\
+*                              d3dx10mesh.d                             *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.directx.d3dx10mesh;
+
+private import win32.windows;
+private import win32.directx.d3d10;
+private import win32.directx.d3dx10;
+
+extern(C) const GUID IID_ID3DX10BaseMesh = {0x7ed943dd, 0x52e8, 0x40b5, [0xa8, 0xd8, 0x76, 0x68, 0x5c, 0x40, 0x63, 0x30]};
+extern(C) const GUID IID_ID3DX10MeshBuffer = {0x4b0d117, 0x1041, 0x46b1, [0xaa, 0x8a, 0x39, 0x52, 0x84, 0x8b, 0xa2, 0x2e]};
+extern(C) const GUID IID_ID3DX10Mesh = {0x4020e5c2, 0x1403, 0x4929, [0x88, 0x3f, 0xe2, 0xe8, 0x49, 0xfa, 0xc1, 0x95]};
+extern(C) const GUID IID_ID3DX10PMesh = {0x8875769a, 0xd579, 0x4088, [0xaa, 0xeb, 0x53, 0x4d, 0x1a, 0xd8, 0x4e, 0x96]};
+extern(C) const GUID IID_ID3DX10SPMesh = {0x667ea4c7, 0xf1cd, 0x4386, [0xb5, 0x23, 0x7c, 0x2, 0x90, 0xb8, 0x3c, 0xc5]};
+extern(C) const GUID IID_ID3DX10PatchMesh = {0x3ce6cc22, 0xdbf2, 0x44f4, [0x89, 0x4d, 0xf9, 0xc3, 0x4a, 0x33, 0x71, 0x39]};
+
+enum D3DX10_MESH {
+    D3DX10_MESH_32_BIT			= 0x001,
+    D3DX10_MESH_GS_ADJACENCY	= 0x004
+}
+
+struct D3DX10_ATTRIBUTE_RANGE {
+    UINT	AttribId;
+    UINT	FaceStart;
+    UINT	FaceCount;
+    UINT	VertexStart;
+    UINT	VertexCount;
+}
+
+enum D3DX10_MESH_DISCARD_FLAGS {
+    D3DX10_MESH_DISCARD_ATTRIBUTE_BUFFER = 0x01,
+    D3DX10_MESH_DISCARD_ATTRIBUTE_TABLE = 0x02,
+    D3DX10_MESH_DISCARD_POINTREPS = 0x04,
+    D3DX10_MESH_DISCARD_ADJACENCY = 0x08,
+    D3DX10_MESH_DISCARD_DEVICE_BUFFERS = 0x10
+}
+
+struct D3DX10_WELD_EPSILONS {
+    FLOAT Position;
+    FLOAT BlendWeights;
+    FLOAT Normal;
+    FLOAT PSize;
+    FLOAT Specular;
+    FLOAT Diffuse;
+    FLOAT[8] Texcoord;
+    FLOAT Tangent;
+    FLOAT Binormal;
+    FLOAT TessFactor;
+}
+
+struct D3DX10_INTERSECT_INFO {
+    UINT	FaceIndex;
+    FLOAT	U;
+    FLOAT	V;
+    FLOAT	Dist;
+}
+
+interface ID3DX10MeshBuffer : IUnknown {
+	extern(Windows) :
+    HRESULT Map(void** ppData, SIZE_T* pSize);
+    HRESULT Unmap();
+    SIZE_T GetSize();
+}
+
+interface ID3DX10Mesh : IUnknown {
+	extern(Windows) :
+    UINT GetFaceCount();
+    UINT GetVertexCount();
+    UINT GetVertexBufferCount();
+    UINT GetFlags();
+    HRESULT GetVertexDescription(D3D10_INPUT_ELEMENT_DESC** ppDesc, UINT* pDeclCount);
+    HRESULT SetVertexData(UINT iBuffer, void* pData);
+    HRESULT GetVertexBuffer(UINT iBuffer, ID3DX10MeshBuffer** ppVertexBuffer);
+    HRESULT SetIndexData(void* pData, UINT cIndices);
+    HRESULT GetIndexBuffer(ID3DX10MeshBuffer** ppIndexBuffer);
+    HRESULT SetAttributeData(UINT* pData);
+    HRESULT GetAttributeBuffer(ID3DX10MeshBuffer** ppAttributeBuffer);
+    HRESULT SetAttributeTable(D3DX10_ATTRIBUTE_RANGE* pAttribTable, UINT  cAttribTableSize);
+    HRESULT GetAttributeTable(D3DX10_ATTRIBUTE_RANGE* pAttribTable, UINT* pAttribTableSize);
+    HRESULT GenerateAdjacencyAndPointReps(FLOAT Epsilon);
+    HRESULT GenerateGSAdjacency();
+    HRESULT SetAdjacencyData(UINT* pAdjacency);
+    HRESULT GetAdjacencyBuffer(ID3DX10MeshBuffer** ppAdjacency);
+    HRESULT SetPointRepData(UINT* pPointReps);
+    HRESULT GetPointRepBuffer(ID3DX10MeshBuffer** ppPointReps);
+    HRESULT Discard(D3DX10_MESH_DISCARD_FLAGS dwDiscard);
+    HRESULT CloneMesh(UINT Flags, LPCSTR pPosSemantic, D3D10_INPUT_ELEMENT_DESC* pDesc, UINT  DeclCount, ID3DX10Mesh** ppCloneMesh);
+    HRESULT Optimize(UINT Flags, UINT * pFaceRemap, ID3D10Blob* ppVertexRemap);
+    HRESULT GenerateAttributeBufferFromTable();
+	HRESULT Intersect(D3DXVECTOR3* pRayPos, D3DXVECTOR3* pRayDir, UINT* pHitCount, UINT* pFaceIndex, float* pU, float* pV, float* pDist, ID3D10Blob* ppAllHits);
+	HRESULT IntersectSubset(UINT AttribId, D3DXVECTOR3* pRayPos, D3DXVECTOR3* pRayDir, UINT* pHitCount, UINT* pFaceIndex, float* pU, float* pV, float* pDist, ID3D10Blob* ppAllHits);
+    HRESULT CommitToDevice();
+    HRESULT DrawSubset(UINT AttribId);
+    HRESULT DrawSubsetInstanced(UINT AttribId, UINT InstanceCount, UINT StartInstanceLocation);
+    HRESULT GetDeviceVertexBuffer(UINT iBuffer, ID3D10Buffer** ppVertexBuffer);
+    HRESULT GetDeviceIndexBuffer(ID3D10Buffer** ppIndexBuffer);
+}
+
+HRESULT D3DX10CreateMesh(ID3D10Device* pDevice, D3D10_INPUT_ELEMENT_DESC* pDeclaration, UINT  DeclCount, LPCSTR pPositionSemantic, UINT  VertexCount, UINT  FaceCount, UINT  Options, ID3DX10Mesh** ppMesh);
+
+enum D3DX10_MESHOPT {
+    D3DX10_MESHOPT_COMPACT				= 0x01000000,
+    D3DX10_MESHOPT_ATTR_SORT			= 0x02000000,
+    D3DX10_MESHOPT_VERTEX_CACHE			= 0x04000000,
+    D3DX10_MESHOPT_STRIP_REORDER		= 0x08000000,
+    D3DX10_MESHOPT_IGNORE_VERTS			= 0x10000000,
+    D3DX10_MESHOPT_DO_NOT_SPLIT			= 0x20000000,
+    D3DX10_MESHOPT_DEVICE_INDEPENDENT	= 0x00400000
+}
+
+extern(C) const GUID IID_ID3DX10SkinInfo = {0x420bd604, 0x1c76, 0x4a34, [0xa4, 0x66, 0xe4, 0x5d, 0x6, 0x58, 0xa3, 0x2c]};
+
+const D3DX10_SKININFO_NO_SCALING = 0;
+const D3DX10_SKININFO_SCALE_TO_1 = 1;
+const D3DX10_SKININFO_SCALE_TO_TOTAL = 2;
+
+struct D3DX10_SKINNING_CHANNEL {
+    UINT SrcOffset;
+    UINT DestOffset;
+    BOOL IsNormal;
+}
+
+interface ID3DX10SkinInfo : IUnknown {
+	extern(Windows) :
+	HRESULT QueryInterface(REFIID iid, LPVOID* ppv);
+	ULONG AddRef();
+	ULONG Release();
+	UINT GetNumVertices();
+	UINT GetNumBones();
+	UINT GetMaxBoneInfluences();
+	HRESULT AddVertices(UINT Count);
+	HRESULT RemapVertices(UINT NewVertexCount, UINT* pVertexRemap);
+	HRESULT AddBones(UINT Count);
+	HRESULT RemoveBone(UINT Index);
+	HRESULT RemapBones(UINT NewBoneCount, UINT* pBoneRemap);
+	HRESULT AddBoneInfluences(UINT BoneIndex, UINT InfluenceCount, UINT* pIndices, float* pWeights);
+	HRESULT ClearBoneInfluences(UINT BoneIndex);
+	UINT GetBoneInfluenceCount(UINT BoneIndex);
+	HRESULT GetBoneInfluences(UINT BoneIndex, UINT Offset, UINT Count, UINT* pDestIndices, float* pDestWeights);
+	HRESULT FindBoneInfluenceIndex(UINT BoneIndex, UINT VertexIndex, UINT* pInfluenceIndex);
+	HRESULT SetBoneInfluence(UINT BoneIndex, UINT InfluenceIndex, float Weight);
+	HRESULT GetBoneInfluence(UINT BoneIndex, UINT InfluenceIndex, float* pWeight);
+	HRESULT Compact(UINT MaxPerVertexInfluences, UINT ScaleMode, float MinWeight);
+	HRESULT DoSoftwareSkinning(UINT StartVertex, UINT VertexCount, void* pSrcVertices, UINT SrcStride, void* pDestVertices, UINT DestStride, D3DXMATRIX* pBoneMatrices, D3DXMATRIX* pInverseTransposeBoneMatrices, D3DX10_SKINNING_CHANNEL* pChannelDescs, UINT NumChannels);
+}
+
+HRESULT D3DX10CreateSkinInfo(ID3DX10SkinInfo* ppSkinInfo);
+
+struct D3DX10_ATTRIBUTE_WEIGHTS {
+	FLOAT Position;
+	FLOAT Boundary;
+	FLOAT Normal;
+	FLOAT Diffuse;
+	FLOAT Specular;
+	FLOAT[8] Texcoord;
+	FLOAT Tangent;
+	FLOAT Binormal;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/d3dx10tex.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,192 @@
+/***********************************************************************\
+*                               d3dx10tex.d                             *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.directx.d3dx10tex;
+
+private import win32.windows;
+private import win32.directx.d3d10;
+private import win32.directx.d3dx10core;
+
+enum D3DX10_FILTER_FLAG {
+	D3DX10_FILTER_NONE             = 0x000001,
+	D3DX10_FILTER_POINT            = 0x000002,
+	D3DX10_FILTER_LINEAR           = 0x000003,
+	D3DX10_FILTER_TRIANGLE         = 0x000004,
+	D3DX10_FILTER_BOX              = 0x000005,
+	D3DX10_FILTER_MIRROR_U         = 0x010000,
+	D3DX10_FILTER_MIRROR_V         = 0x020000,
+	D3DX10_FILTER_MIRROR_W         = 0x040000,
+	D3DX10_FILTER_MIRROR           = 0x070000,
+	D3DX10_FILTER_DITHER           = 0x080000,
+	D3DX10_FILTER_DITHER_DIFFUSION = 0x100000,
+	D3DX10_FILTER_SRGB_IN          = 0x200000,
+	D3DX10_FILTER_SRGB_OUT         = 0x400000,
+	D3DX10_FILTER_SRGB             = 0x600000
+}
+
+enum D3DX10_NORMALMAP_FLAG {
+	D3DX10_NORMALMAP_MIRROR_U          = 0x010000,
+	D3DX10_NORMALMAP_MIRROR_V          = 0x020000,
+	D3DX10_NORMALMAP_MIRROR            = 0x030000,
+	D3DX10_NORMALMAP_INVERTSIGN        = 0x080000,
+	D3DX10_NORMALMAP_COMPUTE_OCCLUSION = 0x100000
+}
+
+enum D3DX10_CHANNEL_FLAG {
+	D3DX10_CHANNEL_RED       =  1,
+	D3DX10_CHANNEL_BLUE      =  2,
+	D3DX10_CHANNEL_GREEN     =  4,
+	D3DX10_CHANNEL_ALPHA     =  8,
+	D3DX10_CHANNEL_LUMINANCE = 16
+}
+
+enum D3DX10_IMAGE_FILE_FORMAT {
+	D3DX10_IFF_BMP         =  0,
+	D3DX10_IFF_JPG         =  1,
+	D3DX10_IFF_PNG         =  3,
+	D3DX10_IFF_DDS         =  4,
+	D3DX10_IFF_TIFF        = 10,
+	D3DX10_IFF_GIF         = 11,
+	D3DX10_IFF_WMP         = 12,
+	D3DX10_IFF_FORCE_DWORD = 0x7fffffff
+}
+
+enum D3DX10_SAVE_TEXTURE_FLAG {
+	D3DX10_STF_USEINPUTBLOB = 1
+}
+
+struct D3DX10_IMAGE_INFO {
+	UINT        Width;
+	UINT        Height;
+	UINT        Depth;
+	UINT        ArraySize;
+	UINT        MipLevels;
+	UINT        MiscFlags;
+	DXGI_FORMAT Format;
+	D3D10_RESOURCE_DIMENSION ResourceDimension;
+	D3DX10_IMAGE_FILE_FORMAT ImageFileFormat;
+}
+
+struct D3DX10_IMAGE_LOAD_INFO {
+	UINT               Width;
+	UINT               Height;
+	UINT               Depth;
+	UINT               FirstMipLevel;
+	UINT               MipLevels;
+	D3D10_USAGE        Usage;
+	UINT               BindFlags;
+	UINT               CpuAccessFlags;
+	UINT               MiscFlags;
+	DXGI_FORMAT        Format;
+	UINT               Filter;
+	UINT               MipFilter;
+	D3DX10_IMAGE_INFO* pSrcInfo;
+}
+
+HRESULT D3DX10GetImageInfoFromFileA(LPCSTR pSrcFile, ID3DX10ThreadPump pPump,
+  D3DX10_IMAGE_INFO* pSrcInfo, HRESULT* pHResult);
+HRESULT D3DX10GetImageInfoFromFileW(LPCWSTR pSrcFile, ID3DX10ThreadPump pPump,
+  D3DX10_IMAGE_INFO* pSrcInfo, HRESULT* pHResult);
+
+HRESULT D3DX10GetImageInfoFromResourceA(HMODULE hSrcModule,
+  LPCSTR pSrcResource, ID3DX10ThreadPump pPump, D3DX10_IMAGE_INFO* pSrcInfo,
+  HRESULT* pHResult);
+HRESULT D3DX10GetImageInfoFromResourceW(HMODULE hSrcModule,
+  LPCWSTR pSrcResource, ID3DX10ThreadPump pPump, D3DX10_IMAGE_INFO* pSrcInfo,
+  HRESULT* pHResult);
+
+HRESULT D3DX10GetImageInfoFromMemory(LPCVOID pSrcData, SIZE_T SrcDataSize,
+  ID3DX10ThreadPump pPump, D3DX10_IMAGE_INFO* pSrcInfo, HRESULT* pHResult);
+
+HRESULT D3DX10CreateShaderResourceViewFromFileA(ID3D10Device pDevice,
+  LPCSTR pSrcFile, D3DX10_IMAGE_LOAD_INFO* pLoadInfo, ID3DX10ThreadPump pPump,
+  ID3D10ShaderResourceView* ppShaderResourceView, HRESULT* pHResult);
+HRESULT D3DX10CreateShaderResourceViewFromFileW(ID3D10Device pDevice,
+  LPCWSTR pSrcFile, D3DX10_IMAGE_LOAD_INFO* pLoadInfo, ID3DX10ThreadPump pPump,
+  ID3D10ShaderResourceView* ppShaderResourceView, HRESULT* pHResult);
+
+HRESULT D3DX10CreateTextureFromFileA(ID3D10Device pDevice, LPCSTR pSrcFile,
+  D3DX10_IMAGE_LOAD_INFO* pLoadInfo, ID3DX10ThreadPump pPump,
+  ID3D10Resource* ppTexture, HRESULT* pHResult);
+HRESULT D3DX10CreateTextureFromFileW(ID3D10Device pDevice, LPCWSTR pSrcFile,
+  D3DX10_IMAGE_LOAD_INFO* pLoadInfo, ID3DX10ThreadPump pPump,
+  ID3D10Resource* ppTexture, HRESULT* pHResult);
+
+HRESULT D3DX10CreateShaderResourceViewFromResourceA(ID3D10Device pDevice,
+  HMODULE hSrcModule, LPCSTR pSrcResource, D3DX10_IMAGE_LOAD_INFO* pLoadInfo,
+  ID3DX10ThreadPump pPump, ID3D10ShaderResourceView* ppShaderResourceView,
+  HRESULT* pHResult);
+HRESULT D3DX10CreateShaderResourceViewFromResourceW(ID3D10Device pDevice,
+  HMODULE hSrcModule, LPCWSTR pSrcResource, D3DX10_IMAGE_LOAD_INFO* pLoadInfo,
+  ID3DX10ThreadPump pPump, ID3D10ShaderResourceView* ppShaderResourceView,
+  HRESULT* pHResult);
+
+HRESULT D3DX10CreateTextureFromResourceA(ID3D10Device pDevice,
+  HMODULE hSrcModule, LPCSTR pSrcResource, D3DX10_IMAGE_LOAD_INFO* pLoadInfo,
+  ID3DX10ThreadPump pPump, ID3D10Resource* ppTexture, HRESULT* pHResult);
+HRESULT D3DX10CreateTextureFromResourceW(ID3D10Device pDevice,
+  HMODULE hSrcModule, LPCWSTR pSrcResource, D3DX10_IMAGE_LOAD_INFO* pLoadInfo,
+  ID3DX10ThreadPump pPump, ID3D10Resource* ppTexture, HRESULT* pHResult);
+
+HRESULT D3DX10CreateShaderResourceViewFromMemory(ID3D10Device pDevice,
+  LPCVOID pSrcData, SIZE_T SrcDataSize, D3DX10_IMAGE_LOAD_INFO* pLoadInfo,
+  ID3DX10ThreadPump pPump, ID3D10ShaderResourceView* ppShaderResourceView,
+  HRESULT* pHResult);
+
+HRESULT D3DX10CreateTextureFromMemory(ID3D10Device pDevice, LPCVOID pSrcData,
+  SIZE_T SrcDataSize, D3DX10_IMAGE_LOAD_INFO* pLoadInfo,
+  ID3DX10ThreadPump pPump, ID3D10Resource* ppTexture, HRESULT* pHResult);
+
+struct D3DX10_TEXTURE_LOAD_INFO {
+	D3D10_BOX* pSrcBox;
+	D3D10_BOX* pDstBox;
+	UINT       SrcFirstMip;
+	UINT       DstFirstMip;
+	UINT       NumMips;
+	UINT       SrcFirstElement;
+	UINT       DstFirstElement;
+	UINT       NumElements;
+	UINT       Filter;
+	UINT       MipFilter;
+}
+
+HRESULT D3DX10LoadTextureFromTexture(ID3D10Resource pSrcTexture,
+  D3DX10_TEXTURE_LOAD_INFO* pLoadInfo, ID3D10Resource pDstTexture);
+
+HRESULT D3DX10FilterTexture(ID3D10Resource pTexture, UINT SrcLevel, UINT MipFilter);
+
+HRESULT D3DX10SaveTextureToFileA(ID3D10Resource pSrcTexture,
+  D3DX10_IMAGE_FILE_FORMAT DestFormat, LPCSTR pDestFile);
+HRESULT D3DX10SaveTextureToFileW(ID3D10Resource pSrcTexture,
+  D3DX10_IMAGE_FILE_FORMAT DestFormat, LPCWSTR pDestFile);
+
+HRESULT D3DX10SaveTextureToMemory(ID3D10Resource pSrcTexture,
+  D3DX10_IMAGE_FILE_FORMAT DestFormat, ID3D10Blob* ppDestBuf, UINT Flags);
+
+HRESULT D3DX10ComputeNormalMap(ID3D10Texture2D pSrcTexture, UINT Flags,
+  UINT Channel, FLOAT Amplitude, ID3D10Texture2D pDestTexture);
+
+HRESULT D3DX10SHProjectCubeMap(UINT Order, ID3D10Texture2D pCubeMap,
+  FLOAT* pROut, FLOAT* pGOut, FLOAT* pBOut);
+
+version(Unicode) {
+	alias D3DX10GetImageInfoFromFileW D3DX10GetImageInfoFromFile;
+	alias D3DX10GetImageInfoFromResourceW D3DX10GetImageInfoFromResource;
+	alias D3DX10CreateShaderResourceViewFromFileW D3DX10CreateShaderResourceViewFromFile;
+	alias D3DX10CreateTextureFromFileW D3DX10CreateTextureFromFile;
+	alias D3DX10CreateShaderResourceViewFromResourceW D3DX10CreateShaderResourceViewFromResource;
+	alias D3DX10CreateTextureFromResourceW D3DX10CreateTextureFromResource;
+	alias D3DX10SaveTextureToFileW D3DX10SaveTextureToFile;
+} else {
+	alias D3DX10GetImageInfoFromFileA D3DX10GetImageInfoFromFile;
+	alias D3DX10GetImageInfoFromResourceA D3DX10GetImageInfoFromResource;
+	alias D3DX10CreateShaderResourceViewFromFileA D3DX10CreateShaderResourceViewFromFile;
+	alias D3DX10CreateTextureFromFileA D3DX10CreateTextureFromFile;
+	alias D3DX10CreateShaderResourceViewFromResourceA D3DX10CreateShaderResourceViewFromResource;
+	alias D3DX10CreateTextureFromResourceA D3DX10CreateTextureFromResource;
+	alias D3DX10SaveTextureToFileA D3DX10SaveTextureToFile;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/d3dx9.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,1990 @@
+// D3DX Types and Constants ---------------------------------------------------------------------------------------
+
+module win32.directx.d3dx9;
+
+public import win32.directx.d3d9;
+public import win32.windows;
+
+alias D3DMATRIX D3DXMATRIX;
+
+const uint MAXD3DDECLLENGTH = 64;
+const uint MAX_FVF_DECL_SIZE = MAXD3DDECLLENGTH + 1;
+
+align(4) struct D3DXATTRIBUTERANGE
+{
+    DWORD AttribId;
+    DWORD FaceStart;
+    DWORD FaceCount;
+    DWORD VertexStart;
+    DWORD VertexCount;
+}
+
+align(4) struct D3DXVECTOR2
+{
+	float x = 0, y = 0;
+
+	static D3DXVECTOR2 opCall(float x, float y)
+	{
+		D3DXVECTOR2 v;
+		v.x = x;
+		v.y = y;
+		return v;
+	}
+}
+
+alias D3DVECTOR D3DXVECTOR3;
+
+align(4) struct D3DXVECTOR4
+{
+	float x = 0, y = 0, z = 0, w = 0;
+
+	static D3DXVECTOR4 opCall(float x, float y, float z, float w)
+	{
+		D3DXVECTOR4 v;
+		v.x = x;
+		v.y = y;
+		v.z = z;
+		v.w = w;
+		return v;
+	}
+}
+
+align(4) struct D3DXQUATERNION
+{
+	float x = 0, y = 0, z = 0, w = 0;
+}
+
+align(4) struct D3DXFRAME
+{
+    LPSTR                   Name;
+    D3DXMATRIX              TransformationMatrix;
+
+    D3DXMESHCONTAINER*     pMeshContainer;
+
+    D3DXFRAME       *pFrameSibling;
+    D3DXFRAME       *pFrameFirstChild;
+}
+
+align(4) struct D3DXMESHCONTAINER
+{
+    LPSTR                   Name;
+
+    D3DXMESHDATA            MeshData;
+
+    D3DXMATERIAL*          pMaterials;
+    D3DXEFFECTINSTANCE*    pEffects;
+    DWORD                   NumMaterials;
+    DWORD                  *pAdjacency;
+
+    ID3DXSkinInfo          pSkinInfo;
+
+    D3DXMESHCONTAINER* pNextMeshContainer;
+}
+
+align(4) struct D3DXMESHDATA
+{
+    D3DXMESHDATATYPE Type;
+
+    // current mesh data interface
+    union
+    {
+        ID3DXMesh              pMesh;
+        ID3DXPMesh             pPMesh;
+        ID3DXPatchMesh         pPatchMesh;
+    }
+}
+
+alias uint D3DXMESHDATATYPE;
+enum : uint
+{
+    D3DXMESHTYPE_MESH      = 0x001,             // Normal ID3DXMesh data
+    D3DXMESHTYPE_PMESH     = 0x002,             // Progressive Mesh - ID3DXPMesh
+    D3DXMESHTYPE_PATCHMESH = 0x003             // Patch Mesh - ID3DXPatchMesh
+}
+
+align(4) struct D3DXMATERIAL
+{
+    D3DMATERIAL9  MatD3D;
+    LPSTR         pTextureFilename;
+}
+
+alias uint D3DXEFFECTDEFAULTTYPE;
+enum : uint
+{
+    D3DXEDT_STRING = 0x1,       // pValue points to a null terminated ASCII string
+    D3DXEDT_FLOATS = 0x2,       // pValue points to an array of floats - number of floats is NumBytes / sizeof(float)
+    D3DXEDT_DWORD  = 0x3       // pValue points to a DWORD
+}
+
+align(4) struct D3DXEFFECTDEFAULT
+{
+    LPSTR                 pParamName;
+    D3DXEFFECTDEFAULTTYPE Type;           // type of the data pointed to by pValue
+    DWORD                 NumBytes;       // size in bytes of the data pointed to by pValue
+    LPVOID                pValue;         // data for the default of the effect
+}
+
+align(4) struct D3DXEFFECTINSTANCE
+{
+    LPSTR               pEffectFilename;
+    DWORD               NumDefaults;
+    D3DXEFFECTDEFAULT* pDefaults;
+}
+
+alias uint D3DXPATCHMESHTYPE;
+enum : uint
+{
+    D3DXPATCHMESH_RECT   = 0x001,
+    D3DXPATCHMESH_TRI    = 0x002,
+    D3DXPATCHMESH_NPATCH = 0x003
+}
+
+align(4) struct D3DXPATCHINFO
+{
+    D3DXPATCHMESHTYPE PatchType;
+    D3DDEGREETYPE Degree;
+    D3DBASISTYPE Basis;
+}
+
+const uint LF_FACESIZE = 32;
+
+align(4) struct D3DXFONT_DESCA
+{
+    INT Height;
+    UINT Width;
+    UINT Weight;
+    UINT MipLevels;
+    BOOL Italic;
+    BYTE CharSet;
+    BYTE OutputPrecision;
+    BYTE Quality;
+    BYTE PitchAndFamily;
+    CHAR FaceName[LF_FACESIZE];
+}
+
+align(4) struct D3DXFONT_DESCW
+{
+    INT Height;
+    UINT Width;
+    UINT Weight;
+    UINT MipLevels;
+    BOOL Italic;
+    BYTE CharSet;
+    BYTE OutputPrecision;
+    BYTE Quality;
+    BYTE PitchAndFamily;
+    WCHAR FaceName[LF_FACESIZE];
+}
+
+align(4) struct TEXTMETRICA
+{
+    LONG        tmHeight;
+    LONG        tmAscent;
+    LONG        tmDescent;
+    LONG        tmInternalLeading;
+    LONG        tmExternalLeading;
+    LONG        tmAveCharWidth;
+    LONG        tmMaxCharWidth;
+    LONG        tmWeight;
+    LONG        tmOverhang;
+    LONG        tmDigitizedAspectX;
+    LONG        tmDigitizedAspectY;
+    BYTE        tmFirstChar;
+    BYTE        tmLastChar;
+    BYTE        tmDefaultChar;
+    BYTE        tmBreakChar;
+    BYTE        tmItalic;
+    BYTE        tmUnderlined;
+    BYTE        tmStruckOut;
+    BYTE        tmPitchAndFamily;
+    BYTE        tmCharSet;
+}
+
+align(4) struct TEXTMETRICW
+{
+    LONG        tmHeight;
+    LONG        tmAscent;
+    LONG        tmDescent;
+    LONG        tmInternalLeading;
+    LONG        tmExternalLeading;
+    LONG        tmAveCharWidth;
+    LONG        tmMaxCharWidth;
+    LONG        tmWeight;
+    LONG        tmOverhang;
+    LONG        tmDigitizedAspectX;
+    LONG        tmDigitizedAspectY;
+    WCHAR       tmFirstChar;
+    WCHAR       tmLastChar;
+    WCHAR       tmDefaultChar;
+    WCHAR       tmBreakChar;
+    BYTE        tmItalic;
+    BYTE        tmUnderlined;
+    BYTE        tmStruckOut;
+    BYTE        tmPitchAndFamily;
+    BYTE        tmCharSet;
+}
+
+align(4) struct D3DXEFFECT_DESC
+{
+    LPCSTR Creator;                     // Creator string
+    UINT Parameters;                    // Number of parameters
+    UINT Techniques;                    // Number of techniques
+    UINT Functions;                     // Number of function entrypoints
+}
+
+alias char* D3DXHANDLE;
+
+align(4) struct D3DXPARAMETER_DESC
+{
+    LPCSTR Name;                        // Parameter name
+    LPCSTR Semantic;                    // Parameter semantic
+    D3DXPARAMETER_CLASS Class;          // Class
+    D3DXPARAMETER_TYPE Type;            // Component type
+    UINT Rows;                          // Number of rows
+    UINT Columns;                       // Number of columns
+    UINT Elements;                      // Number of array elements
+    UINT Annotations;                   // Number of annotations
+    UINT StructMembers;                 // Number of structure member sub-parameters
+    DWORD Flags;                        // D3DX_PARAMETER_* flags
+    UINT Bytes;                         // Parameter size, in bytes
+}
+
+alias uint D3DXPARAMETER_CLASS;
+enum : uint
+{
+    D3DXPC_SCALAR,
+    D3DXPC_VECTOR,
+    D3DXPC_MATRIX_ROWS,
+    D3DXPC_MATRIX_COLUMNS,
+    D3DXPC_OBJECT,
+    D3DXPC_STRUCT
+}
+
+alias uint D3DXPARAMETER_TYPE;
+enum : uint
+{
+    D3DXPT_VOID,
+    D3DXPT_BOOL,
+    D3DXPT_INT,
+    D3DXPT_FLOAT,
+    D3DXPT_STRING,
+    D3DXPT_TEXTURE,
+    D3DXPT_TEXTURE1D,
+    D3DXPT_TEXTURE2D,
+    D3DXPT_TEXTURE3D,
+    D3DXPT_TEXTURECUBE,
+    D3DXPT_SAMPLER,
+    D3DXPT_SAMPLER1D,
+    D3DXPT_SAMPLER2D,
+    D3DXPT_SAMPLER3D,
+    D3DXPT_SAMPLERCUBE,
+    D3DXPT_PIXELSHADER,
+    D3DXPT_VERTEXSHADER,
+    D3DXPT_PIXELFRAGMENT,
+    D3DXPT_VERTEXFRAGMENT
+}
+
+align(4) struct D3DXTECHNIQUE_DESC
+{
+    LPCSTR Name;                        // Technique name
+    UINT Passes;                        // Number of passes
+    UINT Annotations;                   // Number of annotations
+}
+
+align(4) struct D3DXPASS_DESC
+{
+    LPCSTR Name;                        // Pass name
+    UINT Annotations;                   // Number of annotations
+
+    DWORD *pVertexShaderFunction; // Vertex shader function
+    DWORD *pPixelShaderFunction;  // Pixel shader function
+}
+
+align(4) struct D3DXFUNCTION_DESC
+{
+    LPCSTR Name;                        // Function name
+    UINT Annotations;                   // Number of annotations
+}
+
+struct D3DXTRACK_DESC
+{
+    DWORD Priority;
+    FLOAT Weight = 0;
+    FLOAT Speed = 0;
+    double Position = 0;
+    BOOL Enable;
+}
+
+align(4) struct D3DXEVENT_DESC
+{
+    DWORD      Type;
+    UINT                Track;
+    double              StartTime = 0;
+    double              Duration = 0;
+    DWORD Transition;
+    union
+    {
+        FLOAT           Weight = 0;
+        FLOAT           Speed;
+        double          Position;
+        BOOL            Enable;
+    };
+}
+
+align(4) struct D3DXKEY_VECTOR3
+{
+    FLOAT Time = 0;
+    D3DXVECTOR3 Value;
+}
+
+align(4) struct D3DXKEY_QUATERNION
+{
+    FLOAT Time = 0;
+    D3DXQUATERNION Value;
+}
+
+align(4) struct D3DXKEY_CALLBACK
+{
+    FLOAT Time = 0;
+    LPVOID pCallbackData;
+}
+
+align(4) struct D3DXIMAGE_INFO
+{
+    UINT                    Width;
+    UINT                    Height;
+    UINT                    Depth;
+    UINT                    MipLevels;
+    D3DFORMAT               Format;
+    D3DRESOURCETYPE         ResourceType;
+    D3DXIMAGE_FILEFORMAT    ImageFileFormat;
+}
+
+alias uint D3DXIMAGE_FILEFORMAT;
+enum : uint
+{
+    D3DXIFF_BMP         = 0,
+    D3DXIFF_JPG         = 1,
+    D3DXIFF_TGA         = 2,
+    D3DXIFF_PNG         = 3,
+    D3DXIFF_DDS         = 4,
+    D3DXIFF_PPM         = 5,
+    D3DXIFF_DIB         = 6,
+}
+
+align(4) struct D3DXATTRIBUTEWEIGHTS
+{
+    FLOAT Position = 0;
+    FLOAT Boundary = 0;
+    FLOAT Normal = 0;
+    FLOAT Diffuse = 0;
+    FLOAT Specular = 0;
+    FLOAT Texcoord[8] = 0;
+    FLOAT Tangent = 0;
+    FLOAT Binormal = 0;
+}
+
+align(4) struct D3DXPLANE
+{
+	FLOAT a = 0, b = 0, c = 0, d = 0;
+}
+
+alias uint D3DXMESH;
+enum : uint
+{
+    D3DXMESH_32BIT                  = 0x001,
+    D3DXMESH_DONOTCLIP              = 0x002,
+    D3DXMESH_POINTS                 = 0x004,
+    D3DXMESH_RTPATCHES              = 0x008,
+    D3DXMESH_NPATCHES               = 0x4000,
+    D3DXMESH_VB_SYSTEMMEM           = 0x010,
+    D3DXMESH_VB_MANAGED             = 0x020,
+    D3DXMESH_VB_WRITEONLY           = 0x040,
+    D3DXMESH_VB_DYNAMIC             = 0x080,
+    D3DXMESH_VB_SOFTWAREPROCESSING = 0x8000,
+    D3DXMESH_IB_SYSTEMMEM           = 0x100,
+    D3DXMESH_IB_MANAGED             = 0x200,
+    D3DXMESH_IB_WRITEONLY           = 0x400,
+    D3DXMESH_IB_DYNAMIC             = 0x800,
+    D3DXMESH_IB_SOFTWAREPROCESSING= 0x10000,
+    D3DXMESH_VB_SHARE               = 0x1000,
+    D3DXMESH_USEHWONLY              = 0x2000,
+    D3DXMESH_SYSTEMMEM              = 0x110,
+    D3DXMESH_MANAGED                = 0x220,
+    D3DXMESH_WRITEONLY              = 0x440,
+    D3DXMESH_DYNAMIC                = 0x880,
+    D3DXMESH_SOFTWAREPROCESSING   = 0x18000,
+}
+
+align(4) struct D3DXMACRO
+{
+    LPCSTR Name;
+    LPCSTR Definition;
+}
+
+align(4) struct D3DXSEMANTIC
+{
+    UINT Usage;
+    UINT UsageIndex;
+}
+
+alias uint D3DXINCLUDE_TYPE;
+enum : uint
+{
+    D3DXINC_LOCAL,
+    D3DXINC_SYSTEM,
+}
+
+enum : uint
+{
+	D3DXFX_DONOTSAVESTATE         = (1 << 0),
+	D3DXFX_DONOTSAVESHADERSTATE   = (1 << 1),
+	D3DXFX_DONOTSAVESAMPLERSTATE  = (1 << 2),
+	D3DXFX_NOT_CLONEABLE          = (1 << 11)
+}
+
+alias uint D3DXMESHSIMP;
+enum : uint
+{
+    D3DXMESHSIMP_VERTEX   = 0x1,
+    D3DXMESHSIMP_FACE     = 0x2
+}
+
+enum : uint
+{
+	DT_TOP                      = 0x00000000,
+	DT_LEFT                     = 0x00000000,
+	DT_CENTER                   = 0x00000001,
+	DT_RIGHT                    = 0x00000002,
+	DT_VCENTER                  = 0x00000004,
+	DT_BOTTOM                   = 0x00000008,
+	DT_WORDBREAK                = 0x00000010,
+	DT_SINGLELINE               = 0x00000020,
+	DT_EXPANDTABS               = 0x00000040,
+	DT_TABSTOP                  = 0x00000080,
+	DT_NOCLIP                   = 0x00000100,
+	DT_EXTERNALLEADING          = 0x00000200,
+	DT_CALCRECT                 = 0x00000400,
+	DT_NOPREFIX                 = 0x00000800,
+	DT_INTERNAL                 = 0x00001000
+}
+
+enum : uint
+{
+	D3DXSPRITE_DONOTSAVESTATE               = (1 << 0),
+	D3DXSPRITE_DONOTMODIFY_RENDERSTATE      = (1 << 1),
+	D3DXSPRITE_OBJECTSPACE                  = (1 << 2),
+	D3DXSPRITE_BILLBOARD                    = (1 << 3),
+	D3DXSPRITE_ALPHABLEND                   = (1 << 4),
+	D3DXSPRITE_SORT_TEXTURE                 = (1 << 5),
+	D3DXSPRITE_SORT_DEPTH_FRONTTOBACK       = (1 << 6),
+	D3DXSPRITE_SORT_DEPTH_BACKTOFRONT       = (1 << 7)
+}
+
+enum : uint
+{
+	D3DX_FILTER_NONE             = (1 << 0),
+	D3DX_FILTER_POINT            = (2 << 0),
+	D3DX_FILTER_LINEAR           = (3 << 0),
+	D3DX_FILTER_TRIANGLE         = (4 << 0),
+	D3DX_FILTER_BOX              = (5 << 0),
+	D3DX_FILTER_MIRROR_U         = (1 << 16),
+	D3DX_FILTER_MIRROR_V         = (2 << 16),
+	D3DX_FILTER_MIRROR_W         = (4 << 16),
+	D3DX_FILTER_MIRROR           = (7 << 16),
+	D3DX_FILTER_DITHER           = (1 << 19),
+	D3DX_FILTER_DITHER_DIFFUSION = (2 << 19),
+	D3DX_FILTER_SRGB_IN          = (1 << 21),
+	D3DX_FILTER_SRGB_OUT         = (2 << 21),
+	D3DX_FILTER_SRGB             = (3 << 21)
+}
+
+const uint D3DX_DEFAULT            = cast(UINT) -1;
+
+alias uint D3DXMESHOPT;
+enum : uint
+{
+    D3DXMESHOPT_COMPACT       = 0x01000000,
+    D3DXMESHOPT_ATTRSORT      = 0x02000000,
+    D3DXMESHOPT_VERTEXCACHE   = 0x04000000,
+    D3DXMESHOPT_STRIPREORDER  = 0x08000000,
+    D3DXMESHOPT_IGNOREVERTS   = 0x10000000,  // optimize faces only, don't touch vertices
+    D3DXMESHOPT_DONOTSPLIT    = 0x20000000,  // do not split vertices shared between attribute groups when attribute sorting
+    D3DXMESHOPT_DEVICEINDEPENDENT = 0x00400000  // Only affects VCache.  uses a static known good cache size for all cards
+}
+
+enum : uint
+{
+    D3DXPLAY_LOOP = 0,
+    D3DXPLAY_ONCE = 1,
+    D3DXPLAY_PINGPONG = 2
+}
+alias uint D3DXPLAYBACK_TYPE;
+
+
+// D3DX Interfaces ---------------------------------------------------------------------------------------
+
+interface ID3DXSkinInfo : IUnknown
+{
+	extern(Windows):
+
+    // Specify the which vertices do each bones influence and by how much
+    HRESULT SetBoneInfluence(DWORD bone, DWORD numInfluences, DWORD* vertices, FLOAT* weights);
+	HRESULT SetBoneVertexInfluence(DWORD boneNum, DWORD influenceNum, float weight);
+    DWORD GetNumBoneInfluences(DWORD bone);
+	HRESULT GetBoneInfluence(DWORD bone, DWORD* vertices, FLOAT* weights);
+	HRESULT GetBoneVertexInfluence(DWORD boneNum, DWORD influenceNum, float *pWeight, DWORD *pVertexNum);
+    HRESULT GetMaxVertexInfluences(DWORD* maxVertexInfluences);
+    DWORD GetNumBones();
+	HRESULT FindBoneVertexInfluenceIndex(DWORD boneNum, DWORD vertexNum, DWORD *pInfluenceIndex);
+
+    // This gets the max face influences based on a triangle mesh with the specified index buffer
+    HRESULT GetMaxFaceInfluences(IDirect3DIndexBuffer9 pIB, DWORD NumFaces, DWORD* maxFaceInfluences);
+
+    // Set min bone influence. Bone influences that are smaller than this are ignored
+    HRESULT SetMinBoneInfluence(FLOAT MinInfl);
+    // Get min bone influence.
+    FLOAT GetMinBoneInfluence();
+
+    // Bone names are returned by D3DXLoadSkinMeshFromXof. They are not used by any other method of this object
+    HRESULT SetBoneName(DWORD Bone, LPCSTR pName); // pName is copied to an internal string buffer
+    LPCSTR GetBoneName(DWORD Bone); // A pointer to an internal string buffer is returned. Do not free this.
+
+    // Bone offset matrices are returned by D3DXLoadSkinMeshFromXof. They are not used by any other method of this object
+    HRESULT SetBoneOffsetMatrix(DWORD Bone, D3DXMATRIX *pBoneTransform); // pBoneTransform is copied to an internal buffer
+    D3DXMATRIX* GetBoneOffsetMatrix(DWORD Bone); // A pointer to an internal matrix is returned. Do not free this.
+
+    // Clone a skin info object
+    HRESULT Clone(ID3DXSkinInfo* ppSkinInfo);
+
+    // Update bone influence information to match vertices after they are reordered. This should be called
+    // if the target vertex buffer has been reordered externally.
+    HRESULT Remap(DWORD NumVertices, DWORD* pVertexRemap);
+
+    // These methods enable the modification of the vertex layout of the vertices that will be skinned
+    HRESULT SetFVF(DWORD FVF);
+    HRESULT SetDeclaration(D3DVERTEXELEMENT9 *pDeclaration);
+    DWORD GetFVF();
+    HRESULT GetDeclaration(D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]);
+
+    // Apply SW skinning based on current pose matrices to the target vertices.
+    HRESULT UpdateSkinnedMesh(
+        D3DXMATRIX* pBoneTransforms,
+        D3DXMATRIX* pBoneInvTransposeTransforms,
+        LPCVOID pVerticesSrc,
+        PVOID pVerticesDst);
+
+    // Takes a mesh and returns a new mesh with per vertex blend weights and a bone combination
+    // table that describes which bones affect which subsets of the mesh
+    HRESULT ConvertToBlendedMesh(
+        ID3DXMesh pMesh,
+        DWORD Options,
+        DWORD *pAdjacencyIn,
+        LPDWORD pAdjacencyOut,
+        DWORD* pFaceRemap,
+        ID3DXBuffer* ppVertexRemap,
+        DWORD* pMaxFaceInfl,
+        DWORD* pNumBoneCombinations,
+        ID3DXBuffer* ppBoneCombinationTable,
+        ID3DXMesh* ppMesh);
+
+    // Takes a mesh and returns a new mesh with per vertex blend weights and indices
+    // and a bone combination table that describes which bones palettes affect which subsets of the mesh
+    HRESULT ConvertToIndexedBlendedMesh(
+        ID3DXMesh pMesh,
+        DWORD Options,
+        DWORD paletteSize,
+        DWORD *pAdjacencyIn,
+        LPDWORD pAdjacencyOut,
+        DWORD* pFaceRemap,
+        ID3DXBuffer* ppVertexRemap,
+        DWORD* pMaxVertexInfl,
+		DWORD *pNumBoneCombinations,
+        ID3DXBuffer* ppBoneCombinationTable,
+        ID3DXMesh* ppMesh);
+}
+
+interface ID3DXBaseMesh : IUnknown
+{
+    extern(Windows):
+
+    // ID3DXBaseMesh
+    HRESULT DrawSubset( DWORD AttribId) ;
+    DWORD GetNumFaces() ;
+    DWORD GetNumVertices() ;
+    DWORD GetFVF() ;
+    HRESULT GetDeclaration( D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) ;
+    DWORD GetNumBytesPerVertex() ;
+    DWORD GetOptions() ;
+    HRESULT GetDevice( IDirect3DDevice9* ppDevice) ;
+    HRESULT CloneMeshFVF( DWORD Options,
+                DWORD FVF, IDirect3DDevice9 pD3DDevice, ID3DXMesh* ppCloneMesh) ;
+    HRESULT CloneMesh( DWORD Options,
+                 D3DVERTEXELEMENT9 *pDeclaration, IDirect3DDevice9 pD3DDevice, ID3DXMesh* ppCloneMesh) ;
+    HRESULT GetVertexBuffer( IDirect3DVertexBuffer9* ppVB) ;
+    HRESULT GetIndexBuffer( IDirect3DIndexBuffer9* ppIB) ;
+    HRESULT LockVertexBuffer( DWORD Flags, LPVOID *ppData) ;
+    HRESULT UnlockVertexBuffer() ;
+    HRESULT LockIndexBuffer( DWORD Flags, LPVOID *ppData) ;
+    HRESULT UnlockIndexBuffer() ;
+    HRESULT GetAttributeTable(
+                 D3DXATTRIBUTERANGE *pAttribTable, DWORD* pAttribTableSize) ;
+
+    HRESULT ConvertPointRepsToAdjacency(  DWORD* pPRep, DWORD* pAdjacency) ;
+    HRESULT ConvertAdjacencyToPointReps(  DWORD* pAdjacency, DWORD* pPRep) ;
+    HRESULT GenerateAdjacency( FLOAT Epsilon, DWORD* pAdjacency) ;
+
+    HRESULT UpdateSemantics( D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) ;
+}
+
+interface ID3DXMesh : ID3DXBaseMesh
+{
+    extern(Windows):
+
+    // ID3DXMesh
+    HRESULT LockAttributeBuffer( DWORD Flags, DWORD** ppData) ;
+    HRESULT UnlockAttributeBuffer() ;
+    HRESULT Optimize( DWORD Flags,  DWORD* pAdjacencyIn, DWORD* pAdjacencyOut,
+                     DWORD* pFaceRemap, ID3DXBuffer *ppVertexRemap,
+                     ID3DXMesh* ppOptMesh) ;
+    HRESULT OptimizeInplace( DWORD Flags,  DWORD* pAdjacencyIn, DWORD* pAdjacencyOut,
+                     DWORD* pFaceRemap, ID3DXBuffer *ppVertexRemap) ;
+    HRESULT SetAttributeTable(  D3DXATTRIBUTERANGE *pAttribTable, DWORD cAttribTableSize) ;
+}
+
+interface ID3DXBuffer : IUnknown
+{
+    extern(Windows):
+
+    // ID3DXBuffer
+    LPVOID GetBufferPointer();
+    DWORD GetBufferSize();
+}
+
+interface ID3DXPMesh : ID3DXBaseMesh
+{
+    extern(Windows):
+
+    // ID3DXPMesh
+    HRESULT ClonePMeshFVF( DWORD Options,
+                DWORD FVF, IDirect3DDevice9 pD3DDevice, ID3DXPMesh* ppCloneMesh) ;
+    HRESULT ClonePMesh( DWORD Options,
+                 D3DVERTEXELEMENT9 *pDeclaration, IDirect3DDevice9 pD3DDevice, ID3DXPMesh* ppCloneMesh) ;
+    HRESULT SetNumFaces( DWORD Faces) ;
+    HRESULT SetNumVertices( DWORD Vertices) ;
+    DWORD GetMaxFaces() ;
+    DWORD GetMinFaces() ;
+    DWORD GetMaxVertices() ;
+    DWORD GetMinVertices() ;
+    HRESULT Save( void *pStream,  D3DXMATERIAL* pMaterials,  D3DXEFFECTINSTANCE* pEffectInstances, DWORD NumMaterials) ;
+
+    HRESULT Optimize( DWORD Flags, DWORD* pAdjacencyOut,
+                     DWORD* pFaceRemap, ID3DXBuffer *ppVertexRemap,
+                     ID3DXMesh* ppOptMesh) ;
+
+    HRESULT OptimizeBaseLOD( DWORD Flags, DWORD* pFaceRemap) ;
+    HRESULT TrimByFaces( DWORD NewFacesMin, DWORD NewFacesMax, DWORD *rgiFaceRemap, DWORD *rgiVertRemap) ;
+    HRESULT TrimByVertices( DWORD NewVerticesMin, DWORD NewVerticesMax, DWORD *rgiFaceRemap, DWORD *rgiVertRemap) ;
+
+    HRESULT GetAdjacency( DWORD* pAdjacency) ;
+
+    //  Used to generate the immediate "ancestor" for each vertex when it is removed by a vsplit.  Allows generation of geomorphs
+    //     Vertex buffer must be equal to or greater than the maximum number of vertices in the pmesh
+    HRESULT GenerateVertexHistory( DWORD* pVertexHistory) ;
+}
+
+interface ID3DXPatchMesh : IUnknown
+{
+    extern(Windows):
+
+    // ID3DXPatchMesh
+
+    // Return creation parameters
+    DWORD GetNumPatches() ;
+    DWORD GetNumVertices() ;
+    HRESULT GetDeclaration( D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE]) ;
+    DWORD GetControlVerticesPerPatch() ;
+    DWORD GetOptions() ;
+    HRESULT GetDevice( IDirect3DDevice9 *ppDevice) ;
+    HRESULT GetPatchInfo( D3DXPATCHINFO* PatchInfo) ;
+
+    // Control mesh access
+    HRESULT GetVertexBuffer( IDirect3DVertexBuffer9* ppVB) ;
+    HRESULT GetIndexBuffer( IDirect3DIndexBuffer9* ppIB) ;
+    HRESULT LockVertexBuffer( DWORD flags, LPVOID *ppData) ;
+    HRESULT UnlockVertexBuffer() ;
+    HRESULT LockIndexBuffer( DWORD flags, LPVOID *ppData) ;
+    HRESULT UnlockIndexBuffer() ;
+    HRESULT LockAttributeBuffer( DWORD flags, DWORD** ppData) ;
+    HRESULT UnlockAttributeBuffer() ;
+
+    //  function returns the size of the tessellated mesh given a tessellation level.
+    //  assumes uniform tessellation. For adaptive tessellation the Adaptive parameter must
+    // be set to TRUE and TessellationLevel should be the max tessellation.
+    //  will result in the max mesh size necessary for adaptive tessellation.
+    HRESULT GetTessSize( FLOAT fTessLevel,DWORD Adaptive, DWORD *NumTriangles,DWORD *NumVertices) ;
+
+    //GenerateAdjacency determines which patches are adjacent with provided tolerance
+    // information is used internally to optimize tessellation
+    HRESULT GenerateAdjacency( FLOAT Tolerance) ;
+
+    //CloneMesh Creates a new patchmesh with the specified decl, and converts the vertex buffer
+    //to the new decl. Entries in the new decl which are new are set to 0. If the current mesh
+    //has adjacency, the new mesh will also have adjacency
+    HRESULT CloneMesh( DWORD Options,  D3DVERTEXELEMENT9 *pDecl, ID3DXPatchMesh *pMesh) ;
+
+    // Optimizes the patchmesh for efficient tessellation.  function is designed
+    // to perform one time optimization for patch meshes that need to be tessellated
+    // repeatedly by calling the Tessellate() method. The optimization performed is
+    // independent of the actual tessellation level used.
+    // Currently Flags is unused.
+    // If vertices are changed, Optimize must be called again
+    HRESULT Optimize( DWORD flags) ;
+
+    //gets and sets displacement parameters
+    //displacement maps can only be 2D textures MIP-MAPPING is ignored for non adapative tessellation
+    HRESULT SetDisplaceParam( IDirect3DBaseTexture9 Texture,
+                              D3DTEXTUREFILTERTYPE MinFilter,
+                              D3DTEXTUREFILTERTYPE MagFilter,
+                              D3DTEXTUREFILTERTYPE MipFilter,
+                              D3DTEXTUREADDRESS Wrap,
+                              DWORD dwLODBias) ;
+
+    HRESULT GetDisplaceParam( IDirect3DBaseTexture9 *Texture,
+                                D3DTEXTUREFILTERTYPE *MinFilter,
+                                D3DTEXTUREFILTERTYPE *MagFilter,
+                                D3DTEXTUREFILTERTYPE *MipFilter,
+                                D3DTEXTUREADDRESS *Wrap,
+                                DWORD *dwLODBias) ;
+
+    // Performs the uniform tessellation based on the tessellation level.
+    //  function will perform more efficiently if the patch mesh has been optimized using the Optimize() call.
+    HRESULT Tessellate( FLOAT fTessLevel,ID3DXMesh pMesh) ;
+
+    // Performs adaptive tessellation based on the Z based adaptive tessellation criterion.
+    // pTrans specifies a 4D vector that is dotted with the vertices to get the per vertex
+    // adaptive tessellation amount. Each edge is tessellated to the average of the criterion
+    // at the 2 vertices it connects.
+    // MaxTessLevel specifies the upper limit for adaptive tesselation.
+    //  function will perform more efficiently if the patch mesh has been optimized using the Optimize() call.
+    HRESULT TessellateAdaptive(
+         D3DXVECTOR4 *pTrans,
+        DWORD dwMaxTessLevel,
+        DWORD dwMinTessLevel,
+        ID3DXMesh pMesh) ;
+
+}
+
+interface ID3DXFont : IUnknown
+{
+    extern(Windows):
+
+    // ID3DXFont
+    HRESULT GetDevice( IDirect3DDevice9 *ppDevice) ;
+    HRESULT GetDescA( D3DXFONT_DESCA *pDesc) ;
+    HRESULT GetDescW( D3DXFONT_DESCW *pDesc) ;
+    BOOL GetTextMetricsA( TEXTMETRICA *pTextMetrics) ;
+    BOOL GetTextMetricsW( TEXTMETRICW *pTextMetrics) ;
+
+    HDC GetDC() ;
+    HRESULT GetGlyphData( UINT Glyph, IDirect3DTexture9 *ppTexture, RECT *pBlackBox, POINT *pCellInc) ;
+
+    HRESULT PreloadCharacters( UINT First, UINT Last) ;
+    HRESULT PreloadGlyphs( UINT First, UINT Last) ;
+    HRESULT PreloadTextA( LPCSTR pString, INT Count) ;
+    HRESULT PreloadTextW( LPCWSTR pString, INT Count) ;
+
+    INT DrawTextA( ID3DXSprite pSprite, LPCSTR pString, INT Count, LPRECT pRect, DWORD Format, D3DCOLOR Color) ;
+    INT DrawTextW( ID3DXSprite pSprite, LPCWSTR pString, INT Count, LPRECT pRect, DWORD Format, D3DCOLOR Color) ;
+
+    HRESULT OnLostDevice() ;
+    HRESULT OnResetDevice() ;
+}
+
+interface ID3DXSprite : IUnknown
+{
+    extern(Windows):
+
+    // ID3DXSprite
+    HRESULT GetDevice( IDirect3DDevice9* ppDevice) ;
+
+    HRESULT GetTransform( D3DXMATRIX *pTransform) ;
+    HRESULT SetTransform(  D3DXMATRIX *pTransform) ;
+
+    HRESULT SetWorldViewRH(  D3DXMATRIX *pWorld,  D3DXMATRIX *pView) ;
+    HRESULT SetWorldViewLH(  D3DXMATRIX *pWorld,  D3DXMATRIX *pView) ;
+
+    HRESULT Begin( DWORD Flags) ;
+    HRESULT Draw( IDirect3DTexture9 pTexture,  RECT *pSrcRect,  D3DXVECTOR3 *pCenter,  D3DXVECTOR3 *pPosition, D3DCOLOR Color) ;
+    HRESULT Flush() ;
+    HRESULT End() ;
+
+    HRESULT OnLostDevice() ;
+    HRESULT OnResetDevice() ;
+}
+
+interface ID3DXBaseEffect : IUnknown
+{
+    extern(Windows):
+
+    // Descs
+    HRESULT GetDesc( D3DXEFFECT_DESC* pDesc) ;
+    HRESULT GetParameterDesc( D3DXHANDLE hParameter, D3DXPARAMETER_DESC* pDesc) ;
+    HRESULT GetTechniqueDesc( D3DXHANDLE hTechnique, D3DXTECHNIQUE_DESC* pDesc) ;
+    HRESULT GetPassDesc( D3DXHANDLE hPass, D3DXPASS_DESC* pDesc) ;
+    HRESULT GetFunctionDesc( D3DXHANDLE hShader, D3DXFUNCTION_DESC* pDesc) ;
+
+    // Handle operations
+    D3DXHANDLE GetParameter( D3DXHANDLE hParameter, UINT Index) ;
+    D3DXHANDLE GetParameterByName( D3DXHANDLE hParameter, LPCSTR pName) ;
+    D3DXHANDLE GetParameterBySemantic( D3DXHANDLE hParameter, LPCSTR pSemantic) ;
+    D3DXHANDLE GetParameterElement( D3DXHANDLE hParameter, UINT Index) ;
+    D3DXHANDLE GetTechnique( UINT Index) ;
+    D3DXHANDLE GetTechniqueByName( LPCSTR pName) ;
+    D3DXHANDLE GetPass( D3DXHANDLE hTechnique, UINT Index) ;
+    D3DXHANDLE GetPassByName( D3DXHANDLE hTechnique, LPCSTR pName) ;
+    D3DXHANDLE GetFunction( UINT Index) ;
+    D3DXHANDLE GetFunctionByName( LPCSTR pName) ;
+    D3DXHANDLE GetAnnotation( D3DXHANDLE hObject, UINT Index) ;
+    D3DXHANDLE GetAnnotationByName( D3DXHANDLE hObject, LPCSTR pName) ;
+
+    // Get/Set Parameters
+    HRESULT SetValue( D3DXHANDLE hParameter, LPCVOID pData, UINT Bytes) ;
+    HRESULT GetValue( D3DXHANDLE hParameter, LPVOID pData, UINT Bytes) ;
+    HRESULT SetBool( D3DXHANDLE hParameter, BOOL b) ;
+    HRESULT GetBool( D3DXHANDLE hParameter, BOOL* pb) ;
+    HRESULT SetBoolArray( D3DXHANDLE hParameter,  BOOL* pb, UINT Count) ;
+    HRESULT GetBoolArray( D3DXHANDLE hParameter, BOOL* pb, UINT Count) ;
+    HRESULT SetInt( D3DXHANDLE hParameter, INT n) ;
+    HRESULT GetInt( D3DXHANDLE hParameter, INT* pn) ;
+    HRESULT SetIntArray( D3DXHANDLE hParameter,  INT* pn, UINT Count) ;
+    HRESULT GetIntArray( D3DXHANDLE hParameter, INT* pn, UINT Count) ;
+    HRESULT SetFloat( D3DXHANDLE hParameter, FLOAT f) ;
+    HRESULT GetFloat( D3DXHANDLE hParameter, FLOAT* pf) ;
+    HRESULT SetFloatArray( D3DXHANDLE hParameter,  FLOAT* pf, UINT Count) ;
+    HRESULT GetFloatArray( D3DXHANDLE hParameter, FLOAT* pf, UINT Count) ;
+    HRESULT SetVector( D3DXHANDLE hParameter,  D3DXVECTOR4* pVector) ;
+    HRESULT GetVector( D3DXHANDLE hParameter, D3DXVECTOR4* pVector) ;
+    HRESULT SetVectorArray( D3DXHANDLE hParameter,  D3DXVECTOR4* pVector, UINT Count) ;
+    HRESULT GetVectorArray( D3DXHANDLE hParameter, D3DXVECTOR4* pVector, UINT Count) ;
+    HRESULT SetMatrix( D3DXHANDLE hParameter,  D3DXMATRIX* pMatrix) ;
+    HRESULT GetMatrix( D3DXHANDLE hParameter, D3DXMATRIX* pMatrix) ;
+    HRESULT SetMatrixArray( D3DXHANDLE hParameter,  D3DXMATRIX* pMatrix, UINT Count) ;
+    HRESULT GetMatrixArray( D3DXHANDLE hParameter, D3DXMATRIX* pMatrix, UINT Count) ;
+    HRESULT SetMatrixPointerArray( D3DXHANDLE hParameter,  D3DXMATRIX** ppMatrix, UINT Count) ;
+    HRESULT GetMatrixPointerArray( D3DXHANDLE hParameter, D3DXMATRIX** ppMatrix, UINT Count) ;
+    HRESULT SetMatrixTranspose( D3DXHANDLE hParameter,  D3DXMATRIX* pMatrix) ;
+    HRESULT GetMatrixTranspose( D3DXHANDLE hParameter, D3DXMATRIX* pMatrix) ;
+    HRESULT SetMatrixTransposeArray( D3DXHANDLE hParameter,  D3DXMATRIX* pMatrix, UINT Count) ;
+    HRESULT GetMatrixTransposeArray( D3DXHANDLE hParameter, D3DXMATRIX* pMatrix, UINT Count) ;
+    HRESULT SetMatrixTransposePointerArray( D3DXHANDLE hParameter,  D3DXMATRIX** ppMatrix, UINT Count) ;
+    HRESULT GetMatrixTransposePointerArray( D3DXHANDLE hParameter, D3DXMATRIX** ppMatrix, UINT Count) ;
+    HRESULT SetString( D3DXHANDLE hParameter, LPCSTR pString) ;
+    HRESULT GetString( D3DXHANDLE hParameter, LPCSTR* ppString) ;
+    HRESULT SetTexture( D3DXHANDLE hParameter, IDirect3DBaseTexture9 pTexture) ;
+    HRESULT GetTexture( D3DXHANDLE hParameter, IDirect3DBaseTexture9 *ppTexture) ;
+    HRESULT GetPixelShader( D3DXHANDLE hParameter, IDirect3DPixelShader9 *ppPShader) ;
+    HRESULT GetVertexShader( D3DXHANDLE hParameter, IDirect3DVertexShader9 *ppVShader) ;
+
+    //Set Range of an Array to pass to device
+    //Useful for sending only a subrange of an array down to the device
+    HRESULT SetArrayRange( D3DXHANDLE hParameter, UINT uStart, UINT uEnd) ;
+
+}
+
+interface ID3DXEffect : ID3DXBaseEffect
+{
+    extern(Windows):
+
+    // Pool
+    HRESULT GetPool( ID3DXEffectPool* ppPool) ;
+
+    // Selecting and setting a technique
+    HRESULT SetTechnique( D3DXHANDLE hTechnique) ;
+    D3DXHANDLE GetCurrentTechnique() ;
+    HRESULT ValidateTechnique( D3DXHANDLE hTechnique) ;
+    HRESULT FindNextValidTechnique( D3DXHANDLE hTechnique, D3DXHANDLE *pTechnique) ;
+    BOOL IsParameterUsed( D3DXHANDLE hParameter, D3DXHANDLE hTechnique) ;
+
+    // Using current technique
+    // Begin           starts active technique
+    // BeginPass       begins a pass
+    // CommitChanges   updates changes to any set calls in the pass.  should be called before
+    //                 any DrawPrimitive call to d3d
+    // EndPass         ends a pass
+    // End             ends active technique
+    HRESULT Begin( UINT *pPasses, DWORD Flags) ;
+    HRESULT BeginPass( UINT Pass) ;
+    HRESULT CommitChanges() ;
+    HRESULT EndPass() ;
+    HRESULT End() ;
+
+    // Managing D3D Device
+    HRESULT GetDevice( IDirect3DDevice9* ppDevice) ;
+    HRESULT OnLostDevice() ;
+    HRESULT OnResetDevice() ;
+
+    // Logging device calls
+    HRESULT SetStateManager( ID3DXEffectStateManager pManager) ;
+    HRESULT GetStateManager( ID3DXEffectStateManager *ppManager) ;
+
+    // Parameter blocks
+    HRESULT BeginParameterBlock() ;
+    D3DXHANDLE EndParameterBlock() ;
+    HRESULT ApplyParameterBlock( D3DXHANDLE hParameterBlock) ;
+    HRESULT DeleteParameterBlock( D3DXHANDLE hParameterBlock) ;
+
+    // Cloning
+    HRESULT CloneEffect( IDirect3DDevice9 pDevice, ID3DXEffect* ppEffect) ;
+}
+
+interface ID3DXEffectPool : IUnknown
+{
+    extern(Windows):
+
+    // No public methods
+}
+
+interface ID3DXEffectStateManager : IUnknown
+{
+    extern(Windows):
+
+    // The following methods are called by the Effect when it wants to make
+    // the corresponding device call.  Note that:
+    // 1. Users manage the state and are therefore responsible for making the
+    //    the corresponding device calls themselves inside their callbacks.
+    // 2. Effects pay attention to the return values of the callbacks, and so
+    //    users must pay attention to what they return in their callbacks.
+
+    HRESULT SetTransform( D3DTRANSFORMSTATETYPE State,  D3DMATRIX *pMatrix) ;
+    HRESULT SetMaterial(  D3DMATERIAL9 *pMaterial) ;
+    HRESULT SetLight( DWORD Index,  D3DLIGHT9 *pLight) ;
+    HRESULT LightEnable( DWORD Index, BOOL Enable) ;
+    HRESULT SetRenderState( D3DRENDERSTATETYPE State, DWORD Value) ;
+    HRESULT SetTexture( DWORD Stage, IDirect3DBaseTexture9 pTexture) ;
+    HRESULT SetTextureStageState( DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value) ;
+    HRESULT SetSamplerState( DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value) ;
+    HRESULT SetNPatchMode( FLOAT NumSegments) ;
+    HRESULT SetFVF( DWORD FVF) ;
+    HRESULT SetVertexShader( IDirect3DVertexShader9 pShader) ;
+    HRESULT SetVertexShaderConstantF( UINT RegisterIndex,  FLOAT *pConstantData, UINT RegisterCount) ;
+    HRESULT SetVertexShaderConstantI( UINT RegisterIndex,  INT *pConstantData, UINT RegisterCount) ;
+    HRESULT SetVertexShaderConstantB( UINT RegisterIndex,  BOOL *pConstantData, UINT RegisterCount) ;
+    HRESULT SetPixelShader( IDirect3DPixelShader9 pShader) ;
+    HRESULT SetPixelShaderConstantF( UINT RegisterIndex,  FLOAT *pConstantData, UINT RegisterCount) ;
+    HRESULT SetPixelShaderConstantI( UINT RegisterIndex,  INT *pConstantData, UINT RegisterCount) ;
+    HRESULT SetPixelShaderConstantB( UINT RegisterIndex,  BOOL *pConstantData, UINT RegisterCount) ;
+}
+
+interface ID3DXInclude
+{
+    HRESULT Open(D3DXINCLUDE_TYPE IncludeType, LPCSTR pFileName, LPCVOID pParentData, LPCVOID *ppData, UINT *pBytes);
+    HRESULT Close(LPCVOID pData);
+}
+
+// D3DX Functions ---------------------------------------------------------------------------------------
+extern(Windows)
+{
+	uint D3DXGetShaderVersion(uint* pFunction);
+
+	HRESULT D3DXCheckTextureRequirements(
+	        IDirect3DDevice9         pDevice,
+	        UINT*                     pWidth,
+	        UINT*                     pHeight,
+	        UINT*                     pNumMipLevels,
+	        DWORD                     Usage,
+	        D3DFORMAT*                pFormat,
+	        D3DPOOL                   Pool) ;
+
+	HRESULT D3DXCreateTexture(
+	        IDirect3DDevice9         pDevice,
+	        UINT                      Width,
+	        UINT                      Height,
+	        UINT                      MipLevels,
+	        DWORD                     Usage,
+	        D3DFORMAT                 Format,
+	        D3DPOOL                   Pool,
+	        IDirect3DTexture9*       ppTexture);
+
+	HRESULT D3DXCreateCubeTexture(
+	        IDirect3DDevice9         pDevice,
+	        UINT                      Size,
+	        UINT                      MipLevels,
+	        DWORD                     Usage,
+	        D3DFORMAT                 Format,
+	        D3DPOOL                   Pool,
+	        IDirect3DCubeTexture9*   ppCubeTexture);
+			
+	HRESULT D3DXCreateTextureFromFileA(
+			LPDIRECT3DDEVICE9 pDevice,
+			LPCTSTR pSrcFile,
+			LPDIRECT3DTEXTURE9 * ppTexture);
+
+	HRESULT D3DXCreateTextureFromFileExA(
+	        IDirect3DDevice9         pDevice,
+	        LPCSTR                    pSrcFile,
+	        UINT                      Width,
+	        UINT                      Height,
+	        UINT                      MipLevels,
+	        DWORD                     Usage,
+	        D3DFORMAT                 Format,
+	        D3DPOOL                   Pool,
+	        DWORD                     Filter,
+	        DWORD                     MipFilter,
+	        D3DCOLOR                  ColorKey,
+	        D3DXIMAGE_INFO*           pSrcInfo,
+	        PALETTEENTRY*             pPalette,
+	        IDirect3DTexture9*       ppTexture);
+
+	HRESULT D3DXCreateCubeTextureFromFileExA(
+	        IDirect3DDevice9         pDevice,
+	        LPCSTR                    pSrcFile,
+	        UINT                      Size,
+	        UINT                      MipLevels,
+	        DWORD                     Usage,
+	        D3DFORMAT                 Format,
+	        D3DPOOL                   Pool,
+	        DWORD                     Filter,
+	        DWORD                     MipFilter,
+	        D3DCOLOR                  ColorKey,
+	        D3DXIMAGE_INFO*           pSrcInfo,
+	        PALETTEENTRY*             pPalette,
+	        IDirect3DCubeTexture9*   ppCubeTexture);
+
+	HRESULT D3DXSimplifyMesh(
+	        ID3DXMesh pMesh,
+	         DWORD* pAdjacency,
+	         D3DXATTRIBUTEWEIGHTS *pVertexAttributeWeights,
+	         FLOAT *pVertexWeights,
+	        DWORD MinValue,
+	        DWORD Options,
+	        ID3DXMesh* ppMesh);
+
+	HRESULT D3DXCreateSkinInfoFVF(
+	        DWORD NumVertices,
+	        DWORD FVF,
+	        DWORD NumBones,
+	        ID3DXSkinInfo* ppSkinInfo);
+
+	D3DXVECTOR2* D3DXVec2TransformCoord( D3DXVECTOR2 *pOut, D3DXVECTOR2 *pV, D3DXMATRIX *pM );
+
+	D3DXVECTOR4* D3DXVec3Transform( D3DXVECTOR4 *pOut, D3DXVECTOR3 *pV, D3DXMATRIX *pM );
+
+	D3DXVECTOR3* D3DXVec3TransformCoord( D3DXVECTOR3 *pOut, D3DXVECTOR3 *pV, D3DXMATRIX *pM );
+
+	D3DXVECTOR4* D3DXVec4Transform( D3DXVECTOR4 *pOut, D3DXVECTOR4 *pV, D3DXMATRIX *pM );
+
+	D3DXMATRIX* D3DXMatrixTranspose( D3DXMATRIX *pOut, D3DXMATRIX *pM );
+
+	D3DXMATRIX* D3DXMatrixMultiply( D3DXMATRIX *pOut, D3DXMATRIX *pM1, D3DXMATRIX *pM2 );
+
+	D3DXMATRIX* D3DXMatrixInverse( D3DXMATRIX *pOut, FLOAT *pDeterminant, D3DXMATRIX *pM );
+
+	D3DXMATRIX* D3DXMatrixScaling( D3DXMATRIX *pOut, FLOAT sx, FLOAT sy, FLOAT sz );
+
+	D3DXMATRIX* D3DXMatrixTranslation( D3DXMATRIX *pOut, FLOAT x, FLOAT y, FLOAT z );
+
+	D3DXMATRIX* D3DXMatrixRotationX( D3DXMATRIX *pOut, FLOAT Angle );
+
+	D3DXMATRIX* D3DXMatrixRotationY( D3DXMATRIX *pOut, FLOAT Angle );
+
+	D3DXMATRIX* D3DXMatrixRotationZ( D3DXMATRIX *pOut, FLOAT Angle );
+
+	D3DXMATRIX* D3DXMatrixRotationQuaternion( D3DXMATRIX *pOut, D3DXQUATERNION *pQ);
+
+	D3DXMATRIX* D3DXMatrixRotationYawPitchRoll( D3DXMATRIX *pOut, FLOAT Yaw, FLOAT Pitch, FLOAT Roll );
+
+	D3DXMATRIX* D3DXMatrixAffineTransformation2D( D3DXMATRIX *pOut, FLOAT Scaling, D3DXVECTOR2 *pRotationCenter,
+	      float Rotation, D3DXVECTOR2 *pTranslation);
+
+	D3DXMATRIX* D3DXMatrixPerspectiveFovLH( D3DXMATRIX *pOut, FLOAT fovy, FLOAT Aspect, FLOAT zn, FLOAT zf );
+
+	D3DXMATRIX* D3DXMatrixOrthoLH( D3DXMATRIX *pOut, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf );
+
+	D3DXMATRIX* D3DXMatrixOrthoOffCenterLH( D3DXMATRIX *pOut, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn,
+	      FLOAT zf );
+
+	void D3DXQuaternionToAxisAngle( D3DXQUATERNION *pQ, D3DXVECTOR3 *pAxis, FLOAT *pAngle );
+
+	D3DXQUATERNION* D3DXQuaternionRotationMatrix( D3DXQUATERNION *pOut, D3DXMATRIX *pM);
+
+	D3DXQUATERNION* D3DXQuaternionNormalize( D3DXQUATERNION *pOut, D3DXQUATERNION *pQ );
+
+	D3DXPLANE* D3DXPlaneNormalize( D3DXPLANE *pOut, D3DXPLANE *pP);
+
+	char* DXGetErrorDescription9A(HRESULT hr);
+
+	HRESULT D3DXCreateEffectFromFileA(
+	        IDirect3DDevice9               pDevice,
+	        LPCSTR                          pSrcFile,
+	         D3DXMACRO*                pDefines,
+	        ID3DXInclude                   pInclude,
+	        DWORD                           Flags,
+	        ID3DXEffectPool                pPool,
+	        ID3DXEffect*                   ppEffect,
+	        ID3DXBuffer*                   ppCompilationErrors);
+
+	D3DXMATRIX* D3DXMatrixTransformation2D( D3DXMATRIX *pOut, D3DXVECTOR2 *pScalingCenter,
+      float *pScalingRotation, D3DXVECTOR2 *pScaling,
+      D3DXVECTOR2 *pRotationCenter, float Rotation,
+      D3DXVECTOR2 *pTranslation);
+
+    HRESULT D3DXLoadMeshFromXA(
+        LPCSTR pFilename,
+        DWORD Options,
+        IDirect3DDevice9 pD3D,
+        ID3DXBuffer *ppAdjacency,
+        ID3DXBuffer *ppMaterials,
+        ID3DXBuffer *ppEffectInstances,
+        DWORD *pNumMaterials,
+        ID3DXMesh *ppMesh);
+
+    HRESULT D3DXCreatePolygon(
+        IDirect3DDevice9   pDevice,
+        FLOAT               Length,
+        UINT                Sides,
+        ID3DXMesh*         ppMesh,
+        ID3DXBuffer*       ppAdjacency);
+
+	HRESULT D3DXCreateBox(
+	        IDirect3DDevice9   pDevice,
+	        FLOAT               Width,
+	        FLOAT               Height,
+	        FLOAT               Depth,
+	        ID3DXMesh*         ppMesh,
+	        ID3DXBuffer*       ppAdjacency);
+
+	HRESULT D3DXCreateCylinder(
+	        IDirect3DDevice9   pDevice,
+	        FLOAT               Radius1,
+	        FLOAT               Radius2,
+	        FLOAT               Length,
+	        UINT                Slices,
+	        UINT                Stacks,
+	        ID3DXMesh*         ppMesh,
+	        ID3DXBuffer*       ppAdjacency);
+
+	HRESULT D3DXCreateSphere(
+	        IDirect3DDevice9  pDevice,
+	        FLOAT              Radius,
+	        UINT               Slices,
+	        UINT               Stacks,
+	        ID3DXMesh*        ppMesh,
+	        ID3DXBuffer*      ppAdjacency);
+
+	HRESULT D3DXCreateTorus(
+	        IDirect3DDevice9   pDevice,
+	        FLOAT               InnerRadius,
+	        FLOAT               OuterRadius,
+	        UINT                Sides,
+	        UINT                Rings,
+	        ID3DXMesh*         ppMesh,
+	        ID3DXBuffer*       ppAdjacency);
+
+	HRESULT D3DXCreateTeapot(
+	        IDirect3DDevice9   pDevice,
+	        ID3DXMesh*         ppMesh,
+	        ID3DXBuffer*       ppAdjacency);
+
+	HRESULT D3DXCreateFontA(
+        IDirect3DDevice9 pDevice,
+		UINT Height,
+		UINT Width,
+		UINT Weight,
+		UINT MipLevels,
+		BOOL Italic,
+		DWORD CharSet,
+		DWORD OutputPrecision,
+		DWORD Quality,
+		DWORD PitchAndFamily,
+		LPCTSTR pFacename,
+		ID3DXFont *ppFont);
+
+	HRESULT D3DXCreateSprite(
+        IDirect3DDevice9   pDevice,
+        ID3DXSprite*       ppSprite) ;
+
+    HRESULT D3DXCreateEffect(
+        IDirect3DDevice9                pDevice,
+        LPCVOID                         pSrcData,
+        UINT                            SrcDataLen,
+        D3DXMACRO*                      pDefines,
+        ID3DXInclude                    pInclude,
+        DWORD                           Flags,
+        ID3DXEffectPool                 pPool,
+        ID3DXEffect*                    ppEffect,
+        ID3DXBuffer*                    ppCompilationErrors);
+
+    HRESULT D3DXCreateEffectPool(
+        ID3DXEffectPool* pEffectPool);
+
+    HRESULT D3DXGetShaderInputSemantics(
+		DWORD* pFunction,
+		D3DXSEMANTIC* pSemantics,
+		UINT* pCount);
+
+	HRESULT
+    D3DXCreateMeshFVF(
+        DWORD NumFaces,
+        DWORD NumVertices,
+        DWORD Options,
+        DWORD FVF,
+        IDirect3DDevice9 pD3DDevice,
+        ID3DXMesh* ppMesh);
+
+    UINT D3DXGetFVFVertexSize(DWORD FVF);
+
+    HRESULT D3DXFileCreate(ID3DXFile* lplpDirectXFile);
+
+    HRESULT D3DXLoadMeshFromXof(
+        ID3DXFileData pxofMesh,
+        DWORD Options,
+        IDirect3DDevice9 pD3DDevice,
+        ID3DXBuffer *ppAdjacency,
+        ID3DXBuffer *ppMaterials,
+        ID3DXBuffer *ppEffectInstances,
+        DWORD *pNumMaterials,
+        ID3DXMesh *ppMesh);
+
+    HRESULT D3DXConcatenateMeshes(
+		ID3DXMesh * ppMeshes,
+	    UINT NumMeshes,
+	    DWORD Options,
+	    D3DXMATRIX * pGeomXForms,
+	    D3DXMATRIX * pTextureXForms,
+	    D3DVERTEXELEMENT9 * pDecl,
+	    IDirect3DDevice9 pD3DDevice,
+	    ID3DXMesh * ppMeshOut);
+
+	HRESULT D3DXDeclaratorFromFVF(DWORD FVF, D3DVERTEXELEMENT9* Declaration);
+
+	D3DXQUATERNION* D3DXQuaternionSlerp(D3DXQUATERNION* pOut, D3DXQUATERNION* pQ1, D3DXQUATERNION* pQ2, float t);
+
+	D3DXVECTOR3* D3DXVec3CatmullRom(D3DXVECTOR3 *pOut, D3DXVECTOR3 *pV0, D3DXVECTOR3 *pV1, D3DXVECTOR3 *pV2, D3DXVECTOR3 *pV3, float s);
+
+	void D3DXQuaternionSquadSetup(  D3DXQUATERNION *pAOut,
+								    D3DXQUATERNION *pBOut,
+								    D3DXQUATERNION *pCOut,
+								    D3DXQUATERNION *pQ0,
+								    D3DXQUATERNION *pQ1,
+								    D3DXQUATERNION *pQ2,
+								    D3DXQUATERNION *pQ3);
+
+	D3DXQUATERNION* D3DXQuaternionSquad(D3DXQUATERNION *pOut,
+									    D3DXQUATERNION *pQ1,
+									    D3DXQUATERNION *pA,
+									    D3DXQUATERNION *pB,
+									    D3DXQUATERNION *pC,
+									    float t);
+
+	HRESULT D3DXMatrixDecompose(D3DXVECTOR3 *pOutScale,
+							    D3DXQUATERNION *pOutRotation,
+							    D3DXVECTOR3 *pOutTranslation,
+							    D3DXMATRIX *pM
+								);
+
+	D3DXQUATERNION* D3DXQuaternionRotationYawPitchRoll(D3DXQUATERNION *pOut,
+														    FLOAT Yaw,
+														    FLOAT Pitch,
+														    FLOAT Roll
+														);
+
+	UINT D3DXGetDeclVertexSize(D3DVERTEXELEMENT9 *pDecl, DWORD Stream );
+} // extern(Windows)
+
+D3DXMATRIX* D3DXMatrixIdentity( D3DXMATRIX *pOut )
+{
+    pOut.m[0][1] = pOut.m[0][2] = pOut.m[0][3] =
+    pOut.m[1][0] = pOut.m[1][2] = pOut.m[1][3] =
+    pOut.m[2][0] = pOut.m[2][1] = pOut.m[2][3] =
+    pOut.m[3][0] = pOut.m[3][1] = pOut.m[3][2] = 0.0f;
+
+    pOut.m[0][0] = pOut.m[1][1] = pOut.m[2][2] = pOut.m[3][3] = 1.0f;
+    return pOut;
+}
+
+FLOAT D3DXVec3LengthSq(D3DXVECTOR3* v)
+{
+	return (v.x * v.x) + (v.y * v.y) + (v.z * v.z);
+}
+
+template DEFINE_GUID(uint d1, ushort d2, ushort d3, ubyte d4, ubyte d5, ubyte d6, ubyte d7, ubyte d8, ubyte d9, ubyte d10, ubyte d11)
+{
+	const GUID DEFINE_GUID = {d1, d2, d3, [d4, d5, d6, d7, d8, d9, d10, d11]};
+}
+
+const GUID TID_D3DRMInfo = DEFINE_GUID!(0x2b957100, 0x9e9a, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33);
+const GUID TID_D3DRMMesh = DEFINE_GUID!(0x3d82ab44, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33);
+const GUID TID_D3DRMVector = DEFINE_GUID!(0x3d82ab5e, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33);
+const GUID TID_D3DRMMeshFace = DEFINE_GUID!(0x3d82ab5f, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33);
+const GUID TID_D3DRMMaterial = DEFINE_GUID!(0x3d82ab4d, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33);
+const GUID TID_D3DRMMaterialArray = DEFINE_GUID!(0x35ff44e1, 0x6c7c, 0x11cf, 0x8F, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3);
+const GUID TID_D3DRMFrame = DEFINE_GUID!(0x3d82ab46, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33);
+const GUID TID_D3DRMFrameTransformMatrix = DEFINE_GUID!(0xf6f23f41, 0x7686, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3);
+const GUID TID_D3DRMMeshMaterialList = DEFINE_GUID!(0xf6f23f42, 0x7686, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3);
+const GUID TID_D3DRMMeshTextureCoords = DEFINE_GUID!(0xf6f23f40, 0x7686, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3);
+const GUID TID_D3DRMMeshNormals = DEFINE_GUID!(0xf6f23f43, 0x7686, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3);
+const GUID TID_D3DRMCoords2d = DEFINE_GUID!(0xf6f23f44, 0x7686, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3);
+const GUID TID_D3DRMMatrix4x4 = DEFINE_GUID!(0xf6f23f45, 0x7686, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3);
+const GUID TID_D3DRMAnimation = DEFINE_GUID!(0x3d82ab4f, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33);
+const GUID TID_D3DRMAnimationSet = DEFINE_GUID!(0x3d82ab50, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33);
+const GUID TID_D3DRMAnimationKey = DEFINE_GUID!(0x10dd46a8, 0x775b, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xA3);
+const GUID TID_D3DRMFloatKeys = DEFINE_GUID!(0x10dd46a9, 0x775b, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xA3);
+const GUID TID_D3DRMMaterialAmbientColor = DEFINE_GUID!(0x01411840, 0x7786, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xA3);
+const GUID TID_D3DRMMaterialDiffuseColor = DEFINE_GUID!(0x01411841, 0x7786, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xA3);
+const GUID TID_D3DRMMaterialSpecularColor = DEFINE_GUID!(0x01411842, 0x7786, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xA3);
+const GUID TID_D3DRMMaterialEmissiveColor = DEFINE_GUID!(0xd3e16e80, 0x7835, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3);
+const GUID TID_D3DRMMaterialPower = DEFINE_GUID!(0x01411843, 0x7786, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xA3);
+const GUID TID_D3DRMColorRGBA = DEFINE_GUID!(0x35ff44e0, 0x6c7c, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xA3);
+const GUID TID_D3DRMColorRGB = DEFINE_GUID!(0xd3e16e81, 0x7835, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3);
+const GUID TID_D3DRMGuid = DEFINE_GUID!(0xa42790e0, 0x7810, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3);
+const GUID TID_D3DRMTextureFilename = DEFINE_GUID!(0xa42790e1, 0x7810, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3);
+const GUID TID_D3DRMTextureReference = DEFINE_GUID!(0xa42790e2, 0x7810, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3);
+const GUID TID_D3DRMIndexedColor = DEFINE_GUID!(0x1630b820, 0x7842, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3);
+const GUID TID_D3DRMMeshVertexColors = DEFINE_GUID!(0x1630b821, 0x7842, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3);
+const GUID TID_D3DRMMaterialWrap = DEFINE_GUID!(0x4885ae60, 0x78e8, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3);
+const GUID TID_D3DRMBoolean = DEFINE_GUID!(0x537da6a0, 0xca37, 0x11d0, 0x94, 0x1c, 0x0, 0x80, 0xc8, 0xc, 0xfa, 0x7b);
+const GUID TID_D3DRMMeshFaceWraps = DEFINE_GUID!(0xed1ec5c0, 0xc0a8, 0x11d0, 0x94, 0x1c, 0x0, 0x80, 0xc8, 0xc, 0xfa, 0x7b);
+const GUID TID_D3DRMBoolean2d = DEFINE_GUID!(0x4885ae63, 0x78e8, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3);
+const GUID TID_D3DRMTimedFloatKeys = DEFINE_GUID!(0xf406b180, 0x7b3b, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3);
+const GUID TID_D3DRMAnimationOptions = DEFINE_GUID!(0xe2bf56c0, 0x840f, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3);
+const GUID TID_D3DRMFramePosition = DEFINE_GUID!(0xe2bf56c1, 0x840f, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3);
+const GUID TID_D3DRMFrameVelocity = DEFINE_GUID!(0xe2bf56c2, 0x840f, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3);
+const GUID TID_D3DRMFrameRotation = DEFINE_GUID!(0xe2bf56c3, 0x840f, 0x11cf, 0x8f, 0x52, 0x0, 0x40, 0x33, 0x35, 0x94, 0xa3);
+const GUID TID_D3DRMLight = DEFINE_GUID!(0x3d82ab4a, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33);
+const GUID TID_D3DRMCamera = DEFINE_GUID!(0x3d82ab51, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33);
+const GUID TID_D3DRMAppData = DEFINE_GUID!(0xe5745280, 0xb24f, 0x11cf, 0x9d, 0xd5, 0x0, 0xaa, 0x0, 0xa7, 0x1a, 0x2f);
+const GUID TID_D3DRMLightUmbra = DEFINE_GUID!(0xaed22740, 0xb31f, 0x11cf, 0x9d, 0xd5, 0x0, 0xaa, 0x0, 0xa7, 0x1a, 0x2f);
+const GUID TID_D3DRMLightRange = DEFINE_GUID!(0xaed22742, 0xb31f, 0x11cf, 0x9d, 0xd5, 0x0, 0xaa, 0x0, 0xa7, 0x1a, 0x2f);
+const GUID TID_D3DRMLightPenumbra = DEFINE_GUID!(0xaed22741, 0xb31f, 0x11cf, 0x9d, 0xd5, 0x0, 0xaa, 0x0, 0xa7, 0x1a, 0x2f);
+const GUID TID_D3DRMLightAttenuation = DEFINE_GUID!(0xa8a98ba0, 0xc5e5, 0x11cf, 0xb9, 0x41, 0x0, 0x80, 0xc8, 0xc, 0xfa, 0x7b);
+const GUID TID_D3DRMInlineData = DEFINE_GUID!(0x3a23eea0, 0x94b1, 0x11d0, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33);
+const GUID TID_D3DRMUrl = DEFINE_GUID!(0x3a23eea1, 0x94b1, 0x11d0, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33);
+const GUID TID_D3DRMProgressiveMesh = DEFINE_GUID!(0x8A63C360, 0x997D, 0x11d0, 0x94, 0x1C, 0x0, 0x80, 0xC8, 0x0C, 0xFA, 0x7B);
+const GUID TID_D3DRMExternalVisual = DEFINE_GUID!(0x98116AA0, 0xBDBA, 0x11d1, 0x82, 0xC0, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x71);
+const GUID TID_D3DRMStringProperty = DEFINE_GUID!(0x7f0f21e0, 0xbfe1, 0x11d1, 0x82, 0xc0, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x71);
+const GUID TID_D3DRMPropertyBag = DEFINE_GUID!(0x7f0f21e1, 0xbfe1, 0x11d1, 0x82, 0xc0, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x71);
+const GUID TID_D3DRMRightHanded = DEFINE_GUID!(0x7f5d5ea0, 0xd53a, 0x11d1, 0x82, 0xc0, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x71);
+
+ubyte D3DRM_XTEMPLATES[] =
+[
+	0x78, 0x6f, 0x66, 0x20, 0x30, 0x33, 0x30, 0x32, 0x62,
+	0x69, 0x6e, 0x20, 0x30, 0x30, 0x36, 0x34, 0x1f, 0, 0x1,
+	0, 0x6, 0, 0, 0, 0x48, 0x65, 0x61, 0x64, 0x65,
+	0x72, 0xa, 0, 0x5, 0, 0x43, 0xab, 0x82, 0x3d, 0xda,
+	0x62, 0xcf, 0x11, 0xab, 0x39, 0, 0x20, 0xaf, 0x71, 0xe4,
+	0x33, 0x28, 0, 0x1, 0, 0x5, 0, 0, 0, 0x6d,
+	0x61, 0x6a, 0x6f, 0x72, 0x14, 0, 0x28, 0, 0x1, 0,
+	0x5, 0, 0, 0, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x14,
+	0, 0x29, 0, 0x1, 0, 0x5, 0, 0, 0, 0x66,
+	0x6c, 0x61, 0x67, 0x73, 0x14, 0, 0xb, 0, 0x1f, 0,
+	0x1, 0, 0x6, 0, 0, 0, 0x56, 0x65, 0x63, 0x74,
+	0x6f, 0x72, 0xa, 0, 0x5, 0, 0x5e, 0xab, 0x82, 0x3d,
+	0xda, 0x62, 0xcf, 0x11, 0xab, 0x39, 0, 0x20, 0xaf, 0x71,
+	0xe4, 0x33, 0x2a, 0, 0x1, 0, 0x1, 0, 0, 0,
+	0x78, 0x14, 0, 0x2a, 0, 0x1, 0, 0x1, 0, 0,
+	0, 0x79, 0x14, 0, 0x2a, 0, 0x1, 0, 0x1, 0,
+	0, 0, 0x7a, 0x14, 0, 0xb, 0, 0x1f, 0, 0x1,
+	0, 0x8, 0, 0, 0, 0x43, 0x6f, 0x6f, 0x72, 0x64,
+	0x73, 0x32, 0x64, 0xa, 0, 0x5, 0, 0x44, 0x3f, 0xf2,
+	0xf6, 0x86, 0x76, 0xcf, 0x11, 0x8f, 0x52, 0, 0x40, 0x33,
+	0x35, 0x94, 0xa3, 0x2a, 0, 0x1, 0, 0x1, 0, 0,
+	0, 0x75, 0x14, 0, 0x2a, 0, 0x1, 0, 0x1, 0,
+	0, 0, 0x76, 0x14, 0, 0xb, 0, 0x1f, 0, 0x1,
+	0, 0x9, 0, 0, 0, 0x4d, 0x61, 0x74, 0x72, 0x69,
+	0x78, 0x34, 0x78, 0x34, 0xa, 0, 0x5, 0, 0x45, 0x3f,
+	0xf2, 0xf6, 0x86, 0x76, 0xcf, 0x11, 0x8f, 0x52, 0, 0x40,
+	0x33, 0x35, 0x94, 0xa3, 0x34, 0, 0x2a, 0, 0x1, 0,
+	0x6, 0, 0, 0, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78,
+	0xe, 0, 0x3, 0, 0x10, 0, 0, 0, 0xf, 0,
+	0x14, 0, 0xb, 0, 0x1f, 0, 0x1, 0, 0x9, 0,
+	0, 0, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x52, 0x47, 0x42,
+	0x41, 0xa, 0, 0x5, 0, 0xe0, 0x44, 0xff, 0x35, 0x7c,
+	0x6c, 0xcf, 0x11, 0x8f, 0x52, 0, 0x40, 0x33, 0x35, 0x94,
+	0xa3, 0x2a, 0, 0x1, 0, 0x3, 0, 0, 0, 0x72,
+	0x65, 0x64, 0x14, 0, 0x2a, 0, 0x1, 0, 0x5, 0,
+	0, 0, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x14, 0, 0x2a,
+	0, 0x1, 0, 0x4, 0, 0, 0, 0x62, 0x6c, 0x75,
+	0x65, 0x14, 0, 0x2a, 0, 0x1, 0, 0x5, 0, 0,
+	0, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x14, 0, 0xb, 0,
+	0x1f, 0, 0x1, 0, 0x8, 0, 0, 0, 0x43, 0x6f,
+	0x6c, 0x6f, 0x72, 0x52, 0x47, 0x42, 0xa, 0, 0x5, 0,
+	0x81, 0x6e, 0xe1, 0xd3, 0x35, 0x78, 0xcf, 0x11, 0x8f, 0x52,
+	0, 0x40, 0x33, 0x35, 0x94, 0xa3, 0x2a, 0, 0x1, 0,
+	0x3, 0, 0, 0, 0x72, 0x65, 0x64, 0x14, 0, 0x2a,
+	0, 0x1, 0, 0x5, 0, 0, 0, 0x67, 0x72, 0x65,
+	0x65, 0x6e, 0x14, 0, 0x2a, 0, 0x1, 0, 0x4, 0,
+	0, 0, 0x62, 0x6c, 0x75, 0x65, 0x14, 0, 0xb, 0,
+	0x1f, 0, 0x1, 0, 0xc, 0, 0, 0, 0x49, 0x6e,
+	0x64, 0x65, 0x78, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72,
+	0xa, 0, 0x5, 0, 0x20, 0xb8, 0x30, 0x16, 0x42, 0x78,
+	0xcf, 0x11, 0x8f, 0x52, 0, 0x40, 0x33, 0x35, 0x94, 0xa3,
+	0x29, 0, 0x1, 0, 0x5, 0, 0, 0, 0x69, 0x6e,
+	0x64, 0x65, 0x78, 0x14, 0, 0x1, 0, 0x9, 0, 0,
+	0, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x52, 0x47, 0x42, 0x41,
+	0x1, 0, 0xa, 0, 0, 0, 0x69, 0x6e, 0x64, 0x65,
+	0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x14, 0, 0xb, 0,
+	0x1f, 0, 0x1, 0, 0x7, 0, 0, 0, 0x42, 0x6f,
+	0x6f, 0x6c, 0x65, 0x61, 0x6e, 0xa, 0, 0x5, 0, 0xa0,
+	0xa6, 0x7d, 0x53, 0x37, 0xca, 0xd0, 0x11, 0x94, 0x1c, 0,
+	0x80, 0xc8, 0xc, 0xfa, 0x7b, 0x29, 0, 0x1, 0, 0x9,
+	0, 0, 0, 0x74, 0x72, 0x75, 0x65, 0x66, 0x61, 0x6c,
+	0x73, 0x65, 0x14, 0, 0xb, 0, 0x1f, 0, 0x1, 0,
+	0x9, 0, 0, 0, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61,
+	0x6e, 0x32, 0x64, 0xa, 0, 0x5, 0, 0x63, 0xae, 0x85,
+	0x48, 0xe8, 0x78, 0xcf, 0x11, 0x8f, 0x52, 0, 0x40, 0x33,
+	0x35, 0x94, 0xa3, 0x1, 0, 0x7, 0, 0, 0, 0x42,
+	0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x1, 0, 0x1, 0,
+	0, 0, 0x75, 0x14, 0, 0x1, 0, 0x7, 0, 0,
+	0, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x1, 0,
+	0x1, 0, 0, 0, 0x76, 0x14, 0, 0xb, 0, 0x1f,
+	0, 0x1, 0, 0xc, 0, 0, 0, 0x4d, 0x61, 0x74,
+	0x65, 0x72, 0x69, 0x61, 0x6c, 0x57, 0x72, 0x61, 0x70, 0xa,
+	0, 0x5, 0, 0x60, 0xae, 0x85, 0x48, 0xe8, 0x78, 0xcf,
+	0x11, 0x8f, 0x52, 0, 0x40, 0x33, 0x35, 0x94, 0xa3, 0x1,
+	0, 0x7, 0, 0, 0, 0x42, 0x6f, 0x6f, 0x6c, 0x65,
+	0x61, 0x6e, 0x1, 0, 0x1, 0, 0, 0, 0x75, 0x14,
+	0, 0x1, 0, 0x7, 0, 0, 0, 0x42, 0x6f, 0x6f,
+	0x6c, 0x65, 0x61, 0x6e, 0x1, 0, 0x1, 0, 0, 0,
+	0x76, 0x14, 0, 0xb, 0, 0x1f, 0, 0x1, 0, 0xf,
+	0, 0, 0, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65,
+	0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0xa, 0,
+	0x5, 0, 0xe1, 0x90, 0x27, 0xa4, 0x10, 0x78, 0xcf, 0x11,
+	0x8f, 0x52, 0, 0x40, 0x33, 0x35, 0x94, 0xa3, 0x31, 0,
+	0x1, 0, 0x8, 0, 0, 0, 0x66, 0x69, 0x6c, 0x65,
+	0x6e, 0x61, 0x6d, 0x65, 0x14, 0, 0xb, 0, 0x1f, 0,
+	0x1, 0, 0x8, 0, 0, 0, 0x4d, 0x61, 0x74, 0x65,
+	0x72, 0x69, 0x61, 0x6c, 0xa, 0, 0x5, 0, 0x4d, 0xab,
+	0x82, 0x3d, 0xda, 0x62, 0xcf, 0x11, 0xab, 0x39, 0, 0x20,
+	0xaf, 0x71, 0xe4, 0x33, 0x1, 0, 0x9, 0, 0, 0,
+	0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x52, 0x47, 0x42, 0x41, 0x1,
+	0, 0x9, 0, 0, 0, 0x66, 0x61, 0x63, 0x65, 0x43,
+	0x6f, 0x6c, 0x6f, 0x72, 0x14, 0, 0x2a, 0, 0x1, 0,
+	0x5, 0, 0, 0, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x14,
+	0, 0x1, 0, 0x8, 0, 0, 0, 0x43, 0x6f, 0x6c,
+	0x6f, 0x72, 0x52, 0x47, 0x42, 0x1, 0, 0xd, 0, 0,
+	0, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x43,
+	0x6f, 0x6c, 0x6f, 0x72, 0x14, 0, 0x1, 0, 0x8, 0,
+	0, 0, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x52, 0x47, 0x42,
+	0x1, 0, 0xd, 0, 0, 0, 0x65, 0x6d, 0x69, 0x73,
+	0x73, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x14,
+	0, 0xe, 0, 0x12, 0, 0x12, 0, 0x12, 0, 0xf,
+	0, 0xb, 0, 0x1f, 0, 0x1, 0, 0x8, 0, 0,
+	0, 0x4d, 0x65, 0x73, 0x68, 0x46, 0x61, 0x63, 0x65, 0xa,
+	0, 0x5, 0, 0x5f, 0xab, 0x82, 0x3d, 0xda, 0x62, 0xcf,
+	0x11, 0xab, 0x39, 0, 0x20, 0xaf, 0x71, 0xe4, 0x33, 0x29,
+	0, 0x1, 0, 0x12, 0, 0, 0, 0x6e, 0x46, 0x61,
+	0x63, 0x65, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e,
+	0x64, 0x69, 0x63, 0x65, 0x73, 0x14, 0, 0x34, 0, 0x29,
+	0, 0x1, 0, 0x11, 0, 0, 0, 0x66, 0x61, 0x63,
+	0x65, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64,
+	0x69, 0x63, 0x65, 0x73, 0xe, 0, 0x1, 0, 0x12, 0,
+	0, 0, 0x6e, 0x46, 0x61, 0x63, 0x65, 0x56, 0x65, 0x72,
+	0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73,
+	0xf, 0, 0x14, 0, 0xb, 0, 0x1f, 0, 0x1, 0,
+	0xd, 0, 0, 0, 0x4d, 0x65, 0x73, 0x68, 0x46, 0x61,
+	0x63, 0x65, 0x57, 0x72, 0x61, 0x70, 0x73, 0xa, 0, 0x5,
+	0, 0xc0, 0xc5, 0x1e, 0xed, 0xa8, 0xc0, 0xd0, 0x11, 0x94,
+	0x1c, 0, 0x80, 0xc8, 0xc, 0xfa, 0x7b, 0x29, 0, 0x1,
+	0, 0xf, 0, 0, 0, 0x6e, 0x46, 0x61, 0x63, 0x65,
+	0x57, 0x72, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73,
+	0x14, 0, 0x34, 0, 0x1, 0, 0x9, 0, 0, 0,
+	0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x32, 0x64, 0x1,
+	0, 0xe, 0, 0, 0, 0x66, 0x61, 0x63, 0x65, 0x57,
+	0x72, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0xe,
+	0, 0x1, 0, 0xf, 0, 0, 0, 0x6e, 0x46, 0x61,
+	0x63, 0x65, 0x57, 0x72, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75,
+	0x65, 0x73, 0xf, 0, 0x14, 0, 0xb, 0, 0x1f, 0,
+	0x1, 0, 0x11, 0, 0, 0, 0x4d, 0x65, 0x73, 0x68,
+	0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x6f,
+	0x72, 0x64, 0x73, 0xa, 0, 0x5, 0, 0x40, 0x3f, 0xf2,
+	0xf6, 0x86, 0x76, 0xcf, 0x11, 0x8f, 0x52, 0, 0x40, 0x33,
+	0x35, 0x94, 0xa3, 0x29, 0, 0x1, 0, 0xe, 0, 0,
+	0, 0x6e, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43,
+	0x6f, 0x6f, 0x72, 0x64, 0x73, 0x14, 0, 0x34, 0, 0x1,
+	0, 0x8, 0, 0, 0, 0x43, 0x6f, 0x6f, 0x72, 0x64,
+	0x73, 0x32, 0x64, 0x1, 0, 0xd, 0, 0, 0, 0x74,
+	0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x6f, 0x72,
+	0x64, 0x73, 0xe, 0, 0x1, 0, 0xe, 0, 0, 0,
+	0x6e, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x6f,
+	0x6f, 0x72, 0x64, 0x73, 0xf, 0, 0x14, 0, 0xb, 0,
+	0x1f, 0, 0x1, 0, 0x10, 0, 0, 0, 0x4d, 0x65,
+	0x73, 0x68, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c,
+	0x4c, 0x69, 0x73, 0x74, 0xa, 0, 0x5, 0, 0x42, 0x3f,
+	0xf2, 0xf6, 0x86, 0x76, 0xcf, 0x11, 0x8f, 0x52, 0, 0x40,
+	0x33, 0x35, 0x94, 0xa3, 0x29, 0, 0x1, 0, 0xa, 0,
+	0, 0, 0x6e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61,
+	0x6c, 0x73, 0x14, 0, 0x29, 0, 0x1, 0, 0xc, 0,
+	0, 0, 0x6e, 0x46, 0x61, 0x63, 0x65, 0x49, 0x6e, 0x64,
+	0x65, 0x78, 0x65, 0x73, 0x14, 0, 0x34, 0, 0x29, 0,
+	0x1, 0, 0xb, 0, 0, 0, 0x66, 0x61, 0x63, 0x65,
+	0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0xe, 0, 0x1,
+	0, 0xc, 0, 0, 0, 0x6e, 0x46, 0x61, 0x63, 0x65,
+	0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0xf, 0, 0x14,
+	0, 0xe, 0, 0x1, 0, 0x8, 0, 0, 0, 0x4d,
+	0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0xf, 0, 0xb,
+	0, 0x1f, 0, 0x1, 0, 0xb, 0, 0, 0, 0x4d,
+	0x65, 0x73, 0x68, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x73,
+	0xa, 0, 0x5, 0, 0x43, 0x3f, 0xf2, 0xf6, 0x86, 0x76,
+	0xcf, 0x11, 0x8f, 0x52, 0, 0x40, 0x33, 0x35, 0x94, 0xa3,
+	0x29, 0, 0x1, 0, 0x8, 0, 0, 0, 0x6e, 0x4e,
+	0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x73, 0x14, 0, 0x34, 0,
+	0x1, 0, 0x6, 0, 0, 0, 0x56, 0x65, 0x63, 0x74,
+	0x6f, 0x72, 0x1, 0, 0x7, 0, 0, 0, 0x6e, 0x6f,
+	0x72, 0x6d, 0x61, 0x6c, 0x73, 0xe, 0, 0x1, 0, 0x8,
+	0, 0, 0, 0x6e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c,
+	0x73, 0xf, 0, 0x14, 0, 0x29, 0, 0x1, 0, 0xc,
+	0, 0, 0, 0x6e, 0x46, 0x61, 0x63, 0x65, 0x4e, 0x6f,
+	0x72, 0x6d, 0x61, 0x6c, 0x73, 0x14, 0, 0x34, 0, 0x1,
+	0, 0x8, 0, 0, 0, 0x4d, 0x65, 0x73, 0x68, 0x46,
+	0x61, 0x63, 0x65, 0x1, 0, 0xb, 0, 0, 0, 0x66,
+	0x61, 0x63, 0x65, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x73,
+	0xe, 0, 0x1, 0, 0xc, 0, 0, 0, 0x6e, 0x46,
+	0x61, 0x63, 0x65, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x73,
+	0xf, 0, 0x14, 0, 0xb, 0, 0x1f, 0, 0x1, 0,
+	0x10, 0, 0, 0, 0x4d, 0x65, 0x73, 0x68, 0x56, 0x65,
+	0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x73,
+	0xa, 0, 0x5, 0, 0x21, 0xb8, 0x30, 0x16, 0x42, 0x78,
+	0xcf, 0x11, 0x8f, 0x52, 0, 0x40, 0x33, 0x35, 0x94, 0xa3,
+	0x29, 0, 0x1, 0, 0xd, 0, 0, 0, 0x6e, 0x56,
+	0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72,
+	0x73, 0x14, 0, 0x34, 0, 0x1, 0, 0xc, 0, 0,
+	0, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x64, 0x43, 0x6f,
+	0x6c, 0x6f, 0x72, 0x1, 0, 0xc, 0, 0, 0, 0x76,
+	0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72,
+	0x73, 0xe, 0, 0x1, 0, 0xd, 0, 0, 0, 0x6e,
+	0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f,
+	0x72, 0x73, 0xf, 0, 0x14, 0, 0xb, 0, 0x1f, 0,
+	0x1, 0, 0x4, 0, 0, 0, 0x4d, 0x65, 0x73, 0x68,
+	0xa, 0, 0x5, 0, 0x44, 0xab, 0x82, 0x3d, 0xda, 0x62,
+	0xcf, 0x11, 0xab, 0x39, 0, 0x20, 0xaf, 0x71, 0xe4, 0x33,
+	0x29, 0, 0x1, 0, 0x9, 0, 0, 0, 0x6e, 0x56,
+	0x65, 0x72, 0x74, 0x69, 0x63, 0x65, 0x73, 0x14, 0, 0x34,
+	0, 0x1, 0, 0x6, 0, 0, 0, 0x56, 0x65, 0x63,
+	0x74, 0x6f, 0x72, 0x1, 0, 0x8, 0, 0, 0, 0x76,
+	0x65, 0x72, 0x74, 0x69, 0x63, 0x65, 0x73, 0xe, 0, 0x1,
+	0, 0x9, 0, 0, 0, 0x6e, 0x56, 0x65, 0x72, 0x74,
+	0x69, 0x63, 0x65, 0x73, 0xf, 0, 0x14, 0, 0x29, 0,
+	0x1, 0, 0x6, 0, 0, 0, 0x6e, 0x46, 0x61, 0x63,
+	0x65, 0x73, 0x14, 0, 0x34, 0, 0x1, 0, 0x8, 0,
+	0, 0, 0x4d, 0x65, 0x73, 0x68, 0x46, 0x61, 0x63, 0x65,
+	0x1, 0, 0x5, 0, 0, 0, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0xe, 0, 0x1, 0, 0x6, 0, 0, 0, 0x6e,
+	0x46, 0x61, 0x63, 0x65, 0x73, 0xf, 0, 0x14, 0, 0xe,
+	0, 0x12, 0, 0x12, 0, 0x12, 0, 0xf, 0, 0xb,
+	0, 0x1f, 0, 0x1, 0, 0x14, 0, 0, 0, 0x46,
+	0x72, 0x61, 0x6d, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66,
+	0x6f, 0x72, 0x6d, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0xa,
+	0, 0x5, 0, 0x41, 0x3f, 0xf2, 0xf6, 0x86, 0x76, 0xcf,
+	0x11, 0x8f, 0x52, 0, 0x40, 0x33, 0x35, 0x94, 0xa3, 0x1,
+	0, 0x9, 0, 0, 0, 0x4d, 0x61, 0x74, 0x72, 0x69,
+	0x78, 0x34, 0x78, 0x34, 0x1, 0, 0xb, 0, 0, 0,
+	0x66, 0x72, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x74, 0x72, 0x69,
+	0x78, 0x14, 0, 0xb, 0, 0x1f, 0, 0x1, 0, 0x5,
+	0, 0, 0, 0x46, 0x72, 0x61, 0x6d, 0x65, 0xa, 0,
+	0x5, 0, 0x46, 0xab, 0x82, 0x3d, 0xda, 0x62, 0xcf, 0x11,
+	0xab, 0x39, 0, 0x20, 0xaf, 0x71, 0xe4, 0x33, 0xe, 0,
+	0x12, 0, 0x12, 0, 0x12, 0, 0xf, 0, 0xb, 0,
+	0x1f, 0, 0x1, 0, 0x9, 0, 0, 0, 0x46, 0x6c,
+	0x6f, 0x61, 0x74, 0x4b, 0x65, 0x79, 0x73, 0xa, 0, 0x5,
+	0, 0xa9, 0x46, 0xdd, 0x10, 0x5b, 0x77, 0xcf, 0x11, 0x8f,
+	0x52, 0, 0x40, 0x33, 0x35, 0x94, 0xa3, 0x29, 0, 0x1,
+	0, 0x7, 0, 0, 0, 0x6e, 0x56, 0x61, 0x6c, 0x75,
+	0x65, 0x73, 0x14, 0, 0x34, 0, 0x2a, 0, 0x1, 0,
+	0x6, 0, 0, 0, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73,
+	0xe, 0, 0x1, 0, 0x7, 0, 0, 0, 0x6e, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x73, 0xf, 0, 0x14, 0, 0xb,
+	0, 0x1f, 0, 0x1, 0, 0xe, 0, 0, 0, 0x54,
+	0x69, 0x6d, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x4b,
+	0x65, 0x79, 0x73, 0xa, 0, 0x5, 0, 0x80, 0xb1, 0x6,
+	0xf4, 0x3b, 0x7b, 0xcf, 0x11, 0x8f, 0x52, 0, 0x40, 0x33,
+	0x35, 0x94, 0xa3, 0x29, 0, 0x1, 0, 0x4, 0, 0,
+	0, 0x74, 0x69, 0x6d, 0x65, 0x14, 0, 0x1, 0, 0x9,
+	0, 0, 0, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x4b, 0x65,
+	0x79, 0x73, 0x1, 0, 0x6, 0, 0, 0, 0x74, 0x66,
+	0x6b, 0x65, 0x79, 0x73, 0x14, 0, 0xb, 0, 0x1f, 0,
+	0x1, 0, 0xc, 0, 0, 0, 0x41, 0x6e, 0x69, 0x6d,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0xa, 0,
+	0x5, 0, 0xa8, 0x46, 0xdd, 0x10, 0x5b, 0x77, 0xcf, 0x11,
+	0x8f, 0x52, 0, 0x40, 0x33, 0x35, 0x94, 0xa3, 0x29, 0,
+	0x1, 0, 0x7, 0, 0, 0, 0x6b, 0x65, 0x79, 0x54,
+	0x79, 0x70, 0x65, 0x14, 0, 0x29, 0, 0x1, 0, 0x5,
+	0, 0, 0, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x14, 0,
+	0x34, 0, 0x1, 0, 0xe, 0, 0, 0, 0x54, 0x69,
+	0x6d, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x4b, 0x65,
+	0x79, 0x73, 0x1, 0, 0x4, 0, 0, 0, 0x6b, 0x65,
+	0x79, 0x73, 0xe, 0, 0x1, 0, 0x5, 0, 0, 0,
+	0x6e, 0x4b, 0x65, 0x79, 0x73, 0xf, 0, 0x14, 0, 0xb,
+	0, 0x1f, 0, 0x1, 0, 0x10, 0, 0, 0, 0x41,
+	0x6e, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0xa, 0, 0x5, 0, 0xc0,
+	0x56, 0xbf, 0xe2, 0xf, 0x84, 0xcf, 0x11, 0x8f, 0x52, 0,
+	0x40, 0x33, 0x35, 0x94, 0xa3, 0x29, 0, 0x1, 0, 0xa,
+	0, 0, 0, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6c, 0x6f,
+	0x73, 0x65, 0x64, 0x14, 0, 0x29, 0, 0x1, 0, 0xf,
+	0, 0, 0, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f,
+	0x6e, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x14, 0,
+	0xb, 0, 0x1f, 0, 0x1, 0, 0x9, 0, 0, 0,
+	0x41, 0x6e, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xa,
+	0, 0x5, 0, 0x4f, 0xab, 0x82, 0x3d, 0xda, 0x62, 0xcf,
+	0x11, 0xab, 0x39, 0, 0x20, 0xaf, 0x71, 0xe4, 0x33, 0xe,
+	0, 0x12, 0, 0x12, 0, 0x12, 0, 0xf, 0, 0xb,
+	0, 0x1f, 0, 0x1, 0, 0xc, 0, 0, 0, 0x41,
+	0x6e, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65,
+	0x74, 0xa, 0, 0x5, 0, 0x50, 0xab, 0x82, 0x3d, 0xda,
+	0x62, 0xcf, 0x11, 0xab, 0x39, 0, 0x20, 0xaf, 0x71, 0xe4,
+	0x33, 0xe, 0, 0x1, 0, 0x9, 0, 0, 0, 0x41,
+	0x6e, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0xf, 0,
+	0xb, 0, 0x1f, 0, 0x1, 0, 0xa, 0, 0, 0,
+	0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x61, 0x74, 0x61,
+	0xa, 0, 0x5, 0, 0xa0, 0xee, 0x23, 0x3a, 0xb1, 0x94,
+	0xd0, 0x11, 0xab, 0x39, 0, 0x20, 0xaf, 0x71, 0xe4, 0x33,
+	0xe, 0, 0x1, 0, 0x6, 0, 0, 0, 0x42, 0x49,
+	0x4e, 0x41, 0x52, 0x59, 0xf, 0, 0xb, 0, 0x1f, 0,
+	0x1, 0, 0x3, 0, 0, 0, 0x55, 0x72, 0x6c, 0xa,
+	0, 0x5, 0, 0xa1, 0xee, 0x23, 0x3a, 0xb1, 0x94, 0xd0,
+	0x11, 0xab, 0x39, 0, 0x20, 0xaf, 0x71, 0xe4, 0x33, 0x29,
+	0, 0x1, 0, 0x5, 0, 0, 0, 0x6e, 0x55, 0x72,
+	0x6c, 0x73, 0x14, 0, 0x34, 0, 0x31, 0, 0x1, 0,
+	0x4, 0, 0, 0, 0x75, 0x72, 0x6c, 0x73, 0xe, 0,
+	0x1, 0, 0x5, 0, 0, 0, 0x6e, 0x55, 0x72, 0x6c,
+	0x73, 0xf, 0, 0x14, 0, 0xb, 0, 0x1f, 0, 0x1,
+	0, 0xf, 0, 0, 0, 0x50, 0x72, 0x6f, 0x67, 0x72,
+	0x65, 0x73, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x73, 0x68,
+	0xa, 0, 0x5, 0, 0x60, 0xc3, 0x63, 0x8a, 0x7d, 0x99,
+	0xd0, 0x11, 0x94, 0x1c, 0, 0x80, 0xc8, 0xc, 0xfa, 0x7b,
+	0xe, 0, 0x1, 0, 0x3, 0, 0, 0, 0x55, 0x72,
+	0x6c, 0x13, 0, 0x1, 0, 0xa, 0, 0, 0, 0x49,
+	0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x44, 0x61, 0x74, 0x61, 0xf,
+	0, 0xb, 0, 0x1f, 0, 0x1, 0, 0x4, 0, 0,
+	0, 0x47, 0x75, 0x69, 0x64, 0xa, 0, 0x5, 0, 0xe0,
+	0x90, 0x27, 0xa4, 0x10, 0x78, 0xcf, 0x11, 0x8f, 0x52, 0,
+	0x40, 0x33, 0x35, 0x94, 0xa3, 0x29, 0, 0x1, 0, 0x5,
+	0, 0, 0, 0x64, 0x61, 0x74, 0x61, 0x31, 0x14, 0,
+	0x28, 0, 0x1, 0, 0x5, 0, 0, 0, 0x64, 0x61,
+	0x74, 0x61, 0x32, 0x14, 0, 0x28, 0, 0x1, 0, 0x5,
+	0, 0, 0, 0x64, 0x61, 0x74, 0x61, 0x33, 0x14, 0,
+	0x34, 0, 0x2d, 0, 0x1, 0, 0x5, 0, 0, 0,
+	0x64, 0x61, 0x74, 0x61, 0x34, 0xe, 0, 0x3, 0, 0x8,
+	0, 0, 0, 0xf, 0, 0x14, 0, 0xb, 0, 0x1f,
+	0, 0x1, 0, 0xe, 0, 0, 0, 0x53, 0x74, 0x72,
+	0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+	0x79, 0xa, 0, 0x5, 0, 0xe0, 0x21, 0xf, 0x7f, 0xe1,
+	0xbf, 0xd1, 0x11, 0x82, 0xc0, 0, 0xa0, 0xc9, 0x69, 0x72,
+	0x71, 0x31, 0, 0x1, 0, 0x3, 0, 0, 0, 0x6b,
+	0x65, 0x79, 0x14, 0, 0x31, 0, 0x1, 0, 0x5, 0,
+	0, 0, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x14, 0, 0xb,
+	0, 0x1f, 0, 0x1, 0, 0xb, 0, 0, 0, 0x50,
+	0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x42, 0x61, 0x67,
+	0xa, 0, 0x5, 0, 0xe1, 0x21, 0xf, 0x7f, 0xe1, 0xbf,
+	0xd1, 0x11, 0x82, 0xc0, 0, 0xa0, 0xc9, 0x69, 0x72, 0x71,
+	0xe, 0, 0x1, 0, 0xe, 0, 0, 0, 0x53, 0x74,
+	0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72,
+	0x74, 0x79, 0xf, 0, 0xb, 0, 0x1f, 0, 0x1, 0,
+	0xe, 0, 0, 0, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e,
+	0x61, 0x6c, 0x56, 0x69, 0x73, 0x75, 0x61, 0x6c, 0xa, 0,
+	0x5, 0, 0xa0, 0x6a, 0x11, 0x98, 0xba, 0xbd, 0xd1, 0x11,
+	0x82, 0xc0, 0, 0xa0, 0xc9, 0x69, 0x72, 0x71, 0x1, 0,
+	0x4, 0, 0, 0, 0x47, 0x75, 0x69, 0x64, 0x1, 0,
+	0x12, 0, 0, 0, 0x67, 0x75, 0x69, 0x64, 0x45, 0x78,
+	0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x56, 0x69, 0x73, 0x75,
+	0x61, 0x6c, 0x14, 0, 0xe, 0, 0x12, 0, 0x12, 0,
+	0x12, 0, 0xf, 0, 0xb, 0, 0x1f, 0, 0x1, 0,
+	0xb, 0, 0, 0, 0x52, 0x69, 0x67, 0x68, 0x74, 0x48,
+	0x61, 0x6e, 0x64, 0x65, 0x64, 0xa, 0, 0x5, 0, 0xa0,
+	0x5e, 0x5d, 0x7f, 0x3a, 0xd5, 0xd1, 0x11, 0x82, 0xc0, 0,
+	0xa0, 0xc9, 0x69, 0x72, 0x71, 0x29, 0, 0x1, 0, 0xc,
+	0, 0, 0, 0x62, 0x52, 0x69, 0x67, 0x68, 0x74, 0x48,
+	0x61, 0x6e, 0x64, 0x65, 0x64, 0x14, 0, 0xb, 0
+];
+
+const GUID DXFILEOBJ_XSkinMeshHeader = DEFINE_GUID!(0x3cf169ce, 0xff7c, 0x44ab, 0x93, 0xc0, 0xf7, 0x8f, 0x62, 0xd1, 0x72, 0xe2);
+const GUID DXFILEOBJ_VertexDuplicationIndices = DEFINE_GUID!(0xb8d65549, 0xd7c9, 0x4995, 0x89, 0xcf, 0x53, 0xa9, 0xa8, 0xb0, 0x31, 0xe3);
+const GUID DXFILEOBJ_FaceAdjacency = DEFINE_GUID!(0xa64c844a, 0xe282, 0x4756, 0x8b, 0x80, 0x25, 0xc, 0xde, 0x4, 0x39, 0x8c);
+const GUID DXFILEOBJ_SkinWeights = DEFINE_GUID!(0x6f0d123b, 0xbad2, 0x4167, 0xa0, 0xd0, 0x80, 0x22, 0x4f, 0x25, 0xfa, 0xbb);
+const GUID DXFILEOBJ_Patch = DEFINE_GUID!(0xa3eb5d44, 0xfc22, 0x429d, 0x9a, 0xfb, 0x32, 0x21, 0xcb, 0x97, 0x19, 0xa6);
+const GUID DXFILEOBJ_PatchMesh = DEFINE_GUID!(0xd02c95cc, 0xedba, 0x4305, 0x9b, 0x5d, 0x18, 0x20, 0xd7, 0x70, 0x4b, 0xbf);
+const GUID DXFILEOBJ_PatchMesh9 = DEFINE_GUID!(0xb9ec94e1, 0xb9a6, 0x4251, 0xba, 0x18, 0x94, 0x89, 0x3f, 0x2, 0xc0, 0xea);
+const GUID DXFILEOBJ_PMInfo = DEFINE_GUID!(0xb6c3e656, 0xec8b, 0x4b92, 0x9b, 0x62, 0x68, 0x16, 0x59, 0x52, 0x29, 0x47);
+const GUID DXFILEOBJ_PMAttributeRange = DEFINE_GUID!(0x917e0427, 0xc61e, 0x4a14, 0x9c, 0x64, 0xaf, 0xe6, 0x5f, 0x9e, 0x98, 0x44);
+const GUID DXFILEOBJ_PMVSplitRecord = DEFINE_GUID!(0x574ccc14, 0xf0b3, 0x4333, 0x82, 0x2d, 0x93, 0xe8, 0xa8, 0xa0, 0x8e, 0x4c);
+const GUID DXFILEOBJ_FVFData = DEFINE_GUID!(0xb6e70a0e, 0x8ef9, 0x4e83, 0x94, 0xad, 0xec, 0xc8, 0xb0, 0xc0, 0x48, 0x97);
+const GUID DXFILEOBJ_VertexElement = DEFINE_GUID!(0xf752461c, 0x1e23, 0x48f6, 0xb9, 0xf8, 0x83, 0x50, 0x85, 0xf, 0x33, 0x6f);
+const GUID DXFILEOBJ_DeclData = DEFINE_GUID!(0xbf22e553, 0x292c, 0x4781, 0x9f, 0xea, 0x62, 0xbd, 0x55, 0x4b, 0xdd, 0x93);
+const GUID DXFILEOBJ_EffectFloats = DEFINE_GUID!(0xf1cfe2b3, 0xde3, 0x4e28, 0xaf, 0xa1, 0x15, 0x5a, 0x75, 0xa, 0x28, 0x2d);
+const GUID DXFILEOBJ_EffectString = DEFINE_GUID!(0xd55b097e, 0xbdb6, 0x4c52, 0xb0, 0x3d, 0x60, 0x51, 0xc8, 0x9d, 0xe, 0x42);
+const GUID DXFILEOBJ_EffectDWord = DEFINE_GUID!(0x622c0ed0, 0x956e, 0x4da9, 0x90, 0x8a, 0x2a, 0xf9, 0x4f, 0x3c, 0xe7, 0x16);
+const GUID DXFILEOBJ_EffectParamFloats = DEFINE_GUID!(0x3014b9a0, 0x62f5, 0x478c, 0x9b, 0x86, 0xe4, 0xac, 0x9f, 0x4e, 0x41, 0x8b);
+const GUID DXFILEOBJ_EffectParamString = DEFINE_GUID!(0x1dbc4c88, 0x94c1, 0x46ee, 0x90, 0x76, 0x2c, 0x28, 0x81, 0x8c, 0x94, 0x81);
+const GUID DXFILEOBJ_EffectParamDWord = DEFINE_GUID!(0xe13963bc, 0xae51, 0x4c5d, 0xb0, 0xf, 0xcf, 0xa3, 0xa9, 0xd9, 0x7c, 0xe5);
+const GUID DXFILEOBJ_EffectInstance = DEFINE_GUID!(0xe331f7e4, 0x559, 0x4cc2, 0x8e, 0x99, 0x1c, 0xec, 0x16, 0x57, 0x92, 0x8f);
+const GUID DXFILEOBJ_AnimTicksPerSecond = DEFINE_GUID!(0x9e415a43, 0x7ba6, 0x4a73, 0x87, 0x43, 0xb7, 0x3d, 0x47, 0xe8, 0x84, 0x76);
+const GUID DXFILEOBJ_CompressedAnimationSet = DEFINE_GUID!(0x7f9b00b3, 0xf125, 0x4890, 0x87, 0x6e, 0x1c, 0x42, 0xbf, 0x69, 0x7c, 0x4d);
+
+align(1) struct XFILECOMPRESSEDANIMATIONSET
+{
+    DWORD CompressedBlockSize;
+    FLOAT TicksPerSec;
+    DWORD PlaybackType;
+    DWORD BufferLength;
+}
+
+const char[] XSKINEXP_TEMPLATES =
+        "xof 0303txt 0032
+        template XSkinMeshHeader
+        {
+            <3CF169CE-FF7C-44ab-93C0-F78F62D172E2>
+            WORD nMaxSkinWeightsPerVertex;
+            WORD nMaxSkinWeightsPerFace;
+            WORD nBones;
+        }
+        template VertexDuplicationIndices
+        {
+            <B8D65549-D7C9-4995-89CF-53A9A8B031E3>
+            DWORD nIndices;
+            DWORD nOriginalVertices;
+            array DWORD indices[nIndices];
+        }
+        template FaceAdjacency
+        {
+            <A64C844A-E282-4756-8B80-250CDE04398C>
+            DWORD nIndices;
+            array DWORD indices[nIndices];
+        }
+        template SkinWeights
+        {
+            <6F0D123B-BAD2-4167-A0D0-80224F25FABB>
+            STRING transformNodeName;
+            DWORD nWeights;
+            array DWORD vertexIndices[nWeights];
+            array float weights[nWeights];
+            Matrix4x4 matrixOffset;
+        }
+        template Patch
+        {
+            <A3EB5D44-FC22-429D-9AFB-3221CB9719A6>
+            DWORD nControlIndices;
+            array DWORD controlIndices[nControlIndices];
+        }
+        template PatchMesh
+        {
+            <D02C95CC-EDBA-4305-9B5D-1820D7704BBF>
+            DWORD nVertices;
+            array Vector vertices[nVertices];
+            DWORD nPatches;
+            array Patch patches[nPatches];
+            [ ... ]
+        }
+        template PatchMesh9
+        {
+            <B9EC94E1-B9A6-4251-BA18-94893F02C0EA>
+            DWORD Type;
+            DWORD Degree;
+            DWORD Basis;
+            DWORD nVertices;
+            array Vector vertices[nVertices];
+            DWORD nPatches;
+            array Patch patches[nPatches];
+            [ ... ]
+        } "
+        "template EffectFloats
+        {
+            <F1CFE2B3-0DE3-4e28-AFA1-155A750A282D>
+            DWORD nFloats;
+            array float Floats[nFloats];
+        }
+        template EffectString
+        {
+            <D55B097E-BDB6-4c52-B03D-6051C89D0E42>
+            STRING Value;
+        }
+        template EffectDWord
+        {
+            <622C0ED0-956E-4da9-908A-2AF94F3CE716>
+            DWORD Value;
+        } "
+        "template EffectParamFloats
+        {
+            <3014B9A0-62F5-478c-9B86-E4AC9F4E418B>
+            STRING ParamName;
+            DWORD nFloats;
+            array float Floats[nFloats];
+        } "
+        "template EffectParamString
+        {
+            <1DBC4C88-94C1-46ee-9076-2C28818C9481>
+            STRING ParamName;
+            STRING Value;
+        }
+        template EffectParamDWord
+        {
+            <E13963BC-AE51-4c5d-B00F-CFA3A9D97CE5>
+            STRING ParamName;
+            DWORD Value;
+        }
+        template EffectInstance
+        {
+            <E331F7E4-0559-4cc2-8E99-1CEC1657928F>
+            STRING EffectFilename;
+            [ ... ]
+        } "
+        "template AnimTicksPerSecond
+        {
+            <9E415A43-7BA6-4a73-8743-B73D47E88476>
+            DWORD AnimTicksPerSecond;
+        }
+        template CompressedAnimationSet
+        {
+            <7F9B00B3-F125-4890-876E-1C42BF697C4D>
+            DWORD CompressedBlockSize;
+            FLOAT TicksPerSec;
+            DWORD PlaybackType;
+            DWORD BufferLength;
+            array DWORD CompressedData[BufferLength];
+        } ";
+
+const char[] XEXTENSIONS_TEMPLATES =
+        "xof 0303txt 0032
+        template FVFData
+        {
+            <B6E70A0E-8EF9-4e83-94AD-ECC8B0C04897>
+            DWORD dwFVF;
+            DWORD nDWords;
+            array DWORD data[nDWords];
+        }
+        template VertexElement
+        {
+            <F752461C-1E23-48f6-B9F8-8350850F336F>
+            DWORD Type;
+            DWORD Method;
+            DWORD Usage;
+            DWORD UsageIndex;
+        }
+        template DeclData
+        {
+            <BF22E553-292C-4781-9FEA-62BD554BDD93>
+            DWORD nElements;
+            array VertexElement Elements[nElements];
+            DWORD nDWords;
+            array DWORD data[nDWords];
+        }
+        template PMAttributeRange
+        {
+            <917E0427-C61E-4a14-9C64-AFE65F9E9844>
+            DWORD iFaceOffset;
+            DWORD nFacesMin;
+            DWORD nFacesMax;
+            DWORD iVertexOffset;
+            DWORD nVerticesMin;
+            DWORD nVerticesMax;
+        }
+        template PMVSplitRecord
+        {
+            <574CCC14-F0B3-4333-822D-93E8A8A08E4C>
+            DWORD iFaceCLW;
+            DWORD iVlrOffset;
+            DWORD iCode;
+        }
+        template PMInfo
+        {
+            <B6C3E656-EC8B-4b92-9B62-681659522947>
+            DWORD nAttributes;
+            array PMAttributeRange attributeRanges[nAttributes];
+            DWORD nMaxValence;
+            DWORD nMinLogicalVertices;
+            DWORD nMaxLogicalVertices;
+            DWORD nVSplits;
+            array PMVSplitRecord splitRecords[nVSplits];
+            DWORD nAttributeMispredicts;
+            array DWORD attributeMispredicts[nAttributeMispredicts];
+        } ";
+
+enum : uint
+{
+	D3DXF_FILEFORMAT_BINARY          = 0,
+	D3DXF_FILEFORMAT_TEXT            = 1,
+	D3DXF_FILEFORMAT_COMPRESSED      = 2
+}
+alias uint D3DXF_FILEFORMAT;
+
+enum : uint
+{
+	D3DXF_FILESAVE_TOFILE     = 0x00L,
+	D3DXF_FILESAVE_TOWFILE    = 0x01L
+}
+alias uint D3DXF_FILESAVEOPTIONS;
+
+enum : uint
+{
+	D3DXF_FILELOAD_FROMFILE     = 0x00L,
+	D3DXF_FILELOAD_FROMWFILE    = 0x01L,
+	D3DXF_FILELOAD_FROMRESOURCE = 0x02L,
+	D3DXF_FILELOAD_FROMMEMORY   = 0x03L
+}
+alias uint D3DXF_FILELOADOPTIONS;
+
+struct D3DXF_FILELOADRESOURCE
+{
+    HMODULE hModule; // Desc
+    LPCSTR lpName;  // Desc
+    LPCSTR lpType;  // Desc
+}
+
+struct D3DXF_FILELOADMEMORY
+{
+    LPCVOID lpMemory; // Desc
+    size_t  dSize;     // Desc
+}
+
+const GUID IID_ID3DXFile = DEFINE_GUID!(0xcef08cf9, 0x7b4f, 0x4429, 0x96, 0x24, 0x2a, 0x69, 0x0a, 0x93, 0x32, 0x01 );
+const GUID IID_ID3DXFileSaveObject = DEFINE_GUID!(0xcef08cfa, 0x7b4f, 0x4429, 0x96, 0x24, 0x2a, 0x69, 0x0a, 0x93, 0x32, 0x01 );
+const GUID IID_ID3DXFileSaveData = DEFINE_GUID!(0xcef08cfb, 0x7b4f, 0x4429, 0x96, 0x24, 0x2a, 0x69, 0x0a, 0x93, 0x32, 0x01 );
+const GUID IID_ID3DXFileEnumObject = DEFINE_GUID!(0xcef08cfc, 0x7b4f, 0x4429, 0x96, 0x24, 0x2a, 0x69, 0x0a, 0x93, 0x32, 0x01 );
+const GUID IID_ID3DXFileData = DEFINE_GUID!(0xcef08cfd, 0x7b4f, 0x4429, 0x96, 0x24, 0x2a, 0x69, 0x0a, 0x93, 0x32, 0x01 );
+
+interface ID3DXFile : IUnknown
+{
+    HRESULT CreateEnumObject(LPCVOID, D3DXF_FILELOADOPTIONS, ID3DXFileEnumObject*);
+    HRESULT CreateSaveObject(LPCVOID, D3DXF_FILESAVEOPTIONS, D3DXF_FILEFORMAT, ID3DXFileSaveObject*);
+    HRESULT RegisterTemplates(LPCVOID, size_t);
+    HRESULT RegisterEnumTemplates(ID3DXFileEnumObject);
+}
+
+interface ID3DXFileSaveObject : IUnknown
+{
+    HRESULT GetFile(ID3DXFile*);
+    HRESULT AddDataObject(GUID*, LPCSTR, GUID*, size_t, LPCVOID, ID3DXFileSaveData*);
+    HRESULT Save();
+}
+
+interface ID3DXFileSaveData : IUnknown
+{
+    HRESULT GetSave(ID3DXFileSaveObject*);
+    HRESULT GetName(LPSTR, size_t*);
+    HRESULT GetId(GUID*);
+    HRESULT GetType(GUID*);
+    HRESULT AddDataObject(GUID*, LPCSTR, GUID*, size_t, LPCVOID, ID3DXFileSaveData*);
+    HRESULT AddDataReference(LPCSTR, GUID* );
+}
+
+interface ID3DXFileEnumObject : IUnknown
+{
+    HRESULT GetFile(ID3DXFile*);
+    HRESULT GetChildren(size_t*);
+    HRESULT GetChild(size_t, ID3DXFileData*);
+    HRESULT GetDataObjectById(REFGUID, ID3DXFileData*);
+    HRESULT GetDataObjectByName(LPCSTR, ID3DXFileData*);
+}
+
+interface ID3DXFileData : IUnknown
+{
+    HRESULT GetEnum(ID3DXFileEnumObject*);
+    HRESULT GetName(LPSTR, size_t*);
+    HRESULT GetId(GUID*);
+    HRESULT Lock(size_t*, LPCVOID*);
+    HRESULT Unlock();
+    HRESULT GetType(GUID*);
+    BOOL IsReference();
+    HRESULT GetChildren(size_t*);
+    HRESULT GetChild(size_t, ID3DXFileData*);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/d3dx9.def	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,48 @@
+IMPORTS
+_D3DXConcatenateMeshes@32 = d3dx9_29.D3DXConcatenateMeshes
+_D3DXCreateBox@24 = d3dx9_29.D3DXCreateBox
+_D3DXCreateCubeTexture@28 = d3dx9_29.D3DXCreateCubeTexture
+_D3DXCreateCubeTextureFromFileExA@52 = d3dx9_29.D3DXCreateCubeTextureFromFileExA
+_D3DXCreateCylinder@32 = d3dx9_29.D3DXCreateCylinder
+_D3DXCreateFontA@48 = d3dx9_29.D3DXCreateFontA
+_D3DXCreatePolygon@20 = d3dx9_29.D3DXCreatePolygon
+_D3DXCreateSkinInfoFVF@16 = d3dx9_29.D3DXCreateSkinInfoFVF
+_D3DXCreateSphere@24 = d3dx9_29.D3DXCreateSphere
+_D3DXCreateSprite@8 = d3dx9_29.D3DXCreateSprite
+_D3DXCreateTeapot@12 = d3dx9_29.D3DXCreateTeapot
+_D3DXCreateTexture@32 = d3dx9_29.D3DXCreateTexture
+_D3DXCreateTextureFromFileExA@56 = d3dx9_29.D3DXCreateTextureFromFileExA
+_D3DXCreateTextureFromFileA@12 = d3dx9_29.D3DXCreateTextureFromFileA
+_D3DXCreateTorus@28 = d3dx9_29.D3DXCreateTorus
+_D3DXFileCreate@4 = d3dx9_29.D3DXFileCreate
+_D3DXGetDeclVertexSize@8 = d3dx9_29.D3DXGetDeclVertexSize
+_D3DXLoadMeshFromXof@32 = d3dx9_29.D3DXLoadMeshFromXof
+_D3DXMatrixDecompose@16 = d3dx9_29.D3DXMatrixDecompose
+_D3DXMatrixInverse@12 = d3dx9_29.D3DXMatrixInverse
+_D3DXMatrixMultiply@12 = d3dx9_29.D3DXMatrixMultiply
+_D3DXMatrixOrthoOffCenterLH@28 = d3dx9_29.D3DXMatrixOrthoOffCenterLH
+_D3DXMatrixPerspectiveFovLH@20 = d3dx9_29.D3DXMatrixPerspectiveFovLH
+_D3DXMatrixRotationQuaternion@8 = d3dx9_29.D3DXMatrixRotationQuaternion
+_D3DXMatrixRotationX@8 = d3dx9_29.D3DXMatrixRotationX
+_D3DXMatrixRotationY@8 = d3dx9_29.D3DXMatrixRotationY
+_D3DXMatrixRotationYawPitchRoll@16 = d3dx9_29.D3DXMatrixRotationYawPitchRoll
+_D3DXMatrixRotationZ@8 = d3dx9_29.D3DXMatrixRotationZ
+_D3DXMatrixScaling@16 = d3dx9_29.D3DXMatrixScaling
+_D3DXMatrixTransformation2D@28 = d3dx9_29.D3DXMatrixTransformation2D
+_D3DXMatrixTranslation@16 = d3dx9_29.D3DXMatrixTranslation
+_D3DXPlaneNormalize@8 = d3dx9_29.D3DXPlaneNormalize
+_D3DXQuaternionNormalize@8 = d3dx9_29.D3DXQuaternionNormalize
+_D3DXQuaternionRotationYawPitchRoll@16 = d3dx9_29.D3DXQuaternionRotationYawPitchRoll
+_D3DXQuaternionSlerp@16 = d3dx9_29.D3DXQuaternionSlerp
+_D3DXQuaternionSquad@24 = d3dx9_29.D3DXQuaternionSquad
+_D3DXQuaternionSquadSetup@28 = d3dx9_29.D3DXQuaternionSquadSetup
+_D3DXSimplifyMesh@28 = d3dx9_29.D3DXSimplifyMesh
+_D3DXVec2TransformCoord@12 = d3dx9_29.D3DXVec2TransformCoord
+_D3DXVec3CatmullRom@24 = d3dx9_29.D3DXVec3CatmullRom
+_D3DXVec3TransformCoord@12 = d3dx9_29.D3DXVec3TransformCoord
+_D3DXCreateEffect@36 = d3dx9_29.D3DXCreateEffect
+_D3DXCreateEffectFromFileA@32 = d3dx9_29.D3DXCreateEffectFromFileA
+_D3DXCreateEffectPool@4 = d3dx9_29.D3DXCreateEffectPool
+_D3DXGetShaderInputSemantics@12 = d3dx9_29.D3DXGetShaderInputSemantics
+_D3DXGetShaderVersion@4 = d3dx9_29.D3DXGetShaderVersion
+_D3DXMatrixTranspose@8 = d3dx9_29.D3DXMatrixTranspose
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/dinput8.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,431 @@
+module win32.directx.dinput8;
+
+//import tango.sys.win32.Types;
+//alias char CHAR;
+
+import win32.windows;
+
+enum {
+	CLASS_E_NOAGGREGATION = cast(int) 0x80040110,
+}
+
+interface IUnknown {
+    HRESULT QueryInterface(IID* riid, void** pvObject);
+    ULONG AddRef();
+    ULONG Release();
+}
+
+extern(C):
+
+struct DIDEVICEINSTANCEA
+{
+    DWORD   dwSize;
+    GUID    guidInstance;
+    GUID    guidProduct;
+    DWORD   dwDevType;
+    CHAR    tszInstanceName[MAX_PATH];
+    CHAR    tszProductName[MAX_PATH];
+    GUID    guidFFDriver;
+    WORD    wUsagePage;
+    WORD    wUsage;
+}
+alias DIDEVICEINSTANCEA DIDEVICEINSTANCE;
+
+struct DIDEVICEOBJECTINSTANCEA
+{
+    DWORD   dwSize;
+    GUID    guidType;
+    DWORD   dwOfs;
+    DWORD   dwType;
+    DWORD   dwFlags;
+    CHAR    tszName[MAX_PATH];
+    DWORD   dwFFMaxForce;
+    DWORD   dwFFForceResolution;
+    WORD    wCollectionNumber;
+    WORD    wDesignatorIndex;
+    WORD    wUsagePage;
+    WORD    wUsage;
+    DWORD   dwDimension;
+    WORD    wExponent;
+    WORD    wReportId;
+}
+
+struct DIOBJECTDATAFORMAT
+{
+	const   GUID *pguid;
+	DWORD   dwOfs;
+	DWORD   dwType;
+	DWORD   dwFlags;
+}
+
+struct DIDATAFORMAT
+{
+	DWORD   dwSize;
+	DWORD   dwObjSize;
+	DWORD   dwFlags;
+	DWORD   dwDataSize;
+	DWORD   dwNumObjs;
+	DIOBJECTDATAFORMAT* rgodf;
+}
+
+extern DIDATAFORMAT c_dfDIKeyboard;
+extern DIDATAFORMAT c_dfDIMouse2;
+extern DIDATAFORMAT c_dfDIJoystick;
+
+struct DIACTIONA
+{
+	UINT*    uAppData;
+	DWORD       dwSemantic;
+	DWORD       dwFlags;
+	union
+	{
+		LPCSTR      lptszActionName;
+		UINT        uResIdString;
+	}
+	GUID        guidInstance;
+	DWORD       dwObjID;
+	DWORD       dwHow;
+}
+
+struct DIACTIONFORMATA
+{
+	DWORD       dwSize;
+	DWORD       dwActionSize;
+	DWORD       dwDataSize;
+	DWORD       dwNumActions;
+	DIACTIONA*  rgoAction;
+	GUID        guidActionMap;
+	DWORD       dwGenre;
+	DWORD       dwBufferSize;
+	LONG        lAxisMin;
+	LONG        lAxisMax;
+	HINSTANCE   hInstString;
+	FILETIME    ftTimeStamp;
+	DWORD       dwCRC;
+	CHAR        tszActionMap[MAX_PATH];
+}
+
+struct DIDEVCAPS
+{
+    DWORD   dwSize;
+    DWORD   dwFlags;
+    DWORD   dwDevType;
+    DWORD   dwAxes;
+    DWORD   dwButtons;
+    DWORD   dwPOVs;
+    DWORD   dwFFSamplePeriod;
+    DWORD   dwFFMinTimeResolution;
+    DWORD   dwFirmwareRevision;
+    DWORD   dwHardwareRevision;
+    DWORD   dwFFDriverVersion;
+}
+
+struct DIPROPHEADER
+{
+    DWORD   dwSize;
+    DWORD   dwHeaderSize;
+    DWORD   dwObj;
+    DWORD   dwHow;
+}
+
+struct DIDEVICEOBJECTDATA
+{
+    DWORD       dwOfs;
+    DWORD       dwData;
+    DWORD       dwTimeStamp;
+    DWORD       dwSequence;
+    UINT*    uAppData;
+}
+
+struct DIENVELOPE
+{
+    DWORD dwSize = DIENVELOPE.sizeof;
+    DWORD dwAttackLevel;
+    DWORD dwAttackTime;             // Microseconds
+    DWORD dwFadeLevel;
+    DWORD dwFadeTime;               // Microseconds
+}
+
+struct DIEFFECT
+{
+    DWORD dwSize = DIEFFECT.sizeof;
+    DWORD dwFlags;                  // DIEFF_*
+    DWORD dwDuration;               // Microseconds
+    DWORD dwSamplePeriod;           // Microseconds
+    DWORD dwGain;
+    DWORD dwTriggerButton;          // or DIEB_NOTRIGGER
+    DWORD dwTriggerRepeatInterval;  // Microseconds
+    DWORD cAxes;                    // Number of axes
+    LPDWORD rgdwAxes;               // Array of axes
+    LPLONG rglDirection;            // Array of directions
+    DIENVELOPE* lpEnvelope;         // Optional
+    DWORD cbTypeSpecificParams;     // Size of params
+    LPVOID lpvTypeSpecificParams;   // Pointer to params
+    DWORD  dwStartDelay;            // Microseconds
+}
+
+struct DIEFFESCAPE
+{
+    DWORD   dwSize;
+    DWORD   dwCommand;
+    LPVOID  lpvInBuffer;
+    DWORD   cbInBuffer;
+    LPVOID  lpvOutBuffer;
+    DWORD   cbOutBuffer;
+}
+
+struct DIEFFECTINFOA
+{
+    DWORD   dwSize;
+    GUID    guid;
+    DWORD   dwEffType;
+    DWORD   dwStaticParams;
+    DWORD   dwDynamicParams;
+    CHAR    tszName[MAX_PATH];
+}
+
+struct DIFILEEFFECT
+{
+    DWORD       dwSize;
+    GUID        GuidEffect;
+    DIEFFECT* lpDiEffect;
+    CHAR        szFriendlyName[MAX_PATH];
+}
+
+struct DIDEVICEIMAGEINFOA
+{
+    CHAR        tszImagePath[MAX_PATH];
+    DWORD       dwFlags;
+    // These are valid if DIDIFT_OVERLAY is present in dwFlags.
+    DWORD       dwViewID;
+    RECT        rcOverlay;
+    DWORD       dwObjID;
+    DWORD       dwcValidPts;
+    POINT       rgptCalloutLine[5];
+    RECT        rcCalloutRect;
+    DWORD       dwTextAlign;
+}
+
+struct DIDEVICEIMAGEINFOHEADERA
+{
+    DWORD       dwSize;
+    DWORD       dwSizeImageInfo;
+    DWORD       dwcViews;
+    DWORD       dwcButtons;
+    DWORD       dwcAxes;
+    DWORD       dwcPOVs;
+    DWORD       dwBufferSize;
+    DWORD       dwBufferUsed;
+    DIDEVICEIMAGEINFOA* lprgImageInfoArray;
+}
+
+struct DICONFIGUREDEVICESPARAMSA
+{
+	 DWORD            dwSize;
+	 DWORD            dwcUsers;
+	 LPSTR            lptszUserNames;
+	 DWORD            dwcFormats;
+	 DIACTIONFORMATA* lprgFormats;
+	 HWND             hwnd;
+	 DICOLORSET       dics;
+	 IUnknown         lpUnkDDSTarget;
+}
+
+struct DICOLORSET
+{
+    DWORD dwSize;
+    DWORD cTextFore;
+    DWORD cTextHighlight;
+    DWORD cCalloutLine;
+    DWORD cCalloutHighlight;
+    DWORD cBorder;
+    DWORD cControlFill;
+    DWORD cHighlightFill;
+    DWORD cAreaFill;
+}
+
+struct DIMOUSESTATE2
+{
+    LONG    lX;
+    LONG    lY;
+    LONG    lZ;
+    BYTE    rgbButtons[8];
+}
+
+struct DIJOYSTATE
+{
+    LONG    lX;                     /* x-axis position              */
+    LONG    lY;                     /* y-axis position              */
+    LONG    lZ;                     /* z-axis position              */
+    LONG    lRx;                    /* x-axis rotation              */
+    LONG    lRy;                    /* y-axis rotation              */
+    LONG    lRz;                    /* z-axis rotation              */
+    LONG    rglSlider[2];           /* extra axes positions         */
+    DWORD   rgdwPOV[4];             /* POV directions               */
+    BYTE    rgbButtons[32];         /* 32 buttons                   */
+}
+
+struct DIPROPRANGE
+{
+    DIPROPHEADER diph;
+    LONG    lMin;
+    LONG    lMax;
+}
+
+interface IDirectInputEffect : IUnknown
+{
+    HRESULT Initialize(HINSTANCE, DWORD, GUID*);
+    HRESULT GetEffectGuid(GUID*);
+    HRESULT GetParameters(DIEFFECT*, DWORD);
+    HRESULT SetParameters(DIEFFECT*, DWORD);
+    HRESULT Start(DWORD, DWORD);
+    HRESULT Stop();
+    HRESULT GetEffectStatus(LPDWORD);
+    HRESULT Download();
+    HRESULT Unload();
+    HRESULT Escape(DIEFFESCAPE*);
+}
+
+extern(Windows) alias bool function(DIDEVICEINSTANCEA*, LPVOID) LPDIENUMDEVICESCALLBACKA;
+extern(Windows) alias bool function(DIDEVICEINSTANCEA*, IDirectInputDevice8A*, DWORD, DWORD, LPVOID) LPDIENUMDEVICESBYSEMANTICSCBA;
+
+extern(Windows) alias bool function(DIDEVICEOBJECTINSTANCEA *didoi, void* pContext) LPDIENUMDEVICEOBJECTSCALLBACKA;
+
+extern(Windows) alias bool function(DIEFFECTINFOA*, LPVOID) LPDIENUMEFFECTSCALLBACKA;
+extern(Windows) alias bool function(IDirectInputEffect, LPVOID) LPDIENUMCREATEDEFFECTOBJECTSCALLBACK;
+extern(Windows) alias bool function(DIFILEEFFECT* , LPVOID) LPDIENUMEFFECTSINFILECALLBACK;
+extern(Windows) alias bool function(IUnknown, LPVOID) LPDICONFIGUREDEVICESCALLBACK;
+
+interface IDirectInputDevice8A : IUnknown
+{
+    HRESULT GetCapabilities(DIDEVCAPS*);
+    HRESULT EnumObjects(LPDIENUMDEVICEOBJECTSCALLBACKA, VOID*, DWORD);
+    HRESULT GetProperty(GUID*, DIPROPHEADER*);
+    HRESULT SetProperty(GUID*, DIPROPHEADER*);
+    HRESULT Acquire();
+    HRESULT Unacquire();
+    HRESULT GetDeviceState(DWORD, LPVOID);
+    HRESULT GetDeviceData(DWORD, DIDEVICEOBJECTDATA*, LPDWORD, DWORD);
+    HRESULT SetDataFormat(DIDATAFORMAT*);
+    HRESULT SetEventNotification(HANDLE);
+    HRESULT SetCooperativeLevel(HWND, DWORD);
+    HRESULT GetObjectInfo(DIDEVICEOBJECTINSTANCEA*, DWORD, DWORD);
+    HRESULT GetDeviceInfo(DIDEVICEINSTANCEA*);
+    HRESULT RunControlPanel(HWND, DWORD);
+    HRESULT Initialize(HINSTANCE, DWORD, GUID*);
+    HRESULT CreateEffect(GUID*, DIEFFECT*, IDirectInputEffect*, IUnknown);
+    HRESULT EnumEffects(LPDIENUMEFFECTSCALLBACKA, LPVOID, DWORD);
+    HRESULT GetEffectInfo(DIEFFECTINFOA*, GUID*);
+    HRESULT GetForceFeedbackState(LPDWORD);
+    HRESULT SendForceFeedbackCommand(DWORD);
+    HRESULT EnumCreatedEffectObjects(LPDIENUMCREATEDEFFECTOBJECTSCALLBACK, LPVOID, DWORD);
+    HRESULT Escape(DIEFFESCAPE*);
+    HRESULT Poll();
+    HRESULT SendDeviceData(DWORD, DIDEVICEOBJECTDATA*, LPDWORD, DWORD);
+    HRESULT EnumEffectsInFile(LPCSTR, LPDIENUMEFFECTSINFILECALLBACK, LPVOID, DWORD);
+    HRESULT WriteEffectToFile(LPCSTR, DWORD, DIFILEEFFECT*, DWORD);
+    HRESULT BuildActionMap(DIACTIONFORMATA*, LPCSTR, DWORD);
+    HRESULT SetActionMap(DIACTIONFORMATA*, LPCSTR, DWORD);
+    HRESULT GetImageInfo(DIDEVICEIMAGEINFOHEADERA*);
+}
+alias IDirectInputDevice8A IDirectInputDevice8;
+
+interface IDirectInput8A : IUnknown
+{
+extern(Windows):
+    HRESULT CreateDevice(GUID*, IDirectInputDevice8A*, IUnknown);
+    HRESULT EnumDevices(DWORD, LPDIENUMDEVICESCALLBACKA, LPVOID, DWORD);
+    HRESULT GetDeviceStatus(GUID*);
+    HRESULT RunControlPanel(HWND, DWORD);
+    HRESULT Initialize(HINSTANCE, DWORD);
+    HRESULT FindDevice(GUID*, LPCSTR, GUID*);
+    HRESULT EnumDevicesBySemantics(LPCSTR, DIACTIONFORMATA*, LPDIENUMDEVICESBYSEMANTICSCBA, LPVOID, DWORD);
+    HRESULT ConfigureDevices(LPDICONFIGUREDEVICESCALLBACK, DICONFIGUREDEVICESPARAMSA*, DWORD, LPVOID);
+}
+alias IDirectInput8A IDirectInput8;
+
+extern(Windows) HRESULT DirectInput8Create(HINSTANCE hinst, DWORD dwVersion, GUID* riidltf, void** ppvOut, IUnknown punkOuter);
+
+const GUID IID_IDirectInput8A={0xBF798030, 0x483A, 0x4DA2, [0xAA, 0x99, 0x5D, 0x64, 0xED, 0x36, 0x97, 0x00]};
+alias IID_IDirectInput8A IID_IDirectInput8;
+const GUID GUID_SysKeyboard = {0x6F1D2B61, 0xD5A0, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+const GUID GUID_SysMouse =    {0x6F1D2B60, 0xD5A0, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+const GUID GUID_XAxis =       {0xA36D02E0, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+const GUID GUID_YAxis =       {0xA36D02E1, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+const GUID GUID_ZAxis =       {0xA36D02E2, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+const GUID GUID_RxAxis =      {0xA36D02F4, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+const GUID GUID_RyAxis =      {0xA36D02F5, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+const GUID GUID_RzAxis =      {0xA36D02E3, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+const GUID GUID_Slider =      {0xA36D02E4, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+const GUID GUID_Key =         {0x55728220, 0xD33C, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+const GUID GUID_POV =         {0xA36D02F2, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+
+enum : uint
+{
+	DISCL_EXCLUSIVE=     0x00000001,
+	DISCL_NONEXCLUSIVE=  0x00000002,
+	DISCL_FOREGROUND=    0x00000004,
+	DISCL_BACKGROUND=	 0x00000008,
+	DISCL_NOWINKEY=      0x00000010,
+
+	DIPH_DEVICE=0,
+	DIPH_BYOFFSET=1,
+
+	DI8DEVCLASS_GAMECTRL=4,
+	DIEDFL_ATTACHEDONLY=     0x00000001,
+	DIDFT_AXIS=          0x00000003
+}
+
+enum
+{
+	SEVERITY_SUCCESS=    0,
+	SEVERITY_ERROR=      1,
+	FACILITY_WIN32=                   7,
+	ERROR_READ_FAULT=                 30L,
+	DIENUM_CONTINUE=         1,
+	DIPH_BYID=               2
+}
+
+struct DIPROPDWORD
+{
+    DIPROPHEADER diph;
+    DWORD   dwData;
+}
+
+template MAKE_HRESULT(uint sev, uint fac, uint code)
+{
+	const HRESULT MAKE_HRESULT = cast(HRESULT)((sev << 31) | (fac << 16) | code);
+}
+
+const HRESULT DIERR_OLDDIRECTINPUTVERSION             = MAKE_HRESULT!(SEVERITY_ERROR, FACILITY_WIN32, 1150);
+const HRESULT DIERR_BETADIRECTINPUTVERSION            = MAKE_HRESULT!(SEVERITY_ERROR, FACILITY_WIN32, 1153);
+const HRESULT DIERR_BADDRIVERVER                      = MAKE_HRESULT!(SEVERITY_ERROR, FACILITY_WIN32, 119);
+const HRESULT DIERR_DEVICENOTREG                      = 0x80040154;
+const HRESULT DIERR_NOTFOUND                          = MAKE_HRESULT!(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND);
+const HRESULT DIERR_OBJECTNOTFOUND                    = MAKE_HRESULT!(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND);
+const HRESULT DIERR_INVALIDPARAM                      = E_INVALIDARG;
+const HRESULT DIERR_NOINTERFACE                       = E_NOINTERFACE;
+const HRESULT DIERR_GENERIC                           = E_FAIL;
+const HRESULT DIERR_OUTOFMEMORY                       = E_OUTOFMEMORY;
+const HRESULT DIERR_UNSUPPORTED                       = E_NOTIMPL;
+const HRESULT DIERR_NOTINITIALIZED                    = MAKE_HRESULT!(SEVERITY_ERROR, FACILITY_WIN32, 21);
+const HRESULT DIERR_ALREADYINITIALIZED                = MAKE_HRESULT!(SEVERITY_ERROR, FACILITY_WIN32, 1247);
+const HRESULT DIERR_NOAGGREGATION                     = CLASS_E_NOAGGREGATION;
+const HRESULT DIERR_OTHERAPPHASPRIO                   = 0x80070005;
+const HRESULT DIERR_INPUTLOST                         = MAKE_HRESULT!(SEVERITY_ERROR, FACILITY_WIN32, ERROR_READ_FAULT);
+const HRESULT DIERR_ACQUIRED                          = MAKE_HRESULT!(SEVERITY_ERROR, FACILITY_WIN32, 170);
+const HRESULT DIERR_NOTACQUIRED                       = MAKE_HRESULT!(SEVERITY_ERROR, FACILITY_WIN32, 12);
+const HRESULT DIERR_READONLY                          = 0x80070005;
+const HRESULT DIERR_HANDLEEXISTS                      = 0x80070005;
+const HRESULT DIERR_INSUFFICIENTPRIVS                 = 0x80040200;
+const HRESULT DIERR_DEVICEFULL                        = 0x80040201;
+const HRESULT DIERR_MOREDATA                          = 0x80040202;
+const HRESULT DIERR_NOTDOWNLOADED                     = 0x80040203;
+const HRESULT DIERR_HASEFFECTS                        = 0x80040204;
+const HRESULT DIERR_NOTEXCLUSIVEACQUIRED              = 0x80040205;
+const HRESULT DIERR_INCOMPLETEEFFECT                  = 0x80040206;
+const HRESULT DIERR_NOTBUFFERED                       = 0x80040207;
+const HRESULT DIERR_EFFECTPLAYING                     = 0x80040208;
+const HRESULT DIERR_UNPLUGGED                         = 0x80040209;
+const HRESULT DIERR_REPORTFULL                        = 0x8004020A;
+const HRESULT DIERR_MAPFILEFAIL                       = 0x8004020B;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/dinput8.def	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,2 @@
+IMPORTS
+_DirectInput8Create@20 = dinput8.DirectInput8Create
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/dsound8.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,228 @@
+module win32.directx.dsound8;
+
+//import tango.sys.win32.Types;
+import win32.windows;
+
+alias GUID* LPCGUID;
+
+interface IUnknown
+{
+	HRESULT QueryInterface(IID* riid, void** pvObject);
+	ULONG AddRef();
+	ULONG Release();
+}
+
+alias IUnknown LPUNKNOWN;
+
+interface IDirectSound : IUnknown
+{
+	extern(Windows):
+
+    // IDirectSound methods
+    HRESULT CreateSoundBuffer    (LPCDSBUFFERDESC pcDSBufferDesc, LPDIRECTSOUNDBUFFER *ppDSBuffer, LPUNKNOWN pUnkOuter);
+    HRESULT GetCaps              (LPDSCAPS pDSCaps);
+    HRESULT DuplicateSoundBuffer (LPDIRECTSOUNDBUFFER pDSBufferOriginal, LPDIRECTSOUNDBUFFER *ppDSBufferDuplicate);
+    HRESULT SetCooperativeLevel  (HWND hwnd, DWORD dwLevel);
+    HRESULT Compact              ();
+    HRESULT GetSpeakerConfig     (LPDWORD pdwSpeakerConfig);
+    HRESULT SetSpeakerConfig     (DWORD dwSpeakerConfig);
+    HRESULT Initialize           (LPCGUID pcGuidDevice);
+}
+
+alias IDirectSound LPDIRECTSOUND;
+
+interface IDirectSound8 : IDirectSound
+{
+	extern(Windows):
+
+    // IDirectSound8 methods
+    HRESULT VerifyCertification  (LPDWORD pdwCertified);
+}
+
+alias IDirectSound8 LPDIRECTSOUND8;
+
+interface IDirectSoundBuffer : IUnknown
+{
+	extern(Windows):
+
+    // IDirectSoundBuffer methods
+    HRESULT GetCaps              (LPDSBCAPS pDSBufferCaps);
+    HRESULT GetCurrentPosition   (LPDWORD pdwCurrentPlayCursor, LPDWORD pdwCurrentWriteCursor);
+    HRESULT GetFormat            (LPWAVEFORMATEX pwfxFormat, DWORD dwSizeAllocated, LPDWORD pdwSizeWritten);
+    HRESULT GetVolume            (LPLONG plVolume);
+    HRESULT GetPan               (LPLONG plPan);
+    HRESULT GetFrequency         (LPDWORD pdwFrequency);
+    HRESULT GetStatus            (LPDWORD pdwStatus);
+    HRESULT Initialize           (LPDIRECTSOUND pDirectSound, LPCDSBUFFERDESC pcDSBufferDesc);
+    HRESULT Lock                 (DWORD dwOffset, DWORD dwBytes, LPVOID *ppvAudioPtr1, LPDWORD pdwAudioBytes1,
+                                           LPVOID *ppvAudioPtr2, LPDWORD pdwAudioBytes2, DWORD dwFlags);
+    HRESULT Play                 (DWORD dwReserved1, DWORD dwPriority, DWORD dwFlags);
+    HRESULT SetCurrentPosition   (DWORD dwNewPosition);
+    HRESULT SetFormat            (LPCWAVEFORMATEX pcfxFormat);
+    HRESULT SetVolume            (LONG lVolume);
+    HRESULT SetPan               (LONG lPan);
+    HRESULT SetFrequency         (DWORD dwFrequency);
+    HRESULT Stop                 ();
+    HRESULT Unlock               (LPVOID pvAudioPtr1, DWORD dwAudioBytes1, LPVOID pvAudioPtr2, DWORD dwAudioBytes2);
+    HRESULT Restore              ();
+}
+
+alias IDirectSoundBuffer LPDIRECTSOUNDBUFFER;
+
+interface IDirectSound3DListener : IUnknown
+{
+	extern(Windows):
+
+    // IDirectSound3DListener methods
+    HRESULT GetAllParameters         (LPDS3DLISTENER pListener);
+    HRESULT GetDistanceFactor        (D3DVALUE* pflDistanceFactor);
+    HRESULT GetDopplerFactor         (D3DVALUE* pflDopplerFactor);
+    HRESULT GetOrientation           (D3DVECTOR* pvOrientFront, D3DVECTOR* pvOrientTop);
+    HRESULT GetPosition              (D3DVECTOR* pvPosition);
+    HRESULT GetRolloffFactor         (D3DVALUE* pflRolloffFactor);
+    HRESULT GetVelocity              (D3DVECTOR* pvVelocity);
+    HRESULT SetAllParameters         (LPCDS3DLISTENER pcListener, DWORD dwApply);
+    HRESULT SetDistanceFactor        (D3DVALUE flDistanceFactor, DWORD dwApply);
+    HRESULT SetDopplerFactor         (D3DVALUE flDopplerFactor, DWORD dwApply);
+    HRESULT SetOrientation           (D3DVALUE xFront, D3DVALUE yFront, D3DVALUE zFront,
+                                               D3DVALUE xTop, D3DVALUE yTop, D3DVALUE zTop, DWORD dwApply);
+    HRESULT SetPosition              (D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply);
+    HRESULT SetRolloffFactor         (D3DVALUE flRolloffFactor, DWORD dwApply);
+    HRESULT SetVelocity              (D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply);
+    HRESULT CommitDeferredSettings   ();
+}
+
+struct WAVEFORMATEX
+{
+	ushort wFormatTag;
+	ushort nChannels;
+	uint nSamplesPerSec;
+	uint nAvgBytesPerSec;
+	ushort nBlockAlign;
+	ushort wBitsPerSample;
+	ushort cbSize;
+}
+
+alias WAVEFORMATEX* LPWAVEFORMATEX, LPCWAVEFORMATEX;
+
+enum : uint
+{
+	WAVE_FORMAT_PCM = 1
+}
+
+struct DSCBUFFERDESC
+{
+    DWORD           dwSize;
+    DWORD           dwFlags;
+    DWORD           dwBufferBytes;
+    DWORD           dwReserved;
+    LPWAVEFORMATEX  lpwfxFormat;
+    DWORD           dwFXCount;
+    LPDSCEFFECTDESC lpDSCFXDesc;
+}
+
+alias DSCBUFFERDESC* LPDSCBUFFERDESC;
+
+struct DSBUFFERDESC
+{
+    DWORD           dwSize;
+    DWORD           dwFlags;
+    DWORD           dwBufferBytes;
+    DWORD           dwReserved;
+    LPWAVEFORMATEX  lpwfxFormat;
+    GUID            guid3DAlgorithm;
+}
+
+alias DSBUFFERDESC* LPCDSBUFFERDESC;
+
+struct DSCAPS
+{
+    DWORD           dwSize;
+    DWORD           dwFlags;
+    DWORD           dwMinSecondarySampleRate;
+    DWORD           dwMaxSecondarySampleRate;
+    DWORD           dwPrimaryBuffers;
+    DWORD           dwMaxHwMixingAllBuffers;
+    DWORD           dwMaxHwMixingStaticBuffers;
+    DWORD           dwMaxHwMixingStreamingBuffers;
+    DWORD           dwFreeHwMixingAllBuffers;
+    DWORD           dwFreeHwMixingStaticBuffers;
+    DWORD           dwFreeHwMixingStreamingBuffers;
+    DWORD           dwMaxHw3DAllBuffers;
+    DWORD           dwMaxHw3DStaticBuffers;
+    DWORD           dwMaxHw3DStreamingBuffers;
+    DWORD           dwFreeHw3DAllBuffers;
+    DWORD           dwFreeHw3DStaticBuffers;
+    DWORD           dwFreeHw3DStreamingBuffers;
+    DWORD           dwTotalHwMemBytes;
+    DWORD           dwFreeHwMemBytes;
+    DWORD           dwMaxContigFreeHwMemBytes;
+    DWORD           dwUnlockTransferRateHwBuffers;
+    DWORD           dwPlayCpuOverheadSwBuffers;
+    DWORD           dwReserved1;
+    DWORD           dwReserved2;
+}
+
+alias DSCAPS* LPDSCAPS;
+
+struct DSBCAPS
+{
+    DWORD           dwSize;
+    DWORD           dwFlags;
+    DWORD           dwBufferBytes;
+    DWORD           dwUnlockTransferRate;
+    DWORD           dwPlayCpuOverhead;
+}
+
+alias DSBCAPS *LPDSBCAPS;
+
+struct DSCEFFECTDESC
+{
+    DWORD       dwSize;
+    DWORD       dwFlags;
+    GUID        guidDSCFXClass;
+    GUID        guidDSCFXInstance;
+    DWORD       dwReserved1;
+    DWORD       dwReserved2;
+}
+
+alias DSCEFFECTDESC *LPDSCEFFECTDESC;
+
+struct DS3DLISTENER
+{
+    DWORD           dwSize;
+    D3DVECTOR       vPosition;
+    D3DVECTOR       vVelocity;
+    D3DVECTOR       vOrientFront;
+    D3DVECTOR       vOrientTop;
+    D3DVALUE        flDistanceFactor;
+    D3DVALUE        flRolloffFactor;
+    D3DVALUE        flDopplerFactor;
+}
+
+alias DS3DLISTENER *LPDS3DLISTENER, LPCDS3DLISTENER;
+
+alias float D3DVALUE;
+
+struct D3DVECTOR
+{
+    float x;
+    float y;
+    float z;
+}
+
+extern(Windows) export HRESULT DirectSoundCreate8(LPCGUID pcGuidDevice, LPDIRECTSOUND8 *ppDS8, LPUNKNOWN pUnkOuter);
+
+const DSSCL_PRIORITY = 0x00000002;
+const DSBCAPS_PRIMARYBUFFER = 0x00000001;
+const DSBCAPS_CTRL3D = 0x00000010;
+const DSBCAPS_GETCURRENTPOSITION2 = 0x00010000;
+const DSBCAPS_LOCDEFER = 0x00040000;
+const DSBPLAY_LOOPING = 0x00000001;
+const DSBSTATUS_PLAYING = 0x00000001;
+const DSBCAPS_CTRLFREQUENCY = 0x00000020;
+const DSBCAPS_CTRLPAN = 0x00000040;
+const DSBCAPS_CTRLVOLUME = 0x00000080;
+const DSBLOCK_ENTIREBUFFER = 0x00000002;
+
+const GUID IID_IDirectSound3DListener8 = {0x279AFA84,0x4981,0x11CE,[0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60]};
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/dsound8.def	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,2 @@
+IMPORTS
+_DirectSoundCreate8@12 = dsound.DirectSoundCreate8
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/dxerr.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,55 @@
+/***********************************************************************\
+*                                 dxerr.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.directx.dxerr;
+
+import win32.windows;
+
+pragma(lib, "dxerr.lib");
+
+extern (Windows) {
+	CHAR*  DXGetErrorStringA(HRESULT hr);
+	WCHAR* DXGetErrorStringW(HRESULT hr);
+	CHAR*  DXGetErrorDescriptionA(HRESULT hr);
+	WCHAR* DXGetErrorDescriptionW(HRESULT hr);
+	HRESULT DXTraceA(CHAR* strFile, DWORD dwLine, HRESULT hr, CHAR* strMsg,
+	  BOOL bPopMsgBox);
+	HRESULT DXTraceW(CHAR* strFile, DWORD dwLine, HRESULT hr, WCHAR* strMsg,
+	  BOOL bPopMsgBox);
+}
+
+version (Unicode) {
+	alias DXGetErrorStringW DXGetErrorString;
+	alias DXGetErrorDescriptionW DXGetErrorDescription;
+	alias DXTraceW DXTrace;
+} else {
+	alias DXGetErrorStringA DXGetErrorString;
+	alias DXGetErrorDescriptionA DXGetErrorDescription;
+	alias DXTraceA DXTrace;
+}
+
+debug (dxerr) {
+	HRESULT DXTRACE_MSG(TCHAR* str) {
+		return DXTrace(__FILE__, __LINE__, 0, str, false);
+	}
+	HRESULT DXTRACE_ERR(TCHAR* str, HRESULT hr) {
+		return DXTrace(__FILE__, __LINE__, hr, str, false);
+	}
+	HRESULT DXTRACE_ERR_MSGBOX(TCHAR* str, HRESULT hr) {
+		return DXTrace(__FILE__, __LINE__, hr, str, true);
+	}
+} else {
+	HRESULT DXTRACE_MSG(TCHAR* str) {
+		return 0;
+	}
+	HRESULT DXTRACE_ERR(TCHAR* str, HRESULT hr) {
+		return hr;
+	}
+	HRESULT DXTRACE_ERR_MSGBOX(TCHAR* str, HRESULT hr) {
+		return hr;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/dxerr8.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,68 @@
+/***********************************************************************\
+*                                dxerr8.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.directx.dxerr8;
+
+/*
+	dxerr8.d - Header file for the DirectX 8 Error API
+
+	Written by Filip Navara <xnavara@volny.cz>
+	Ported to D by James Pelcis <jpelcis@gmail.com>
+
+	This library is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+*/
+
+private import win32.windef;
+
+extern (Windows) {
+	char* DXGetErrorString8A (HRESULT);
+	WCHAR* DXGetErrorString8W (HRESULT);
+	char* DXGetErrorDescription8A (HRESULT);
+	WCHAR* DXGetErrorDescription8W (HRESULT);
+	HRESULT DXTraceA (char*, DWORD, HRESULT, char*, BOOL);
+	HRESULT DXTraceW (char*, DWORD, HRESULT, WCHAR*, BOOL);
+}
+
+version (Unicode) {
+	alias DXGetErrorString8W DXGetErrorString8;
+	alias DXGetErrorDescription8W DXGetErrorDescription8;
+	alias DXTraceW DXTrace;
+} else {
+	alias DXGetErrorString8A DXGetErrorString8;
+	alias DXGetErrorDescription8A DXGetErrorDescription8;
+	alias DXTraceA DXTrace;
+}
+
+debug (dxerr) {
+	HRESULT DXTRACE_MSG(TCHAR* str) {
+		return DXTrace(__FILE__, __LINE__, 0, str, FALSE);
+	}
+
+	HRESULT DXTRACE_ERR(TCHAR* str, HRESULT hr) {
+		return DXTrace(__FILE__, __LINE__, hr, str, TRUE);
+	}
+
+	HRESULT DXTRACE_ERR_NOMSGBOX (WCHAR* str, HRESULT hr) {
+		return DXTrace(__FILE__, __LINE__, hr, str, FALSE);
+	}
+} else {
+	HRESULT DXTRACE_MSG(TCHAR* str) {
+		return 0;
+	}
+
+	HRESULT DXTRACE_ERR(TCHAR* str, HRESULT hr) {
+		return hr;
+	}
+
+	HRESULT DXTRACE_ERR_NOMSGBOX(TCHAR* str, HRESULT hr) {
+		return hr;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/dxerr9.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,69 @@
+/***********************************************************************\
+*                                dxerr9.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.directx.dxerr9;
+
+/*
+	dxerr9.h - Header file for the DirectX 9 Error API
+
+	Written by Filip Navara <xnavara@volny.cz>
+	Ported to D by James Pelcis <jpelcis@gmail.com>
+
+	This library is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+*/
+
+private import win32.windef;
+
+extern (Windows) {
+	char* DXGetErrorString9A(HRESULT);
+	WCHAR* DXGetErrorString9W(HRESULT);
+	char* DXGetErrorDescription9A(HRESULT);
+	WCHAR* DXGetErrorDescription9W(HRESULT);
+	HRESULT DXTraceA(char*, DWORD, HRESULT, char*, BOOL);
+	HRESULT DXTraceW(char*, DWORD, HRESULT, WCHAR*, BOOL);
+}
+
+version (Unicode) {
+	alias DXGetErrorString9W DXGetErrorString9;
+	alias DXGetErrorDescription9W DXGetErrorDescription9;
+	alias DXTraceW DXTrace;
+} else {
+	alias DXGetErrorString9A DXGetErrorString9;
+	alias DXGetErrorDescription9A DXGetErrorDescription9;
+	alias DXTraceA DXTrace;
+}
+
+debug (dxerr) {
+	HRESULT DXTRACE_MSG(TCHAR* str) {
+		return DXTrace(__FILE__, cast(DWORD)__LINE__, 0, str, FALSE);
+	}
+
+	HRESULT DXTRACE_ERR(TCHAR* str, HRESULT hr) {
+		return DXTrace(__FILE__, cast(DWORD)__LINE__, hr, str, FALSE);
+	}
+
+	HRESULT DXTRACE_ERR_NOMSGBOX(TCHAR* str, HRESULT hr) {
+		return DXTrace(__FILE__, cast(DWORD)__LINE__, hr, str, TRUE);
+	}
+} else {
+	HRESULT DXTRACE_MSG(TCHAR* str) {
+		return 0;
+	}
+
+	HRESULT DXTRACE_ERR(TCHAR* str, HRESULT hr) {
+		return hr;
+	}
+
+	HRESULT DXTRACE_ERR_NOMSGBOX(TCHAR* str, HRESULT hr) {
+		return hr;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/dxgi.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,211 @@
+/***********************************************************************\
+*                                 dxgi.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.directx.dxgi;
+
+private import win32.windows;
+
+private import win32.directx.dxgitype;
+
+enum {
+	DXGI_CPU_ACCESS_NONE		=  0,
+	DXGI_CPU_ACCESS_DYNAMIC		=  1,
+	DXGI_CPU_ACCESS_READ_WRITE	=  2,
+	DXGI_CPU_ACCESS_SCRATCH		=  3,
+	DXGI_CPU_ACCESS_FIELD		= 15
+}
+
+enum {
+	DXGI_USAGE_SHADER_INPUT			= 0b00_00010000,
+	DXGI_USAGE_RENDER_TARGET_OUTPUT	= 0b00_00100000,
+	DXGI_USAGE_BACK_BUFFER			= 0b00_01000000,
+	DXGI_USAGE_SHARED				= 0b00_10000000,
+	DXGI_USAGE_READ_ONLY			= 0b01_00000000,
+	DXGI_USAGE_DISCARD_ON_PRESENT	= 0b10_00000000,
+}
+alias UINT DXGI_USAGE;
+
+struct DXGI_FRAME_STATISTICS {
+	UINT PresentCount;
+	UINT PresentRefreshCount;
+	UINT SyncRefreshCount;
+	LARGE_INTEGER SyncQPCTime;
+	LARGE_INTEGER SyncGPUTime;
+}
+
+struct DXGI_MAPPED_RECT {
+	INT Pitch;
+	BYTE* pBits;
+}
+
+struct DXGI_ADAPTER_DESC {
+	WCHAR[128] Description;
+	UINT VendorId;
+	UINT DeviceId;
+	UINT SubSysId;
+	UINT Revision;
+	SIZE_T DedicatedVideoMemory;
+	SIZE_T DedicatedSystemMemory;
+	SIZE_T SharedSystemMemory;
+	LUID AdapterLuid;
+}
+
+struct DXGI_OUTPUT_DESC {
+	WCHAR[32] DeviceName;
+	RECT DesktopCoordinates;
+	BOOL AttachedToDesktop;
+	DXGI_MODE_ROTATION Rotation;
+	HMONITOR Monitor;
+}
+
+struct DXGI_SHARED_RESOURCE {
+	HANDLE Handle;
+}
+
+enum {
+	DXGI_RESOURCE_PRIORITY_MINIMUM	= 0x28000000,
+	DXGI_RESOURCE_PRIORITY_LOW		= 0x50000000,
+	DXGI_RESOURCE_PRIORITY_NORMAL	= 0x78000000,
+	DXGI_RESOURCE_PRIORITY_HIGH		= 0xa0000000,
+	DXGI_RESOURCE_PRIORITY_MAXIMUM	= 0xc8000000
+}
+
+enum DXGI_RESIDENCY {
+	DXGI_RESIDENCY_FULLY_RESIDENT				= 1,
+	DXGI_RESIDENCY_RESIDENT_IN_SHARED_MEMORY	= 2,
+	DXGI_RESIDENCY_EVICTED_TO_DISK				= 3
+}
+
+struct DXGI_SURFACE_DESC {
+	UINT Width;
+	UINT Height;
+	DXGI_FORMAT Format;
+	DXGI_SAMPLE_DESC SampleDesc;
+}
+
+enum DXGI_SWAP_EFFECT {
+	DXGI_SWAP_EFFECT_DISCARD	= 0,
+	DXGI_SWAP_EFFECT_SEQUENTIAL	= 1
+}
+
+enum DXGI_SWAP_CHAIN_FLAG {
+	DXGI_SWAP_CHAIN_FLAG_NONPREROTATED		= 1,
+	DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH	= 2
+}
+
+struct DXGI_SWAP_CHAIN_DESC {
+	DXGI_MODE_DESC BufferDesc;
+	DXGI_SAMPLE_DESC SampleDesc;
+	DXGI_USAGE BufferUsage;
+	UINT BufferCount;
+	HWND OutputWindow;
+	BOOL Windowed;
+	DXGI_SWAP_EFFECT SwapEffect;
+	UINT Flags;
+}
+
+interface IDXGIObject : IUnknown {
+	extern(Windows) :
+	HRESULT SetPrivateData(REFGUID Name, UINT DataSize, void* pData);
+	HRESULT SetPrivateDataInterface(REFGUID Name, IUnknown pUnknown);
+	HRESULT GetPrivateData(REFGUID Name, UINT* pDataSize, void* pData);
+	HRESULT GetParent(REFIID riid, void** ppParent);
+}
+
+interface IDXGIDeviceSubObject : IDXGIObject {
+	extern(Windows) :
+	HRESULT GetDevice(REFIID riid, void** ppDevice);
+}
+
+interface IDXGIResource : IDXGIDeviceSubObject {
+	extern(Windows) :
+	HRESULT GetSharedHandle(HANDLE* pSharedHandle);
+	HRESULT GetUsage(DXGI_USAGE* pUsage);
+	HRESULT SetEvictionPriority(UINT EvictionPriority);
+	HRESULT GetEvictionPriority(UINT* pEvictionPriority);
+}
+
+interface IDXGISurface : IDXGIDeviceSubObject {
+	extern(Windows) :
+	HRESULT GetDesc(DXGI_SURFACE_DESC* pDesc);
+	HRESULT Map(DXGI_MAPPED_RECT* pLockedRect, UINT MapFlags);
+	HRESULT Unmap();
+}
+
+interface IDXGIAdapter : IDXGIObject {
+	extern(Windows) :
+	HRESULT EnumOutputs(UINT Output, IDXGIOutput* ppOutput);
+	HRESULT GetDesc(DXGI_ADAPTER_DESC* pDesc);
+	HRESULT CheckInterfaceSupport(REFGUID InterfaceName, LARGE_INTEGER* pUMDVersion);
+}
+
+interface IDXGIOutput : IDXGIObject {
+	extern(Windows) :
+	HRESULT GetDesc(DXGI_OUTPUT_DESC* pDesc);
+	HRESULT GetDisplayModeList(DXGI_FORMAT EnumFormat, UINT Flags, UINT* pNumModes, DXGI_MODE_DESC* pDesc);
+	HRESULT FindClosestMatchingMode(DXGI_MODE_DESC* pModeToMatch, DXGI_MODE_DESC* pClosestMatch, IUnknown pConcernedDevice);
+	HRESULT WaitForVBlank();
+	HRESULT TakeOwnership(IUnknown pDevice, BOOL Exclusive);
+	void ReleaseOwnership();
+	HRESULT GetGammaControlCapabilities(DXGI_GAMMA_CONTROL_CAPABILITIES* pGammaCaps);
+	HRESULT SetGammaControl(DXGI_GAMMA_CONTROL* pArray);
+	HRESULT GetGammaControl(DXGI_GAMMA_CONTROL* pArray);
+	HRESULT SetDisplaySurface(IDXGISurface pScanoutSurface);
+	HRESULT GetDisplaySurfaceData(IDXGISurface pDestination);
+	HRESULT GetFrameStatistics(DXGI_FRAME_STATISTICS* pStats);
+}
+
+const DXGI_MAX_SWAP_CHAIN_BUFFERS = 16;
+
+enum {
+	DXGI_PRESENT_TEST				= 0x00000001,
+	DXGI_PRESENT_DO_NOT_SEQUENCE	= 0x00000002,
+	DXGI_PRESENT_RESTART			= 0x00000004
+}
+
+interface IDXGISwapChain : IDXGIDeviceSubObject {
+	extern(Windows) :
+	HRESULT Present(UINT SyncInterval, UINT Flags);
+	HRESULT GetBuffer(UINT Buffer, REFIID riid, void** ppSurface);
+	HRESULT SetFullscreenState(BOOL Fullscreen, IDXGIOutput pTarget);
+	HRESULT GetFullscreenState(BOOL* pFullscreen, IDXGIOutput* ppTarget);
+	HRESULT GetDesc(DXGI_SWAP_CHAIN_DESC* pDesc);
+	HRESULT ResizeBuffers(UINT BufferCount, UINT Width, UINT Height, DXGI_FORMAT NewFormat, UINT SwapChainFlags);
+	HRESULT ResizeTarget(DXGI_MODE_DESC* pNewTargetParameters);
+	HRESULT GetContainingOutput(IDXGIOutput* ppOutput);
+	HRESULT GetFrameStatistics(DXGI_FRAME_STATISTICS* pStats);
+	HRESULT GetLastPresentCount(UINT* pLastPresentCount);
+}
+
+interface IDXGIFactory : IDXGIObject {
+	extern(Windows) :
+	HRESULT EnumAdapters(UINT Adapter, IDXGIAdapter* ppAdapter);
+	HRESULT MakeWindowAssociation(HWND WindowHandle, UINT Flags);
+	HRESULT GetWindowAssociation(HWND* pWindowHandle);
+	HRESULT CreateSwapChain(IUnknown pDevice, DXGI_SWAP_CHAIN_DESC* pDesc, IDXGISwapChain* ppSwapChain);
+	HRESULT CreateSoftwareAdapter(HMODULE Module, IDXGIAdapter* ppAdapter);
+}
+
+interface IDXGIDevice : IDXGIObject {
+	extern(Windows) :
+	HRESULT GetAdapter(IDXGIAdapter* pAdapter);
+	HRESULT CreateSurface(DXGI_SURFACE_DESC* pDesc, UINT NumSurfaces, DXGI_USAGE Usage, DXGI_SHARED_RESOURCE* pSharedResource, IDXGISurface* ppSurface);
+	HRESULT QueryResourceResidency(IUnknown* ppResources, DXGI_RESIDENCY* pResidencyStatus, UINT NumResources);
+	HRESULT SetGPUThreadPriority(INT Priority);
+	HRESULT GetGPUThreadPriority(INT* pPriority);
+}
+
+extern(C) const GUID IID_IDXGIObject			= {0xaec22fb8, 0x76f3, 0x4639, [0x9b, 0xe0, 0x28, 0xeb, 0x43, 0xa6, 0x7a, 0x2e]};
+extern(C) const GUID IID_IDXGIDeviceSubObject	= {0x3d3e0379, 0xf9de, 0x4d58, [0xbb, 0x6c, 0x18, 0xd6, 0x29, 0x92, 0xf1, 0xa6]};
+extern(C) const GUID IID_IDXGIResource			= {0x035f3ab4, 0x482e, 0x4e50, [0xb4, 0x1f, 0x8a, 0x7f, 0x8b, 0xd8, 0x96, 0x0b]};
+extern(C) const GUID IID_IDXGISurface			= {0xcafcb56c, 0x6ac3, 0x4889, [0xbf, 0x47, 0x9e, 0x23, 0xbb, 0xd2, 0x60, 0xec]};
+extern(C) const GUID IID_IDXGIAdapter			= {0x2411e7e1, 0x12ac, 0x4ccf, [0xbd, 0x14, 0x97, 0x98, 0xe8, 0x53, 0x4d, 0xc0]};
+extern(C) const GUID IID_IDXGIOutput			= {0xae02eedb, 0xc735, 0x4690, [0x8d, 0x52, 0x5a, 0x8d, 0xc2, 0x02, 0x13, 0xaa]};
+extern(C) const GUID IID_IDXGISwapChain			= {0x310d36a0, 0xd2e7, 0x4c0a, [0xaa, 0x04, 0x6a, 0x9d, 0x23, 0xb8, 0x88, 0x6a]};
+extern(C) const GUID IID_IDXGIFactory			= {0x7b7166ec, 0x21c7, 0x44ae, [0xb2, 0x1a, 0xc9, 0xae, 0x32, 0x1a, 0xe3, 0x69]};
+extern(C) const GUID IID_IDXGIDevice			= {0x54ec77fa, 0x1377, 0x44e6, [0x8c, 0x32, 0x88, 0xfd, 0x5f, 0x44, 0xc8, 0x4c]};
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/directx/dxgitype.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,195 @@
+/***********************************************************************\
+*                                dxgitype.d                             *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.directx.dxgitype;
+
+private import win32.windows;
+
+const _FACDXGI = 0x87a;
+
+HRESULT MAKE_DXGI_HRESULT(T)(T code) {
+	return MAKE_HRESULT(1, _FACDXGI, code);
+}
+
+HRESULT MAKE_DXGI_STATUS(T)(T code) {
+	return MAKE_HRESULT(0, _FACDXGI, code);
+}
+
+const HRESULT DXGI_STATUS_OCCLUDED						= MAKE_DXGI_STATUS(1);
+const HRESULT DXGI_STATUS_CLIPPED						= MAKE_DXGI_STATUS(2);
+const HRESULT DXGI_STATUS_NO_REDIRECTION				= MAKE_DXGI_STATUS(4);
+const HRESULT DXGI_STATUS_NO_DESKTOP_ACCESS				= MAKE_DXGI_STATUS(5);
+const HRESULT DXGI_STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE	= MAKE_DXGI_STATUS(6);
+const HRESULT DXGI_STATUS_MODE_CHANGED					= MAKE_DXGI_STATUS(7);
+const HRESULT DXGI_STATUS_MODE_CHANGE_IN_PROGRESS		= MAKE_DXGI_STATUS(8);
+const HRESULT DXGI_ERROR_INVALID_CALL					= MAKE_DXGI_HRESULT( 1);
+const HRESULT DXGI_ERROR_NOT_FOUND						= MAKE_DXGI_HRESULT( 2);
+const HRESULT DXGI_ERROR_MORE_DATA						= MAKE_DXGI_HRESULT( 3);
+const HRESULT DXGI_ERROR_UNSUPPORTED					= MAKE_DXGI_HRESULT( 4);
+const HRESULT DXGI_ERROR_DEVICE_REMOVED					= MAKE_DXGI_HRESULT( 5);
+const HRESULT DXGI_ERROR_DEVICE_HUNG					= MAKE_DXGI_HRESULT( 6);
+const HRESULT DXGI_ERROR_DEVICE_RESET					= MAKE_DXGI_HRESULT( 7);
+const HRESULT DXGI_ERROR_WAS_STILL_DRAWING				= MAKE_DXGI_HRESULT(10);
+const HRESULT DXGI_ERROR_FRAME_STATISTICS_DISJOINT		= MAKE_DXGI_HRESULT(11);
+const HRESULT DXGI_ERROR_GRAPHICS_VIDPN_SOURCE_IN_USE	= MAKE_DXGI_HRESULT(12);
+const HRESULT DXGI_ERROR_DRIVER_INTERNAL_ERROR			= MAKE_DXGI_HRESULT(32);
+const HRESULT DXGI_ERROR_NONEXCLUSIVE					= MAKE_DXGI_HRESULT(33);
+const HRESULT DXGI_ERROR_NOT_CURRENTLY_AVAILABLE		= MAKE_DXGI_HRESULT(34);
+const HRESULT DXGI_FORMAT_DEFINED						= 1;
+
+enum DXGI_FORMAT {
+	DXGI_FORMAT_UNKNOWN						= 0,
+	DXGI_FORMAT_R32G32B32A32_TYPELESS,
+	DXGI_FORMAT_R32G32B32A32_FLOAT,
+	DXGI_FORMAT_R32G32B32A32_UINT,
+	DXGI_FORMAT_R32G32B32A32_SINT,
+	DXGI_FORMAT_R32G32B32_TYPELESS,
+	DXGI_FORMAT_R32G32B32_FLOAT,
+	DXGI_FORMAT_R32G32B32_UINT,
+	DXGI_FORMAT_R32G32B32_SINT,
+	DXGI_FORMAT_R16G16B16A16_TYPELESS,
+	DXGI_FORMAT_R16G16B16A16_FLOAT,
+	DXGI_FORMAT_R16G16B16A16_UNORM,
+	DXGI_FORMAT_R16G16B16A16_UINT,
+	DXGI_FORMAT_R16G16B16A16_SNORM,
+	DXGI_FORMAT_R16G16B16A16_SINT,
+	DXGI_FORMAT_R32G32_TYPELESS,
+	DXGI_FORMAT_R32G32_FLOAT,
+	DXGI_FORMAT_R32G32_UINT,
+	DXGI_FORMAT_R32G32_SINT,
+	DXGI_FORMAT_R32G8X24_TYPELESS,
+	DXGI_FORMAT_D32_FLOAT_S8X24_UINT,
+	DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS,
+	DXGI_FORMAT_X32_TYPELESS_G8X24_UINT,
+	DXGI_FORMAT_R10G10B10A2_TYPELESS,
+	DXGI_FORMAT_R10G10B10A2_UNORM,
+	DXGI_FORMAT_R10G10B10A2_UINT,
+	DXGI_FORMAT_R11G11B10_FLOAT,
+	DXGI_FORMAT_R8G8B8A8_TYPELESS,
+	DXGI_FORMAT_R8G8B8A8_UNORM,
+	DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
+	DXGI_FORMAT_R8G8B8A8_UINT,
+	DXGI_FORMAT_R8G8B8A8_SNORM,
+	DXGI_FORMAT_R8G8B8A8_SINT,
+	DXGI_FORMAT_R16G16_TYPELESS,
+	DXGI_FORMAT_R16G16_FLOAT,
+	DXGI_FORMAT_R16G16_UNORM,
+	DXGI_FORMAT_R16G16_UINT,
+	DXGI_FORMAT_R16G16_SNORM,
+	DXGI_FORMAT_R16G16_SINT,
+	DXGI_FORMAT_R32_TYPELESS,
+	DXGI_FORMAT_D32_FLOAT,
+	DXGI_FORMAT_R32_FLOAT,
+	DXGI_FORMAT_R32_UINT,
+	DXGI_FORMAT_R32_SINT,
+	DXGI_FORMAT_R24G8_TYPELESS,
+	DXGI_FORMAT_D24_UNORM_S8_UINT,
+	DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
+	DXGI_FORMAT_X24_TYPELESS_G8_UINT,
+	DXGI_FORMAT_R8G8_TYPELESS,
+	DXGI_FORMAT_R8G8_UNORM,
+	DXGI_FORMAT_R8G8_UINT,
+	DXGI_FORMAT_R8G8_SNORM,
+	DXGI_FORMAT_R8G8_SINT,
+	DXGI_FORMAT_R16_TYPELESS,
+	DXGI_FORMAT_R16_FLOAT,
+	DXGI_FORMAT_D16_UNORM,
+	DXGI_FORMAT_R16_UNORM,
+	DXGI_FORMAT_R16_UINT,
+	DXGI_FORMAT_R16_SNORM,
+	DXGI_FORMAT_R16_SINT,
+	DXGI_FORMAT_R8_TYPELESS,
+	DXGI_FORMAT_R8_UNORM,
+	DXGI_FORMAT_R8_UINT,
+	DXGI_FORMAT_R8_SNORM,
+	DXGI_FORMAT_R8_SINT,
+	DXGI_FORMAT_A8_UNORM,
+	DXGI_FORMAT_R1_UNORM,
+	DXGI_FORMAT_R9G9B9E5_SHAREDEXP,
+	DXGI_FORMAT_R8G8_B8G8_UNORM,
+	DXGI_FORMAT_G8R8_G8B8_UNORM,
+	DXGI_FORMAT_BC1_TYPELESS,
+	DXGI_FORMAT_BC1_UNORM,
+	DXGI_FORMAT_BC1_UNORM_SRGB,
+	DXGI_FORMAT_BC2_TYPELESS,
+	DXGI_FORMAT_BC2_UNORM,
+	DXGI_FORMAT_BC2_UNORM_SRGB,
+	DXGI_FORMAT_BC3_TYPELESS,
+	DXGI_FORMAT_BC3_UNORM,
+	DXGI_FORMAT_BC3_UNORM_SRGB,
+	DXGI_FORMAT_BC4_TYPELESS,
+	DXGI_FORMAT_BC4_UNORM,
+	DXGI_FORMAT_BC4_SNORM,
+	DXGI_FORMAT_BC5_TYPELESS,
+	DXGI_FORMAT_BC5_UNORM,
+	DXGI_FORMAT_BC5_SNORM,
+	DXGI_FORMAT_B5G6R5_UNORM,
+	DXGI_FORMAT_B5G5R5A1_UNORM,
+	DXGI_FORMAT_B8G8R8A8_UNORM,
+	DXGI_FORMAT_B8G8R8X8_UNORM,
+	DXGI_FORMAT_FORCE_UINT			= 0xffffffff
+}
+
+struct DXGI_RGB {
+	float Red;
+	float Green;
+	float Blue;
+}
+
+struct DXGI_GAMMA_CONTROL {
+	DXGI_RGB Scale;
+	DXGI_RGB Offset;
+	DXGI_RGB[1025] GammaCurve;
+}
+
+struct DXGI_GAMMA_CONTROL_CAPABILITIES {
+	BOOL ScaleAndOffsetSupported;
+	float MaxConvertedValue;
+	float MinConvertedValue;
+	UINT NumGammaControlPoints;
+	float[1025] ControlPointPositions;
+}
+
+struct DXGI_RATIONAL {
+	UINT Numerator;
+	UINT Denominator;
+}
+
+enum DXGI_MODE_SCANLINE_ORDER {
+	DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED		= 0,
+	DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE		= 1,
+	DXGI_MODE_SCANLINE_ORDER_UPPER_FIELD_FIRST	= 2,
+	DXGI_MODE_SCANLINE_ORDER_LOWER_FIELD_FIRST	= 3
+}
+
+enum DXGI_MODE_SCALING {
+	DXGI_MODE_SCALING_UNSPECIFIED	= 0,
+	DXGI_MODE_SCALING_CENTERED		= 1,
+	DXGI_MODE_SCALING_STRETCHED		= 2
+}
+
+enum DXGI_MODE_ROTATION {
+	DXGI_MODE_ROTATION_UNSPECIFIED	= 0,
+	DXGI_MODE_ROTATION_IDENTITY		= 1,
+	DXGI_MODE_ROTATION_ROTATE90		= 2,
+	DXGI_MODE_ROTATION_ROTATE180	= 3,
+	DXGI_MODE_ROTATION_ROTATE270	= 4
+}
+
+struct DXGI_MODE_DESC {
+	UINT Width;
+	UINT Height;
+	DXGI_RATIONAL RefreshRate;
+	DXGI_FORMAT Format;
+	DXGI_MODE_SCANLINE_ORDER ScanlineOrdering;
+	DXGI_MODE_SCALING Scaling;
+}
+
+struct DXGI_SAMPLE_DESC {
+	UINT Count;
+	UINT Quality;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/dlgs.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,191 @@
+/***********************************************************************\
+*                                 dlgs.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.dlgs;
+
+private import win32.windef;
+
+enum : ushort {
+	FILEOPENORD      = 1536,
+	MULTIFILEOPENORD = 1537,
+	PRINTDLGORD      = 1538,
+	PRNSETUPDLGORD   = 1539,
+	FINDDLGORD       = 1540,
+	REPLACEDLGORD    = 1541,
+	FONTDLGORD       = 1542,
+	FORMATDLGORD31   = 1543,
+	FORMATDLGORD30   = 1544,
+	PAGESETUPDLGORD  = 1546
+}
+
+enum : int {
+	ctlFirst = 0x400,
+	ctlLast  = 0x4ff,
+	chx1     = 0x410,
+	chx2     = 0x411,
+	chx3     = 0x412,
+	chx4     = 0x413,
+	chx5     = 0x414,
+	chx6     = 0x415,
+	chx7     = 0x416,
+	chx8     = 0x417,
+	chx9     = 0x418,
+	chx10    = 0x419,
+	chx11    = 0x41a,
+	chx12    = 0x41b,
+	chx13    = 0x41c,
+	chx14    = 0x41d,
+	chx15    = 0x41e,
+	chx16    = 0x41f,
+	cmb1     = 0x470,
+	cmb2     = 0x471,
+	cmb3     = 0x472,
+	cmb4     = 0x473,
+	cmb5     = 0x474,
+	cmb6     = 0x475,
+	cmb7     = 0x476,
+	cmb8     = 0x477,
+	cmb9     = 0x478,
+	cmb10    = 0x479,
+	cmb11    = 0x47a,
+	cmb12    = 0x47b,
+	cmb13    = 0x47c,
+	cmb14    = 0x47d,
+	cmb15    = 0x47e,
+	cmb16    = 0x47f,
+	edt1     = 0x480,
+	edt2     = 0x481,
+	edt3     = 0x482,
+	edt4     = 0x483,
+	edt5     = 0x484,
+	edt6     = 0x485,
+	edt7     = 0x486,
+	edt8     = 0x487,
+	edt9     = 0x488,
+	edt10    = 0x489,
+	edt11    = 0x48a,
+	edt12    = 0x48b,
+	edt13    = 0x48c,
+	edt14    = 0x48d,
+	edt15    = 0x48e,
+	edt16    = 0x48f,
+	frm1     = 0x434,
+	frm2     = 0x435,
+	frm3     = 0x436,
+	frm4     = 0x437,
+	grp1     = 0x430,
+	grp2     = 0x431,
+	grp3     = 0x432,
+	grp4     = 0x433,
+	ico1     = 0x43c,
+	ico2     = 0x43d,
+	ico3     = 0x43e,
+	ico4     = 0x43f,
+	lst1     = 0x460,
+	lst2     = 0x461,
+	lst3     = 0x462,
+	lst4     = 0x463,
+	lst5     = 0x464,
+	lst6     = 0x465,
+	lst7     = 0x466,
+	lst8     = 0x467,
+	lst9     = 0x468,
+	lst10    = 0x469,
+	lst11    = 0x46a,
+	lst12    = 0x46b,
+	lst13    = 0x46c,
+	lst14    = 0x46d,
+	lst15    = 0x46e,
+	lst16    = 0x46f,
+	psh1     = 0x400,
+	psh2     = 0x401,
+	psh3     = 0x402,
+	psh4     = 0x403,
+	psh5     = 0x404,
+	psh6     = 0x405,
+	psh7     = 0x406,
+	psh8     = 0x407,
+	psh9     = 0x408,
+	psh10    = 0x409,
+	psh11    = 0x40a,
+	psh12    = 0x40b,
+	psh13    = 0x40c,
+	psh14    = 0x40d,
+	psh15    = 0x40e,
+	pshHelp  = 0x40e,
+	psh16    = 0x40f,
+	rad1     = 0x420,
+	rad2     = 0x421,
+	rad3     = 0x422,
+	rad4     = 0x423,
+	rad5     = 0x424,
+	rad6     = 0x425,
+	rad7     = 0x426,
+	rad8     = 0x427,
+	rad9     = 0x428,
+	rad10    = 0x429,
+	rad11    = 0x42a,
+	rad12    = 0x42b,
+	rad13    = 0x42c,
+	rad14    = 0x42d,
+	rad15    = 0x42e,
+	rad16    = 0x42f,
+	rct1     = 0x438,
+	rct2     = 0x439,
+	rct3     = 0x43a,
+	rct4     = 0x43b,
+	scr1     = 0x490,
+	scr2     = 0x491,
+	scr3     = 0x492,
+	scr4     = 0x493,
+	scr5     = 0x494,
+	scr6     = 0x495,
+	scr7     = 0x496,
+	scr8     = 0x497,
+	stc1     = 0x440,
+	stc2     = 0x441,
+	stc3     = 0x442,
+	stc4     = 0x443,
+	stc5     = 0x444,
+	stc6     = 0x445,
+	stc7     = 0x446,
+	stc8     = 0x447,
+	stc9     = 0x448,
+	stc10    = 0x449,
+	stc11    = 0x44a,
+	stc12    = 0x44b,
+	stc13    = 0x44c,
+	stc14    = 0x44d,
+	stc15    = 0x44e,
+	stc16    = 0x44f,
+	stc17    = 0x450,
+	stc18    = 0x451,
+	stc19    = 0x452,
+	stc20    = 0x453,
+	stc21    = 0x454,
+	stc22    = 0x455,
+	stc23    = 0x456,
+	stc24    = 0x457,
+	stc25    = 0x458,
+	stc26    = 0x459,
+	stc27    = 0x45a,
+	stc28    = 0x45b,
+	stc29    = 0x45c,
+	stc30    = 0x45d,
+	stc31    = 0x45e,
+	stc32    = 0x45f
+}
+
+struct CRGB {
+	ubyte bRed;
+	ubyte bGreen;
+	ubyte bBlue;
+	ubyte bExtra;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/docobj.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,133 @@
+/***********************************************************************\
+*                              docobj.d                                 *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.docobj;
+
+private import win32.basetyps, win32.oaidl, win32.objidl, win32.oleidl,
+  win32.unknwn, win32.windef, win32.wtypes;
+
+// FIXME: remove inherited methods from interface definitions
+
+enum {
+	OLECMDERR_E_UNKNOWNGROUP = -2147221244,
+	OLECMDERR_E_CANCELED     = -2147221245,
+	OLECMDERR_E_NOHELP       = -2147221246,
+	OLECMDERR_E_DISABLED     = -2147221247,
+	OLECMDERR_E_NOTSUPPORTED = -2147221248
+}
+
+enum OLECMDID {
+	OLECMDID_OPEN = 1,
+	OLECMDID_NEW = 2,
+	OLECMDID_SAVE = 3,
+	OLECMDID_SAVEAS = 4,
+	OLECMDID_SAVECOPYAS = 5,
+	OLECMDID_PRINT = 6,
+	OLECMDID_PRINTPREVIEW = 7,
+	OLECMDID_PAGESETUP = 8,
+	OLECMDID_SPELL = 9,
+	OLECMDID_PROPERTIES = 10,
+	OLECMDID_CUT = 11,
+	OLECMDID_COPY = 12,
+	OLECMDID_PASTE = 13,
+	OLECMDID_PASTESPECIAL = 14,
+	OLECMDID_UNDO = 15,
+	OLECMDID_REDO = 16,
+	OLECMDID_SELECTALL = 17,
+	OLECMDID_CLEARSELECTION = 18,
+	OLECMDID_ZOOM = 19,
+	OLECMDID_GETZOOMRANGE = 20,
+	OLECMDID_UPDATECOMMANDS = 21,
+	OLECMDID_REFRESH = 22,
+	OLECMDID_STOP = 23,
+	OLECMDID_HIDETOOLBARS = 24,
+	OLECMDID_SETPROGRESSMAX = 25,
+	OLECMDID_SETPROGRESSPOS = 26,
+	OLECMDID_SETPROGRESSTEXT = 27,
+	OLECMDID_SETTITLE = 28,
+	OLECMDID_SETDOWNLOADSTATE = 29,
+	OLECMDID_STOPDOWNLOAD = 30
+}
+
+enum OLECMDF {
+	OLECMDF_SUPPORTED = 1,
+	OLECMDF_ENABLED = 2,
+	OLECMDF_LATCHED = 4,
+	OLECMDF_NINCHED = 8
+}
+
+enum OLECMDEXECOPT {
+	OLECMDEXECOPT_DODEFAULT = 0,
+	OLECMDEXECOPT_PROMPTUSER = 1,
+	OLECMDEXECOPT_DONTPROMPTUSER = 2,
+	OLECMDEXECOPT_SHOWHELP = 3
+}
+
+struct OLECMDTEXT {
+	DWORD cmdtextf;
+	ULONG cwActual;
+	ULONG cwBuf;
+	wchar rgwz[1];
+}
+
+struct OLECMD {
+	ULONG cmdID;
+	DWORD cmdf;
+}
+
+alias IOleInPlaceSite* LPOLEINPLACESITE;
+alias IEnumOleDocumentViews* LPENUMOLEDOCUMENTVIEWS;
+
+extern (C) extern const IID
+	IID_IContinueCallback,
+	IID_IEnumOleDocumentViews,
+	IID_IPrint,
+	IID_IOleDocumentView,
+	IID_IOleDocument,
+	IID_IOleCommandTarget,
+	IID_IOleDocumentSite;
+
+
+interface IOleDocumentView : public IUnknown {
+	HRESULT SetInPlaceSite(LPOLEINPLACESITE);
+	HRESULT GetInPlaceSite(LPOLEINPLACESITE*);
+	HRESULT GetDocument(IUnknown**);
+	HRESULT SetRect(LPRECT);
+	HRESULT GetRect(LPRECT);
+	HRESULT SetRectComplex(LPRECT, LPRECT, LPRECT, LPRECT);
+	HRESULT Show(BOOL);
+	HRESULT UIActivate(BOOL);
+	HRESULT Open();
+	HRESULT Close(DWORD);
+	HRESULT SaveViewState(IStream*);
+	HRESULT ApplyViewState(IStream*);
+	HRESULT Clone(LPOLEINPLACESITE, IOleDocumentView**);
+}
+
+interface IEnumOleDocumentViews : public IUnknown {
+	  HRESULT Next(ULONG, IOleDocumentView*, ULONG*);
+	  HRESULT Skip(ULONG);
+	  HRESULT Reset();
+	  HRESULT Clone(IEnumOleDocumentViews**);
+}
+
+interface IOleDocument : public IUnknown {
+	HRESULT CreateView(LPOLEINPLACESITE, IStream*, DWORD, IOleDocumentView**);
+	HRESULT GetDocMiscStatus(DWORD*);
+	HRESULT EnumViews(LPENUMOLEDOCUMENTVIEWS*, IOleDocumentView**);
+}
+
+interface IOleCommandTarget : public IUnknown {
+	HRESULT QueryStatus(GUID*, ULONG, OLECMD*, OLECMDTEXT*);
+	HRESULT Exec(GUID*, DWORD, DWORD, VARIANTARG*, VARIANTARG*);
+}
+
+interface IOleDocumentSite : public IUnknown {
+	HRESULT ActivateMe(IOleDocumentView*);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/errorrep.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,40 @@
+/***********************************************************************\
+*                               errorrep.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.errorrep;
+
+private import win32.w32api, win32.windef;
+
+static assert (_WIN32_WINNT >= 0x501,
+	"win32.errorrep is available only if version WindowsXP, Windows2003 "
+	"or WindowsVista is set");
+
+enum EFaultRepRetVal {
+	frrvOk,
+	frrvOkManifest,
+	frrvOkQueued,
+	frrvErr,
+	frrvErrNoDW,
+	frrvErrTimeout,
+	frrvLaunchDebugger,
+	frrvOkHeadless // = 7
+}
+
+extern (Windows) {
+	BOOL AddERExcludedApplicationA(LPCSTR);
+	BOOL AddERExcludedApplicationW(LPCWSTR);
+	EFaultRepRetVal ReportFault(LPEXCEPTION_POINTERS, DWORD);
+}
+
+version (Unicode) {
+	alias AddERExcludedApplicationW AddERExcludedApplication;
+} else {
+	alias AddERExcludedApplicationA AddERExcludedApplication;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/exdisp.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,127 @@
+/***********************************************************************\
+*                               exdisp.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.exdisp;
+
+import win32.docobj, win32.oaidl, win32.ocidl;
+private import win32.basetyps, win32.windef, win32.wtypes;
+
+
+enum BrowserNavConstants {
+	navOpenInNewWindow = 0x01,
+	navNoHistory       = 0x02,
+	navNoReadFromCache = 0x04,
+	navNoWriteTocache  = 0x08,
+	navAllowAutosearch = 0x10,
+	navBrowserBar      = 0x20,
+	navHyperLink       = 0x40
+}
+
+interface IWebBrowser : public IDispatch {
+	HRESULT GoBack();
+	HRESULT GoForward();
+	HRESULT GoHome();
+	HRESULT GoSearch();
+	HRESULT Navigate(BSTR, VARIANT*, VARIANT*, VARIANT*, VARIANT*);
+	HRESULT Refresh();
+	HRESULT Refresh2(VARIANT*);
+	HRESULT Stop();
+	HRESULT get_Application(IDispatch* ppDisp);
+	HRESULT get_Parent(IDispatch* ppDisp);
+	HRESULT get_Container(IDispatch* ppDisp);
+	HRESULT get_Document(IDispatch* ppDisp);
+	HRESULT get_TopLevelContainer(VARIANT_BOOL*);
+	HRESULT get_Type(BSTR*);
+	HRESULT get_Left(LONG*);
+	HRESULT put_Left(LONG);
+	HRESULT get_Top(LONG*);
+	HRESULT put_Top(LONG);
+	HRESULT get_Width(LONG*);
+	HRESULT put_Width(LONG);
+	HRESULT get_Height(LONG*);
+	HRESULT put_Height(LONG);
+	HRESULT get_LocationName(BSTR*);
+	HRESULT get_LocationURL(BSTR*);
+	HRESULT get_Busy(VARIANT_BOOL*);
+}
+
+interface IWebBrowserApp : public IWebBrowser {
+	HRESULT Quit();
+	HRESULT ClientToWindow(int*, int*);
+	HRESULT PutProperty(BSTR, VARIANT);
+	HRESULT GetProperty(BSTR, VARIANT*);
+	HRESULT get_Name(BSTR*);
+	HRESULT get_HWND(LONG*);
+	HRESULT get_FullName(BSTR*);
+	HRESULT get_Path(BSTR*);
+	HRESULT get_Visible(VARIANT_BOOL*);
+	HRESULT put_Visible(VARIANT_BOOL);
+	HRESULT get_StatusBar(VARIANT_BOOL*);
+	HRESULT put_StatusBar(VARIANT_BOOL);
+	HRESULT get_StatusText(BSTR*);
+	HRESULT put_StatusText(BSTR);
+	HRESULT get_ToolBar(int*);
+	HRESULT put_ToolBar(int);
+	HRESULT get_MenuBar(VARIANT_BOOL*);
+	HRESULT put_MenuBar(VARIANT_BOOL);
+	HRESULT get_FullScreen(VARIANT_BOOL*);
+	HRESULT put_FullScreen(VARIANT_BOOL);
+}
+
+interface IWebBrowser2 : public IWebBrowserApp {
+	HRESULT Navigate2(VARIANT*, VARIANT*, VARIANT*, VARIANT*, VARIANT*);
+	HRESULT QueryStatusWB(OLECMDID, OLECMDF*);
+	HRESULT ExecWB(OLECMDID, OLECMDEXECOPT, VARIANT*, VARIANT*);
+	HRESULT ShowBrowserBar(VARIANT*, VARIANT*, VARIANT*);
+	HRESULT get_ReadyState(READYSTATE*);
+	HRESULT get_Offline(VARIANT_BOOL*);
+	HRESULT put_Offline(VARIANT_BOOL);
+	HRESULT get_Silent(VARIANT_BOOL*);
+	HRESULT put_Silent(VARIANT_BOOL);
+	HRESULT get_RegistaerAsBrowser(VARIANT_BOOL*);
+	HRESULT put_RegisterAsBrowser(VARIANT_BOOL);
+	HRESULT get_RegistaerAsDropTarget(VARIANT_BOOL*);
+	HRESULT put_RegisterAsDropTarget(VARIANT_BOOL);
+	HRESULT get_TheaterMode(VARIANT_BOOL*);
+	HRESULT put_TheaterMode(VARIANT_BOOL);
+	HRESULT get_AddressBar(VARIANT_BOOL*);
+	HRESULT put_AddressBar(VARIANT_BOOL);
+	HRESULT get_Resizable(VARIANT_BOOL*);
+	HRESULT put_Resizable(VARIANT_BOOL);
+}
+
+interface DWebBrowserEvents2 : public IDispatch {
+	void StatusTextChange(BSTR);
+	void ProgressChange(LONG, LONG);
+	void CommandStateChange(LONG, VARIANT_BOOL);
+	void DownloadBegin();
+	void DownloadComplete();
+	void TitleChange(BSTR);
+	void PropertyChange(BSTR);
+	void BeforeNavigate2(IDispatch pDisp, VARIANT*, VARIANT*, VARIANT*, VARIANT*, VARIANT*, VARIANT_BOOL*);
+	void NewWindow2(IDispatch* ppDisp, VARIANT_BOOL*);
+	void NavigateComplete(IDispatch pDisp, VARIANT*);
+	void DocumentComplete(IDispatch pDisp, VARIANT*);
+	void OnQuit();
+	void OnVisible(VARIANT_BOOL);
+	void OnToolBar(VARIANT_BOOL);
+	void OnMenuBar(VARIANT_BOOL);
+	void OnStatusBar(VARIANT_BOOL);
+	void OnFullScreen(VARIANT_BOOL);
+	void OnTheaterMode(VARIANT_BOOL);
+	void WindowSetResizable(VARIANT_BOOL);
+	void WindowSetLeft(LONG);
+	void WindowSetTop(LONG);
+	void WindowSetWidth(LONG);
+	void WindowSetHeight(LONG);
+	void WindowClosing(VARIANT_BOOL, VARIANT_BOOL*);
+	void ClientToHostWindow(LONG*, LONG*);
+	void SetSecureLockIcon(LONG);
+	void FileDownload(VARIANT_BOOL*);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/exdispid.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,20 @@
+/***********************************************************************\
+*                               exdispid.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*             Translated from MinGW API for MS-Windows 3.10             *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.exdispid;
+
+enum : int {
+	DISPID_STATUSTEXTCHANGE = 102,
+	DISPID_PROGRESSCHANGE   = 108,
+	DISPID_TITLECHANGE      = 113,
+	DISPID_BEFORENAVIGATE2  = 250,
+	DISPID_NEWWINDOW2       = 251,
+	DISPID_DOCUMENTCOMPLETE = 259
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/httpext.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,114 @@
+/***********************************************************************\
+*                               httpext.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.httpext;
+
+/* Comment from MinGW
+       httpext.h - Header for ISAPI extensions.
+
+       This file is part of a free library for the Win32 API.
+
+       This library is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+*/
+
+private import win32.windows;
+
+enum {
+    HSE_VERSION_MAJOR               = 2,
+    HSE_VERSION_MINOR               = 0,
+    HSE_LOG_BUFFER_LEN              = 80,
+    HSE_MAX_EXT_DLL_NAME_LEN        = 256,
+    HSE_STATUS_SUCCESS              = 1,
+    HSE_STATUS_SUCCESS_AND_KEEP_CONN,
+    HSE_STATUS_PENDING,
+    HSE_STATUS_ERROR,
+    HSE_REQ_BASE                    = 0,
+    HSE_REQ_SEND_URL_REDIRECT_RESP,
+    HSE_REQ_SEND_URL,
+    HSE_REQ_SEND_RESPONSE_HEADER,
+    HSE_REQ_DONE_WITH_SESSION,
+    HSE_REQ_SEND_RESPONSE_HEADER_EX = 1016,
+    HSE_REQ_END_RESERVED            = 1000,
+    HSE_TERM_ADVISORY_UNLOAD        = 0x00000001,
+    HSE_TERM_MUST_UNLOAD,
+    HSE_IO_SYNC                     = 0x00000001,
+    HSE_IO_ASYNC,
+    HSE_IO_DISCONNECT_AFTER_SEND    = 0x00000004,
+    HSE_IO_SEND_HEADERS             = 0x00000008
+}
+
+alias HANDLE HCONN;
+
+struct HSE_VERSION_INFO {
+	DWORD dwExtensionVersion;
+	CHAR[HSE_MAX_EXT_DLL_NAME_LEN] lpszExtensionDesc;
+}
+alias HSE_VERSION_INFO* LPHSE_VERSION_INFO;
+
+struct EXTENSION_CONTROL_BLOCK {
+	DWORD  cbSize = EXTENSION_CONTROL_BLOCK.sizeof;
+	DWORD  dwVersion;
+	HCONN  ConnID;
+	DWORD  dwHttpStatusCode;
+	CHAR[HSE_LOG_BUFFER_LEN] lpszLogData;
+	LPSTR  lpszMethod;
+	LPSTR  lpszQueryString;
+	LPSTR  lpszPathInfo;
+	LPSTR  lpszPathTranslated;
+	DWORD  cbTotalBytes;
+	DWORD  cbAvailable;
+	LPBYTE lpbData;
+	LPSTR  lpszContentType;
+	extern(Pascal) BOOL function(HCONN, LPSTR, LPVOID, LPDWORD)
+	  GetServerVariable;
+	extern(Pascal) BOOL function(HCONN, LPVOID, LPDWORD, DWORD) WriteClient;
+	extern(Pascal) BOOL function(HCONN, LPVOID, LPDWORD) ReadClient;
+	extern(Pascal) BOOL function(HCONN, DWORD, LPVOID, LPDWORD, LPDWORD)
+	  ServerSupportFunction;
+}
+alias EXTENSION_CONTROL_BLOCK* LPEXTENSION_CONTROL_BLOCK;
+
+extern (Pascal) {
+	alias BOOL function(HSE_VERSION_INFO*) PFN_GETEXTENSIONVERSION;
+	alias DWORD function(EXTENSION_CONTROL_BLOCK*) PFN_HTTPEXTENSIONPROC;
+	alias BOOL function(DWORD) PFN_TERMINATEEXTENSION;
+	alias VOID function(EXTENSION_CONTROL_BLOCK*, PVOID, DWORD, DWORD) PFN_HSE_IO_COMPLETION;
+}
+
+struct HSE_TF_INFO {
+	PFN_HSE_IO_COMPLETION pfnHseIO;
+	PVOID  pContext;
+	HANDLE hFile;
+	LPCSTR pszStatusCode;
+	DWORD  BytesToWrite;
+	DWORD  Offset;
+	PVOID  pHead;
+	DWORD  HeadLength;
+	PVOID  pTail;
+	DWORD  TailLength;
+	DWORD  dwFlags;
+}
+alias HSE_TF_INFO* LPHSE_TF_INFO;
+
+struct HSE_SEND_HEADER_EX_INFO {
+	LPCSTR pszStatus;
+	LPCSTR pszHeader;
+	DWORD  cchStatus;
+	DWORD  cchHeader;
+	BOOL   fKeepConn;
+}
+alias HSE_SEND_HEADER_EX_INFO* LPHSE_SEND_HEADER_EX_INF;
+
+extern (Pascal) {
+	BOOL GetExtensionVersion(HSE_VERSION_INFO*);
+	DWORD HttpExtensionProc(EXTENSION_CONTROL_BLOCK*);
+	BOOL TerminateExtension(DWORD);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/idispids.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,16 @@
+/***********************************************************************\
+*                               idispids.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*             Translated from MinGW API for MS-Windows 3.10             *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.idispids;
+
+enum : int {
+	DISPID_AMBIENT_OFFLINEIFNOTCONNECTED = -5501,
+	DISPID_AMBIENT_SILENT                = -5502
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/imagehlp.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,363 @@
+/***********************************************************************\
+*                               imagehlp.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.imagehlp;
+
+/* Comment from MinGW
+	NOTE: This strictly does not belong in the Win32 API since it's
+	really part of Platform SDK. However, GDB needs it and we might
+	as well provide it here.
+*/
+
+private import win32.winbase, win32.windef;
+
+// FIXME: check types of constants
+
+const API_VERSION_NUMBER = 7;
+
+const BIND_NO_BOUND_IMPORTS  = 1;
+const BIND_NO_UPDATE         = 2;
+const BIND_ALL_IMAGES        = 4;
+const BIND_CACHE_IMPORT_DLLS = 8;
+
+enum {
+	CBA_DEFERRED_SYMBOL_LOAD_START = 1,
+	CBA_DEFERRED_SYMBOL_LOAD_COMPLETE,
+	CBA_DEFERRED_SYMBOL_LOAD_FAILURE,
+	CBA_SYMBOLS_UNLOADED,
+	CBA_DUPLICATE_SYMBOL
+}
+
+const CERT_PE_IMAGE_DIGEST_DEBUG_INFO      = 1;
+const CERT_PE_IMAGE_DIGEST_RESOURCES       = 2;
+const CERT_PE_IMAGE_DIGEST_ALL_IMPORT_INFO = 4;
+const CERT_PE_IMAGE_DIGEST_NON_PE_INFO     = 8;
+
+const CERT_SECTION_TYPE_ANY = 255;
+
+enum {
+	CHECKSUM_SUCCESS = 0,
+	CHECKSUM_OPEN_FAILURE,
+	CHECKSUM_MAP_FAILURE,
+	CHECKSUM_MAPVIEW_FAILURE,
+	CHECKSUM_UNICODE_FAILURE
+}
+
+const IMAGE_SEPARATION = 65536;
+
+const SPLITSYM_REMOVE_PRIVATE    = 1;
+const SPLITSYM_EXTRACT_ALL       = 2;
+const SPLITSYM_SYMBOLPATH_IS_SRC = 4;
+
+const SYMF_OMAP_GENERATED = 1;
+const SYMF_OMAP_MODIFIED  = 2;
+
+const SYMOPT_CASE_INSENSITIVE  =  1;
+const SYMOPT_UNDNAME           =  2;
+const SYMOPT_DEFERRED_LOADS    =  4;
+const SYMOPT_NO_CPP            =  8;
+const SYMOPT_LOAD_LINES        = 16;
+const SYMOPT_OMAP_FIND_NEAREST = 32;
+
+const UNDNAME_COMPLETE               =     0;
+const UNDNAME_NO_LEADING_UNDERSCORES =     1;
+const UNDNAME_NO_MS_KEYWORDS         =     2;
+const UNDNAME_NO_FUNCTION_RETURNS    =     4;
+const UNDNAME_NO_ALLOCATION_MODEL    =     8;
+const UNDNAME_NO_ALLOCATION_LANGUAGE =    16;
+const UNDNAME_NO_MS_THISTYPE         =    32;
+const UNDNAME_NO_CV_THISTYPE         =    64;
+const UNDNAME_NO_THISTYPE            =    96;
+const UNDNAME_NO_ACCESS_SPECIFIERS   =   128;
+const UNDNAME_NO_THROW_SIGNATURES    =   256;
+const UNDNAME_NO_MEMBER_TYPE         =   512;
+const UNDNAME_NO_RETURN_UDT_MODEL    =  1024;
+const UNDNAME_32_BIT_DECODE          =  2048;
+const UNDNAME_NAME_ONLY              =  4096;
+const UNDNAME_NO_ARGUMENTS           =  8192;
+const UNDNAME_NO_SPECIAL_SYMS        = 16384;
+
+enum IMAGEHLP_STATUS_REASON {
+	BindOutOfMemory,
+	BindRvaToVaFailed,
+	BindNoRoomInImage,
+	BindImportModuleFailed,
+	BindImportProcedureFailed,
+	BindImportModule,
+	BindImportProcedure,
+	BindForwarder,
+	BindForwarderNOT,
+	BindImageModified,
+	BindExpandFileHeaders,
+	BindImageComplete,
+	BindMismatchedSymbols,
+	BindSymbolsNotUpdated
+}
+
+struct LOADED_IMAGE {
+	LPSTR                 ModuleName;
+	HANDLE                hFile;
+	PUCHAR                MappedAddress;
+	PIMAGE_NT_HEADERS     FileHeader;
+	PIMAGE_SECTION_HEADER LastRvaSection;
+	ULONG                 NumberOfSections;
+	PIMAGE_SECTION_HEADER Sections;
+	ULONG                 Characteristics;
+	BOOLEAN               fSystemImage;
+	BOOLEAN               fDOSImage;
+	LIST_ENTRY            Links;
+	ULONG                 SizeOfImage;
+}
+alias LOADED_IMAGE* PLOADED_IMAGE;
+
+struct IMAGE_DEBUG_INFORMATION {
+	LIST_ENTRY                 List;
+	DWORD                      Size;
+	PVOID                      MappedBase;
+	USHORT                     Machine;
+	USHORT                     Characteristics;
+	DWORD                      CheckSum;
+	DWORD                      ImageBase;
+	DWORD                      SizeOfImage;
+	DWORD                      NumberOfSections;
+	PIMAGE_SECTION_HEADER      Sections;
+	DWORD                      ExportedNamesSize;
+	LPSTR                      ExportedNames;
+	DWORD                      NumberOfFunctionTableEntries;
+	PIMAGE_FUNCTION_ENTRY      FunctionTableEntries;
+	DWORD                      LowestFunctionStartingAddress;
+	DWORD                      HighestFunctionEndingAddress;
+	DWORD                      NumberOfFpoTableEntries;
+	PFPO_DATA                  FpoTableEntries;
+	DWORD                      SizeOfCoffSymbols;
+	PIMAGE_COFF_SYMBOLS_HEADER CoffSymbols;
+	DWORD                      SizeOfCodeViewSymbols;
+	PVOID                      CodeViewSymbols;
+	LPSTR                      ImageFilePath;
+	LPSTR                      ImageFileName;
+	LPSTR                      DebugFilePath;
+	DWORD                      TimeDateStamp;
+	BOOL                       RomImage;
+	PIMAGE_DEBUG_DIRECTORY     DebugDirectory;
+	DWORD                      NumberOfDebugDirectories;
+	DWORD[3]                   Reserved;
+}
+alias IMAGE_DEBUG_INFORMATION* PIMAGE_DEBUG_INFORMATION;
+
+enum ADDRESS_MODE {
+	AddrMode1616,
+	AddrMode1632,
+	AddrModeReal,
+	AddrModeFlat
+}
+
+struct ADDRESS {
+	DWORD        Offset;
+	WORD         Segment;
+	ADDRESS_MODE Mode;
+}
+alias ADDRESS* LPADDRESS;
+
+struct KDHELP {
+	DWORD Thread;
+	DWORD ThCallbackStack;
+	DWORD NextCallback;
+	DWORD FramePointer;
+	DWORD KiCallUserMode;
+	DWORD KeUserCallbackDispatcher;
+	DWORD SystemRangeStart;
+}
+alias KDHELP* PKDHELP;
+
+struct STACKFRAME {
+	ADDRESS  AddrPC;
+	ADDRESS  AddrReturn;
+	ADDRESS  AddrFrame;
+	ADDRESS  AddrStack;
+	LPVOID   FuncTableEntry;
+	DWORD[4] Params;
+	BOOL     Far;
+	BOOL     Virtual;
+	DWORD[3] Reserved;
+	KDHELP   KdHelp;
+}
+alias STACKFRAME* LPSTACKFRAME;
+
+struct API_VERSION {
+	USHORT MajorVersion;
+	USHORT MinorVersion;
+	USHORT Revision;
+	USHORT Reserved;
+}
+alias API_VERSION* LPAPI_VERSION;
+
+enum SYM_TYPE {
+	SymNone,
+	SymCoff,
+	SymCv,
+	SymPdb,
+	SymExport,
+	SymDeferred,
+	SymSym
+}
+
+struct IMAGEHLP_SYMBOL {
+	DWORD   SizeOfStruct;
+	DWORD   Address;
+	DWORD   Size;
+	DWORD   Flags;
+	DWORD   MaxNameLength;
+	CHAR[1] Name;
+}
+alias IMAGEHLP_SYMBOL* PIMAGEHLP_SYMBOL;
+
+struct IMAGEHLP_MODULE {
+	DWORD     SizeOfStruct;
+	DWORD     BaseOfImage;
+	DWORD     ImageSize;
+	DWORD     TimeDateStamp;
+	DWORD     CheckSum;
+	DWORD     NumSyms;
+	SYM_TYPE  SymType;
+	CHAR[32]  ModuleName;
+	CHAR[256] ImageName;
+	CHAR[256] LoadedImageName;
+}
+alias IMAGEHLP_MODULE* PIMAGEHLP_MODULE;
+
+struct IMAGEHLP_LINE {
+	DWORD SizeOfStruct;
+	DWORD Key;
+	DWORD LineNumber;
+	PCHAR FileName;
+	DWORD Address;
+}
+alias IMAGEHLP_LINE* PIMAGEHLP_LINE;
+
+struct IMAGEHLP_DEFERRED_SYMBOL_LOAD {
+	DWORD          SizeOfStruct;
+	DWORD          BaseOfImage;
+	DWORD          CheckSum;
+	DWORD          TimeDateStamp;
+	CHAR[MAX_PATH] FileName;
+	BOOLEAN        Reparse;
+}
+alias IMAGEHLP_DEFERRED_SYMBOL_LOAD* PIMAGEHLP_DEFERRED_SYMBOL_LOAD;
+
+struct IMAGEHLP_DUPLICATE_SYMBOL {
+	DWORD            SizeOfStruct;
+	DWORD            NumberOfDups;
+	PIMAGEHLP_SYMBOL Symbol;
+	ULONG            SelectedSymbol;
+}
+alias IMAGEHLP_DUPLICATE_SYMBOL* PIMAGEHLP_DUPLICATE_SYMBOL;
+
+alias HANDLE DIGEST_HANDLE;
+
+extern (Windows) {
+	alias BOOL function(IMAGEHLP_STATUS_REASON, LPSTR, LPSTR, ULONG, ULONG)
+	  PIMAGEHLP_STATUS_ROUTINE;
+	alias BOOL function(HANDLE , LPCVOID, LPVOID, DWORD, LPDWORD)
+	  PREAD_PROCESS_MEMORY_ROUTINE;
+	alias LPVOID function(HANDLE, DWORD) PFUNCTION_TABLE_ACCESS_ROUTINE;
+	alias DWORD function(HANDLE, DWORD) PGET_MODULE_BASE_ROUTINE;
+	alias DWORD function(HANDLE, HANDLE, LPADDRESS)
+	  PTRANSLATE_ADDRESS_ROUTINE;
+	alias BOOL function(LPSTR, ULONG, PVOID) PSYM_ENUMMODULES_CALLBACK;
+	alias BOOL function(LPSTR, ULONG, ULONG, PVOID) PSYM_ENUMSYMBOLS_CALLBACK;
+	alias BOOL function(LPSTR, ULONG, ULONG, PVOID)
+	  PENUMLOADED_MODULES_CALLBACK;
+	alias BOOL function(HANDLE, ULONG, PVOID, PVOID)
+	  PSYMBOL_REGISTERED_CALLBACK;
+	alias BOOL function(DIGEST_HANDLE refdata, PBYTE pData, DWORD dwLength)
+	  DIGEST_FUNCTION;
+
+	PIMAGE_NT_HEADERS CheckSumMappedFile(LPVOID, DWORD, LPDWORD, LPDWORD);
+	DWORD MapFileAndCheckSumA(LPSTR, LPDWORD, LPDWORD);
+	DWORD MapFileAndCheckSumW(PWSTR, LPDWORD, LPDWORD);
+	BOOL TouchFileTimes(HANDLE, LPSYSTEMTIME);
+	BOOL SplitSymbols(LPSTR, LPSTR, LPSTR, DWORD);
+	HANDLE FindDebugInfoFile(LPSTR, LPSTR, LPSTR);
+	HANDLE FindExecutableImage(LPSTR, LPSTR, LPSTR);
+	BOOL UpdateDebugInfoFile(LPSTR, LPSTR, LPSTR, PIMAGE_NT_HEADERS);
+	BOOL UpdateDebugInfoFileEx(LPSTR, LPSTR, LPSTR, PIMAGE_NT_HEADERS, DWORD);
+	BOOL BindImage(LPSTR, LPSTR, LPSTR);
+	BOOL BindImageEx(DWORD, LPSTR, LPSTR, LPSTR, PIMAGEHLP_STATUS_ROUTINE);
+	BOOL ReBaseImage(LPSTR, LPSTR, BOOL, BOOL, BOOL, ULONG, ULONG*, ULONG*,
+	  ULONG*, ULONG*, ULONG);
+	PLOADED_IMAGE ImageLoad(LPSTR, LPSTR);
+	BOOL ImageUnload(PLOADED_IMAGE);
+	PIMAGE_NT_HEADERS ImageNtHeader(PVOID);
+	PVOID ImageDirectoryEntryToData(PVOID, BOOLEAN, USHORT, PULONG);
+	PIMAGE_SECTION_HEADER ImageRvaToSection(PIMAGE_NT_HEADERS, PVOID, ULONG);
+	PVOID ImageRvaToVa(PIMAGE_NT_HEADERS, PVOID, ULONG,
+	  PIMAGE_SECTION_HEADER*);
+	BOOL MapAndLoad(LPSTR, LPSTR, PLOADED_IMAGE, BOOL, BOOL);
+	BOOL GetImageConfigInformation(PLOADED_IMAGE,
+	  PIMAGE_LOAD_CONFIG_DIRECTORY);
+	DWORD GetImageUnusedHeaderBytes(PLOADED_IMAGE, LPDWORD);
+	BOOL SetImageConfigInformation(PLOADED_IMAGE,
+	  PIMAGE_LOAD_CONFIG_DIRECTORY);
+	BOOL UnMapAndLoad(PLOADED_IMAGE);
+	PIMAGE_DEBUG_INFORMATION MapDebugInformation(HANDLE, LPSTR, LPSTR, DWORD);
+	BOOL UnmapDebugInformation(PIMAGE_DEBUG_INFORMATION);
+	HANDLE FindExecutableImage(LPSTR, LPSTR, LPSTR);
+	BOOL SearchTreeForFile(LPSTR, LPSTR, LPSTR);
+	BOOL MakeSureDirectoryPathExists(LPCSTR);
+	DWORD UnDecorateSymbolName(LPCSTR, LPSTR, DWORD, DWORD);
+	BOOL StackWalk(DWORD, HANDLE, HANDLE, LPSTACKFRAME, LPVOID,
+	  PREAD_PROCESS_MEMORY_ROUTINE, PFUNCTION_TABLE_ACCESS_ROUTINE,
+	  PGET_MODULE_BASE_ROUTINE, PTRANSLATE_ADDRESS_ROUTINE);
+	LPAPI_VERSION ImagehlpApiVersion();
+	LPAPI_VERSION ImagehlpApiVersionEx(LPAPI_VERSION);
+	DWORD GetTimestampForLoadedLibrary(HMODULE);
+	BOOL RemovePrivateCvSymbolic(PCHAR, PCHAR*, ULONG*);
+	VOID RemoveRelocations(PCHAR);
+	DWORD SymSetOptions(DWORD);
+	DWORD SymGetOptions();
+	BOOL SymCleanup(HANDLE);
+	BOOL SymEnumerateModules(HANDLE, PSYM_ENUMMODULES_CALLBACK, PVOID);
+	BOOL SymEnumerateSymbols(HANDLE, DWORD, PSYM_ENUMSYMBOLS_CALLBACK, PVOID);
+	BOOL EnumerateLoadedModules(HANDLE, PENUMLOADED_MODULES_CALLBACK, PVOID);
+	LPVOID SymFunctionTableAccess(HANDLE, DWORD);
+	BOOL SymGetModuleInfo(HANDLE, DWORD, PIMAGEHLP_MODULE);
+	DWORD SymGetModuleBase(HANDLE, DWORD);
+	BOOL SymGetSymFromAddr(HANDLE, DWORD, PDWORD, PIMAGEHLP_SYMBOL);
+	BOOL SymGetSymFromName(HANDLE, LPSTR, PIMAGEHLP_SYMBOL);
+	BOOL SymGetSymNext(HANDLE, PIMAGEHLP_SYMBOL);
+	BOOL SymGetSymPrev(HANDLE, PIMAGEHLP_SYMBOL);
+	BOOL SymGetLineFromAddr(HANDLE, DWORD, PDWORD, PIMAGEHLP_LINE);
+	BOOL SymGetLineFromName(HANDLE, LPSTR, LPSTR, DWORD, PLONG,
+	  PIMAGEHLP_LINE);
+	BOOL SymGetLineNext(HANDLE, PIMAGEHLP_LINE);
+	BOOL SymGetLinePrev(HANDLE, PIMAGEHLP_LINE);
+	BOOL SymMatchFileName(LPSTR, LPSTR, LPSTR*, LPSTR*);
+	BOOL SymInitialize(HANDLE, LPSTR, BOOL);
+	BOOL SymGetSearchPath(HANDLE, LPSTR, DWORD);
+	BOOL SymSetSearchPath(HANDLE, LPSTR);
+	BOOL SymLoadModule(HANDLE, HANDLE, PSTR, PSTR, DWORD, DWORD);
+	BOOL SymUnloadModule(HANDLE, DWORD);
+	BOOL SymUnDName(PIMAGEHLP_SYMBOL, LPSTR, DWORD);
+	BOOL SymRegisterCallback(HANDLE, PSYMBOL_REGISTERED_CALLBACK, PVOID);
+	BOOL ImageGetDigestStream(HANDLE, DWORD, DIGEST_FUNCTION, DIGEST_HANDLE);
+	BOOL ImageAddCertificate(HANDLE, LPWIN_CERTIFICATE, PDWORD);
+	BOOL ImageRemoveCertificate(HANDLE, DWORD);
+	BOOL ImageEnumerateCertificates(HANDLE, WORD, PDWORD, PDWORD, DWORD);
+	BOOL ImageGetCertificateData(HANDLE, DWORD, LPWIN_CERTIFICATE, PDWORD);
+	BOOL ImageGetCertificateHeader(HANDLE, DWORD, LPWIN_CERTIFICATE);
+	BOOL CopyPdb(CHAR*, CHAR*, BOOL);
+	BOOL RemovePrivateCvSymbolicEx(PCHAR, ULONG, PCHAR*, ULONG*);
+}
+
+version (Unicode) {
+	alias MapFileAndCheckSumW MapFileAndCheckSum;
+} else {
+	alias MapFileAndCheckSumA MapFileAndCheckSum;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/imm.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,482 @@
+/***********************************************************************\
+*                                 imm.d                                 *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.imm;
+pragma(lib, "imm32.lib");
+
+import win32.windef, win32.wingdi;
+import win32.winuser; // for the MFS_xxx enums.
+private import win32.w32api;
+
+const WM_CONVERTREQUESTEX     = 0x108;
+const WM_IME_STARTCOMPOSITION = 0x10D;
+const WM_IME_ENDCOMPOSITION   = 0x10E;
+const WM_IME_COMPOSITION      = 0x10F;
+const WM_IME_KEYLAST          = 0x10F;
+const WM_IME_SETCONTEXT       = 0x281;
+const WM_IME_NOTIFY           = 0x282;
+const WM_IME_CONTROL          = 0x283;
+const WM_IME_COMPOSITIONFULL  = 0x284;
+const WM_IME_SELECT           = 0x285;
+const WM_IME_CHAR             = 0x286;
+static if (WINVER >= 0x500) {
+	const WM_IME_REQUEST      = 0x288;
+}
+const WM_IME_KEYDOWN          = 0x290;
+const WM_IME_KEYUP            = 0x291;
+
+
+const IMC_GETCANDIDATEPOS=7;
+const IMC_SETCANDIDATEPOS=8;
+const IMC_GETCOMPOSITIONFONT=9;
+const IMC_SETCOMPOSITIONFONT=10;
+const IMC_GETCOMPOSITIONWINDOW=11;
+const IMC_SETCOMPOSITIONWINDOW=12;
+const IMC_GETSTATUSWINDOWPOS=15;
+const IMC_SETSTATUSWINDOWPOS=16;
+const IMC_CLOSESTATUSWINDOW=0x21;
+const IMC_OPENSTATUSWINDOW=0x22;
+const IMN_CLOSESTATUSWINDOW=1;
+const IMN_OPENSTATUSWINDOW=2;
+const IMN_CHANGECANDIDATE=3;
+const IMN_CLOSECANDIDATE=4;
+const IMN_OPENCANDIDATE=5;
+const IMN_SETCONVERSIONMODE=6;
+const IMN_SETSENTENCEMODE=7;
+const IMN_SETOPENSTATUS=8;
+const IMN_SETCANDIDATEPOS=9;
+const IMN_SETCOMPOSITIONFONT=10;
+const IMN_SETCOMPOSITIONWINDOW=11;
+const IMN_SETSTATUSWINDOWPOS=12;
+const IMN_GUIDELINE=13;
+const IMN_PRIVATE=14;
+
+const NI_OPENCANDIDATE=16;
+const NI_CLOSECANDIDATE=17;
+const NI_SELECTCANDIDATESTR=18;
+const NI_CHANGECANDIDATELIST=19;
+const NI_FINALIZECONVERSIONRESULT=20;
+const NI_COMPOSITIONSTR=21;
+const NI_SETCANDIDATE_PAGESTART=22;
+const NI_SETCANDIDATE_PAGESIZE=23;
+const NI_IMEMENUSELECTED=24;
+
+const ISC_SHOWUICANDIDATEWINDOW=1;
+const ISC_SHOWUICOMPOSITIONWINDOW=0x80000000;
+const ISC_SHOWUIGUIDELINE=0x40000000;
+const ISC_SHOWUIALLCANDIDATEWINDOW=15;
+const ISC_SHOWUIALL=0xC000000F;
+
+const CPS_COMPLETE=1;
+const CPS_CONVERT=2;
+const CPS_REVERT=3;
+const CPS_CANCEL=4;
+
+const IME_CHOTKEY_IME_NONIME_TOGGLE=16;
+const IME_CHOTKEY_SHAPE_TOGGLE=17;
+const IME_CHOTKEY_SYMBOL_TOGGLE=18;
+const IME_JHOTKEY_CLOSE_OPEN=0x30;
+const IME_KHOTKEY_SHAPE_TOGGLE=0x50;
+const IME_KHOTKEY_HANJACONVERT=0x51;
+const IME_KHOTKEY_ENGLISH=0x52;
+const IME_THOTKEY_IME_NONIME_TOGGLE=0x70;
+const IME_THOTKEY_SHAPE_TOGGLE=0x71;
+const IME_THOTKEY_SYMBOL_TOGGLE=0x72;
+const IME_HOTKEY_DSWITCH_FIRST=256;
+const IME_HOTKEY_DSWITCH_LAST=0x11F;
+const IME_ITHOTKEY_RESEND_RESULTSTR=512;
+const IME_ITHOTKEY_PREVIOUS_COMPOSITION=513;
+const IME_ITHOTKEY_UISTYLE_TOGGLE=514;
+
+const GCS_COMPREADSTR=1;
+const GCS_COMPREADATTR=2;
+const GCS_COMPREADCLAUSE=4;
+const GCS_COMPSTR=8;
+const GCS_COMPATTR=16;
+const GCS_COMPCLAUSE=32;
+const GCS_CURSORPOS=128;
+const GCS_DELTASTART=256;
+const GCS_RESULTREADSTR=512;
+const GCS_RESULTREADCLAUSE=1024;
+const GCS_RESULTSTR=2048;
+const GCS_RESULTCLAUSE=4096;
+
+const CS_INSERTCHAR=0x2000;
+const CS_NOMOVECARET=0x4000;
+
+const IMEVER_0310=0x3000A;
+const IMEVER_0400=0x40000;
+
+const IME_PROP_AT_CARET=0x10000;
+const IME_PROP_SPECIAL_UI=0x20000;
+const IME_PROP_CANDLIST_START_FROM_1=0x40000;
+const IME_PROP_UNICODE=0x80000;
+
+const UI_CAP_2700=1;
+const UI_CAP_ROT90=2;
+const UI_CAP_ROTANY=4;
+
+const SCS_CAP_COMPSTR=1;
+const SCS_CAP_MAKEREAD=2;
+const SELECT_CAP_CONVERSION=1;
+const SELECT_CAP_SENTENCE=2;
+const GGL_LEVEL=1;
+const GGL_INDEX=2;
+const GGL_STRING=3;
+const GGL_PRIVATE=4;
+const GL_LEVEL_NOGUIDELINE=0;
+const GL_LEVEL_FATAL=1;
+const GL_LEVEL_ERROR=2;
+const GL_LEVEL_WARNING=3;
+const GL_LEVEL_INFORMATION=4;
+const GL_ID_UNKNOWN=0;
+const GL_ID_NOMODULE=1;
+const GL_ID_NODICTIONARY=16;
+const GL_ID_CANNOTSAVE=17;
+const GL_ID_NOCONVERT=32;
+const GL_ID_TYPINGERROR=33;
+const GL_ID_TOOMANYSTROKE=34;
+const GL_ID_READINGCONFLICT=35;
+const GL_ID_INPUTREADING=36;
+const GL_ID_INPUTRADICAL=37;
+const GL_ID_INPUTCODE=38;
+const GL_ID_INPUTSYMBOL=39;
+const GL_ID_CHOOSECANDIDATE=40;
+const GL_ID_REVERSECONVERSION=41;
+const GL_ID_PRIVATE_FIRST=0x8000;
+const GL_ID_PRIVATE_LAST=0xFFFF;
+
+const DWORD IGP_GETIMEVERSION = -4;
+const IGP_PROPERTY=4;
+const IGP_CONVERSION=8;
+const IGP_SENTENCE=12;
+const IGP_UI=16;
+const IGP_SETCOMPSTR=0x14;
+const IGP_SELECT=0x18;
+
+const SCS_SETSTR       = GCS_COMPREADSTR|GCS_COMPSTR;
+const SCS_CHANGEATTR   = GCS_COMPREADATTR|GCS_COMPATTR;
+const SCS_CHANGECLAUSE = GCS_COMPREADCLAUSE|GCS_COMPCLAUSE;
+
+const ATTR_INPUT=0;
+const ATTR_TARGET_CONVERTED=1;
+const ATTR_CONVERTED=2;
+const ATTR_TARGET_NOTCONVERTED=3;
+const ATTR_INPUT_ERROR=4;
+const ATTR_FIXEDCONVERTED=5;
+const CFS_DEFAULT=0;
+const CFS_RECT=1;
+const CFS_POINT=2;
+const CFS_SCREEN=4;
+const CFS_FORCE_POSITION=32;
+const CFS_CANDIDATEPOS=64;
+const CFS_EXCLUDE=128;
+const GCL_CONVERSION=1;
+const GCL_REVERSECONVERSION=2;
+const GCL_REVERSE_LENGTH=3;
+
+const IME_CMODE_ALPHANUMERIC=0;
+const IME_CMODE_NATIVE=1;
+const IME_CMODE_CHINESE=IME_CMODE_NATIVE;
+const IME_CMODE_HANGEUL=IME_CMODE_NATIVE;
+const IME_CMODE_HANGUL=IME_CMODE_NATIVE;
+const IME_CMODE_JAPANESE=IME_CMODE_NATIVE;
+const IME_CMODE_KATAKANA=2;
+const IME_CMODE_LANGUAGE=3;
+const IME_CMODE_FULLSHAPE=8;
+const IME_CMODE_ROMAN=16;
+const IME_CMODE_CHARCODE=32;
+const IME_CMODE_HANJACONVERT=64;
+const IME_CMODE_SOFTKBD=128;
+const IME_CMODE_NOCONVERSION=256;
+const IME_CMODE_EUDC=512;
+const IME_CMODE_SYMBOL=1024;
+const IME_CMODE_FIXED=2048;
+const IME_SMODE_NONE=0;
+const IME_SMODE_PLAURALCLAUSE=1;
+const IME_SMODE_SINGLECONVERT=2;
+const IME_SMODE_AUTOMATIC=4;
+const IME_SMODE_PHRASEPREDICT=8;
+const IME_CAND_UNKNOWN=0;
+const IME_CAND_READ=1;
+const IME_CAND_CODE=2;
+const IME_CAND_MEANING=3;
+const IME_CAND_RADICAL=4;
+const IME_CAND_STROKE=5;
+const IMM_ERROR_NODATA=(-1);
+const IMM_ERROR_GENERAL=(-2);
+const IME_CONFIG_GENERAL=1;
+const IME_CONFIG_REGISTERWORD=2;
+const IME_CONFIG_SELECTDICTIONARY=3;
+const IME_ESC_QUERY_SUPPORT=3;
+const IME_ESC_RESERVED_FIRST=4;
+const IME_ESC_RESERVED_LAST=0x7FF;
+const IME_ESC_PRIVATE_FIRST=0x800;
+const IME_ESC_PRIVATE_LAST=0xFFF;
+const IME_ESC_SEQUENCE_TO_INTERNAL=0x1001;
+const IME_ESC_GET_EUDC_DICTIONARY=0x1003;
+const IME_ESC_SET_EUDC_DICTIONARY=0x1004;
+const IME_ESC_MAX_KEY=0x1005;
+const IME_ESC_IME_NAME=0x1006;
+const IME_ESC_SYNC_HOTKEY=0x1007;
+const IME_ESC_HANJA_MODE=0x1008;
+const IME_ESC_AUTOMATA=0x1009;
+const IME_REGWORD_STYLE_EUDC=1;
+const IME_REGWORD_STYLE_USER_FIRST=0x80000000;
+const IME_REGWORD_STYLE_USER_LAST=0xFFFFFFFF;
+
+const SOFTKEYBOARD_TYPE_T1=1;
+const SOFTKEYBOARD_TYPE_C1=2;
+
+const IMEMENUITEM_STRING_SIZE=80;
+
+const MOD_ALT=1;
+const MOD_CONTROL=2;
+const MOD_SHIFT=4;
+const MOD_WIN=8;
+const MOD_IGNORE_ALL_MODIFIER=1024;
+const MOD_ON_KEYUP=2048;
+const MOD_RIGHT=16384;
+const MOD_LEFT=32768;
+
+const IACE_CHILDREN=1;
+const IACE_DEFAULT=16;
+const IACE_IGNORENOCONTEXT=32;
+
+const IGIMIF_RIGHTMENU=1;
+
+const IGIMII_CMODE=1;
+const IGIMII_SMODE=2;
+const IGIMII_CONFIGURE=4;
+const IGIMII_TOOLS=8;
+const IGIMII_HELP=16;
+const IGIMII_OTHER=32;
+const IGIMII_INPUTTOOLS=64;
+
+const IMFT_RADIOCHECK=1;
+const IMFT_SEPARATOR=2;
+const IMFT_SUBMENU=4;
+
+const IMFS_GRAYED=MFS_GRAYED;
+const IMFS_DISABLED=MFS_DISABLED;
+const IMFS_CHECKED=MFS_CHECKED;
+const IMFS_HILITE=MFS_HILITE;
+const IMFS_ENABLED=MFS_ENABLED;
+const IMFS_UNCHECKED=MFS_UNCHECKED;
+const IMFS_UNHILITE=MFS_UNHILITE;
+const IMFS_DEFAULT=MFS_DEFAULT;
+
+const STYLE_DESCRIPTION_SIZE=32;
+
+alias DWORD HIMC;
+alias DWORD HIMCC;
+alias HKL* LPHKL;
+
+struct COMPOSITIONFORM{
+	DWORD dwStyle;
+	POINT ptCurrentPos;
+	RECT rcArea;
+}
+alias COMPOSITIONFORM* PCOMPOSITIONFORM, LPCOMPOSITIONFORM;
+
+struct CANDIDATEFORM{
+	DWORD dwIndex;
+	DWORD dwStyle;
+	POINT ptCurrentPos;
+	RECT rcArea;
+}
+alias CANDIDATEFORM* PCANDIDATEFORM, LPCANDIDATEFORM;
+
+struct CANDIDATELIST{
+	DWORD dwSize;
+	DWORD dwStyle;
+	DWORD dwCount;
+	DWORD dwSelection;
+	DWORD dwPageStart;
+	DWORD dwPageSize;
+	DWORD dwOffset[1];
+}
+alias CANDIDATELIST* PCANDIDATELIST, LPCANDIDATELIST;
+
+struct REGISTERWORDA{
+	LPSTR lpReading;
+	LPSTR lpWord;
+}
+alias REGISTERWORDA* PREGISTERWORDA, LPREGISTERWORDA;
+
+struct REGISTERWORDW{
+	LPWSTR lpReading;
+	LPWSTR lpWord;
+}
+alias REGISTERWORDW* PREGISTERWORDW, LPREGISTERWORDW;
+
+struct STYLEBUFA{
+	DWORD dwStyle;
+	CHAR szDescription[STYLE_DESCRIPTION_SIZE];
+}
+alias STYLEBUFA* PSTYLEBUFA, LPSTYLEBUFA;
+
+struct STYLEBUFW{
+	DWORD dwStyle;
+	WCHAR szDescription[STYLE_DESCRIPTION_SIZE];
+}
+alias STYLEBUFW* PSTYLEBUFW, LPSTYLEBUFW;
+
+struct IMEMENUITEMINFOA{
+	UINT cbSize = this.sizeof;
+	UINT fType;
+	UINT fState;
+	UINT wID;
+	HBITMAP hbmpChecked;
+	HBITMAP hbmpUnchecked;
+	DWORD dwItemData;
+	CHAR szString[IMEMENUITEM_STRING_SIZE];
+	HBITMAP hbmpItem;
+}
+alias IMEMENUITEMINFOA* PIMEMENUITEMINFOA, LPIMEMENUITEMINFOA;
+
+struct IMEMENUITEMINFOW{
+	UINT cbSize = this.sizeof;
+	UINT fType;
+	UINT fState;
+	UINT wID;
+	HBITMAP hbmpChecked;
+	HBITMAP hbmpUnchecked;
+	DWORD dwItemData;
+	WCHAR szString[IMEMENUITEM_STRING_SIZE];
+	HBITMAP hbmpItem;
+}
+alias IMEMENUITEMINFOW* PIMEMENUITEMINFOW, LPIMEMENUITEMINFOW;
+
+alias int function (LPCSTR, DWORD, LPCSTR, LPVOID)  REGISTERWORDENUMPROCA;
+alias int function (LPCWSTR, DWORD, LPCWSTR, LPVOID) REGISTERWORDENUMPROCW;
+
+version(Unicode) {
+	alias REGISTERWORDENUMPROCW REGISTERWORDENUMPROC;
+	alias REGISTERWORDW REGISTERWORD;
+	alias IMEMENUITEMINFOW IMEMENUITEMINFO;
+	alias STYLEBUFW STYLEBUF;
+} else {
+	alias REGISTERWORDENUMPROCA REGISTERWORDENUMPROC;
+	alias REGISTERWORDA REGISTERWORD;
+	alias IMEMENUITEMINFOA IMEMENUITEMINFO;
+	alias STYLEBUFA STYLEBUF;
+}
+
+alias STYLEBUF* PSTYLEBUF, LPSTYLEBUF;
+alias REGISTERWORD* PREGISTERWORD, LPREGISTERWORD;
+alias IMEMENUITEMINFO* PIMEMENUITEMINFO, LPIMEMENUITEMINFO;
+
+
+extern (Windows):
+HKL ImmInstallIMEA(LPCSTR, LPCSTR);
+HKL ImmInstallIMEW(LPCWSTR, LPCWSTR);
+HWND ImmGetDefaultIMEWnd(HWND);
+UINT ImmGetDescriptionA(HKL, LPSTR, UINT);
+UINT ImmGetDescriptionW(HKL, LPWSTR, UINT);
+UINT ImmGetIMEFileNameA(HKL, LPSTR, UINT);
+UINT ImmGetIMEFileNameW(HKL, LPWSTR, UINT);
+DWORD ImmGetProperty(HKL, DWORD);
+BOOL ImmIsIME(HKL);
+BOOL ImmSimulateHotKey(HWND, DWORD);
+HIMC ImmCreateContext();
+BOOL ImmDestroyContext(HIMC);
+HIMC ImmGetContext(HWND);
+BOOL ImmReleaseContext(HWND, HIMC);
+HIMC ImmAssociateContext(HWND, HIMC);
+LONG ImmGetCompositionStringA(HIMC, DWORD, PVOID, DWORD);
+LONG ImmGetCompositionStringW(HIMC, DWORD, PVOID, DWORD);
+BOOL ImmSetCompositionStringA(HIMC, DWORD, PCVOID, DWORD, PCVOID, DWORD);
+BOOL ImmSetCompositionStringW(HIMC, DWORD, PCVOID, DWORD, PCVOID, DWORD);
+DWORD ImmGetCandidateListCountA(HIMC, PDWORD);
+DWORD ImmGetCandidateListCountW(HIMC, PDWORD);
+DWORD ImmGetCandidateListA(HIMC, DWORD, PCANDIDATELIST, DWORD);
+DWORD ImmGetCandidateListW(HIMC, DWORD, PCANDIDATELIST, DWORD);
+DWORD ImmGetGuideLineA(HIMC, DWORD, LPSTR, DWORD);
+DWORD ImmGetGuideLineW(HIMC, DWORD, LPWSTR, DWORD);
+BOOL ImmGetConversionStatus(HIMC, LPDWORD, PDWORD);
+BOOL ImmSetConversionStatus(HIMC, DWORD, DWORD);
+BOOL ImmGetOpenStatus(HIMC);
+BOOL ImmSetOpenStatus(HIMC, BOOL);
+
+BOOL ImmGetCompositionFontA(HIMC, LPLOGFONTA);
+BOOL ImmGetCompositionFontW(HIMC, LPLOGFONTW);
+BOOL ImmSetCompositionFontA(HIMC, LPLOGFONTA);
+BOOL ImmSetCompositionFontW(HIMC, LPLOGFONTW);
+
+BOOL ImmConfigureIMEA(HKL, HWND, DWORD, PVOID);
+BOOL ImmConfigureIMEW(HKL, HWND, DWORD, PVOID);
+LRESULT ImmEscapeA(HKL, HIMC, UINT, PVOID);
+LRESULT ImmEscapeW(HKL, HIMC, UINT, PVOID);
+DWORD ImmGetConversionListA(HKL, HIMC, LPCSTR, PCANDIDATELIST, DWORD, UINT);
+DWORD ImmGetConversionListW(HKL, HIMC, LPCWSTR, PCANDIDATELIST, DWORD, UINT);
+BOOL ImmNotifyIME(HIMC, DWORD, DWORD, DWORD);
+BOOL ImmGetStatusWindowPos(HIMC, LPPOINT);
+BOOL ImmSetStatusWindowPos(HIMC, LPPOINT);
+BOOL ImmGetCompositionWindow(HIMC, PCOMPOSITIONFORM);
+BOOL ImmSetCompositionWindow(HIMC, PCOMPOSITIONFORM);
+BOOL ImmGetCandidateWindow(HIMC, DWORD, PCANDIDATEFORM);
+BOOL ImmSetCandidateWindow(HIMC, PCANDIDATEFORM);
+BOOL ImmIsUIMessageA(HWND, UINT, WPARAM, LPARAM);
+BOOL ImmIsUIMessageW(HWND, UINT, WPARAM, LPARAM);
+UINT ImmGetVirtualKey(HWND);
+BOOL ImmRegisterWordA(HKL, LPCSTR, DWORD, LPCSTR);
+BOOL ImmRegisterWordW(HKL, LPCWSTR, DWORD, LPCWSTR);
+BOOL ImmUnregisterWordA(HKL, LPCSTR, DWORD, LPCSTR);
+BOOL ImmUnregisterWordW(HKL, LPCWSTR, DWORD, LPCWSTR);
+UINT ImmGetRegisterWordStyleA(HKL, UINT, PSTYLEBUFA);
+UINT ImmGetRegisterWordStyleW(HKL, UINT, PSTYLEBUFW);
+UINT ImmEnumRegisterWordA(HKL, REGISTERWORDENUMPROCA, LPCSTR, DWORD, LPCSTR, PVOID);
+UINT ImmEnumRegisterWordW(HKL, REGISTERWORDENUMPROCW, LPCWSTR, DWORD, LPCWSTR, PVOID);
+BOOL EnableEUDC(BOOL);
+BOOL ImmDisableIME(DWORD);
+DWORD ImmGetImeMenuItemsA(HIMC, DWORD, DWORD, LPIMEMENUITEMINFOA, LPIMEMENUITEMINFOA, DWORD);
+DWORD ImmGetImeMenuItemsW(HIMC, DWORD, DWORD, LPIMEMENUITEMINFOW, LPIMEMENUITEMINFOW, DWORD);
+
+version(Unicode) {
+	alias ImmEnumRegisterWordW ImmEnumRegisterWord;
+	alias ImmGetRegisterWordStyleW ImmGetRegisterWordStyle;
+	alias ImmUnregisterWordW ImmUnregisterWord;
+	alias ImmRegisterWordW ImmRegisterWord;
+	alias ImmInstallIMEW ImmInstallIME;
+	alias ImmIsUIMessageW ImmIsUIMessage;
+	alias ImmGetConversionListW ImmGetConversionList;
+	alias ImmEscapeW ImmEscape;
+	alias ImmConfigureIMEW ImmConfigureIME;
+	alias ImmSetCompositionFontW ImmSetCompositionFont;
+	alias ImmGetCompositionFontW ImmGetCompositionFont;
+	alias ImmGetGuideLineW ImmGetGuideLine;
+	alias ImmGetCandidateListW ImmGetCandidateList;
+	alias ImmGetCandidateListCountW ImmGetCandidateListCount;
+	alias ImmSetCompositionStringW ImmSetCompositionString;
+	alias ImmGetCompositionStringW ImmGetCompositionString;
+	alias ImmGetDescriptionW ImmGetDescription;
+	alias ImmGetIMEFileNameW ImmGetIMEFileName;
+	alias ImmGetImeMenuItemsW ImmGetImeMenuItems;
+} else {
+	alias ImmEnumRegisterWordA ImmEnumRegisterWord;
+	alias ImmGetRegisterWordStyleA ImmGetRegisterWordStyle;
+	alias ImmUnregisterWordA ImmUnregisterWord;
+	alias ImmRegisterWordA ImmRegisterWord;
+	alias ImmInstallIMEA ImmInstallIME;
+	alias ImmIsUIMessageA ImmIsUIMessage;
+	alias ImmGetConversionListA ImmGetConversionList;
+	alias ImmEscapeA ImmEscape;
+	alias ImmConfigureIMEA ImmConfigureIME;
+	alias ImmSetCompositionFontA ImmSetCompositionFont;
+	alias ImmGetCompositionFontA ImmGetCompositionFont;
+	alias ImmGetGuideLineA ImmGetGuideLine;
+	alias ImmGetCandidateListA ImmGetCandidateList;
+	alias ImmGetCandidateListCountA ImmGetCandidateListCount;
+	alias ImmSetCompositionStringA ImmSetCompositionString;
+	alias ImmGetCompositionStringA ImmGetCompositionString;
+	alias ImmGetDescriptionA ImmGetDescription;
+	alias ImmGetIMEFileNameA ImmGetIMEFileName;
+	alias ImmGetImeMenuItemsW ImmGetImeMenuItems;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/intshcut.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,89 @@
+/***********************************************************************\
+*                               intshcut.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.intshcut;
+
+private import win32.unknwn, win32.windef;
+
+enum : SCODE {
+	E_FLAGS                     = 0x80041000,
+	  // = MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x1000)
+	URL_E_INVALID_SYNTAX        = 0x80041001,
+	  // = MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x1001)
+	URL_E_UNREGISTERED_PROTOCOL = 0x80041002, // etc.
+	IS_E_EXEC_FAILED            = 0x80042002
+}
+
+enum IURL_SETURL_FLAGS {
+	IURL_SETURL_FL_GUESS_PROTOCOL = 1,
+	IURL_SETURL_FL_USE_DEFAULT_PROTOCOL,
+	ALL_IURL_SETURL_FLAGS
+}
+
+enum IURL_INVOKECOMMAND_FLAGS {
+	IURL_INVOKECOMMAND_FL_ALLOW_UI = 1,
+	IURL_INVOKECOMMAND_FL_USE_DEFAULT_VERB,
+	ALL_IURL_INVOKECOMMAND_FLAGS
+}
+
+enum TRANSLATEURL_IN_FLAGS {
+	TRANSLATEURL_FL_GUESS_PROTOCOL = 1,
+	TRANSLATEURL_FL_USE_DEFAULT_PROTOCOL,
+	ALL_TRANSLATEURL_FLAGS
+}
+
+enum URLASSOCIATIONDIALOG_IN_FLAGS {
+	URLASSOCDLG_FL_USE_DEFAULT_NAME = 1,
+	URLASSOCDLG_FL_REGISTER_ASSOC,
+	ALL_URLASSOCDLG_FLAGS
+}
+
+enum MIMEASSOCIATIONDIALOG_IN_FLAGS {
+	MIMEASSOCDLG_FL_REGISTER_ASSOC = 1,
+	ALL_MIMEASSOCDLG_FLAGS         = MIMEASSOCDLG_FL_REGISTER_ASSOC
+}
+
+struct URLINVOKECOMMANDINFO {
+	DWORD dwcbSize = URLINVOKECOMMANDINFO.sizeof;
+	DWORD dwFlags;
+	HWND  hwndParent;
+	PCSTR pcszVerb;
+}
+alias URLINVOKECOMMANDINFO CURLINVOKECOMMANDINFO;
+alias URLINVOKECOMMANDINFO* PURLINVOKECOMMANDINFO, PCURLINVOKECOMMANDINFO;
+
+interface IUniformResourceLocator : IUnknown {
+	HRESULT SetURL(PCSTR, DWORD);
+	HRESULT GetURL(PSTR*);
+	HRESULT InvokeCommand(PURLINVOKECOMMANDINFO);
+}
+alias IUniformResourceLocator CIUniformResourceLocator;
+alias IUniformResourceLocator* PIUniformResourceLocator,
+  PCIUniformResourceLocator;
+
+extern (Windows) {
+	BOOL InetIsOffline(DWORD);
+	HRESULT MIMEAssociationDialogA(HWND, DWORD, PCSTR, PCSTR, PSTR, UINT);
+	HRESULT MIMEAssociationDialogW(HWND, DWORD, PCWSTR, PCWSTR, PWSTR, UINT);
+	HRESULT TranslateURLA(PCSTR, DWORD, PSTR*);
+	HRESULT TranslateURLW(PCWSTR, DWORD, PWSTR*);
+	HRESULT URLAssociationDialogA(HWND, DWORD, PCSTR, PCSTR, PSTR, UINT);
+	HRESULT URLAssociationDialogW(HWND, DWORD, PCWSTR, PCWSTR, PWSTR, UINT);
+}
+
+version (Unicode) {
+	alias TranslateURLW TranslateURL;
+	alias MIMEAssociationDialogW MIMEAssociationDialog;
+	alias URLAssociationDialogW URLAssociationDialog;
+} else {
+	alias TranslateURLA TranslateURL;
+	alias MIMEAssociationDialogA MIMEAssociationDialog;
+	alias URLAssociationDialogA URLAssociationDialog;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/ipexport.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,108 @@
+/***********************************************************************\
+*                               ipexport.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.ipexport;
+
+private import win32.windef;
+
+const size_t MAX_ADAPTER_NAME = 128;
+
+// IP STATUS flags
+enum : IP_STATUS {
+	IP_SUCCESS         =     0,
+	IP_STATUS_BASE     = 11000,
+	IP_BUF_TOO_SMALL,
+	IP_DEST_NET_UNREACHABLE,
+	IP_DEST_HOST_UNREACHABLE,
+	IP_DEST_PROT_UNREACHABLE,
+	IP_DEST_PORT_UNREACHABLE,
+	IP_NO_RESOURCES,
+	IP_BAD_OPTION,
+	IP_HW_ERROR,
+	IP_PACKET_TOO_BIG,
+	IP_REQ_TIMED_OUT,
+	IP_BAD_REQ,
+	IP_BAD_ROUTE,
+	IP_TTL_EXPIRED_TRANSIT,
+	IP_TTL_EXPIRED_REASSEM,
+	IP_PARAM_PROBLEM,
+	IP_SOURCE_QUENCH,
+	IP_OPTION_TOO_BIG,
+	IP_BAD_DESTINATION,
+	IP_ADDR_DELETED,
+	IP_SPEC_MTU_CHANGE,
+	IP_MTU_CHANGE,
+	IP_UNLOAD,      // = IP_STATUS_BASE + 22
+	IP_GENERAL_FAILURE = IP_STATUS_BASE + 50,
+	MAX_IP_STATUS      = IP_GENERAL_FAILURE,
+	IP_PENDING         = IP_STATUS_BASE + 255
+}
+
+// IP header Flags values
+const byte IP_FLAG_DF = 2;
+
+// IP Option types
+enum : ubyte {
+	IP_OPT_EOL          = 0,
+	IP_OPT_NOP          = 0x01,
+	IP_OPT_RR           = 0x07,
+	IP_OPT_SECURITY     = 0x82,
+	IP_OPT_LSRR         = 0x83,
+	IP_OPT_SSRR         = 0x89,
+	IP_OPT_TS           = 0x44,
+	IP_OPT_SID          = 0x88,
+	IP_OPT_ROUTER_ALERT = 0x94
+}
+
+const ubyte MAX_OPT_SIZE = 40;
+
+alias uint IPAddr, IPMask, IP_STATUS;
+
+struct IP_OPTION_INFORMATION {
+	ubyte  Ttl;
+	ubyte  Tos;
+	ubyte  Flags;
+	ubyte  OptionsSize;
+	ubyte* OptionsData;
+}
+alias IP_OPTION_INFORMATION* PIP_OPTION_INFORMATION;
+
+struct ICMP_ECHO_REPLY {
+  IPAddr Address;
+  uint   Status;
+  uint   RoundTripTime;
+  ushort DataSize;
+  ushort Reserved;
+  void*  Data;
+  IP_OPTION_INFORMATION Options;
+}
+alias ICMP_ECHO_REPLY* PICMP_ECHO_REPLY;
+
+struct IP_ADAPTER_INDEX_MAP {
+	ULONG                   Index;
+	WCHAR[MAX_ADAPTER_NAME] Name;
+}
+alias IP_ADAPTER_INDEX_MAP* PIP_ADAPTER_INDEX_MAP;
+
+struct IP_INTERFACE_INFO {
+	LONG                    NumAdapters;
+	IP_ADAPTER_INDEX_MAP[1] _Adapter;
+
+	IP_ADAPTER_INDEX_MAP* Adapter() { return _Adapter.ptr; }
+}
+alias IP_INTERFACE_INFO* PIP_INTERFACE_INFO;
+
+struct IP_UNIDIRECTIONAL_ADAPTER_ADDRESS {
+	ULONG     NumAdapters;
+	IPAddr[1] _Address;
+
+	IPAddr* Address() { return _Address.ptr; }
+}
+alias IP_UNIDIRECTIONAL_ADAPTER_ADDRESS* PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/iphlpapi.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,62 @@
+/***********************************************************************\
+*                               iphlpapi.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.iphlpapi;
+
+import win32.ipexport, win32.iprtrmib, win32.iptypes;
+private import win32.winbase, win32.windef;
+
+extern (Windows) {
+	DWORD AddIPAddress(IPAddr, IPMask, DWORD, PULONG, PULONG);
+	DWORD CreateIpForwardEntry(PMIB_IPFORWARDROW);
+	DWORD CreateIpNetEntry(PMIB_IPNETROW);
+	DWORD CreateProxyArpEntry(DWORD, DWORD, DWORD);
+	DWORD DeleteIPAddress(ULONG);
+	DWORD DeleteIpForwardEntry(PMIB_IPFORWARDROW);
+	DWORD DeleteIpNetEntry(PMIB_IPNETROW);
+	DWORD DeleteProxyArpEntry(DWORD, DWORD, DWORD);
+	DWORD EnableRouter(HANDLE*, OVERLAPPED*);
+	DWORD FlushIpNetTable(DWORD);
+	DWORD GetAdapterIndex(LPWSTR, PULONG);
+	DWORD GetAdaptersInfo(PIP_ADAPTER_INFO, PULONG);
+	DWORD GetBestInterface(IPAddr, PDWORD);
+	DWORD GetBestRoute(DWORD, DWORD, PMIB_IPFORWARDROW);
+	DWORD GetFriendlyIfIndex(DWORD);
+	DWORD GetIcmpStatistics(PMIB_ICMP);
+	DWORD GetIfEntry(PMIB_IFROW);
+	DWORD GetIfTable(PMIB_IFTABLE, PULONG, BOOL);
+	DWORD GetInterfaceInfo(PIP_INTERFACE_INFO, PULONG);
+	DWORD GetIpAddrTable(PMIB_IPADDRTABLE, PULONG, BOOL);
+	DWORD GetIpForwardTable(PMIB_IPFORWARDTABLE, PULONG, BOOL);
+	DWORD GetIpNetTable(PMIB_IPNETTABLE, PULONG, BOOL);
+	DWORD GetIpStatistics(PMIB_IPSTATS);
+	DWORD GetNetworkParams(PFIXED_INFO, PULONG);
+	DWORD GetNumberOfInterfaces(PDWORD);
+	DWORD GetPerAdapterInfo(ULONG, PIP_PER_ADAPTER_INFO, PULONG);
+	BOOL GetRTTAndHopCount(IPAddr, PULONG, ULONG, PULONG);
+	DWORD GetTcpStatistics(PMIB_TCPSTATS);
+	DWORD GetTcpTable(PMIB_TCPTABLE, PDWORD, BOOL);
+	DWORD GetUniDirectionalAdapterInfo(PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS,
+	  PULONG);
+	DWORD GetUdpStatistics(PMIB_UDPSTATS);
+	DWORD GetUdpTable(PMIB_UDPTABLE, PDWORD, BOOL);
+	DWORD IpReleaseAddress(PIP_ADAPTER_INDEX_MAP);
+	DWORD IpRenewAddress(PIP_ADAPTER_INDEX_MAP);
+	DWORD NotifyAddrChange(PHANDLE, LPOVERLAPPED);
+	DWORD NotifyRouteChange(PHANDLE, LPOVERLAPPED);
+	DWORD SendARP(IPAddr, IPAddr, PULONG, PULONG);
+	DWORD SetIfEntry(PMIB_IFROW);
+	DWORD SetIpForwardEntry(PMIB_IPFORWARDROW);
+	DWORD SetIpNetEntry(PMIB_IPNETROW);
+	DWORD SetIpStatistics(PMIB_IPSTATS);
+	DWORD SetIpTTL(UINT);
+	DWORD SetTcpEntry(PMIB_TCPROW);
+	DWORD UnenableRouter(OVERLAPPED*, LPDWORD);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/ipifcons.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,38 @@
+/***********************************************************************\
+*                               ipifcons.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.ipifcons;
+
+// FIXME: check types of constants
+
+enum {
+	MIB_IF_ADMIN_STATUS_UP = 1,
+	MIB_IF_ADMIN_STATUS_DOWN,
+	MIB_IF_ADMIN_STATUS_TESTING,
+}
+
+enum {
+	MIB_IF_OPER_STATUS_NON_OPERATIONAL,
+	MIB_IF_OPER_STATUS_UNREACHABLE,
+	MIB_IF_OPER_STATUS_DISCONNECTED,
+	MIB_IF_OPER_STATUS_CONNECTING,
+	MIB_IF_OPER_STATUS_CONNECTED,
+	MIB_IF_OPER_STATUS_OPERATIONAL // = 5
+}
+
+enum {
+	MIB_IF_TYPE_OTHER     =  1,
+	MIB_IF_TYPE_ETHERNET  =  6,
+	MIB_IF_TYPE_TOKENRING =  9,
+	MIB_IF_TYPE_FDDI      = 15,
+	MIB_IF_TYPE_PPP       = 23,
+	MIB_IF_TYPE_LOOPBACK  = 24,
+	MIB_IF_TYPE_SLIP      = 28
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/iprtrmib.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,267 @@
+/***********************************************************************\
+*                               iprtrmib.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.iprtrmib;
+
+import win32.ipifcons;
+private import win32.windef;
+
+// FIXME: check types of constants
+
+const size_t
+	MAXLEN_PHYSADDR        =   8,
+	MAXLEN_IFDESCR         = 256,
+	MAX_INTERFACE_NAME_LEN = 256;
+
+enum {
+	MIB_IPNET_TYPE_OTHER = 1,
+	MIB_IPNET_TYPE_INVALID,
+	MIB_IPNET_TYPE_DYNAMIC,
+	MIB_IPNET_TYPE_STATIC
+}
+
+enum {
+	MIB_TCP_RTO_OTHER = 1,
+	MIB_TCP_RTO_CONSTANT,
+	MIB_TCP_RTO_RSRE,
+	MIB_TCP_RTO_VANJ
+}
+
+enum {
+	MIB_TCP_STATE_CLOSED = 1,
+	MIB_TCP_STATE_LISTEN,
+	MIB_TCP_STATE_SYN_SENT,
+	MIB_TCP_STATE_SYN_RCVD,
+	MIB_TCP_STATE_ESTAB,
+	MIB_TCP_STATE_FIN_WAIT1,
+	MIB_TCP_STATE_FIN_WAIT2,
+	MIB_TCP_STATE_CLOSE_WAIT,
+	MIB_TCP_STATE_CLOSING,
+	MIB_TCP_STATE_LAST_ACK,
+	MIB_TCP_STATE_TIME_WAIT,
+	MIB_TCP_STATE_DELETE_TCB // = 12
+}
+
+const DWORD
+	MIB_USE_CURRENT_TTL        = -1,
+	MIB_USE_CURRENT_FORWARDING = -1,
+	MIB_TCP_MAXCONN_DYNAMIC    = -1;
+
+struct MIB_IPADDRROW {
+	DWORD  dwAddr;
+	DWORD  dwIndex;
+	DWORD  dwMask;
+	DWORD  dwBCastAddr;
+	DWORD  dwReasmSize;
+	ushort unused1;
+	ushort unused2;
+}
+alias MIB_IPADDRROW* PMIB_IPADDRROW;
+
+struct MIB_IPADDRTABLE {
+	DWORD            dwNumEntries;
+	MIB_IPADDRROW[1] _table;
+
+	MIB_IPADDRROW* table() { return _table.ptr; }
+}
+alias MIB_IPADDRTABLE* PMIB_IPADDRTABLE;
+
+struct MIB_IPFORWARDROW {
+	DWORD dwForwardDest;
+	DWORD dwForwardMask;
+	DWORD dwForwardPolicy;
+	DWORD dwForwardNextHop;
+	DWORD dwForwardIfIndex;
+	DWORD dwForwardType;
+	DWORD dwForwardProto;
+	DWORD dwForwardAge;
+	DWORD dwForwardNextHopAS;
+	DWORD dwForwardMetric1;
+	DWORD dwForwardMetric2;
+	DWORD dwForwardMetric3;
+	DWORD dwForwardMetric4;
+	DWORD dwForwardMetric5;
+}
+alias MIB_IPFORWARDROW* PMIB_IPFORWARDROW;
+
+struct MIB_IPFORWARDTABLE {
+	DWORD               dwNumEntries;
+	MIB_IPFORWARDROW[1] _table;
+
+	MIB_IPFORWARDROW* table() { return _table.ptr; }
+}
+alias MIB_IPFORWARDTABLE* PMIB_IPFORWARDTABLE;
+
+struct MIB_IPNETROW {
+	DWORD dwIndex;
+	DWORD dwPhysAddrLen;
+	BYTE[MAXLEN_PHYSADDR] bPhysAddr;
+	DWORD dwAddr;
+	DWORD dwType;
+}
+alias MIB_IPNETROW* PMIB_IPNETROW;
+
+struct MIB_IPNETTABLE {
+	DWORD           dwNumEntries;
+	MIB_IPNETROW[1] _table;
+
+	MIB_IPNETROW* table() { return _table.ptr; }
+}
+alias MIB_IPNETTABLE* PMIB_IPNETTABLE;
+
+struct MIBICMPSTATS {
+	DWORD dwMsgs;
+	DWORD dwErrors;
+	DWORD dwDestUnreachs;
+	DWORD dwTimeExcds;
+	DWORD dwParmProbs;
+	DWORD dwSrcQuenchs;
+	DWORD dwRedirects;
+	DWORD dwEchos;
+	DWORD dwEchoReps;
+	DWORD dwTimestamps;
+	DWORD dwTimestampReps;
+	DWORD dwAddrMasks;
+	DWORD dwAddrMaskReps;
+}
+alias MIBICMPSTATS* PMIBICMPSTATS;
+
+struct MIBICMPINFO {
+	MIBICMPSTATS icmpInStats;
+	MIBICMPSTATS icmpOutStats;
+}
+alias MIBICMPINFO* PMIBICMPINFO;
+
+struct MIB_ICMP {
+	MIBICMPINFO stats;
+}
+alias MIB_ICMP* PMIB_ICMP;
+
+struct MIB_IFROW {
+	WCHAR[MAX_INTERFACE_NAME_LEN] wszName;
+	DWORD dwIndex;
+	DWORD dwType;
+	DWORD dwMtu;
+	DWORD dwSpeed;
+	DWORD dwPhysAddrLen;
+	BYTE[MAXLEN_PHYSADDR] bPhysAddr;
+	DWORD dwAdminStatus;
+	DWORD dwOperStatus;
+	DWORD dwLastChange;
+	DWORD dwInOctets;
+	DWORD dwInUcastPkts;
+	DWORD dwInNUcastPkts;
+	DWORD dwInDiscards;
+	DWORD dwInErrors;
+	DWORD dwInUnknownProtos;
+	DWORD dwOutOctets;
+	DWORD dwOutUcastPkts;
+	DWORD dwOutNUcastPkts;
+	DWORD dwOutDiscards;
+	DWORD dwOutErrors;
+	DWORD dwOutQLen;
+	DWORD dwDescrLen;
+	BYTE[MAXLEN_IFDESCR] bDescr;
+}
+alias MIB_IFROW* PMIB_IFROW;
+
+struct MIB_IFTABLE {
+	DWORD        dwNumEntries;
+	MIB_IFROW[1] _table;
+
+	MIB_IFROW* table() { return _table.ptr; }
+}
+alias MIB_IFTABLE* PMIB_IFTABLE;
+
+struct MIB_IPSTATS {
+	DWORD dwForwarding;
+	DWORD dwDefaultTTL;
+	DWORD dwInReceives;
+	DWORD dwInHdrErrors;
+	DWORD dwInAddrErrors;
+	DWORD dwForwDatagrams;
+	DWORD dwInUnknownProtos;
+	DWORD dwInDiscards;
+	DWORD dwInDelivers;
+	DWORD dwOutRequests;
+	DWORD dwRoutingDiscards;
+	DWORD dwOutDiscards;
+	DWORD dwOutNoRoutes;
+	DWORD dwReasmTimeout;
+	DWORD dwReasmReqds;
+	DWORD dwReasmOks;
+	DWORD dwReasmFails;
+	DWORD dwFragOks;
+	DWORD dwFragFails;
+	DWORD dwFragCreates;
+	DWORD dwNumIf;
+	DWORD dwNumAddr;
+	DWORD dwNumRoutes;
+}
+alias MIB_IPSTATS* PMIB_IPSTATS;
+
+struct MIB_TCPSTATS {
+	DWORD dwRtoAlgorithm;
+	DWORD dwRtoMin;
+	DWORD dwRtoMax;
+	DWORD dwMaxConn;
+	DWORD dwActiveOpens;
+	DWORD dwPassiveOpens;
+	DWORD dwAttemptFails;
+	DWORD dwEstabResets;
+	DWORD dwCurrEstab;
+	DWORD dwInSegs;
+	DWORD dwOutSegs;
+	DWORD dwRetransSegs;
+	DWORD dwInErrs;
+	DWORD dwOutRsts;
+	DWORD dwNumConns;
+}
+alias MIB_TCPSTATS* PMIB_TCPSTATS;
+
+struct MIB_TCPROW {
+	DWORD dwState;
+	DWORD dwLocalAddr;
+	DWORD dwLocalPort;
+	DWORD dwRemoteAddr;
+	DWORD dwRemotePort;
+}
+alias MIB_TCPROW* PMIB_TCPROW;
+
+struct MIB_TCPTABLE {
+	DWORD         dwNumEntries;
+	MIB_TCPROW[1] _table;
+
+	MIB_TCPROW* table() { return _table.ptr; }
+}
+alias MIB_TCPTABLE* PMIB_TCPTABLE;
+
+struct MIB_UDPSTATS {
+	DWORD dwInDatagrams;
+	DWORD dwNoPorts;
+	DWORD dwInErrors;
+	DWORD dwOutDatagrams;
+	DWORD dwNumAddrs;
+}
+alias MIB_UDPSTATS* PMIB_UDPSTATS;
+
+struct MIB_UDPROW {
+	DWORD dwLocalAddr;
+	DWORD dwLocalPort;
+}
+alias MIB_UDPROW* PMIB_UDPROW;
+
+struct MIB_UDPTABLE {
+	DWORD         dwNumEntries;
+	MIB_UDPROW[1] _table;
+
+	MIB_UDPROW* table() { return _table.ptr; }
+}
+alias MIB_UDPTABLE* PMIB_UDPTABLE;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/iptypes.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,100 @@
+/***********************************************************************\
+*                               iptypes.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.iptypes;
+
+import win32.windef;
+version(Tango){
+    private import tango.stdc.time;
+}else{
+    private import std.c.time;
+}
+//#include <sys/types.h>
+
+const size_t
+	DEFAULT_MINIMUM_ENTITIES       =  32,
+	MAX_ADAPTER_ADDRESS_LENGTH     =   8,
+	MAX_ADAPTER_DESCRIPTION_LENGTH = 128,
+	MAX_ADAPTER_NAME_LENGTH        = 256,
+	MAX_DOMAIN_NAME_LEN            = 128,
+	MAX_HOSTNAME_LEN               = 128,
+	MAX_SCOPE_ID_LEN               = 256;
+
+const UINT
+	BROADCAST_NODETYPE    = 1,
+	PEER_TO_PEER_NODETYPE = 2,
+	MIXED_NODETYPE        = 4,
+	HYBRID_NODETYPE       = 8;
+
+enum : UINT {
+	IF_OTHER_ADAPTERTYPE,
+	IF_ETHERNET_ADAPTERTYPE,
+	IF_TOKEN_RING_ADAPTERTYPE,
+	IF_FDDI_ADAPTERTYPE,
+	IF_PPP_ADAPTERTYPE,
+	IF_LOOPBACK_ADAPTERTYPE // = 5
+}
+
+struct IP_ADDRESS_STRING {
+	char[16] String;
+}
+alias IP_ADDRESS_STRING IP_MASK_STRING;
+alias IP_ADDRESS_STRING* PIP_ADDRESS_STRING, PIP_MASK_STRING;
+
+struct IP_ADDR_STRING {
+	IP_ADDR_STRING*   Next;
+	IP_ADDRESS_STRING IpAddress;
+	IP_MASK_STRING    IpMask;
+	DWORD             Context;
+}
+alias IP_ADDR_STRING* PIP_ADDR_STRING;
+
+struct IP_ADAPTER_INFO {
+	IP_ADAPTER_INFO* Next;
+	DWORD ComboIndex;
+	char[MAX_ADAPTER_NAME_LENGTH+4]        AdapterName;
+	char[MAX_ADAPTER_DESCRIPTION_LENGTH+4] Description;
+	UINT             AddressLength;
+	BYTE[MAX_ADAPTER_ADDRESS_LENGTH]       Address;
+	DWORD            Index;
+	UINT             Type;
+	UINT             DhcpEnabled;
+	PIP_ADDR_STRING  CurrentIpAddress;
+	IP_ADDR_STRING   IpAddressList;
+	IP_ADDR_STRING   GatewayList;
+	IP_ADDR_STRING   DhcpServer;
+	BOOL             HaveWins;
+	IP_ADDR_STRING   PrimaryWinsServer;
+	IP_ADDR_STRING   SecondaryWinsServer;
+	time_t           LeaseObtained;
+	time_t           LeaseExpires;
+}
+alias IP_ADAPTER_INFO* PIP_ADAPTER_INFO;
+
+struct IP_PER_ADAPTER_INFO {
+	UINT AutoconfigEnabled;
+	UINT AutoconfigActive;
+	PIP_ADDR_STRING CurrentDnsServer;
+	IP_ADDR_STRING DnsServerList;
+}
+alias IP_PER_ADAPTER_INFO* PIP_PER_ADAPTER_INFO;
+
+struct FIXED_INFO {
+	char[MAX_HOSTNAME_LEN+4]    HostName;
+	char[MAX_DOMAIN_NAME_LEN+4] DomainName;
+	PIP_ADDR_STRING             CurrentDnsServer;
+	IP_ADDR_STRING              DnsServerList;
+	UINT                        NodeType;
+	char[MAX_SCOPE_ID_LEN+4]    ScopeId;
+	UINT                        EnableRouting;
+	UINT                        EnableProxy;
+	UINT                        EnableDns;
+}
+alias FIXED_INFO* PFIXED_INFO;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/isguids.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,17 @@
+/***********************************************************************\
+*                               isguids.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*             Translated from MinGW API for MS-Windows 3.10             *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.isguids;
+
+private import win32.basetyps;
+
+extern (C) extern const GUID
+	CLSID_InternetShortcut,
+	IID_IUniformResourceLocator;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lm.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,52 @@
+/***********************************************************************\
+*                                  lm.d                                 *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lm;
+
+version (WindowsVista) {
+	version = WIN32_WINNT_ONLY;
+} else version (Windows2003) {
+	version = WIN32_WINNT_ONLY;
+} else version (WindowsXP) {
+	version = WIN32_WINNT_ONLY;
+} else version (WindowsNTonly) {
+	version = WIN32_WINNT_ONLY;
+}
+
+public import win32.lmcons;
+public import win32.lmaccess;
+public import win32.lmalert;
+public import win32.lmat;
+public import win32.lmerr;
+public import win32.lmshare;
+public import win32.lmapibuf;
+public import win32.lmremutl;
+public import win32.lmrepl;
+public import win32.lmuse;
+public import win32.lmstats;
+
+version (WIN32_WINNT_ONLY) {
+	public import win32.lmwksta;
+	public import win32.lmserver;
+}
+version (WindowsVista) {
+	public import win32.lmmsg;
+} else version (Windows2003) {
+	public import win32.lmmsg;
+} else version (WindowsXP) {
+	public import win32.lmmsg;
+}
+
+// FIXME: Everything in these next files seems to be deprecated!
+import win32.lmaudit;
+import win32.lmchdev; // can't find many docs for functions from this file.
+import win32.lmconfig;
+import win32.lmerrlog;
+import win32.lmsvc;
+import win32.lmsname; // in MinGW, this was publicly included by lm.lmsvc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmaccess.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,759 @@
+/***********************************************************************\
+*                              lmaccess.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lmaccess;
+pragma(lib, "netapi32.lib");
+
+/**
+ Changes relative to MinGW:
+	USER_POSIX_ID_PARMNUM and GROUP_POSIX_ID_PARMNUM aren't in MinGW or in
+	the Platform SDK docs, so they have been dropped from this file.
+*/
+
+private import win32.lmcons, win32.windef;
+
+const wchar[]
+	GROUP_SPECIALGRP_USERS  = "USERS",
+	GROUP_SPECIALGRP_ADMINS = "ADMINS",
+	GROUP_SPECIALGRP_GUESTS = "GUESTS",
+	GROUP_SPECIALGRP_LOCAL  = "LOCAL";
+
+const ACCESS_LETTERS = "RWCXDAP ";
+
+const NETLOGON_CONTROL_QUERY=1;
+const NETLOGON_CONTROL_REPLICATE=2;
+const NETLOGON_CONTROL_SYNCHRONIZE=3;
+const NETLOGON_CONTROL_PDC_REPLICATE=4;
+const NETLOGON_CONTROL_REDISCOVER=5;
+const NETLOGON_CONTROL_TC_QUERY=6;
+const NETLOGON_CONTROL_BACKUP_CHANGE_LOG=65532;
+const NETLOGON_CONTROL_TRUNCATE_LOG=65533;
+const NETLOGON_CONTROL_SET_DBFLAG=65534;
+const NETLOGON_CONTROL_BREAKPOINT=65535;
+
+const UF_SCRIPT=1;
+const UF_ACCOUNTDISABLE=2;
+const UF_HOMEDIR_REQUIRED=8;
+const UF_LOCKOUT=16;
+const UF_PASSWD_NOTREQD=32;
+const UF_PASSWD_CANT_CHANGE=64;
+const UF_TEMP_DUPLICATE_ACCOUNT=256;
+const UF_NORMAL_ACCOUNT=512;
+const UF_INTERDOMAIN_TRUST_ACCOUNT=2048;
+const UF_WORKSTATION_TRUST_ACCOUNT=4096;
+const UF_SERVER_TRUST_ACCOUNT=8192;
+const UF_MNS_LOGON_ACCOUNT=131072;
+const UF_MACHINE_ACCOUNT_MASK=UF_INTERDOMAIN_TRUST_ACCOUNT|UF_WORKSTATION_TRUST_ACCOUNT|UF_SERVER_TRUST_ACCOUNT;
+const UF_ACCOUNT_TYPE_MASK=UF_TEMP_DUPLICATE_ACCOUNT|UF_NORMAL_ACCOUNT|UF_INTERDOMAIN_TRUST_ACCOUNT|UF_WORKSTATION_TRUST_ACCOUNT|UF_SERVER_TRUST_ACCOUNT;
+const UF_DONT_EXPIRE_PASSWD=65536;
+const UF_SETTABLE_BITS=UF_SCRIPT|UF_ACCOUNTDISABLE|UF_LOCKOUT|UF_HOMEDIR_REQUIRED|UF_PASSWD_NOTREQD|UF_PASSWD_CANT_CHANGE|UF_ACCOUNT_TYPE_MASK|UF_DONT_EXPIRE_PASSWD;
+
+const FILTER_TEMP_DUPLICATE_ACCOUNT=1;
+const FILTER_NORMAL_ACCOUNT=2;
+const FILTER_INTERDOMAIN_TRUST_ACCOUNT=8;
+const FILTER_WORKSTATION_TRUST_ACCOUNT=16;
+const FILTER_SERVER_TRUST_ACCOUNT=32;
+
+const LG_INCLUDE_INDIRECT=1;
+
+const AF_OP_PRINT=1;
+const AF_OP_COMM=2;
+const AF_OP_SERVER=4;
+const AF_OP_ACCOUNTS=8;
+const AF_SETTABLE_BITS=(AF_OP_PRINT|AF_OP_COMM|AF_OP_SERVER|AF_OP_ACCOUNTS);
+
+const UAS_ROLE_STANDALONE=0;
+const UAS_ROLE_MEMBER=1;
+const UAS_ROLE_BACKUP=2;
+const UAS_ROLE_PRIMARY=3;
+
+const USER_NAME_PARMNUM=1;
+const USER_PASSWORD_PARMNUM=3;
+const USER_PASSWORD_AGE_PARMNUM=4;
+const USER_PRIV_PARMNUM=5;
+const USER_HOME_DIR_PARMNUM=6;
+const USER_COMMENT_PARMNUM=7;
+const USER_FLAGS_PARMNUM=8;
+const USER_SCRIPT_PATH_PARMNUM=9;
+const USER_AUTH_FLAGS_PARMNUM=10;
+const USER_FULL_NAME_PARMNUM=11;
+const USER_USR_COMMENT_PARMNUM=12;
+const USER_PARMS_PARMNUM=13;
+const USER_WORKSTATIONS_PARMNUM=14;
+const USER_LAST_LOGON_PARMNUM=15;
+const USER_LAST_LOGOFF_PARMNUM=16;
+const USER_ACCT_EXPIRES_PARMNUM=17;
+const USER_MAX_STORAGE_PARMNUM=18;
+const USER_UNITS_PER_WEEK_PARMNUM=19;
+const USER_LOGON_HOURS_PARMNUM=20;
+const USER_PAD_PW_COUNT_PARMNUM=21;
+const USER_NUM_LOGONS_PARMNUM=22;
+const USER_LOGON_SERVER_PARMNUM=23;
+const USER_COUNTRY_CODE_PARMNUM=24;
+const USER_CODE_PAGE_PARMNUM=25;
+const USER_PRIMARY_GROUP_PARMNUM=51;
+const USER_PROFILE=52;
+const USER_PROFILE_PARMNUM=52;
+const USER_HOME_DIR_DRIVE_PARMNUM=53;
+
+const USER_NAME_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_NAME_PARMNUM;
+const USER_PASSWORD_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_PASSWORD_PARMNUM;
+const USER_PASSWORD_AGE_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_PASSWORD_AGE_PARMNUM;
+const USER_PRIV_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_PRIV_PARMNUM;
+const USER_HOME_DIR_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_HOME_DIR_PARMNUM;
+const USER_COMMENT_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_COMMENT_PARMNUM;
+const USER_FLAGS_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_FLAGS_PARMNUM;
+const USER_SCRIPT_PATH_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_SCRIPT_PATH_PARMNUM;
+const USER_AUTH_FLAGS_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_AUTH_FLAGS_PARMNUM;
+const USER_FULL_NAME_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_FULL_NAME_PARMNUM;
+const USER_USR_COMMENT_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_USR_COMMENT_PARMNUM;
+const USER_PARMS_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_PARMS_PARMNUM;
+const USER_WORKSTATIONS_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_WORKSTATIONS_PARMNUM;
+const USER_LAST_LOGON_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_LAST_LOGON_PARMNUM;
+const USER_LAST_LOGOFF_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_LAST_LOGOFF_PARMNUM;
+const USER_ACCT_EXPIRES_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_ACCT_EXPIRES_PARMNUM;
+const USER_MAX_STORAGE_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_MAX_STORAGE_PARMNUM;
+const USER_UNITS_PER_WEEK_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_UNITS_PER_WEEK_PARMNUM;
+const USER_LOGON_HOURS_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_LOGON_HOURS_PARMNUM;
+const USER_PAD_PW_COUNT_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_PAD_PW_COUNT_PARMNUM;
+const USER_NUM_LOGONS_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_NUM_LOGONS_PARMNUM;
+const USER_LOGON_SERVER_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_LOGON_SERVER_PARMNUM;
+const USER_COUNTRY_CODE_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_COUNTRY_CODE_PARMNUM;
+const USER_CODE_PAGE_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_CODE_PAGE_PARMNUM;
+const USER_PRIMARY_GROUP_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_PRIMARY_GROUP_PARMNUM;
+// USER_POSIX_ID_PARMNUM isn't in MinGW or in the Platform SDK docs.
+//const USER_POSIX_ID_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_POSIX_ID_PARMNUM;
+const USER_HOME_DIR_DRIVE_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+USER_HOME_DIR_DRIVE_PARMNUM;
+
+const NULL_USERSETINFO_PASSWD=" ";
+const ULONG TIMEQ_FOREVER=-1;
+const ULONG USER_MAXSTORAGE_UNLIMITED=-1;
+const ULONG USER_NO_LOGOFF=-1;
+const UNITS_PER_DAY=24;
+const UNITS_PER_WEEK=168;
+const USER_PRIV_MASK=3;
+const USER_PRIV_GUEST=0;
+const USER_PRIV_USER=1;
+const USER_PRIV_ADMIN=2;
+const MAX_PASSWD_LEN=PWLEN;
+const DEF_MIN_PWLEN=6;
+const DEF_PWUNIQUENESS=5;
+const DEF_MAX_PWHIST=8;
+const DEF_MAX_PWAGE=TIMEQ_FOREVER;
+const DEF_MIN_PWAGE=0;
+const ULONG DEF_FORCE_LOGOFF=0xffffffff;
+const DEF_MAX_BADPW=0;
+const ONE_DAY=86400;
+const VALIDATED_LOGON=0;
+const PASSWORD_EXPIRED=2;
+const NON_VALIDATED_LOGON=3;
+const VALID_LOGOFF=1;
+
+const MODALS_MIN_PASSWD_LEN_PARMNUM=1;
+const MODALS_MAX_PASSWD_AGE_PARMNUM=2;
+const MODALS_MIN_PASSWD_AGE_PARMNUM=3;
+const MODALS_FORCE_LOGOFF_PARMNUM=4;
+const MODALS_PASSWD_HIST_LEN_PARMNUM=5;
+const MODALS_ROLE_PARMNUM=6;
+const MODALS_PRIMARY_PARMNUM=7;
+const MODALS_DOMAIN_NAME_PARMNUM=8;
+const MODALS_DOMAIN_ID_PARMNUM=9;
+const MODALS_LOCKOUT_DURATION_PARMNUM=10;
+const MODALS_LOCKOUT_OBSERVATION_WINDOW_PARMNUM=11;
+const MODALS_LOCKOUT_THRESHOLD_PARMNUM=12;
+
+const MODALS_MIN_PASSWD_LEN_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+MODALS_MIN_PASSWD_LEN_PARMNUM);
+const MODALS_MAX_PASSWD_AGE_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+MODALS_MAX_PASSWD_AGE_PARMNUM);
+const MODALS_MIN_PASSWD_AGE_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+MODALS_MIN_PASSWD_AGE_PARMNUM);
+const MODALS_FORCE_LOGOFF_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+MODALS_FORCE_LOGOFF_PARMNUM);
+const MODALS_PASSWD_HIST_LEN_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+MODALS_PASSWD_HIST_LEN_PARMNUM);
+const MODALS_ROLE_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+MODALS_ROLE_PARMNUM);
+const MODALS_PRIMARY_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+MODALS_PRIMARY_PARMNUM);
+const MODALS_DOMAIN_NAME_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+MODALS_DOMAIN_NAME_PARMNUM);
+const MODALS_DOMAIN_ID_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+MODALS_DOMAIN_ID_PARMNUM);
+
+const GROUPIDMASK=0x8000;
+const GROUP_ALL_PARMNUM=0;
+const GROUP_NAME_PARMNUM=1;
+const GROUP_COMMENT_PARMNUM=2;
+const GROUP_ATTRIBUTES_PARMNUM=3;
+
+const GROUP_ALL_INFOLEVEL = PARMNUM_BASE_INFOLEVEL + GROUP_ALL_PARMNUM;
+const GROUP_NAME_INFOLEVEL = PARMNUM_BASE_INFOLEVEL + GROUP_NAME_PARMNUM;
+const GROUP_COMMENT_INFOLEVEL = PARMNUM_BASE_INFOLEVEL + GROUP_COMMENT_PARMNUM;
+const GROUP_ATTRIBUTES_INFOLEVEL = PARMNUM_BASE_INFOLEVEL + GROUP_ATTRIBUTES_PARMNUM;
+// GROUP_POSIX_ID_PARMNUM isn't in MinGW or in the Platform SDK docs.
+//const GROUP_POSIX_ID_INFOLEVEL = PARMNUM_BASE_INFOLEVEL + GROUP_POSIX_ID_PARMNUM;
+
+const LOCALGROUP_NAME_PARMNUM=1;
+const LOCALGROUP_COMMENT_PARMNUM=2;
+const MAXPERMENTRIES=64;
+const ACCESS_NONE=0;
+const ACCESS_READ=1;
+const ACCESS_WRITE=2;
+const ACCESS_CREATE=4;
+const ACCESS_EXEC=8;
+const ACCESS_DELETE=16;
+const ACCESS_ATRIB=32;
+const ACCESS_PERM=64;
+const ACCESS_ALL = ACCESS_READ|ACCESS_WRITE|ACCESS_CREATE|ACCESS_EXEC|ACCESS_DELETE|ACCESS_ATRIB|ACCESS_PERM;
+const ACCESS_GROUP=0x8000;
+const ACCESS_AUDIT=1;
+const ACCESS_SUCCESS_OPEN=16;
+const ACCESS_SUCCESS_WRITE=32;
+const ACCESS_SUCCESS_DELETE=64;
+const ACCESS_SUCCESS_ACL=128;
+const ACCESS_SUCCESS_MASK=240;
+const ACCESS_FAIL_OPEN=256;
+const ACCESS_FAIL_WRITE=512;
+const ACCESS_FAIL_DELETE=1024;
+const ACCESS_FAIL_ACL=2048;
+const ACCESS_FAIL_MASK=3840;
+const ACCESS_FAIL_SHIFT=4;
+const ACCESS_RESOURCE_NAME_PARMNUM=1;
+const ACCESS_ATTR_PARMNUM=2;
+const ACCESS_COUNT_PARMNUM=3;
+const ACCESS_ACCESS_LIST_PARMNUM=4;
+
+const ACCESS_RESOURCE_NAME_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+ACCESS_RESOURCE_NAME_PARMNUM);
+const ACCESS_ATTR_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+ACCESS_ATTR_PARMNUM);
+const ACCESS_COUNT_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+ACCESS_COUNT_PARMNUM);
+const ACCESS_ACCESS_LIST_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+ACCESS_ACCESS_LIST_PARMNUM);
+
+const NETLOGON_REPLICATION_NEEDED=1;
+const NETLOGON_REPLICATION_IN_PROGRESS=2;
+const NETLOGON_FULL_SYNC_REPLICATION=4;
+const NETLOGON_REDO_NEEDED=8;
+
+struct USER_INFO_0 {
+	LPWSTR usri0_name;
+}
+alias USER_INFO_0* PUSER_INFO_0, LPUSER_INFO_0;
+
+struct USER_INFO_1{
+	LPWSTR usri1_name;
+	LPWSTR usri1_password;
+	DWORD usri1_password_age;
+	DWORD usri1_priv;
+	LPWSTR usri1_home_dir;
+	LPWSTR usri1_comment;
+	DWORD usri1_flags;
+	LPWSTR usri1_script_path;
+}
+alias USER_INFO_1* PUSER_INFO_1, LPUSER_INFO_1;
+
+struct USER_INFO_2{
+	LPWSTR usri2_name;
+	LPWSTR usri2_password;
+	DWORD usri2_password_age;
+	DWORD usri2_priv;
+	LPWSTR usri2_home_dir;
+	LPWSTR usri2_comment;
+	DWORD usri2_flags;
+	LPWSTR usri2_script_path;
+	DWORD usri2_auth_flags;
+	LPWSTR usri2_full_name;
+	LPWSTR usri2_usr_comment;
+	LPWSTR usri2_parms;
+	LPWSTR usri2_workstations;
+	DWORD usri2_last_logon;
+	DWORD usri2_last_logoff;
+	DWORD usri2_acct_expires;
+	DWORD usri2_max_storage;
+	DWORD usri2_units_per_week;
+	PBYTE usri2_logon_hours;
+	DWORD usri2_bad_pw_count;
+	DWORD usri2_num_logons;
+	LPWSTR usri2_logon_server;
+	DWORD usri2_country_code;
+	DWORD usri2_code_page;
+}
+alias USER_INFO_2* PUSER_INFO_2, LPUSER_INFO_2;
+
+struct USER_INFO_3{
+	LPWSTR usri3_name;
+	LPWSTR usri3_password;
+	DWORD usri3_password_age;
+	DWORD usri3_priv;
+	LPWSTR usri3_home_dir;
+	LPWSTR usri3_comment;
+	DWORD usri3_flags;
+	LPWSTR usri3_script_path;
+	DWORD usri3_auth_flags;
+	LPWSTR usri3_full_name;
+	LPWSTR usri3_usr_comment;
+	LPWSTR usri3_parms;
+	LPWSTR usri3_workstations;
+	DWORD usri3_last_logon;
+	DWORD usri3_last_logoff;
+	DWORD usri3_acct_expires;
+	DWORD usri3_max_storage;
+	DWORD usri3_units_per_week;
+	PBYTE usri3_logon_hours;
+	DWORD usri3_bad_pw_count;
+	DWORD usri3_num_logons;
+	LPWSTR usri3_logon_server;
+	DWORD usri3_country_code;
+	DWORD usri3_code_page;
+	DWORD usri3_user_id;
+	DWORD usri3_primary_group_id;
+	LPWSTR usri3_profile;
+	LPWSTR usri3_home_dir_drive;
+	DWORD usri3_password_expired;
+}
+alias USER_INFO_3* PUSER_INFO_3, LPUSER_INFO_3;
+
+struct USER_INFO_10{
+	LPWSTR usri10_name;
+	LPWSTR usri10_comment;
+	LPWSTR usri10_usr_comment;
+	LPWSTR usri10_full_name;
+}
+alias USER_INFO_10* PUSER_INFO_10, LPUSER_INFO_10;
+
+struct USER_INFO_11{
+	LPWSTR usri11_name;
+	LPWSTR usri11_comment;
+	LPWSTR usri11_usr_comment;
+	LPWSTR usri11_full_name;
+	DWORD usri11_priv;
+	DWORD usri11_auth_flags;
+	DWORD usri11_password_age;
+	LPWSTR usri11_home_dir;
+	LPWSTR usri11_parms;
+	DWORD usri11_last_logon;
+	DWORD usri11_last_logoff;
+	DWORD usri11_bad_pw_count;
+	DWORD usri11_num_logons;
+	LPWSTR usri11_logon_server;
+	DWORD usri11_country_code;
+	LPWSTR usri11_workstations;
+	DWORD usri11_max_storage;
+	DWORD usri11_units_per_week;
+	PBYTE usri11_logon_hours;
+	DWORD usri11_code_page;
+}
+alias USER_INFO_11* PUSER_INFO_11, LPUSER_INFO_11;
+
+struct USER_INFO_20 {
+	LPWSTR usri20_name;
+	LPWSTR usri20_full_name;
+	LPWSTR usri20_comment;
+	DWORD usri20_flags;
+	DWORD usri20_user_id;
+}
+alias USER_INFO_20* PUSER_INFO_20, LPUSER_INFO_20;
+
+struct USER_INFO_21 {
+	BYTE usri21_password[ENCRYPTED_PWLEN];
+}
+alias USER_INFO_21* PUSER_INFO_21, LPUSER_INFO_21;
+
+struct USER_INFO_22{
+	LPWSTR usri22_name;
+	BYTE usri22_password[ENCRYPTED_PWLEN];
+	DWORD usri22_password_age;
+	DWORD usri22_priv;
+	LPWSTR usri22_home_dir;
+	LPWSTR usri22_comment;
+	DWORD usri22_flags;
+	LPWSTR usri22_script_path;
+	DWORD usri22_auth_flags;
+	LPWSTR usri22_full_name;
+	LPWSTR usri22_usr_comment;
+	LPWSTR usri22_parms;
+	LPWSTR usri22_workstations;
+	DWORD usri22_last_logon;
+	DWORD usri22_last_logoff;
+	DWORD usri22_acct_expires;
+	DWORD usri22_max_storage;
+	DWORD usri22_units_per_week;
+	PBYTE usri22_logon_hours;
+	DWORD usri22_bad_pw_count;
+	DWORD usri22_num_logons;
+	LPWSTR usri22_logon_server;
+	DWORD usri22_country_code;
+	DWORD usri22_code_page;
+}
+alias USER_INFO_22* PUSER_INFO_22, LPUSER_INFO_22;
+
+struct USER_INFO_1003{
+	LPWSTR usri1003_password;
+}
+alias USER_INFO_1003* PUSER_INFO_1003, LPUSER_INFO_1003;
+
+struct USER_INFO_1005{
+	DWORD usri1005_priv;
+}
+alias USER_INFO_1005* PUSER_INFO_1005, LPUSER_INFO_1005;
+
+struct USER_INFO_1006{
+	LPWSTR usri1006_home_dir;
+}
+alias USER_INFO_1006* PUSER_INFO_1006, LPUSER_INFO_1006;
+
+struct USER_INFO_1007{
+	LPWSTR usri1007_comment;
+}
+alias USER_INFO_1007* PUSER_INFO_1007, LPUSER_INFO_1007;
+
+struct USER_INFO_1008{
+	DWORD usri1008_flags;
+}
+alias USER_INFO_1008* PUSER_INFO_1008, LPUSER_INFO_1008;
+
+struct USER_INFO_1009{
+	LPWSTR usri1009_script_path;
+}
+alias USER_INFO_1009* PUSER_INFO_1009, LPUSER_INFO_1009;
+
+struct USER_INFO_1010{
+	DWORD usri1010_auth_flags;
+}
+alias USER_INFO_1010* PUSER_INFO_1010, LPUSER_INFO_1010;
+
+struct USER_INFO_1011{
+	LPWSTR usri1011_full_name;
+}
+alias USER_INFO_1011* PUSER_INFO_1011, LPUSER_INFO_1011;
+
+struct USER_INFO_1012{
+	LPWSTR usri1012_usr_comment;
+}
+alias USER_INFO_1012* PUSER_INFO_1012, LPUSER_INFO_1012;
+
+struct USER_INFO_1013{
+	LPWSTR usri1013_parms;
+}
+alias USER_INFO_1013* PUSER_INFO_1013, LPUSER_INFO_1013;
+
+struct USER_INFO_1014{
+	LPWSTR usri1014_workstations;
+}
+alias USER_INFO_1014* PUSER_INFO_1014, LPUSER_INFO_1014;
+
+struct USER_INFO_1017{
+	DWORD usri1017_acct_expires;
+}
+alias USER_INFO_1017* PUSER_INFO_1017, LPUSER_INFO_1017;
+
+struct USER_INFO_1018{
+	DWORD usri1018_max_storage;
+}
+alias USER_INFO_1018* PUSER_INFO_1018, LPUSER_INFO_1018;
+
+struct USER_INFO_1020{
+	DWORD usri1020_units_per_week;
+	PBYTE usri1020_logon_hours;
+}
+alias USER_INFO_1020* PUSER_INFO_1020, LPUSER_INFO_1020;
+
+struct USER_INFO_1023{
+	LPWSTR usri1023_logon_server;
+}
+alias USER_INFO_1023* PUSER_INFO_1023, LPUSER_INFO_1023;
+
+struct USER_INFO_1024{
+	DWORD usri1024_country_code;
+}
+alias USER_INFO_1024* PUSER_INFO_1024, LPUSER_INFO_1024;
+
+struct USER_INFO_1025{
+	DWORD usri1025_code_page;
+}
+alias USER_INFO_1025* PUSER_INFO_1025, LPUSER_INFO_1025;
+
+struct USER_INFO_1051{
+	DWORD usri1051_primary_group_id;
+}
+alias USER_INFO_1051* PUSER_INFO_1051, LPUSER_INFO_1051;
+
+struct USER_INFO_1052{
+	LPWSTR usri1052_profile;
+}
+alias USER_INFO_1052* PUSER_INFO_1052, LPUSER_INFO_1052;
+
+struct USER_INFO_1053{
+	LPWSTR usri1053_home_dir_drive;
+}
+alias USER_INFO_1053* PUSER_INFO_1053, LPUSER_INFO_1053;
+
+struct USER_MODALS_INFO_0{
+	DWORD usrmod0_min_passwd_len;
+	DWORD usrmod0_max_passwd_age;
+	DWORD usrmod0_min_passwd_age;
+	DWORD usrmod0_force_logoff;
+	DWORD usrmod0_password_hist_len;
+}
+alias USER_MODALS_INFO_0* PUSER_MODALS_INFO_0, LPUSER_MODALS_INFO_0;
+
+struct USER_MODALS_INFO_1{
+	DWORD usrmod1_role;
+	LPWSTR usrmod1_primary;
+}
+alias USER_MODALS_INFO_1* PUSER_MODALS_INFO_1, LPUSER_MODALS_INFO_1;
+
+struct USER_MODALS_INFO_2{
+	LPWSTR usrmod2_domain_name;
+	PSID usrmod2_domain_id;
+}
+alias USER_MODALS_INFO_2* PUSER_MODALS_INFO_2, LPUSER_MODALS_INFO_2;
+
+struct USER_MODALS_INFO_3{
+	DWORD usrmod3_lockout_duration;
+	DWORD usrmod3_lockout_observation_window;
+	DWORD usrmod3_lockout_threshold;
+}
+alias USER_MODALS_INFO_3* PUSER_MODALS_INFO_3, LPUSER_MODALS_INFO_3;
+
+struct USER_MODALS_INFO_1001{
+	DWORD usrmod1001_min_passwd_len;
+}
+alias USER_MODALS_INFO_1001* PUSER_MODALS_INFO_1001, LPUSER_MODALS_INFO_1001;
+
+struct USER_MODALS_INFO_1002{
+	DWORD usrmod1002_max_passwd_age;
+}
+alias USER_MODALS_INFO_1002* PUSER_MODALS_INFO_1002, LPUSER_MODALS_INFO_1002;
+
+struct USER_MODALS_INFO_1003{
+	DWORD usrmod1003_min_passwd_age;
+}
+alias USER_MODALS_INFO_1003* PUSER_MODALS_INFO_1003, LPUSER_MODALS_INFO_1003;
+
+struct USER_MODALS_INFO_1004{
+	DWORD usrmod1004_force_logoff;
+}
+alias USER_MODALS_INFO_1004* PUSER_MODALS_INFO_1004, LPUSER_MODALS_INFO_1004;
+
+struct USER_MODALS_INFO_1005{
+	DWORD usrmod1005_password_hist_len;
+}
+alias USER_MODALS_INFO_1005* PUSER_MODALS_INFO_1005, LPUSER_MODALS_INFO_1005;
+
+struct USER_MODALS_INFO_1006{
+	DWORD usrmod1006_role;
+}
+alias USER_MODALS_INFO_1006* PUSER_MODALS_INFO_1006, LPUSER_MODALS_INFO_1006;
+
+struct USER_MODALS_INFO_1007{
+	LPWSTR usrmod1007_primary;
+}
+alias USER_MODALS_INFO_1007* PUSER_MODALS_INFO_1007, LPUSER_MODALS_INFO_1007;
+
+struct GROUP_INFO_0{
+	LPWSTR grpi0_name;
+}
+alias GROUP_INFO_0* PGROUP_INFO_0, LPGROUP_INFO_0;
+
+struct GROUP_INFO_1{
+	LPWSTR grpi1_name;
+	LPWSTR grpi1_comment;
+}
+alias GROUP_INFO_1* PGROUP_INFO_1, LPGROUP_INFO_1;
+
+struct GROUP_INFO_2{
+	LPWSTR grpi2_name;
+	LPWSTR grpi2_comment;
+	DWORD grpi2_group_id;
+	DWORD grpi2_attributes;
+}
+alias GROUP_INFO_2* PGROUP_INFO_2;
+
+struct GROUP_INFO_1002{
+	LPWSTR grpi1002_comment;
+}
+alias GROUP_INFO_1002* PGROUP_INFO_1002, LPGROUP_INFO_1002;
+
+struct GROUP_INFO_1005{
+	DWORD grpi1005_attributes;
+}
+alias GROUP_INFO_1005* PGROUP_INFO_1005, LPGROUP_INFO_1005;
+
+struct GROUP_USERS_INFO_0{
+	LPWSTR grui0_name;
+}
+alias GROUP_USERS_INFO_0* PGROUP_USERS_INFO_0, LPGROUP_USERS_INFO_0;
+
+struct GROUP_USERS_INFO_1{
+	LPWSTR grui1_name;
+	DWORD grui1_attributes;
+}
+alias GROUP_USERS_INFO_1* PGROUP_USERS_INFO_1, LPGROUP_USERS_INFO_1;
+
+struct LOCALGROUP_INFO_0{
+	LPWSTR lgrpi0_name;
+}
+alias LOCALGROUP_INFO_0* PLOCALGROUP_INFO_0, LPLOCALGROUP_INFO_0;
+
+struct LOCALGROUP_INFO_1{
+	LPWSTR lgrpi1_name;
+	LPWSTR lgrpi1_comment;
+}
+alias LOCALGROUP_INFO_1* PLOCALGROUP_INFO_1, LPLOCALGROUP_INFO_1;
+
+struct LOCALGROUP_INFO_1002{
+	LPWSTR lgrpi1002_comment;
+}
+alias LOCALGROUP_INFO_1002* PLOCALGROUP_INFO_1002, LPLOCALGROUP_INFO_1002;
+
+struct LOCALGROUP_MEMBERS_INFO_0{
+	PSID lgrmi0_sid;
+}
+alias LOCALGROUP_MEMBERS_INFO_0* PLOCALGROUP_MEMBERS_INFO_0, LPLOCALGROUP_MEMBERS_INFO_0;
+
+struct LOCALGROUP_MEMBERS_INFO_1{
+	PSID lgrmi1_sid;
+	SID_NAME_USE lgrmi1_sidusage;
+	LPWSTR lgrmi1_name;
+}
+alias LOCALGROUP_MEMBERS_INFO_1* PLOCALGROUP_MEMBERS_INFO_1, LPLOCALGROUP_MEMBERS_INFO_1;
+
+struct LOCALGROUP_MEMBERS_INFO_2{
+	PSID lgrmi2_sid;
+	SID_NAME_USE lgrmi2_sidusage;
+	LPWSTR lgrmi2_domainandname;
+}
+alias LOCALGROUP_MEMBERS_INFO_2* PLOCALGROUP_MEMBERS_INFO_2, LPLOCALGROUP_MEMBERS_INFO_2;
+
+struct LOCALGROUP_MEMBERS_INFO_3{
+	LPWSTR lgrmi3_domainandname;
+}
+alias LOCALGROUP_MEMBERS_INFO_3* PLOCALGROUP_MEMBERS_INFO_3, LPLOCALGROUP_MEMBERS_INFO_3;
+
+struct LOCALGROUP_USERS_INFO_0{
+	LPWSTR lgrui0_name;
+}
+alias LOCALGROUP_USERS_INFO_0* PLOCALGROUP_USERS_INFO_0, LPLOCALGROUP_USERS_INFO_0;
+
+struct NET_DISPLAY_USER{
+	LPWSTR usri1_name;
+	LPWSTR usri1_comment;
+	DWORD usri1_flags;
+	LPWSTR usri1_full_name;
+	DWORD usri1_user_id;
+	DWORD usri1_next_index;
+}
+alias NET_DISPLAY_USER* PNET_DISPLAY_USER;
+
+struct NET_DISPLAY_MACHINE{
+	LPWSTR usri2_name;
+	LPWSTR usri2_comment;
+	DWORD usri2_flags;
+	DWORD usri2_user_id;
+	DWORD usri2_next_index;
+}
+alias NET_DISPLAY_MACHINE* PNET_DISPLAY_MACHINE;
+
+struct NET_DISPLAY_GROUP{
+	LPWSTR grpi3_name;
+	LPWSTR grpi3_comment;
+	DWORD grpi3_group_id;
+	DWORD grpi3_attributes;
+	DWORD grpi3_next_index;
+}
+alias NET_DISPLAY_GROUP* PNET_DISPLAY_GROUP;
+
+struct ACCESS_INFO_0{
+	LPTSTR acc0_resource_name;
+}
+alias ACCESS_INFO_0* PACCESS_INFO_0, LPACCESS_INFO_0;
+
+struct ACCESS_INFO_1{
+	LPTSTR acc1_resource_name;
+	DWORD acc1_attr;
+	DWORD acc1_count;
+}
+alias ACCESS_INFO_1* PACCESS_INFO_1, LPACCESS_INFO_1;
+
+struct ACCESS_INFO_1002{
+	DWORD acc1002_attr;
+}
+alias ACCESS_INFO_1002* PACCESS_INFO_1002, LPACCESS_INFO_1002;
+
+struct ACCESS_LIST{
+	LPTSTR acl_ugname;
+	DWORD acl_access;
+}
+alias ACCESS_LIST* PACCESS_LIST, LPACCESS_LIST;
+
+struct NETLOGON_INFO_1{
+	DWORD netlog1_flags;
+	NET_API_STATUS netlog1_pdc_connection_status;
+}
+alias NETLOGON_INFO_1* PNETLOGON_INFO_1;
+
+struct NETLOGON_INFO_2{
+	DWORD netlog2_flags;
+	NET_API_STATUS netlog2_pdc_connection_status;
+	LPWSTR netlog2_trusted_dc_name;
+	NET_API_STATUS netlog2_tc_connection_status;
+}
+alias NETLOGON_INFO_2* PNETLOGON_INFO_2;
+
+struct NETLOGON_INFO_3{
+	DWORD netlog3_flags;
+	DWORD netlog3_logon_attempts;
+	DWORD netlog3_reserved1;
+	DWORD netlog3_reserved2;
+	DWORD netlog3_reserved3;
+	DWORD netlog3_reserved4;
+	DWORD netlog3_reserved5;
+}
+alias NETLOGON_INFO_3* PNETLOGON_INFO_3;
+
+extern (Windows) {
+deprecated {
+	/* These are obsolete */
+	NET_API_STATUS NetAccessAdd(LPCWSTR,DWORD,PBYTE,PDWORD);
+	NET_API_STATUS NetAccessEnum(LPCWSTR,LPCWSTR,DWORD,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+	NET_API_STATUS NetAccessGetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE*);
+	NET_API_STATUS NetAccessSetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE,PDWORD);
+	NET_API_STATUS NetAccessDel(LPCWSTR,LPCWSTR);
+	NET_API_STATUS NetAccessGetUserPerms(LPCWSTR,LPCWSTR,LPCWSTR,PDWORD);
+}
+NET_API_STATUS NetUserAdd(LPCWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS NetUserEnum(LPCWSTR,DWORD,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS NetUserGetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE*);
+NET_API_STATUS NetUserSetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS NetUserDel(LPCWSTR,LPCWSTR);
+NET_API_STATUS NetUserGetGroups(LPCWSTR,LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD);
+NET_API_STATUS NetUserSetGroups(LPCWSTR,LPCWSTR,DWORD,PBYTE,DWORD);
+NET_API_STATUS NetUserGetLocalGroups(LPCWSTR,LPCWSTR,DWORD,DWORD,PBYTE*,DWORD,PDWORD,PDWORD);
+NET_API_STATUS NetUserModalsGet(LPCWSTR,DWORD,PBYTE*);
+NET_API_STATUS NetUserModalsSet(LPCWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS NetUserChangePassword(LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR);
+NET_API_STATUS NetGroupAdd(LPCWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS NetGroupAddUser(LPCWSTR,LPCWSTR,LPCWSTR);
+NET_API_STATUS NetGroupEnum(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS NetGroupGetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE*);
+NET_API_STATUS NetGroupSetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS NetGroupDel(LPCWSTR,LPCWSTR);
+NET_API_STATUS NetGroupDelUser(LPCWSTR,LPCWSTR,LPCWSTR);
+NET_API_STATUS NetGroupGetUsers(LPCWSTR,LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS NetGroupSetUsers(LPCWSTR,LPCWSTR,DWORD,PBYTE,DWORD);
+NET_API_STATUS NetLocalGroupAdd(LPCWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS NetLocalGroupAddMember(LPCWSTR,LPCWSTR,PSID);
+NET_API_STATUS NetLocalGroupEnum(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS NetLocalGroupGetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE*);
+NET_API_STATUS NetLocalGroupSetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS NetLocalGroupDel(LPCWSTR,LPCWSTR);
+NET_API_STATUS NetLocalGroupDelMember(LPCWSTR,LPCWSTR,PSID);
+NET_API_STATUS NetLocalGroupGetMembers(LPCWSTR,LPCWSTR,DWORD,PBYTE*,DWORD,
+PDWORD,PDWORD,PDWORD);
+NET_API_STATUS NetLocalGroupSetMembers(LPCWSTR,LPCWSTR,DWORD,PBYTE,DWORD);
+NET_API_STATUS NetLocalGroupAddMembers(LPCWSTR,LPCWSTR,DWORD,PBYTE,DWORD);
+NET_API_STATUS NetLocalGroupDelMembers(LPCWSTR,LPCWSTR,DWORD,PBYTE,DWORD);
+NET_API_STATUS NetQueryDisplayInformation(LPCWSTR,DWORD,DWORD,DWORD,DWORD,PDWORD,PVOID*);
+NET_API_STATUS NetGetDisplayInformationIndex(LPCWSTR,DWORD,LPCWSTR,PDWORD);
+NET_API_STATUS NetGetDCName(LPCWSTR,LPCWSTR,PBYTE*);
+NET_API_STATUS NetGetAnyDCName(LPCWSTR,LPCWSTR,PBYTE*);
+NET_API_STATUS I_NetLogonControl(LPCWSTR,DWORD,DWORD,PBYTE*);
+NET_API_STATUS I_NetLogonControl2(LPCWSTR,DWORD,DWORD,PBYTE,PBYTE*);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmalert.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,77 @@
+/***********************************************************************\
+*                               lmalert.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lmalert;
+pragma(lib, "netapi32.lib");
+
+private import win32.lmcons, win32.windef;
+
+const TCHAR[]
+	ALERTER_MAILSLOT     = `\\.\MAILSLOT\Alerter`,
+	ALERT_PRINT_EVENT    = "PRINTING",
+	ALERT_MESSAGE_EVENT  = "MESSAGE",
+	ALERT_ERRORLOG_EVENT = "ERRORLOG",
+	ALERT_ADMIN_EVENT    = "ADMIN",
+	ALERT_USER_EVENT     = "USER";
+//MACRO #define ALERT_OTHER_INFO(x) ((PBYTE)(x)+sizeof(STD_ALERT))
+
+//MACRO #define ALERT_VAR_DATA(p) ((PBYTE)(p)+sizeof(*p))
+
+const PRJOB_QSTATUS     = 3;
+const PRJOB_DEVSTATUS   = 508;
+const PRJOB_COMPLETE    = 4;
+const PRJOB_INTERV      = 8;
+const PRJOB_            = 16;
+const PRJOB_DESTOFFLINE = 32;
+const PRJOB_DESTPAUSED  = 64;
+const PRJOB_NOTIFY      = 128;
+const PRJOB_DESTNOPAPER = 256;
+const PRJOB_DELETED     = 32768;
+const PRJOB_QS_QUEUED   = 0;
+const PRJOB_QS_PAUSED   = 1;
+const PRJOB_QS_SPOOLING = 2;
+const PRJOB_QS_PRINTING = 3;
+
+struct ADMIN_OTHER_INFO{
+	DWORD alrtad_errcode;
+	DWORD alrtad_numstrings;
+}
+alias ADMIN_OTHER_INFO* PADMIN_OTHER_INFO, LPADMIN_OTHER_INFO;
+
+struct STD_ALERT{
+	DWORD alrt_timestamp;
+	TCHAR alrt_eventname[EVLEN+1];
+	TCHAR alrt_servicename[SNLEN+1];
+}
+alias STD_ALERT* PSTD_ALERT, LPSTD_ALERT;
+
+struct ERRLOG_OTHER_INFO{
+	DWORD alrter_errcode;
+	DWORD alrter_offset;
+}
+alias ERRLOG_OTHER_INFO* PERRLOG_OTHER_INFO, LPERRLOG_OTHER_INFO;
+
+struct PRINT_OTHER_INFO{
+	DWORD alrtpr_jobid;
+	DWORD alrtpr_status;
+	DWORD alrtpr_submitted;
+	DWORD alrtpr_size;
+}
+alias PRINT_OTHER_INFO* PPRINT_OTHER_INFO, LPPRINT_OTHER_INFO;
+
+struct USER_OTHER_INFO{
+	DWORD alrtus_errcode;
+	DWORD alrtus_numstrings;
+}
+alias USER_OTHER_INFO* PUSER_OTHER_INFO, LPUSER_OTHER_INFO;
+
+extern (Windows) {
+NET_API_STATUS NetAlertRaise(LPCWSTR,PVOID,DWORD);
+NET_API_STATUS NetAlertRaiseEx(LPCWSTR,PVOID,DWORD,LPCWSTR);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmapibuf.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,21 @@
+/***********************************************************************\
+*                              lmapibuf.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lmapibuf;
+pragma(lib, "netapi32.lib");
+
+private import win32.lmcons, win32.windef;
+
+extern (Windows) {
+	NET_API_STATUS NetApiBufferAllocate(DWORD, PVOID*);
+	NET_API_STATUS NetApiBufferFree(PVOID);
+	NET_API_STATUS NetApiBufferReallocate(PVOID, DWORD, PVOID*);
+	NET_API_STATUS NetApiBufferSize(PVOID, PDWORD);
+	NET_API_STATUS NetapipBufferAllocate(DWORD, PVOID*);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmat.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,50 @@
+/***********************************************************************\
+*                                lmat.d                                 *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lmat;
+pragma(lib, "netapi32.lib");
+
+private import win32.lmcons, win32.windef;
+
+const JOB_RUN_PERIODICALLY = 1;
+const JOB_EXEC_ERROR       = 2;
+const JOB_RUNS_TODAY       = 4;
+const JOB_ADD_CURRENT_DATE = 8;
+const JOB_NONINTERACTIVE   = 16;
+const JOB_INPUT_FLAGS      = JOB_RUN_PERIODICALLY | JOB_ADD_CURRENT_DATE
+                             | JOB_NONINTERACTIVE;
+const JOB_OUTPUT_FLAGS     = JOB_RUN_PERIODICALLY | JOB_EXEC_ERROR
+                             | JOB_RUNS_TODAY | JOB_NONINTERACTIVE;
+
+struct AT_ENUM {
+	DWORD JobId;
+	DWORD JobTime;
+	DWORD DaysOfMonth;
+	UCHAR DaysOfWeek;
+	UCHAR Flags;
+	LPWSTR Command;
+}
+alias AT_ENUM* PAT_ENUM, LPAT_ENUM;
+
+struct AT_INFO {
+	DWORD JobTime;
+	DWORD DaysOfMonth;
+	UCHAR DaysOfWeek;
+	UCHAR Flags;
+	LPWSTR Command;
+}
+alias AT_INFO* PAT_INFO, LPAT_INFO;
+
+extern (Windows) {
+	NET_API_STATUS NetScheduleJobAdd(LPWSTR, PBYTE, LPDWORD);
+	NET_API_STATUS NetScheduleJobDel(LPWSTR, DWORD, DWORD);
+	NET_API_STATUS NetScheduleJobEnum(LPWSTR, PBYTE*, DWORD, PDWORD, PDWORD,
+	  PDWORD);
+	NET_API_STATUS NetScheduleJobGetInfo(LPWSTR, DWORD, PBYTE*);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmaudit.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,302 @@
+/***********************************************************************\
+*                               lmaudit.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+// COMMENT: This file may be deprecated.
+module win32.lmaudit;
+
+private import win32.lmcons, win32.windef;
+
+const LOGFLAGS_FORWARD  = 0;
+const LOGFLAGS_BACKWARD = 1;
+const LOGFLAGS_SEEK     = 2;
+
+const ACTION_LOCKOUT     = 0;
+const ACTION_ADMINUNLOCK = 1;
+
+const AE_GUEST=0;
+const AE_USER=1;
+const AE_ADMIN=2;
+const AE_NORMAL=0;
+const AE_USERLIMIT=0;
+const AE_GENERAL=0;
+const AE_ERROR=1;
+const AE_SESSDIS=1;
+const AE_BADPW=1;
+const AE_AUTODIS=2;
+const AE_UNSHARE=2;
+const AE_ADMINPRIVREQD=2;
+const AE_ADMINDIS=3;
+const AE_NOACCESSPERM=3;
+const AE_ACCRESTRICT=4;
+const AE_NORMAL_CLOSE=0;
+const AE_SES_CLOSE=1;
+const AE_ADMIN_CLOSE=2;
+const AE_LIM_UNKNOWN=0;
+const AE_LIM_LOGONHOURS=1;
+const AE_LIM_EXPIRED=2;
+const AE_LIM_INVAL_WKSTA=3;
+const AE_LIM_DISABLED=4;
+const AE_LIM_DELETED=5;
+const AE_MOD=0;
+const AE_DELETE=1;
+const AE_ADD=2;
+
+const AE_UAS_USER   = 0;
+const AE_UAS_GROUP  = 1;
+const AE_UAS_MODALS = 2;
+
+const SVAUD_SERVICE       = 1;
+const SVAUD_GOODSESSLOGON = 6;
+const SVAUD_BADSESSLOGON  = 24;
+const SVAUD_SESSLOGON     = SVAUD_GOODSESSLOGON|SVAUD_BADSESSLOGON;
+const SVAUD_GOODNETLOGON  = 96;
+const SVAUD_BADNETLOGON   = 384;
+const SVAUD_NETLOGON      = SVAUD_GOODNETLOGON|SVAUD_BADNETLOGON;
+const SVAUD_LOGON         = SVAUD_NETLOGON|SVAUD_SESSLOGON;
+const SVAUD_GOODUSE       = 0x600;
+const SVAUD_BADUSE        = 0x1800;
+const SVAUD_USE           = SVAUD_GOODUSE|SVAUD_BADUSE;
+const SVAUD_USERLIST      = 8192;
+const SVAUD_PERMISSIONS   = 16384;
+const SVAUD_RESOURCE      = 32768;
+const SVAUD_LOGONLIM      = 65536;
+
+const AA_AUDIT_ALL=1;
+const AA_A_OWNER=4;
+const AA_CLOSE=8;
+const AA_S_OPEN=16;
+const AA_S_WRITE=32;
+const AA_S_CREATE=32;
+const AA_S_DELETE=64;
+const AA_S_ACL=128;
+const AA_S_ALL=253;
+const AA_F_OPEN=256;
+const AA_F_WRITE=512;
+const AA_F_CREATE=512;
+const AA_F_DELETE=1024;
+const AA_F_ACL=2048;
+const AA_F_ALL = AA_F_OPEN|AA_F_WRITE|AA_F_DELETE|AA_F_ACL;
+const AA_A_OPEN=2048;
+const AA_A_WRITE=4096;
+const AA_A_CREATE=8192;
+const AA_A_DELETE=16384;
+const AA_A_ACL=32768;
+const AA_A_ALL = AA_F_OPEN|AA_F_WRITE|AA_F_DELETE|AA_F_ACL;
+
+struct AUDIT_ENTRY{
+	DWORD ae_len;
+	DWORD ae_reserved;
+	DWORD ae_time;
+	DWORD ae_type;
+	DWORD ae_data_offset;
+	DWORD ae_data_size;
+}
+alias AUDIT_ENTRY* PAUDIT_ENTRY, LPAUDIT_ENTRY;
+
+struct HLOG{
+	DWORD time;
+	DWORD last_flags;
+	DWORD offset;
+	DWORD rec_offset;
+}
+alias HLOG* PHLOG, LPHLOG;
+
+struct AE_SRVSTATUS{
+	DWORD ae_sv_status;
+}
+alias AE_SRVSTATUS* PAE_SRVSTATUS, LPAE_SRVSTATUS;
+
+struct AE_SESSLOGON{
+	DWORD ae_so_compname;
+	DWORD ae_so_username;
+	DWORD ae_so_privilege;
+}
+alias AE_SESSLOGON* PAE_SESSLOGON, LPAE_SESSLOGON;
+
+struct AE_SESSLOGOFF{
+	DWORD ae_sf_compname;
+	DWORD ae_sf_username;
+	DWORD ae_sf_reason;
+}
+alias AE_SESSLOGOFF* PAE_SESSLOGOFF, LPAE_SESSLOGOFF;
+
+struct AE_SESSPWERR{
+	DWORD ae_sp_compname;
+	DWORD ae_sp_username;
+}
+alias AE_SESSPWERR* PAE_SESSPWERR, LPAE_SESSPWERR;
+
+struct AE_CONNSTART{
+	DWORD ae_ct_compname;
+	DWORD ae_ct_username;
+	DWORD ae_ct_netname;
+	DWORD ae_ct_connid;
+}
+alias AE_CONNSTART* PAE_CONNSTART, LPAE_CONNSTART;
+
+struct AE_CONNSTOP{
+	DWORD ae_cp_compname;
+	DWORD ae_cp_username;
+	DWORD ae_cp_netname;
+	DWORD ae_cp_connid;
+	DWORD ae_cp_reason;
+}
+alias AE_CONNSTOP* PAE_CONNSTOP, LPAE_CONNSTOP;
+
+struct AE_CONNREJ{
+	DWORD ae_cr_compname;
+	DWORD ae_cr_username;
+	DWORD ae_cr_netname;
+	DWORD ae_cr_reason;
+}
+alias AE_CONNREJ* PAE_CONNREJ, LPAE_CONNREJ;
+
+struct AE_RESACCESS{
+	DWORD ae_ra_compname;
+	DWORD ae_ra_username;
+	DWORD ae_ra_resname;
+	DWORD ae_ra_operation;
+	DWORD ae_ra_returncode;
+	DWORD ae_ra_restype;
+	DWORD ae_ra_fileid;
+}
+alias AE_RESACCESS* PAE_RESACCESS, LPAE_RESACCESS;
+
+struct AE_RESACCESSREJ{
+	DWORD ae_rr_compname;
+	DWORD ae_rr_username;
+	DWORD ae_rr_resname;
+	DWORD ae_rr_operation;
+}
+alias AE_RESACCESSREJ* PAE_RESACCESSREJ, LPAE_RESACCESSREJ;
+
+struct AE_CLOSEFILE{
+	DWORD ae_cf_compname;
+	DWORD ae_cf_username;
+	DWORD ae_cf_resname;
+	DWORD ae_cf_fileid;
+	DWORD ae_cf_duration;
+	DWORD ae_cf_reason;
+}
+alias AE_CLOSEFILE* PAE_CLOSEFILE, LPAE_CLOSEFILE;
+
+struct AE_SERVICESTAT{
+	DWORD ae_ss_compname;
+	DWORD ae_ss_username;
+	DWORD ae_ss_svcname;
+	DWORD ae_ss_status;
+	DWORD ae_ss_code;
+	DWORD ae_ss_text;
+	DWORD ae_ss_returnval;
+}
+alias AE_SERVICESTAT* PAE_SERVICESTAT, LPAE_SERVICESTAT;
+
+struct AE_ACLMOD{
+	DWORD ae_am_compname;
+	DWORD ae_am_username;
+	DWORD ae_am_resname;
+	DWORD ae_am_action;
+	DWORD ae_am_datalen;
+}
+alias AE_ACLMOD* PAE_ACLMOD, LPAE_ACLMOD;
+
+struct AE_UASMOD{
+	DWORD ae_um_compname;
+	DWORD ae_um_username;
+	DWORD ae_um_resname;
+	DWORD ae_um_rectype;
+	DWORD ae_um_action;
+	DWORD ae_um_datalen;
+}
+alias AE_UASMOD* PAE_UASMOD, LPAE_UASMOD;
+
+struct AE_NETLOGON{
+	DWORD ae_no_compname;
+	DWORD ae_no_username;
+	DWORD ae_no_privilege;
+	DWORD ae_no_authflags;
+}
+alias AE_NETLOGON* PAE_NETLOGON, LPAE_NETLOGON;
+
+struct AE_NETLOGOFF{
+	DWORD ae_nf_compname;
+	DWORD ae_nf_username;
+	DWORD ae_nf_reserved1;
+	DWORD ae_nf_reserved2;
+}
+alias AE_NETLOGOFF* PAE_NETLOGOFF, LPAE_NETLOGOFF;
+
+struct AE_ACCLIM{
+	DWORD ae_al_compname;
+	DWORD ae_al_username;
+	DWORD ae_al_resname;
+	DWORD ae_al_limit;
+}
+alias AE_ACCLIM* PAE_ACCLIM, LPAE_ACCLIM;
+
+struct AE_LOCKOUT{
+	DWORD ae_lk_compname;
+	DWORD ae_lk_username;
+	DWORD ae_lk_action;
+	DWORD ae_lk_bad_pw_count;
+}
+alias AE_LOCKOUT* PAE_LOCKOUT, LPAE_LOCKOUT;
+
+struct AE_GENERIC{
+	DWORD ae_ge_msgfile;
+	DWORD ae_ge_msgnum;
+	DWORD ae_ge_params;
+	DWORD ae_ge_param1;
+	DWORD ae_ge_param2;
+	DWORD ae_ge_param3;
+	DWORD ae_ge_param4;
+	DWORD ae_ge_param5;
+	DWORD ae_ge_param6;
+	DWORD ae_ge_param7;
+	DWORD ae_ge_param8;
+	DWORD ae_ge_param9;
+}
+alias AE_GENERIC* PAE_GENERIC, LPAE_GENERIC;
+
+extern (Windows) {
+deprecated {
+NET_API_STATUS NetAuditClear(LPCWSTR,LPCWSTR,LPCWSTR);
+NET_API_STATUS NetAuditRead(LPTSTR,LPTSTR,LPHLOG,DWORD,PDWORD,DWORD,DWORD,PBYTE*,DWORD,PDWORD,PDWORD);
+NET_API_STATUS NetAuditWrite(DWORD,PBYTE,DWORD,LPTSTR,PBYTE);
+}
+}
+
+/+
+/* MinGW: These conflict with struct typedefs, why? */
+const AE_SRVSTATUS=0;
+const AE_SESSLOGON=1;
+const AE_SESSLOGOFF=2;
+const AE_SESSPWERR=3;
+const AE_CONNSTART=4;
+const AE_CONNSTOP=5;
+const AE_CONNREJ=6;
+const AE_RESACCESS=7;
+const AE_RESACCESSREJ=8;
+const AE_CLOSEFILE=9;
+const AE_SERVICESTAT=11;
+const AE_ACLMOD=12;
+const AE_UASMOD=13;
+const AE_NETLOGON=14;
+const AE_NETLOGOFF=15;
+const AE_NETLOGDENIED=16;
+const AE_ACCLIMITEXCD=17;
+const AE_RESACCESS2=18;
+const AE_ACLMODFAIL=19;
+const AE_LOCKOUT=20;
+const AE_GENERIC_TYPE=21;
+const AE_SRVSTART=0;
+const AE_SRVPAUSED=1;
+const AE_SRVCONT=2;
+const AE_SRVSTOP=3;
++/
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmbrowsr.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,85 @@
+/***********************************************************************\
+*                              lmbrowsr.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lmbrowsr;
+
+private import win32.lmcons, win32.windef;
+
+const BROWSER_ROLE_PDC = 1;
+const BROWSER_ROLE_BDC = 2;
+
+struct BROWSER_STATISTICS {
+	LARGE_INTEGER StatisticsStartTime;
+	LARGE_INTEGER NumberOfServerAnnouncements;
+	LARGE_INTEGER NumberOfDomainAnnouncements;
+	ULONG NumberOfElectionPackets;
+	ULONG NumberOfMailslotWrites;
+	ULONG NumberOfGetBrowserServerListRequests;
+	ULONG NumberOfServerEnumerations;
+	ULONG NumberOfDomainEnumerations;
+	ULONG NumberOfOtherEnumerations;
+	ULONG NumberOfMissedServerAnnouncements;
+	ULONG NumberOfMissedMailslotDatagrams;
+	ULONG NumberOfMissedGetBrowserServerListRequests;
+	ULONG NumberOfFailedServerAnnounceAllocations;
+	ULONG NumberOfFailedMailslotAllocations;
+	ULONG NumberOfFailedMailslotReceives;
+	ULONG NumberOfFailedMailslotWrites;
+	ULONG NumberOfFailedMailslotOpens;
+	ULONG NumberOfDuplicateMasterAnnouncements;
+	LARGE_INTEGER NumberOfIllegalDatagrams;
+}
+alias BROWSER_STATISTICS* PBROWSER_STATISTICS, LPBROWSER_STATISTICS;
+
+struct BROWSER_STATISTICS_100 {
+	LARGE_INTEGER StartTime;
+	LARGE_INTEGER NumberOfServerAnnouncements;
+	LARGE_INTEGER NumberOfDomainAnnouncements;
+	ULONG NumberOfElectionPackets;
+	ULONG NumberOfMailslotWrites;
+	ULONG NumberOfGetBrowserServerListRequests;
+	LARGE_INTEGER NumberOfIllegalDatagrams;
+}
+alias BROWSER_STATISTICS_100* PBROWSER_STATISTICS_100;
+
+struct BROWSER_STATISTICS_101 {
+	LARGE_INTEGER StartTime;
+	LARGE_INTEGER NumberOfServerAnnouncements;
+	LARGE_INTEGER NumberOfDomainAnnouncements;
+	ULONG NumberOfElectionPackets;
+	ULONG NumberOfMailslotWrites;
+	ULONG NumberOfGetBrowserServerListRequests;
+	LARGE_INTEGER NumberOfIllegalDatagrams;
+	ULONG NumberOfMissedServerAnnouncements;
+	ULONG NumberOfMissedMailslotDatagrams;
+	ULONG NumberOfMissedGetBrowserServerListRequests;
+	ULONG NumberOfFailedServerAnnounceAllocations;
+	ULONG NumberOfFailedMailslotAllocations;
+	ULONG NumberOfFailedMailslotReceives;
+	ULONG NumberOfFailedMailslotWrites;
+	ULONG NumberOfFailedMailslotOpens;
+	ULONG NumberOfDuplicateMasterAnnouncements;
+}
+alias BROWSER_STATISTICS_101* PBROWSER_STATISTICS_101;
+
+extern (Windows) {
+	NET_API_STATUS I_BrowserServerEnum(LPCWSTR, LPCWSTR, LPCWSTR, DWORD,
+	  PBYTE*, DWORD, PDWORD, PDWORD, DWORD, LPCWSTR, PDWORD);
+	NET_API_STATUS I_BrowserServerEnumEx(LPCWSTR, LPCWSTR, LPCWSTR, DWORD,
+	  PBYTE*, DWORD, PDWORD, PDWORD, DWORD, LPCWSTR, LPCWSTR);
+	NET_API_STATUS I_BrowserQueryEmulatedDomains(LPWSTR, PBYTE*, PDWORD);
+	NET_API_STATUS I_BrowserQueryOtherDomains(LPCWSTR, PBYTE*, PDWORD, PDWORD);
+	NET_API_STATUS I_BrowserResetNetlogonState(LPCWSTR);
+	NET_API_STATUS I_BrowserSetNetlogonState(LPWSTR, LPWSTR, LPWSTR, DWORD);
+	NET_API_STATUS I_BrowserQueryStatistics(LPCWSTR, LPBROWSER_STATISTICS*);
+	NET_API_STATUS I_BrowserResetStatistics(LPCWSTR);
+	WORD I_BrowserServerEnumForXactsrv(LPCWSTR, LPCWSTR, ULONG, USHORT, PVOID,
+	  WORD, DWORD, PDWORD, PDWORD, DWORD, LPCWSTR, LPCWSTR, PWORD);
+	NET_API_STATUS I_BrowserDebugTrace(PWCHAR, PCHAR);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmchdev.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,90 @@
+/***********************************************************************\
+*                               lmchdev.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lmchdev;
+
+// COMMENT: This file might be deprecated.
+
+private import win32.lmcons, win32.windef;
+
+const CHARDEVQ_NO_REQUESTS  = -1;
+const CHARDEV_CLOSE         = 0;
+const CHARDEVQ_MAX_PRIORITY = 1;
+const CHARDEVQ_DEV_PARMNUM  = 1;
+
+const HANDLE_INFO_LEVEL_1 = 1;
+const HANDLE_CHARTIME_PARMNUM = 1;
+const HANDLE_CHARCOUNT_PARMNUM = 2;
+
+const CHARDEV_STAT_OPENED = 2;
+const CHARDEVQ_PRIORITY_PARMNUM = 2;
+const CHARDEVQ_DEVS_PARMNUM = 3;
+const CHARDEV_STAT_ERROR = 4;
+const CHARDEVQ_NUMUSERS_PARMNUM = 4;
+const CHARDEVQ_NUMAHEAD_PARMNUM = 5;
+const CHARDEVQ_DEF_PRIORITY = 5;
+const CHARDEVQ_PRIORITY_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+CHARDEVQ_PRIORITY_PARMNUM;
+const CHARDEVQ_DEVS_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+CHARDEVQ_DEVS_PARMNUM;
+const CHARDEVQ_MIN_PRIORITY = 9;
+
+struct CHARDEV_INFO_0 {
+ LPWSTR ch0_dev;
+}
+alias CHARDEV_INFO_0* PCHARDEV_INFO_0, LPCHARDEV_INFO_0;
+
+struct CHARDEV_INFO_1{
+	LPWSTR ch1_dev;
+	DWORD ch1_status;
+	LPWSTR ch1_username;
+	DWORD ch1_time;
+}
+alias CHARDEV_INFO_1* PCHARDEV_INFO_1, LPCHARDEV_INFO_1;
+
+struct CHARDEVQ_INFO_0 {
+ LPWSTR cq0_dev;
+}
+alias CHARDEVQ_INFO_0* PCHARDEVQ_INFO_0, LPCHARDEVQ_INFO_0;
+
+struct CHARDEVQ_INFO_1{
+	LPWSTR cq1_dev;
+	DWORD cq1_priority;
+	LPWSTR cq1_devs;
+	DWORD cq1_numusers;
+	DWORD cq1_numahead;
+}
+alias CHARDEVQ_INFO_1* PCHARDEVQ_INFO_1, LPCHARDEVQ_INFO_1;
+
+struct CHARDEVQ_INFO_1002 {
+	DWORD cq1002_priority;
+}
+alias CHARDEVQ_INFO_1002* PCHARDEVQ_INFO_1002, LPCHARDEVQ_INFO_1002;
+
+struct CHARDEVQ_INFO_1003 {
+	LPWSTR cq1003_devs;
+}
+alias CHARDEVQ_INFO_1003* PCHARDEVQ_INFO_1003, LPCHARDEVQ_INFO_1003;
+
+struct HANDLE_INFO_1{
+	DWORD hdli1_chartime;
+	DWORD hdli1_charcount;
+}
+alias HANDLE_INFO_1* PHANDLE_INFO_1, LPHANDLE_INFO_1;
+
+extern (Windows) {
+	NET_API_STATUS NetCharDevEnum(LPCWSTR, DWORD, PBYTE*, DWORD, PDWORD, PDWORD, PDWORD);
+	NET_API_STATUS NetCharDevGetInfo(LPCWSTR, LPCWSTR, DWORD, PBYTE*);
+	NET_API_STATUS NetCharDevControl(LPCWSTR, LPCWSTR, DWORD);
+	NET_API_STATUS NetCharDevQEnum(LPCWSTR, LPCWSTR, DWORD, PBYTE*, DWORD, PDWORD, PDWORD, PDWORD);
+	NET_API_STATUS NetCharDevQGetInfo(LPCWSTR, LPCWSTR, LPCWSTR, DWORD, PBYTE*);
+	NET_API_STATUS NetCharDevQSetInfo(LPCWSTR, LPCWSTR, DWORD, PBYTE, PDWORD);
+	NET_API_STATUS NetCharDevQPurge(LPCWSTR, LPCWSTR);
+	NET_API_STATUS NetCharDevQPurgeSelf(LPCWSTR, LPCWSTR, LPCWSTR);
+	NET_API_STATUS NetHandleGetInfo(HANDLE, DWORD, PBYTE*);
+	NET_API_STATUS NetHandleSetInfo(HANDLE, DWORD, PBYTE, DWORD, PDWORD);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmconfig.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,30 @@
+/***********************************************************************\
+*                              lmconfig.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lmconfig;
+
+// All functions in this file are deprecated!
+
+private import win32.lmcons, win32.windef;
+
+deprecated {
+	struct CONFIG_INFO_0 {
+		LPWSTR cfgi0_key;
+		LPWSTR cfgi0_data;
+	}
+
+	alias CONFIG_INFO_0* PCONFIG_INFO_0, LPCONFIG_INFO_0;
+
+	extern (Windows) {
+		NET_API_STATUS NetConfigGet(LPCWSTR, LPCWSTR, LPCWSTR, PBYTE*);
+		NET_API_STATUS NetConfigGetAll(LPCWSTR, LPCWSTR, PBYTE*);
+		NET_API_STATUS NetConfigSet(LPCWSTR, LPCWSTR, LPCWSTR, DWORD, DWORD,
+		  PBYTE, DWORD);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmcons.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,86 @@
+/***********************************************************************\
+*                                lmcons.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lmcons;
+
+private import win32.windef;
+private import win32.lmerr; // for NERR_BASE
+
+const TCHAR[]
+	MESSAGE_FILENAME = "NETMSG",
+	OS2MSG_FILENAME = "BASE",
+	HELP_MSG_FILENAME = "NETH";
+
+alias DWORD NET_API_STATUS, API_RET_TYPE;
+
+const MIN_LANMAN_MESSAGE_ID = NERR_BASE;
+const MAX_LANMAN_MESSAGE_ID = 5799;
+
+const CNLEN        = 15; /* also in nddeapi.h */
+const UNCLEN       = CNLEN + 2;
+
+const DNLEN        = 15;
+const LM20_CNLEN   = 15;
+const LM20_DNLEN   = 15;
+const LM20_SNLEN   = 15;
+const LM20_STXTLEN = 63;
+const LM20_UNCLEN  = LM20_CNLEN + 2;
+const LM20_NNLEN   = 12;
+const LM20_RMLEN   = LM20_UNCLEN + 1 + LM20_NNLEN;
+const NNLEN        = 80;
+const RMLEN        = UNCLEN + 1 + NNLEN;
+const SNLEN        = 80;
+const STXTLEN      = 256;
+const PATHLEN      = 256;
+const LM20_PATHLEN = 256;
+const DEVLEN       = 80;
+const LM20_DEVLEN  = 8;
+const EVLEN        = 16;
+const UNLEN        = 256;
+const LM20_UNLEN   = 20;
+const GNLEN        = UNLEN;
+const LM20_GNLEN   = LM20_UNLEN;
+const PWLEN        = 256;
+const LM20_PWLEN   = 14;
+const SHPWLEN      = 8;
+const CLTYPE_LEN   = 12;
+const QNLEN        = NNLEN;
+const LM20_QNLEN   = LM20_NNLEN;
+
+const MAXCOMMENTSZ = 256;
+const LM20_MAXCOMMENTSZ = 48;
+const ALERTSZ      = 128;
+const MAXDEVENTRIES = 32;// (sizeof(int)*8);
+const NETBIOS_NAME_LEN = 16;
+const DWORD MAX_PREFERRED_LENGTH = -1;
+const CRYPT_KEY_LEN = 7;
+const CRYPT_TXT_LEN = 8;
+const ENCRYPTED_PWLEN = 16;
+const SESSION_PWLEN = 24;
+const SESSION_CRYPT_KLEN = 21;
+
+const PARMNUM_ALL = 0;
+const DWORD PARM_ERROR_UNKNOWN = -1;
+const PARM_ERROR_NONE = 0;
+const PARMNUM_BASE_INFOLEVEL = 1000;
+
+const PLATFORM_ID_DOS = 300;
+const PLATFORM_ID_OS2 = 400;
+const PLATFORM_ID_NT  = 500;
+const PLATFORM_ID_OSF = 600;
+const PLATFORM_ID_VMS = 700;
+
+// this is a new typedef in W2K, but it should be harmless for earlier Windows versions.
+version (Unicode) {
+	alias LPWSTR LMSTR;
+	alias LPCWSTR LMCSTR;
+} else {
+	alias LPSTR LMSTR;
+	alias LPCSTR LMCSTR;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmerr.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,313 @@
+/***********************************************************************\
+*                                lmerr.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lmerr;
+
+import win32.winerror;
+
+enum {
+	NERR_Success                      = 0,
+	NERR_BASE                         = 2100,
+	NERR_NetNotStarted                = NERR_BASE + 2,
+	NERR_UnknownServer,
+	NERR_ShareMem,
+	NERR_NoNetworkResource,
+	NERR_RemoteOnly,
+	NERR_DevNotRedirected,
+	NERR_ServerNotStarted             = NERR_BASE + 14,
+	NERR_ItemNotFound,
+	NERR_UnknownDevDir,
+	NERR_RedirectedPath,
+	NERR_DuplicateShare,
+	NERR_NoRoom,
+	NERR_TooManyItems                 = NERR_BASE + 21,
+	NERR_InvalidMaxUsers,
+	NERR_BufTooSmall,
+	NERR_RemoteErr                    = NERR_BASE + 27,
+	NERR_LanmanIniError               = NERR_BASE + 31,
+	NERR_NetworkError                 = NERR_BASE + 36,
+	NERR_WkstaInconsistentState,
+	NERR_WkstaNotStarted,
+	NERR_BrowserNotStarted,
+	NERR_InternalError,
+	NERR_BadTransactConfig,
+	NERR_InvalidAPI,
+	NERR_BadEventName,
+	NERR_DupNameReboot,
+	NERR_CfgCompNotFound              = NERR_BASE + 46,
+	NERR_CfgParamNotFound,
+	NERR_LineTooLong                  = NERR_BASE + 49,
+	NERR_QNotFound,
+	NERR_JobNotFound,
+	NERR_DestNotFound,
+	NERR_DestExists,
+	NERR_QExists,
+	NERR_QNoRoom,
+	NERR_JobNoRoom,
+	NERR_DestNoRoom,
+	NERR_DestIdle,
+	NERR_DestInvalidOp,
+	NERR_ProcNoRespond,
+	NERR_SpoolerNotLoaded,
+	NERR_DestInvalidState,
+	NERR_QInvalidState,
+	NERR_JobInvalidState,
+	NERR_SpoolNoMemory,
+	NERR_DriverNotFound,
+	NERR_DataTypeInvalid,
+	NERR_ProcNotFound,
+	NERR_ServiceTableLocked           = NERR_BASE + 80,
+	NERR_ServiceTableFull,
+	NERR_ServiceInstalled,
+	NERR_ServiceEntryLocked,
+	NERR_ServiceNotInstalled,
+	NERR_BadServiceName,
+	NERR_ServiceCtlTimeout,
+	NERR_ServiceCtlBusy,
+	NERR_BadServiceProgName,
+	NERR_ServiceNotCtrl,
+	NERR_ServiceKillProc,
+	NERR_ServiceCtlNotValid,
+	NERR_NotInDispatchTbl,
+	NERR_BadControlRecv,
+	NERR_ServiceNotStarting,
+	NERR_AlreadyLoggedOn              = NERR_BASE + 100,
+	NERR_NotLoggedOn,
+	NERR_BadUsername,
+	NERR_BadPassword,
+	NERR_UnableToAddName_W,
+	NERR_UnableToAddName_F,
+	NERR_UnableToDelName_W,
+	NERR_UnableToDelName_F,
+	NERR_LogonsPaused                 = NERR_BASE + 109,
+	NERR_LogonServerConflict,
+	NERR_LogonNoUserPath,
+	NERR_LogonScriptError,
+	NERR_StandaloneLogon              = NERR_BASE + 114,
+	NERR_LogonServerNotFound,
+	NERR_LogonDomainExists,
+	NERR_NonValidatedLogon,
+	NERR_ACFNotFound                  = NERR_BASE + 119,
+	NERR_GroupNotFound,
+	NERR_UserNotFound,
+	NERR_ResourceNotFound,
+	NERR_GroupExists,
+	NERR_UserExists,
+	NERR_ResourceExists,
+	NERR_NotPrimary,
+	NERR_ACFNotLoaded,
+	NERR_ACFNoRoom,
+	NERR_ACFFileIOFail,
+	NERR_ACFTooManyLists,
+	NERR_UserLogon,
+	NERR_ACFNoParent,
+	NERR_CanNotGrowSegment,
+	NERR_SpeGroupOp,
+	NERR_NotInCache,
+	NERR_UserInGroup,
+	NERR_UserNotInGroup,
+	NERR_AccountUndefined,
+	NERR_AccountExpired,
+	NERR_InvalidWorkstation,
+	NERR_InvalidLogonHours,
+	NERR_PasswordExpired,
+	NERR_PasswordCantChange,
+	NERR_PasswordHistConflict,
+	NERR_PasswordTooShort,
+	NERR_PasswordTooRecent,
+	NERR_InvalidDatabase,
+	NERR_DatabaseUpToDate,
+	NERR_SyncRequired,
+	NERR_UseNotFound,
+	NERR_BadAsgType,
+	NERR_DeviceIsShared,
+	NERR_NoComputerName               = NERR_BASE + 170,
+	NERR_MsgAlreadyStarted,
+	NERR_MsgInitFailed,
+	NERR_NameNotFound,
+	NERR_AlreadyForwarded,
+	NERR_AddForwarded,
+	NERR_AlreadyExists,
+	NERR_TooManyNames,
+	NERR_DelComputerName,
+	NERR_LocalForward,
+	NERR_GrpMsgProcessor,
+	NERR_PausedRemote,
+	NERR_BadReceive,
+	NERR_NameInUse,
+	NERR_MsgNotStarted,
+	NERR_NotLocalName,
+	NERR_NoForwardName,
+	NERR_RemoteFull,
+	NERR_NameNotForwarded,
+	NERR_TruncatedBroadcast,
+	NERR_InvalidDevice                = NERR_BASE + 194,
+	NERR_WriteFault,
+	NERR_DuplicateName                = NERR_BASE + 197,
+	NERR_DeleteLater,
+	NERR_IncompleteDel,
+	NERR_MultipleNets,
+	NERR_NetNameNotFound              = NERR_BASE + 210,
+	NERR_DeviceNotShared,
+	NERR_ClientNameNotFound,
+	NERR_FileIdNotFound               = NERR_BASE + 214,
+	NERR_ExecFailure,
+	NERR_TmpFile,
+	NERR_TooMuchData,
+	NERR_DeviceShareConflict,
+	NERR_BrowserTableIncomplete,
+	NERR_NotLocalDomain,
+	NERR_DevInvalidOpCode             = NERR_BASE + 231,
+	NERR_DevNotFound,
+	NERR_DevNotOpen,
+	NERR_BadQueueDevString,
+	NERR_BadQueuePriority,
+	NERR_NoCommDevs                   = NERR_BASE + 237,
+	NERR_QueueNotFound,
+	NERR_BadDevString                 = NERR_BASE + 240,
+	NERR_BadDev,
+	NERR_InUseBySpooler,
+	NERR_CommDevInUse,
+	NERR_InvalidComputer              = NERR_BASE + 251,
+	NERR_MaxLenExceeded               = NERR_BASE + 254,
+	NERR_BadComponent                 = NERR_BASE + 256,
+	NERR_CantType,
+	NERR_TooManyEntries               = NERR_BASE + 262,
+	NERR_ProfileFileTooBig            = NERR_BASE + 270,
+	NERR_ProfileOffset,
+	NERR_ProfileCleanup,
+	NERR_ProfileUnknownCmd,
+	NERR_ProfileLoadErr,
+	NERR_ProfileSaveErr,
+	NERR_LogOverflow                  = NERR_BASE + 277,
+	NERR_LogFileChanged,
+	NERR_LogFileCorrupt,
+	NERR_SourceIsDir,
+	NERR_BadSource,
+	NERR_BadDest,
+	NERR_DifferentServers,
+	NERR_RunSrvPaused                 = NERR_BASE + 285,
+	NERR_ErrCommRunSrv                = NERR_BASE + 289,
+	NERR_ErrorExecingGhost            = NERR_BASE + 291,
+	NERR_ShareNotFound,
+	NERR_InvalidLana                  = NERR_BASE + 300,
+	NERR_OpenFiles,
+	NERR_ActiveConns,
+	NERR_BadPasswordCore,
+	NERR_DevInUse,
+	NERR_LocalDrive,
+	NERR_AlertExists                  = NERR_BASE + 330,
+	NERR_TooManyAlerts,
+	NERR_NoSuchAlert,
+	NERR_BadRecipient,
+	NERR_AcctLimitExceeded,
+	NERR_InvalidLogSeek               = NERR_BASE + 340,
+	NERR_BadUasConfig                 = NERR_BASE + 350,
+	NERR_InvalidUASOp,
+	NERR_LastAdmin,
+	NERR_DCNotFound,
+	NERR_LogonTrackingError,
+	NERR_NetlogonNotStarted,
+	NERR_CanNotGrowUASFile,
+	NERR_TimeDiffAtDC,
+	NERR_PasswordMismatch,
+	NERR_NoSuchServer                 = NERR_BASE + 360,
+	NERR_NoSuchSession,
+	NERR_NoSuchConnection,
+	NERR_TooManyServers,
+	NERR_TooManySessions,
+	NERR_TooManyConnections,
+	NERR_TooManyFiles,
+	NERR_NoAlternateServers,
+	NERR_TryDownLevel                 = NERR_BASE + 370,
+	NERR_UPSDriverNotStarted          = NERR_BASE + 380,
+	NERR_UPSInvalidConfig,
+	NERR_UPSInvalidCommPort,
+	NERR_UPSSignalAsserted,
+	NERR_UPSShutdownFailed,
+	NERR_BadDosRetCode                = NERR_BASE + 400,
+	NERR_ProgNeedsExtraMem,
+	NERR_BadDosFunction,
+	NERR_RemoteBootFailed,
+	NERR_BadFileCheckSum,
+	NERR_NoRplBootSystem,
+	NERR_RplLoadrNetBiosErr,
+	NERR_RplLoadrDiskErr,
+	NERR_ImageParamErr,
+	NERR_TooManyImageParams,
+	NERR_NonDosFloppyUsed,
+	NERR_RplBootRestart,
+	NERR_RplSrvrCallFailed,
+	NERR_CantConnectRplSrvr,
+	NERR_CantOpenImageFile,
+	NERR_CallingRplSrvr,
+	NERR_StartingRplBoot,
+	NERR_RplBootServiceTerm,
+	NERR_RplBootStartFailed,
+	NERR_RPL_CONNECTED,
+	NERR_BrowserConfiguredToNotRun    = NERR_BASE + 450,
+	NERR_RplNoAdaptersStarted         = NERR_BASE + 510,
+	NERR_RplBadRegistry,
+	NERR_RplBadDatabase,
+	NERR_RplRplfilesShare,
+	NERR_RplNotRplServer,
+	NERR_RplCannotEnum,
+	NERR_RplWkstaInfoCorrupted,
+	NERR_RplWkstaNotFound,
+	NERR_RplWkstaNameUnavailable,
+	NERR_RplProfileInfoCorrupted,
+	NERR_RplProfileNotFound,
+	NERR_RplProfileNameUnavailable,
+	NERR_RplProfileNotEmpty,
+	NERR_RplConfigInfoCorrupted,
+	NERR_RplConfigNotFound,
+	NERR_RplAdapterInfoCorrupted,
+	NERR_RplInternal,
+	NERR_RplVendorInfoCorrupted,
+	NERR_RplBootInfoCorrupted,
+	NERR_RplWkstaNeedsUserAcct,
+	NERR_RplNeedsRPLUSERAcct,
+	NERR_RplBootNotFound,
+	NERR_RplIncompatibleProfile,
+	NERR_RplAdapterNameUnavailable,
+	NERR_RplConfigNotEmpty,
+	NERR_RplBootInUse,
+	NERR_RplBackupDatabase,
+	NERR_RplAdapterNotFound,
+	NERR_RplVendorNotFound,
+	NERR_RplVendorNameUnavailable,
+	NERR_RplBootNameUnavailable,
+	NERR_RplConfigNameUnavailable,
+	NERR_DfsInternalCorruption        = NERR_BASE + 560,
+	NERR_DfsVolumeDataCorrupt,
+	NERR_DfsNoSuchVolume,
+	NERR_DfsVolumeAlreadyExists,
+	NERR_DfsAlreadyShared,
+	NERR_DfsNoSuchShare,
+	NERR_DfsNotALeafVolume,
+	NERR_DfsLeafVolume,
+	NERR_DfsVolumeHasMultipleServers,
+	NERR_DfsCantCreateJunctionPoint,
+	NERR_DfsServerNotDfsAware,
+	NERR_DfsBadRenamePath,
+	NERR_DfsVolumeIsOffline,
+	NERR_DfsNoSuchServer,
+	NERR_DfsCyclicalName,
+	NERR_DfsNotSupportedInServerDfs,
+	NERR_DfsDuplicateService,
+	NERR_DfsCantRemoveLastServerShare,
+	NERR_DfsVolumeIsInterDfs,
+	NERR_DfsInconsistent,
+	NERR_DfsServerUpgraded,
+	NERR_DfsDataIsIdentical,
+	NERR_DfsCantRemoveDfsRoot,
+	NERR_DfsChildOrParentInDfs,
+	NERR_DfsInternalError             = NERR_BASE + 590,
+	MAX_NERR                          = NERR_BASE + 899
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmerrlog.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,222 @@
+/***********************************************************************\
+*                               lmerrlog.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lmerrlog;
+
+// COMMENT: This appears to be only for Win16. All functions are deprecated.
+
+private import win32.lmcons, win32.windef;
+private import win32.lmaudit; // for LPHLOG
+
+const ERRLOG_BASE=3100;
+const ERRLOG2_BASE=5700;
+const LOGFLAGS_FORWARD=0;
+const LOGFLAGS_BACKWARD=1;
+const LOGFLAGS_SEEK=2;
+const NELOG_Internal_Error=ERRLOG_BASE;
+const NELOG_Resource_Shortage=(ERRLOG_BASE+1);
+const NELOG_Unable_To_Lock_Segment=(ERRLOG_BASE+2);
+const NELOG_Unable_To_Unlock_Segment=(ERRLOG_BASE+3);
+const NELOG_Uninstall_Service=(ERRLOG_BASE+4);
+const NELOG_Init_Exec_Fail=(ERRLOG_BASE+5);
+const NELOG_Ncb_Error=(ERRLOG_BASE+6);
+const NELOG_Net_Not_Started=(ERRLOG_BASE+7);
+const NELOG_Ioctl_Error=(ERRLOG_BASE+8);
+const NELOG_System_Semaphore=(ERRLOG_BASE+9);
+const NELOG_Init_OpenCreate_Err=(ERRLOG_BASE+10);
+const NELOG_NetBios=(ERRLOG_BASE+11);
+const NELOG_SMB_Illegal=(ERRLOG_BASE+12);
+const NELOG_Service_Fail=(ERRLOG_BASE+13);
+const NELOG_Entries_Lost=(ERRLOG_BASE+14);
+const NELOG_Init_Seg_Overflow=(ERRLOG_BASE+20);
+const NELOG_Srv_No_Mem_Grow=(ERRLOG_BASE+21);
+const NELOG_Access_File_Bad=(ERRLOG_BASE+22);
+const NELOG_Srvnet_Not_Started=(ERRLOG_BASE+23);
+const NELOG_Init_Chardev_Err=(ERRLOG_BASE+24);
+const NELOG_Remote_API=(ERRLOG_BASE+25);
+const NELOG_Ncb_TooManyErr=(ERRLOG_BASE+26);
+const NELOG_Mailslot_err=(ERRLOG_BASE+27);
+const NELOG_ReleaseMem_Alert=(ERRLOG_BASE+28);
+const NELOG_AT_cannot_write=(ERRLOG_BASE+29);
+const NELOG_Cant_Make_Msg_File=(ERRLOG_BASE+30);
+const NELOG_Exec_Netservr_NoMem=(ERRLOG_BASE+31);
+const NELOG_Server_Lock_Failure=(ERRLOG_BASE+32);
+const NELOG_Msg_Shutdown=(ERRLOG_BASE+40);
+const NELOG_Msg_Sem_Shutdown=(ERRLOG_BASE+41);
+const NELOG_Msg_Log_Err=(ERRLOG_BASE+50);
+const NELOG_VIO_POPUP_ERR=(ERRLOG_BASE+51);
+const NELOG_Msg_Unexpected_SMB_Type=(ERRLOG_BASE+52);
+const NELOG_Wksta_Infoseg=(ERRLOG_BASE+60);
+const NELOG_Wksta_Compname=(ERRLOG_BASE+61);
+const NELOG_Wksta_BiosThreadFailure=(ERRLOG_BASE+62);
+const NELOG_Wksta_IniSeg=(ERRLOG_BASE+63);
+const NELOG_Wksta_HostTab_Full=(ERRLOG_BASE+64);
+const NELOG_Wksta_Bad_Mailslot_SMB=(ERRLOG_BASE+65);
+const NELOG_Wksta_UASInit=(ERRLOG_BASE+66);
+const NELOG_Wksta_SSIRelogon=(ERRLOG_BASE+67);
+const NELOG_Build_Name=(ERRLOG_BASE+70);
+const NELOG_Name_Expansion=(ERRLOG_BASE+71);
+const NELOG_Message_Send=(ERRLOG_BASE+72);
+const NELOG_Mail_Slt_Err=(ERRLOG_BASE+73);
+const NELOG_AT_cannot_read=(ERRLOG_BASE+74);
+const NELOG_AT_sched_err=(ERRLOG_BASE+75);
+const NELOG_AT_schedule_file_created=(ERRLOG_BASE+76);
+const NELOG_Srvnet_NB_Open=(ERRLOG_BASE+77);
+const NELOG_AT_Exec_Err=(ERRLOG_BASE+78);
+const NELOG_Lazy_Write_Err=(ERRLOG_BASE+80);
+const NELOG_HotFix=(ERRLOG_BASE+81);
+const NELOG_HardErr_From_Server=(ERRLOG_BASE+82);
+const NELOG_LocalSecFail1=(ERRLOG_BASE+83);
+const NELOG_LocalSecFail2=(ERRLOG_BASE+84);
+const NELOG_LocalSecFail3=(ERRLOG_BASE+85);
+const NELOG_LocalSecGeneralFail=(ERRLOG_BASE+86);
+const NELOG_NetWkSta_Internal_Error=(ERRLOG_BASE+90);
+const NELOG_NetWkSta_No_Resource=(ERRLOG_BASE+91);
+const NELOG_NetWkSta_SMB_Err=(ERRLOG_BASE+92);
+const NELOG_NetWkSta_VC_Err=(ERRLOG_BASE+93);
+const NELOG_NetWkSta_Stuck_VC_Err=(ERRLOG_BASE+94);
+const NELOG_NetWkSta_NCB_Err=(ERRLOG_BASE+95);
+const NELOG_NetWkSta_Write_Behind_Err=(ERRLOG_BASE+96);
+const NELOG_NetWkSta_Reset_Err=(ERRLOG_BASE+97);
+const NELOG_NetWkSta_Too_Many=(ERRLOG_BASE+98);
+const NELOG_Srv_Thread_Failure=(ERRLOG_BASE+104);
+const NELOG_Srv_Close_Failure=(ERRLOG_BASE+105);
+const NELOG_ReplUserCurDir=(ERRLOG_BASE+106);
+const NELOG_ReplCannotMasterDir=(ERRLOG_BASE+107);
+const NELOG_ReplUpdateError=(ERRLOG_BASE+108);
+const NELOG_ReplLostMaster=(ERRLOG_BASE+109);
+const NELOG_NetlogonAuthDCFail=(ERRLOG_BASE+110);
+const NELOG_ReplLogonFailed=(ERRLOG_BASE+111);
+const NELOG_ReplNetErr=(ERRLOG_BASE+112);
+const NELOG_ReplMaxFiles=(ERRLOG_BASE+113);
+const NELOG_ReplMaxTreeDepth=(ERRLOG_BASE+114);
+const NELOG_ReplBadMsg=(ERRLOG_BASE+115);
+const NELOG_ReplSysErr=(ERRLOG_BASE+116);
+const NELOG_ReplUserLoged=(ERRLOG_BASE+117);
+const NELOG_ReplBadImport=(ERRLOG_BASE+118);
+const NELOG_ReplBadExport=(ERRLOG_BASE+119);
+const NELOG_ReplSignalFileErr=(ERRLOG_BASE+120);
+const NELOG_DiskFT=(ERRLOG_BASE+121);
+const NELOG_ReplAccessDenied=(ERRLOG_BASE+122);
+const NELOG_NetlogonFailedPrimary=(ERRLOG_BASE+123);
+const NELOG_NetlogonPasswdSetFailed=(ERRLOG_BASE+124);
+const NELOG_NetlogonTrackingError=(ERRLOG_BASE+125);
+const NELOG_NetlogonSyncError=(ERRLOG_BASE+126);
+const NELOG_UPS_PowerOut=(ERRLOG_BASE+130);
+const NELOG_UPS_Shutdown=(ERRLOG_BASE+131);
+const NELOG_UPS_CmdFileError=(ERRLOG_BASE+132);
+const NELOG_UPS_CannotOpenDriver=(ERRLOG_BASE+133);
+const NELOG_UPS_PowerBack=(ERRLOG_BASE+134);
+const NELOG_UPS_CmdFileConfig=(ERRLOG_BASE+135);
+const NELOG_UPS_CmdFileExec=(ERRLOG_BASE+136);
+const NELOG_Missing_Parameter=(ERRLOG_BASE+150);
+const NELOG_Invalid_Config_Line=(ERRLOG_BASE+151);
+const NELOG_Invalid_Config_File=(ERRLOG_BASE+152);
+const NELOG_File_Changed=(ERRLOG_BASE+153);
+const NELOG_Files_Dont_Fit=(ERRLOG_BASE+154);
+const NELOG_Wrong_DLL_Version=(ERRLOG_BASE+155);
+const NELOG_Error_in_DLL=(ERRLOG_BASE+156);
+const NELOG_System_Error=(ERRLOG_BASE+157);
+const NELOG_FT_ErrLog_Too_Large=(ERRLOG_BASE+158);
+const NELOG_FT_Update_In_Progress=(ERRLOG_BASE+159);
+const NELOG_OEM_Code=(ERRLOG_BASE+199);
+const NELOG_NetlogonSSIInitError=ERRLOG2_BASE;
+const NELOG_NetlogonFailedToUpdateTrustList=(ERRLOG2_BASE+1);
+const NELOG_NetlogonFailedToAddRpcInterface=(ERRLOG2_BASE+2);
+const NELOG_NetlogonFailedToReadMailslot=(ERRLOG2_BASE+3);
+const NELOG_NetlogonFailedToRegisterSC=(ERRLOG2_BASE+4);
+const NELOG_NetlogonChangeLogCorrupt=(ERRLOG2_BASE+5);
+const NELOG_NetlogonFailedToCreateShare=(ERRLOG2_BASE+6);
+const NELOG_NetlogonDownLevelLogonFailed=(ERRLOG2_BASE+7);
+const NELOG_NetlogonDownLevelLogoffFailed=(ERRLOG2_BASE+8);
+const NELOG_NetlogonNTLogonFailed=(ERRLOG2_BASE+9);
+const NELOG_NetlogonNTLogoffFailed=(ERRLOG2_BASE+10);
+const NELOG_NetlogonPartialSyncCallSuccess=(ERRLOG2_BASE+11);
+const NELOG_NetlogonPartialSyncCallFailed=(ERRLOG2_BASE+12);
+const NELOG_NetlogonFullSyncCallSuccess=(ERRLOG2_BASE+13);
+const NELOG_NetlogonFullSyncCallFailed=(ERRLOG2_BASE+14);
+const NELOG_NetlogonPartialSyncSuccess=(ERRLOG2_BASE+15);
+const NELOG_NetlogonPartialSyncFailed=(ERRLOG2_BASE+16);
+const NELOG_NetlogonFullSyncSuccess=(ERRLOG2_BASE+17);
+const NELOG_NetlogonFullSyncFailed=(ERRLOG2_BASE+18);
+const NELOG_NetlogonAuthNoDomainController=(ERRLOG2_BASE+19);
+const NELOG_NetlogonAuthNoTrustLsaSecret=(ERRLOG2_BASE+20);
+const NELOG_NetlogonAuthNoTrustSamAccount=(ERRLOG2_BASE+21);
+const NELOG_NetlogonServerAuthFailed=(ERRLOG2_BASE+22);
+const NELOG_NetlogonServerAuthNoTrustSamAccount=(ERRLOG2_BASE+23);
+const NELOG_FailedToRegisterSC=(ERRLOG2_BASE+24);
+const NELOG_FailedToSetServiceStatus=(ERRLOG2_BASE+25);
+const NELOG_FailedToGetComputerName=(ERRLOG2_BASE+26);
+const NELOG_DriverNotLoaded=(ERRLOG2_BASE+27);
+const NELOG_NoTranportLoaded=(ERRLOG2_BASE+28);
+const NELOG_NetlogonFailedDomainDelta=(ERRLOG2_BASE+29);
+const NELOG_NetlogonFailedGlobalGroupDelta=(ERRLOG2_BASE+30);
+const NELOG_NetlogonFailedLocalGroupDelta=(ERRLOG2_BASE+31);
+const NELOG_NetlogonFailedUserDelta=(ERRLOG2_BASE+32);
+const NELOG_NetlogonFailedPolicyDelta=(ERRLOG2_BASE+33);
+const NELOG_NetlogonFailedTrustedDomainDelta=(ERRLOG2_BASE+34);
+const NELOG_NetlogonFailedAccountDelta=(ERRLOG2_BASE+35);
+const NELOG_NetlogonFailedSecretDelta=(ERRLOG2_BASE+36);
+const NELOG_NetlogonSystemError=(ERRLOG2_BASE+37);
+const NELOG_NetlogonDuplicateMachineAccounts=(ERRLOG2_BASE+38);
+const NELOG_NetlogonTooManyGlobalGroups=(ERRLOG2_BASE+39);
+const NELOG_NetlogonBrowserDriver=(ERRLOG2_BASE+40);
+const NELOG_NetlogonAddNameFailure=(ERRLOG2_BASE+41);
+const NELOG_RplMessages=(ERRLOG2_BASE+42);
+const NELOG_RplXnsBoot=(ERRLOG2_BASE+43);
+const NELOG_RplSystem=(ERRLOG2_BASE+44);
+const NELOG_RplWkstaTimeout=(ERRLOG2_BASE+45);
+const NELOG_RplWkstaFileOpen=(ERRLOG2_BASE+46);
+const NELOG_RplWkstaFileRead=(ERRLOG2_BASE+47);
+const NELOG_RplWkstaMemory=(ERRLOG2_BASE+48);
+const NELOG_RplWkstaFileChecksum=(ERRLOG2_BASE+49);
+const NELOG_RplWkstaFileLineCount=(ERRLOG2_BASE+50);
+const NELOG_RplWkstaBbcFile=(ERRLOG2_BASE+51);
+const NELOG_RplWkstaFileSize=(ERRLOG2_BASE+52);
+const NELOG_RplWkstaInternal=(ERRLOG2_BASE+53);
+const NELOG_RplWkstaWrongVersion=(ERRLOG2_BASE+54);
+const NELOG_RplWkstaNetwork=(ERRLOG2_BASE+55);
+const NELOG_RplAdapterResource=(ERRLOG2_BASE+56);
+const NELOG_RplFileCopy=(ERRLOG2_BASE+57);
+const NELOG_RplFileDelete=(ERRLOG2_BASE+58);
+const NELOG_RplFilePerms=(ERRLOG2_BASE+59);
+const NELOG_RplCheckConfigs=(ERRLOG2_BASE+60);
+const NELOG_RplCreateProfiles=(ERRLOG2_BASE+61);
+const NELOG_RplRegistry=(ERRLOG2_BASE+62);
+const NELOG_RplReplaceRPLDISK=(ERRLOG2_BASE+63);
+const NELOG_RplCheckSecurity=(ERRLOG2_BASE+64);
+const NELOG_RplBackupDatabase=(ERRLOG2_BASE+65);
+const NELOG_RplInitDatabase=(ERRLOG2_BASE+66);
+const NELOG_RplRestoreDatabaseFailure=(ERRLOG2_BASE+67);
+const NELOG_RplRestoreDatabaseSuccess=(ERRLOG2_BASE+68);
+const NELOG_RplInitRestoredDatabase=(ERRLOG2_BASE+69);
+const NELOG_NetlogonSessionTypeWrong=(ERRLOG2_BASE+70);
+
+struct ERROR_LOG {
+	DWORD el_len;
+	DWORD el_reserved;
+	DWORD el_time;
+	DWORD el_error;
+	LPWSTR el_name;
+	LPWSTR el_text;
+	LPBYTE el_data;
+	DWORD el_data_size;
+	DWORD el_nstrings;
+}
+alias ERROR_LOG* PERROR_LOG, LPERROR_LOG;
+
+extern (Windows) {
+	deprecated {
+		NET_API_STATUS NetErrorLogClear(LPCWSTR, LPCWSTR, LPBYTE);
+		NET_API_STATUS NetErrorLogRead(LPCWSTR, LPWSTR, LPHLOG, DWORD,
+		  LPDWORD, DWORD, DWORD, LPBYTE*, DWORD, LPDWORD, LPDWORD);
+		NET_API_STATUS NetErrorLogWrite(LPBYTE, DWORD, LPCWSTR, LPBYTE,
+		  DWORD, LPBYTE, DWORD, LPBYTE);
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmmsg.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,43 @@
+/***********************************************************************\
+*                                lmmsg.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lmmsg;
+pragma(lib, "netapi32.lib");
+
+private import win32.lmcons, win32.windef, win32.w32api;
+
+static assert (_WIN32_WINNT_ONLY && _WIN32_WINNT >= 0x501,
+	"win32.lmmsg is available only if version WindowsXP, Windows2003 "
+	"or WindowsVista is set");
+
+const MSGNAME_NOT_FORWARDED  = 0;
+const MSGNAME_FORWARDED_TO   = 4;
+const MSGNAME_FORWARDED_FROM = 16;
+
+struct MSG_INFO_0 {
+	LPWSTR msgi0_name;
+}
+alias MSG_INFO_0* PMSG_INFO_0, LPMSG_INFO_0;
+
+struct MSG_INFO_1 {
+	LPWSTR msgi1_name;
+	DWORD msgi1_forward_flag;
+	LPWSTR msgi1_forward;
+}
+alias MSG_INFO_1* PMSG_INFO_1, LPMSG_INFO_1;
+
+extern (Windows) {
+	NET_API_STATUS NetMessageBufferSend(LPCWSTR, LPCWSTR, LPCWSTR, PBYTE,
+	  DWORD);
+	NET_API_STATUS NetMessageNameAdd(LPCWSTR, LPCWSTR);
+	NET_API_STATUS NetMessageNameDel(LPCWSTR, LPCWSTR);
+	NET_API_STATUS NetMessageNameEnum(LPCWSTR, DWORD, PBYTE*, DWORD, PDWORD,
+	  PDWORD, PDWORD);
+	NET_API_STATUS NetMessageNameGetInfo(LPCWSTR, LPCWSTR, DWORD, PBYTE*);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmremutl.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,60 @@
+/***********************************************************************\
+*                               lmremutl.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lmremutl;
+pragma(lib, "netapi32.lib");
+
+// D Conversion Note: DESC_CHAR is defined as TCHAR.
+
+private import win32.lmcons, win32.windef;
+
+const SUPPORTS_REMOTE_ADMIN_PROTOCOL =  2;
+const SUPPORTS_RPC                   =  4;
+const SUPPORTS_SAM_PROTOCOL          =  8;
+const SUPPORTS_UNICODE               = 16;
+const SUPPORTS_LOCAL                 = 32;
+const SUPPORTS_ANY                   = 0xFFFFFFFF;
+
+const NO_PERMISSION_REQUIRED = 1;
+const ALLOCATE_RESPONSE      = 2;
+const USE_SPECIFIC_TRANSPORT = 0x80000000;
+
+//[Yes] #ifndef DESC_CHAR_UNICODE
+//alias CHAR DESC_CHAR;
+//} else {
+//[No] #else
+//[No] typedef WCHAR DESC_CHAR;
+//[No] #endif
+// FIXME (D): Is this OK?
+alias TCHAR DESC_CHAR;
+
+alias DESC_CHAR* LPDESC;
+
+struct TIME_OF_DAY_INFO {
+	DWORD tod_elapsedt;
+	DWORD tod_msecs;
+	DWORD tod_hours;
+	DWORD tod_mins;
+	DWORD tod_secs;
+	DWORD tod_hunds;
+	LONG  tod_timezone;
+	DWORD tod_tinterval;
+	DWORD tod_day;
+	DWORD tod_month;
+	DWORD tod_year;
+	DWORD tod_weekday;
+}
+alias TIME_OF_DAY_INFO* PTIME_OF_DAY_INFO, LPTIME_OF_DAY_INFO;
+
+extern (Windows) {
+	NET_API_STATUS NetRemoteTOD(LPCWSTR, PBYTE*);
+	NET_API_STATUS NetRemoteComputerSupports(LPCWSTR, DWORD, PDWORD);
+	NET_API_STATUS RxRemoteApi(DWORD, LPCWSTR, LPDESC, LPDESC, LPDESC,
+	  LPDESC, LPDESC, LPDESC, LPDESC, DWORD, ...);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmrepl.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,134 @@
+/***********************************************************************\
+*                                lmrepl.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lmrepl;
+pragma(lib, "netapi32.lib");
+
+private import win32.lmcons, win32.windef;
+
+const REPL_ROLE_EXPORT=1;
+const REPL_ROLE_IMPORT=2;
+const REPL_ROLE_BOTH=3;
+
+const REPL_INTERVAL_INFOLEVEL  = PARMNUM_BASE_INFOLEVEL+0;
+const REPL_PULSE_INFOLEVEL     = PARMNUM_BASE_INFOLEVEL+1;
+const REPL_GUARDTIME_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+2;
+const REPL_RANDOM_INFOLEVEL    = PARMNUM_BASE_INFOLEVEL+3;
+
+const REPL_UNLOCK_NOFORCE=0;
+const REPL_UNLOCK_FORCE=1;
+const REPL_STATE_OK=0;
+const REPL_STATE_NO_MASTER=1;
+const REPL_STATE_NO_SYNC=2;
+const REPL_STATE_NEVER_REPLICATED=3;
+const REPL_INTEGRITY_FILE=1;
+const REPL_INTEGRITY_TREE=2;
+const REPL_EXTENT_FILE=1;
+const REPL_EXTENT_TREE=2;
+
+const REPL_EXPORT_INTEGRITY_INFOLEVEL = PARMNUM_BASE_INFOLEVEL+0;
+const REPL_EXPORT_EXTENT_INFOLEVEL    = PARMNUM_BASE_INFOLEVEL+1;
+
+struct REPL_INFO_0 {
+	DWORD rp0_role;
+	LPWSTR rp0_exportpath;
+	LPWSTR rp0_exportlist;
+	LPWSTR rp0_importpath;
+	LPWSTR rp0_importlist;
+	LPWSTR rp0_logonusername;
+	DWORD rp0_interval;
+	DWORD rp0_pulse;
+	DWORD rp0_guardtime;
+	DWORD rp0_random;
+}
+alias REPL_INFO_0* PREPL_INFO_0, LPREPL_INFO_0;
+
+struct REPL_INFO_1000 {
+	DWORD rp1000_interval;
+}
+alias REPL_INFO_1000* PREPL_INFO_1000, LPREPL_INFO_1000;
+
+struct REPL_INFO_1001 {
+	DWORD rp1001_pulse;
+}
+alias REPL_INFO_1001* PREPL_INFO_1001, LPREPL_INFO_1001;
+
+struct REPL_INFO_1002 {
+	DWORD rp1002_guardtime;
+}
+alias REPL_INFO_1002* PREPL_INFO_1002, LPREPL_INFO_1002;
+
+struct REPL_INFO_1003 {
+	DWORD rp1003_random;
+}
+alias REPL_INFO_1003* PREPL_INFO_1003, LPREPL_INFO_1003;
+
+struct REPL_EDIR_INFO_0 {
+	LPWSTR rped0_dirname;
+}
+alias REPL_EDIR_INFO_0* PREPL_EDIR_INFO_0, LPREPL_EDIR_INFO_0;
+
+struct REPL_EDIR_INFO_1 {
+	LPWSTR rped1_dirname;
+	DWORD rped1_integrity;
+	DWORD rped1_extent;
+}
+alias REPL_EDIR_INFO_1* PREPL_EDIR_INFO_1, LPREPL_EDIR_INFO_1;
+
+struct REPL_EDIR_INFO_2 {
+	LPWSTR rped2_dirname;
+	DWORD rped2_integrity;
+	DWORD rped2_extent;
+	DWORD rped2_lockcount;
+	DWORD rped2_locktime;
+}
+alias REPL_EDIR_INFO_2* PREPL_EDIR_INFO_2, LPREPL_EDIR_INFO_2;
+
+struct REPL_EDIR_INFO_1000 {
+	DWORD rped1000_integrity;
+}
+alias REPL_EDIR_INFO_1000* PREPL_EDIR_INFO_1000, LPREPL_EDIR_INFO_1000;
+
+struct REPL_EDIR_INFO_1001 {
+	DWORD rped1001_extent;
+}
+alias REPL_EDIR_INFO_1001* PREPL_EDIR_INFO_1001, LPREPL_EDIR_INFO_1001;
+
+struct REPL_IDIR_INFO_0 {
+	LPWSTR rpid0_dirname;
+}
+alias REPL_IDIR_INFO_0* PREPL_IDIR_INFO_0, LPREPL_IDIR_INFO_0;
+
+struct REPL_IDIR_INFO_1 {
+	LPWSTR rpid1_dirname;
+	DWORD rpid1_state;
+	LPWSTR rpid1_mastername;
+	DWORD rpid1_last_update_time;
+	DWORD rpid1_lockcount;
+	DWORD rpid1_locktime;
+}
+alias REPL_IDIR_INFO_1* PREPL_IDIR_INFO_1, LPREPL_IDIR_INFO_1;
+
+extern (Windows) {
+NET_API_STATUS NetReplGetInfo(LPCWSTR,DWORD,PBYTE*);
+NET_API_STATUS NetReplSetInfo(LPCWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS NetReplExportDirAdd(LPCWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS NetReplExportDirDel(LPCWSTR,LPCWSTR);
+NET_API_STATUS NetReplExportDirEnum(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS NetReplExportDirGetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE*);
+NET_API_STATUS NetReplExportDirSetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS NetReplExportDirLock(LPCWSTR,LPCWSTR);
+NET_API_STATUS NetReplExportDirUnlock(LPCWSTR,LPCWSTR,DWORD);
+NET_API_STATUS NetReplImportDirAdd(LPCWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS NetReplImportDirDel(LPCWSTR,LPCWSTR);
+NET_API_STATUS NetReplImportDirEnum(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS NetReplImportDirGetInfo(LPCWSTR,LPCWSTR,DWORD,PBYTE*);
+NET_API_STATUS NetReplImportDirLock(LPCWSTR,LPCWSTR);
+NET_API_STATUS NetReplImportDirUnlock(LPCWSTR,LPCWSTR,DWORD);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmserver.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,941 @@
+/***********************************************************************\
+*                               lmserver.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lmserver;
+
+import win32.winsvc;
+private import win32.lmcons, win32.windef;
+
+struct SERVER_INFO_100 {
+	DWORD  sv100_platform_id;
+	LPWSTR sv100_name;
+}
+alias SERVER_INFO_100* PSERVER_INFO_100, LPSERVER_INFO_100;
+
+struct SERVER_INFO_101 {
+	DWORD  sv101_platform_id;
+	LPWSTR sv101_name;
+	DWORD  sv101_version_major;
+	DWORD  sv101_version_minor;
+	DWORD  sv101_type;
+	LPWSTR sv101_comment;
+}
+alias SERVER_INFO_101* PSERVER_INFO_101, LPSERVER_INFO_101;
+
+struct SERVER_INFO_102 {
+	DWORD  sv102_platform_id;
+	LPWSTR sv102_name;
+	DWORD  sv102_version_major;
+	DWORD  sv102_version_minor;
+	DWORD  sv102_type;
+	LPWSTR sv102_comment;
+	DWORD  sv102_users;
+	LONG   sv102_disc;
+	BOOL   sv102_hidden;
+	DWORD  sv102_announce;
+	DWORD  sv102_anndelta;
+	DWORD  sv102_licenses;
+	LPWSTR sv102_userpath;
+}
+alias SERVER_INFO_102* PSERVER_INFO_102, LPSERVER_INFO_102;
+
+struct SERVER_INFO_402 {
+	DWORD  sv402_ulist_mtime;
+	DWORD  sv402_glist_mtime;
+	DWORD  sv402_alist_mtime;
+	LPWSTR sv402_alerts;
+	DWORD  sv402_security;
+	DWORD  sv402_numadmin;
+	DWORD  sv402_lanmask;
+	LPWSTR sv402_guestacct;
+	DWORD  sv402_chdevs;
+	DWORD  sv402_chdevq;
+	DWORD  sv402_chdevjobs;
+	DWORD  sv402_connections;
+	DWORD  sv402_shares;
+	DWORD  sv402_openfiles;
+	DWORD  sv402_sessopens;
+	DWORD  sv402_sessvcs;
+	DWORD  sv402_sessreqs;
+	DWORD  sv402_opensearch;
+	DWORD  sv402_activelocks;
+	DWORD  sv402_numreqbuf;
+	DWORD  sv402_sizreqbuf;
+	DWORD  sv402_numbigbuf;
+	DWORD  sv402_numfiletasks;
+	DWORD  sv402_alertsched;
+	DWORD  sv402_erroralert;
+	DWORD  sv402_logonalert;
+	DWORD  sv402_accessalert;
+	DWORD  sv402_diskalert;
+	DWORD  sv402_netioalert;
+	DWORD  sv402_maxauditsz;
+	LPWSTR sv402_srvheuristics;
+}
+alias SERVER_INFO_402* PSERVER_INFO_402, LPSERVER_INFO_402;
+
+struct SERVER_INFO_403 {
+	DWORD  sv403_ulist_mtime;
+	DWORD  sv403_glist_mtime;
+	DWORD  sv403_alist_mtime;
+	LPWSTR sv403_alerts;
+	DWORD  sv403_security;
+	DWORD  sv403_numadmin;
+	DWORD  sv403_lanmask;
+	LPWSTR sv403_guestacct;
+	DWORD  sv403_chdevs;
+	DWORD  sv403_chdevq;
+	DWORD  sv403_chdevjobs;
+	DWORD  sv403_connections;
+	DWORD  sv403_shares;
+	DWORD  sv403_openfiles;
+	DWORD  sv403_sessopens;
+	DWORD  sv403_sessvcs;
+	DWORD  sv403_sessreqs;
+	DWORD  sv403_opensearch;
+	DWORD  sv403_activelocks;
+	DWORD  sv403_numreqbuf;
+	DWORD  sv403_sizreqbuf;
+	DWORD  sv403_numbigbuf;
+	DWORD  sv403_numfiletasks;
+	DWORD  sv403_alertsched;
+	DWORD  sv403_erroralert;
+	DWORD  sv403_logonalert;
+	DWORD  sv403_accessalert;
+	DWORD  sv403_diskalert;
+	DWORD  sv403_netioalert;
+	DWORD  sv403_maxauditsz;
+	LPWSTR sv403_srvheuristics;
+	DWORD  sv403_auditedevents;
+	DWORD  sv403_autoprofile;
+	LPWSTR sv403_autopath;
+}
+alias SERVER_INFO_403* PSERVER_INFO_403, LPSERVER_INFO_403;
+
+struct SERVER_INFO_502 {
+	DWORD sv502_sessopens;
+	DWORD sv502_sessvcs;
+	DWORD sv502_opensearch;
+	DWORD sv502_sizreqbuf;
+	DWORD sv502_initworkitems;
+	DWORD sv502_maxworkitems;
+	DWORD sv502_rawworkitems;
+	DWORD sv502_irpstacksize;
+	DWORD sv502_maxrawbuflen;
+	DWORD sv502_sessusers;
+	DWORD sv502_sessconns;
+	DWORD sv502_maxpagedmemoryusage;
+	DWORD sv502_maxnonpagedmemoryusage;
+	BOOL  sv502_enablesoftcompat;
+	BOOL  sv502_enableforcedlogoff;
+	BOOL  sv502_timesource;
+	BOOL  sv502_acceptdownlevelapis;
+	BOOL  sv502_lmannounce;
+}
+alias SERVER_INFO_502* PSERVER_INFO_502, LPSERVER_INFO_502;
+
+struct SERVER_INFO_503 {
+	DWORD  sv503_sessopens;
+	DWORD  sv503_sessvcs;
+	DWORD  sv503_opensearch;
+	DWORD  sv503_sizreqbuf;
+	DWORD  sv503_initworkitems;
+	DWORD  sv503_maxworkitems;
+	DWORD  sv503_rawworkitems;
+	DWORD  sv503_irpstacksize;
+	DWORD  sv503_maxrawbuflen;
+	DWORD  sv503_sessusers;
+	DWORD  sv503_sessconns;
+	DWORD  sv503_maxpagedmemoryusage;
+	DWORD  sv503_maxnonpagedmemoryusage;
+	BOOL   sv503_enablesoftcompat;
+	BOOL   sv503_enableforcedlogoff;
+	BOOL   sv503_timesource;
+	BOOL   sv503_acceptdownlevelapis;
+	BOOL   sv503_lmannounce;
+	LPWSTR sv503_domain;
+	DWORD  sv503_maxcopyreadlen;
+	DWORD  sv503_maxcopywritelen;
+	DWORD  sv503_minkeepsearch;
+	DWORD  sv503_maxkeepsearch;
+	DWORD  sv503_minkeepcomplsearch;
+	DWORD  sv503_maxkeepcomplsearch;
+	DWORD  sv503_threadcountadd;
+	DWORD  sv503_numblockthreads;
+	DWORD  sv503_scavtimeout;
+	DWORD  sv503_minrcvqueue;
+	DWORD  sv503_minfreeworkitems;
+	DWORD  sv503_xactmemsize;
+	DWORD  sv503_threadpriority;
+	DWORD  sv503_maxmpxct;
+	DWORD  sv503_oplockbreakwait;
+	DWORD  sv503_oplockbreakresponsewait;
+	BOOL   sv503_enableoplocks;
+	BOOL   sv503_enableoplockforceclose;
+	BOOL   sv503_enablefcbopens;
+	BOOL   sv503_enableraw;
+	BOOL   sv503_enablesharednetdrives;
+	DWORD  sv503_minfreeconnections;
+	DWORD  sv503_maxfreeconnections;
+}
+alias SERVER_INFO_503* PSERVER_INFO_503, LPSERVER_INFO_503;
+
+struct SERVER_INFO_599 {
+	DWORD  sv599_sessopens;
+	DWORD  sv599_sessvcs;
+	DWORD  sv599_opensearch;
+	DWORD  sv599_sizreqbuf;
+	DWORD  sv599_initworkitems;
+	DWORD  sv599_maxworkitems;
+	DWORD  sv599_rawworkitems;
+	DWORD  sv599_irpstacksize;
+	DWORD  sv599_maxrawbuflen;
+	DWORD  sv599_sessusers;
+	DWORD  sv599_sessconns;
+	DWORD  sv599_maxpagedmemoryusage;
+	DWORD  sv599_maxnonpagedmemoryusage;
+	BOOL   sv599_enablesoftcompat;
+	BOOL   sv599_enableforcedlogoff;
+	BOOL   sv599_timesource;
+	BOOL   sv599_acceptdownlevelapis;
+	BOOL   sv599_lmannounce;
+	LPWSTR sv599_domain;
+	DWORD  sv599_maxcopyreadlen;
+	DWORD  sv599_maxcopywritelen;
+	DWORD  sv599_minkeepsearch;
+	DWORD  sv599_maxkeepsearch;
+	DWORD  sv599_minkeepcomplsearch;
+	DWORD  sv599_maxkeepcomplsearch;
+	DWORD  sv599_threadcountadd;
+	DWORD  sv599_numblockthreads;
+	DWORD  sv599_scavtimeout;
+	DWORD  sv599_minrcvqueue;
+	DWORD  sv599_minfreeworkitems;
+	DWORD  sv599_xactmemsize;
+	DWORD  sv599_threadpriority;
+	DWORD  sv599_maxmpxct;
+	DWORD  sv599_oplockbreakwait;
+	DWORD  sv599_oplockbreakresponsewait;
+	BOOL   sv599_enableoplocks;
+	BOOL   sv599_enableoplockforceclose;
+	BOOL   sv599_enablefcbopens;
+	BOOL   sv599_enableraw;
+	BOOL   sv599_enablesharednetdrives;
+	DWORD  sv599_minfreeconnections;
+	DWORD  sv599_maxfreeconnections;
+	DWORD  sv599_initsesstable;
+	DWORD  sv599_initconntable;
+	DWORD  sv599_initfiletable;
+	DWORD  sv599_initsearchtable;
+	DWORD  sv599_alertschedule;
+	DWORD  sv599_errorthreshold;
+	DWORD  sv599_networkerrorthreshold;
+	DWORD  sv599_diskspacethreshold;
+	DWORD  sv599_reserved;
+	DWORD  sv599_maxlinkdelay;
+	DWORD  sv599_minlinkthroughput;
+	DWORD  sv599_linkinfovalidtime;
+	DWORD  sv599_scavqosinfoupdatetime;
+	DWORD  sv599_maxworkitemidletime;
+}
+alias SERVER_INFO_599* PSERVER_INFO_599, LPSERVER_INFO_599;
+
+struct SERVER_INFO_598 {
+	DWORD sv598_maxrawworkitems;
+	DWORD sv598_maxthreadsperqueue;
+	DWORD sv598_producttype;
+	DWORD sv598_serversize;
+	DWORD sv598_connectionlessautodisc;
+	DWORD sv598_sharingviolationretries;
+	DWORD sv598_sharingviolationdelay;
+	DWORD sv598_maxglobalopensearch;
+	DWORD sv598_removeduplicatesearches;
+	DWORD sv598_lockviolationoffset;
+	DWORD sv598_lockviolationdelay;
+	DWORD sv598_mdlreadswitchover;
+	DWORD sv598_cachedopenlimit;
+	DWORD sv598_otherqueueaffinity;
+	BOOL  sv598_restrictnullsessaccess;
+	BOOL  sv598_enablewfw311directipx;
+	DWORD sv598_queuesamplesecs;
+	DWORD sv598_balancecount;
+	DWORD sv598_preferredaffinity;
+	DWORD sv598_maxfreerfcbs;
+	DWORD sv598_maxfreemfcbs;
+	DWORD sv598_maxfreelfcbs;
+	DWORD sv598_maxfreepagedpoolchunks;
+	DWORD sv598_minpagedpoolchunksize;
+	DWORD sv598_maxpagedpoolchunksize;
+	BOOL  sv598_sendsfrompreferredprocessor;
+}
+alias SERVER_INFO_598* PSERVER_INFO_598, LPSERVER_INFO_598;
+
+struct SERVER_INFO_1005 {
+	LPWSTR sv1005_comment;
+}
+alias SERVER_INFO_1005* PSERVER_INFO_1005, LPSERVER_INFO_1005;
+
+struct SERVER_INFO_1107 {
+	DWORD sv1107_users;
+}
+alias SERVER_INFO_1107* PSERVER_INFO_1107, LPSERVER_INFO_1107;
+
+struct SERVER_INFO_1010 {
+	LONG sv1010_disc;
+}
+alias SERVER_INFO_1010* PSERVER_INFO_1010, LPSERVER_INFO_1010;
+
+struct SERVER_INFO_1016 {
+	BOOL sv1016_hidden;
+}
+alias SERVER_INFO_1016* PSERVER_INFO_1016, LPSERVER_INFO_1016;
+
+struct SERVER_INFO_1017 {
+	DWORD sv1017_announce;
+}
+alias SERVER_INFO_1017* PSERVER_INFO_1017, LPSERVER_INFO_1017;
+
+struct SERVER_INFO_1018 {
+	DWORD sv1018_anndelta;
+}
+alias SERVER_INFO_1018* PSERVER_INFO_1018, LPSERVER_INFO_1018;
+
+struct SERVER_INFO_1501 {
+	DWORD sv1501_sessopens;
+}
+alias SERVER_INFO_1501* PSERVER_INFO_1501, LPSERVER_INFO_1501;
+
+struct SERVER_INFO_1502 {
+	DWORD sv1502_sessvcs;
+}
+alias SERVER_INFO_1502* PSERVER_INFO_1502, LPSERVER_INFO_1502;
+
+struct SERVER_INFO_1503 {
+	DWORD sv1503_opensearch;
+}
+alias SERVER_INFO_1503* PSERVER_INFO_1503, LPSERVER_INFO_1503;
+
+struct SERVER_INFO_1506 {
+	DWORD sv1506_maxworkitems;
+}
+alias SERVER_INFO_1506* PSERVER_INFO_1506, LPSERVER_INFO_1506;
+
+struct SERVER_INFO_1509 {
+	DWORD sv1509_maxrawbuflen;
+}
+alias SERVER_INFO_1509* PSERVER_INFO_1509, LPSERVER_INFO_1509;
+
+struct SERVER_INFO_1510 {
+	DWORD sv1510_sessusers;
+}
+alias SERVER_INFO_1510* PSERVER_INFO_1510, LPSERVER_INFO_1510;
+
+struct SERVER_INFO_1511 {
+	DWORD sv1511_sessconns;
+} alias SERVER_INFO_1511* PSERVER_INFO_1511, LPSERVER_INFO_1511;
+
+struct SERVER_INFO_1512 {
+	DWORD sv1512_maxnonpagedmemoryusage;
+}
+alias SERVER_INFO_1512* PSERVER_INFO_1512, LPSERVER_INFO_1512;
+
+struct SERVER_INFO_1513 {
+	DWORD sv1513_maxpagedmemoryusage;
+}
+alias SERVER_INFO_1513* PSERVER_INFO_1513, LPSERVER_INFO_1513;
+
+struct SERVER_INFO_1514 {
+	BOOL sv1514_enablesoftcompat;
+}
+alias SERVER_INFO_1514* PSERVER_INFO_1514, LPSERVER_INFO_1514;
+
+struct SERVER_INFO_1515 {
+	BOOL sv1515_enableforcedlogoff;
+}
+alias SERVER_INFO_1515* PSERVER_INFO_1515, LPSERVER_INFO_1515;
+
+struct SERVER_INFO_1516 {
+	BOOL sv1516_timesource;
+}
+alias SERVER_INFO_1516* PSERVER_INFO_1516, LPSERVER_INFO_1516;
+
+struct SERVER_INFO_1518 {
+	BOOL sv1518_lmannounce;
+}
+alias SERVER_INFO_1518* PSERVER_INFO_1518, LPSERVER_INFO_1518;
+
+struct SERVER_INFO_1520 {
+	DWORD sv1520_maxcopyreadlen;
+}
+alias SERVER_INFO_1520* PSERVER_INFO_1520, LPSERVER_INFO_1520;
+
+struct SERVER_INFO_1521 {
+	DWORD sv1521_maxcopywritelen;
+}
+alias SERVER_INFO_1521* PSERVER_INFO_1521, LPSERVER_INFO_1521;
+
+struct SERVER_INFO_1522 {
+	DWORD sv1522_minkeepsearch;
+}
+alias SERVER_INFO_1522* PSERVER_INFO_1522, LPSERVER_INFO_1522;
+
+struct SERVER_INFO_1523 {
+	DWORD sv1523_maxkeepsearch;
+}
+alias SERVER_INFO_1523* PSERVER_INFO_1523, LPSERVER_INFO_1523;
+
+struct SERVER_INFO_1524 {
+	DWORD sv1524_minkeepcomplsearch;
+}
+alias SERVER_INFO_1524* PSERVER_INFO_1524, LPSERVER_INFO_1524;
+
+struct SERVER_INFO_1525 {
+	DWORD sv1525_maxkeepcomplsearch;
+}
+alias SERVER_INFO_1525* PSERVER_INFO_1525, LPSERVER_INFO_1525;
+
+struct SERVER_INFO_1528 {
+	DWORD sv1528_scavtimeout;
+}
+alias SERVER_INFO_1528* PSERVER_INFO_1528, LPSERVER_INFO_1528;
+
+struct SERVER_INFO_1529 {
+	DWORD sv1529_minrcvqueue;
+}
+alias SERVER_INFO_1529* PSERVER_INFO_1529, LPSERVER_INFO_1529;
+
+struct SERVER_INFO_1530 {
+	DWORD sv1530_minfreeworkitems;
+}
+alias SERVER_INFO_1530* PSERVER_INFO_1530, LPSERVER_INFO_1530;
+
+struct SERVER_INFO_1533 {
+	DWORD sv1533_maxmpxct;
+}
+alias SERVER_INFO_1533* PSERVER_INFO_1533, LPSERVER_INFO_1533;
+
+struct SERVER_INFO_1534 {
+	DWORD sv1534_oplockbreakwait;
+}
+alias SERVER_INFO_1534* PSERVER_INFO_1534, LPSERVER_INFO_1534;
+
+struct SERVER_INFO_1535 {
+	DWORD sv1535_oplockbreakresponsewait;
+}
+alias SERVER_INFO_1535* PSERVER_INFO_1535, LPSERVER_INFO_1535;
+
+struct SERVER_INFO_1536 {
+	BOOL sv1536_enableoplocks;
+}
+alias SERVER_INFO_1536* PSERVER_INFO_1536, LPSERVER_INFO_1536;
+
+struct SERVER_INFO_1537 {
+	BOOL sv1537_enableoplockforceclose;
+}
+alias SERVER_INFO_1537* PSERVER_INFO_1537, LPSERVER_INFO_1537;
+
+struct SERVER_INFO_1538 {
+	BOOL sv1538_enablefcbopens;
+}
+alias SERVER_INFO_1538* PSERVER_INFO_1538, LPSERVER_INFO_1538;
+
+struct SERVER_INFO_1539 {
+	BOOL sv1539_enableraw;
+}
+alias SERVER_INFO_1539* PSERVER_INFO_1539, LPSERVER_INFO_1539;
+
+struct SERVER_INFO_1540 {
+	BOOL sv1540_enablesharednetdrives;
+}
+alias SERVER_INFO_1540* PSERVER_INFO_1540, LPSERVER_INFO_1540;
+
+struct SERVER_INFO_1541 {
+	BOOL sv1541_minfreeconnections;
+}
+alias SERVER_INFO_1541* PSERVER_INFO_1541, LPSERVER_INFO_1541;
+
+struct SERVER_INFO_1542 {
+	BOOL sv1542_maxfreeconnections;
+}
+alias SERVER_INFO_1542* PSERVER_INFO_1542, LPSERVER_INFO_1542;
+
+struct SERVER_INFO_1543 {
+	DWORD sv1543_initsesstable;
+}
+alias SERVER_INFO_1543* PSERVER_INFO_1543, LPSERVER_INFO_1543;
+
+struct SERVER_INFO_1544 {
+	DWORD sv1544_initconntable;
+}
+alias SERVER_INFO_1544* PSERVER_INFO_1544, LPSERVER_INFO_1544;
+
+struct SERVER_INFO_1545 {
+	DWORD sv1545_initfiletable;
+}
+alias SERVER_INFO_1545* PSERVER_INFO_1545, LPSERVER_INFO_1545;
+
+struct SERVER_INFO_1546 {
+	DWORD sv1546_initsearchtable;
+}
+alias SERVER_INFO_1546* PSERVER_INFO_1546, LPSERVER_INFO_1546;
+
+struct SERVER_INFO_1547 {
+	DWORD sv1547_alertschedule;
+}
+alias SERVER_INFO_1547* PSERVER_INFO_1547, LPSERVER_INFO_1547;
+
+struct SERVER_INFO_1548 {
+	DWORD sv1548_errorthreshold;
+}
+alias SERVER_INFO_1548* PSERVER_INFO_1548, LPSERVER_INFO_1548;
+
+struct SERVER_INFO_1549 {
+	DWORD sv1549_networkerrorthreshold;
+}
+alias SERVER_INFO_1549* PSERVER_INFO_1549, LPSERVER_INFO_1549;
+
+struct SERVER_INFO_1550 {
+	DWORD sv1550_diskspacethreshold;
+}
+alias SERVER_INFO_1550* PSERVER_INFO_1550, LPSERVER_INFO_1550;
+
+struct SERVER_INFO_1552 {
+	DWORD sv1552_maxlinkdelay;
+}
+alias SERVER_INFO_1552* PSERVER_INFO_1552, LPSERVER_INFO_1552;
+
+struct SERVER_INFO_1553 {
+	DWORD sv1553_minlinkthroughput;
+}
+alias SERVER_INFO_1553* PSERVER_INFO_1553, LPSERVER_INFO_1553;
+
+struct SERVER_INFO_1554 {
+	DWORD sv1554_linkinfovalidtime;
+}
+alias SERVER_INFO_1554* PSERVER_INFO_1554, LPSERVER_INFO_1554;
+
+struct SERVER_INFO_1555 {
+	DWORD sv1555_scavqosinfoupdatetime;
+}
+alias SERVER_INFO_1555* PSERVER_INFO_1555, LPSERVER_INFO_1555;
+
+struct SERVER_INFO_1556 {
+	DWORD sv1556_maxworkitemidletime;
+}
+alias SERVER_INFO_1556* PSERVER_INFO_1556, LPSERVER_INFO_1556;
+
+struct SERVER_INFO_1557 {
+	DWORD sv1557_maxrawworkitems;
+}
+alias SERVER_INFO_1557* PSERVER_INFO_1557, LPSERVER_INFO_1557;
+
+struct SERVER_INFO_1560 {
+	DWORD sv1560_producttype;
+}
+alias SERVER_INFO_1560* PSERVER_INFO_1560, LPSERVER_INFO_1560;
+
+struct SERVER_INFO_1561 {
+	DWORD sv1561_serversize;
+}
+alias SERVER_INFO_1561* PSERVER_INFO_1561, LPSERVER_INFO_1561;
+
+struct SERVER_INFO_1562 {
+	DWORD sv1562_connectionlessautodisc;
+}
+alias SERVER_INFO_1562* PSERVER_INFO_1562, LPSERVER_INFO_1562;
+
+struct SERVER_INFO_1563 {
+	DWORD sv1563_sharingviolationretries;
+}
+alias SERVER_INFO_1563* PSERVER_INFO_1563, LPSERVER_INFO_1563;
+
+struct SERVER_INFO_1564 {
+	DWORD sv1564_sharingviolationdelay;
+}
+alias SERVER_INFO_1564* PSERVER_INFO_1564, LPSERVER_INFO_1564;
+
+struct SERVER_INFO_1565 {
+	DWORD sv1565_maxglobalopensearch;
+}
+alias SERVER_INFO_1565* PSERVER_INFO_1565, LPSERVER_INFO_1565;
+
+struct SERVER_INFO_1566 {
+	BOOL sv1566_removeduplicatesearches;
+}
+alias SERVER_INFO_1566* PSERVER_INFO_1566, LPSERVER_INFO_1566;
+
+struct SERVER_INFO_1567 {
+	DWORD sv1567_lockviolationretries;
+}
+alias SERVER_INFO_1567* PSERVER_INFO_1567, LPSERVER_INFO_1567;
+
+struct SERVER_INFO_1568 {
+	DWORD sv1568_lockviolationoffset;
+}
+alias SERVER_INFO_1568* PSERVER_INFO_1568, LPSERVER_INFO_1568;
+
+struct SERVER_INFO_1569 {
+	DWORD sv1569_lockviolationdelay;
+}
+alias SERVER_INFO_1569* PSERVER_INFO_1569, LPSERVER_INFO_1569;
+
+struct SERVER_INFO_1570 {
+	DWORD sv1570_mdlreadswitchover;
+}
+alias SERVER_INFO_1570* PSERVER_INFO_1570, LPSERVER_INFO_1570;
+
+struct SERVER_INFO_1571 {
+	DWORD sv1571_cachedopenlimit;
+}
+alias SERVER_INFO_1571* PSERVER_INFO_1571, LPSERVER_INFO_1571;
+
+struct SERVER_INFO_1572 {
+	DWORD sv1572_criticalthreads;
+}
+alias SERVER_INFO_1572* PSERVER_INFO_1572, LPSERVER_INFO_1572;
+
+struct SERVER_INFO_1573 {
+	DWORD sv1573_restrictnullsessaccess;
+}
+alias SERVER_INFO_1573* PSERVER_INFO_1573, LPSERVER_INFO_1573;
+
+struct SERVER_INFO_1574 {
+	DWORD sv1574_enablewfw311directipx;
+}
+alias SERVER_INFO_1574* PSERVER_INFO_1574, LPSERVER_INFO_1574;
+
+struct SERVER_INFO_1575 {
+	DWORD sv1575_otherqueueaffinity;
+}
+alias SERVER_INFO_1575* PSERVER_INFO_1575, LPSERVER_INFO_1575;
+
+struct SERVER_INFO_1576 {
+	DWORD sv1576_queuesamplesecs;
+}
+alias SERVER_INFO_1576* PSERVER_INFO_1576, LPSERVER_INFO_1576;
+
+struct SERVER_INFO_1577 {
+	DWORD sv1577_balancecount;
+}
+alias SERVER_INFO_1577* PSERVER_INFO_1577, LPSERVER_INFO_1577;
+
+struct SERVER_INFO_1578 {
+	DWORD sv1578_preferredaffinity;
+}
+alias SERVER_INFO_1578* PSERVER_INFO_1578, LPSERVER_INFO_1578;
+
+struct SERVER_INFO_1579 {
+	DWORD sv1579_maxfreerfcbs;
+}
+alias SERVER_INFO_1579* PSERVER_INFO_1579, LPSERVER_INFO_1579;
+
+struct SERVER_INFO_1580 {
+	DWORD sv1580_maxfreemfcbs;
+}
+alias SERVER_INFO_1580* PSERVER_INFO_1580, LPSERVER_INFO_1580;
+
+struct SERVER_INFO_1581 {
+	DWORD sv1581_maxfreemlcbs;
+}
+alias SERVER_INFO_1581* PSERVER_INFO_1581, LPSERVER_INFO_1581;
+
+struct SERVER_INFO_1582 {
+	DWORD sv1582_maxfreepagedpoolchunks;
+}
+alias SERVER_INFO_1582* PSERVER_INFO_1582, LPSERVER_INFO_1582;
+
+struct SERVER_INFO_1583 {
+	DWORD sv1583_minpagedpoolchunksize;
+}
+alias SERVER_INFO_1583* PSERVER_INFO_1583, LPSERVER_INFO_1583;
+
+struct SERVER_INFO_1584 {
+	DWORD sv1584_maxpagedpoolchunksize;
+}
+alias SERVER_INFO_1584* PSERVER_INFO_1584, LPSERVER_INFO_1584;
+
+struct SERVER_INFO_1585 {
+	BOOL sv1585_sendsfrompreferredprocessor;
+}
+alias SERVER_INFO_1585* PSERVER_INFO_1585, LPSERVER_INFO_1585;
+
+struct SERVER_INFO_1586 {
+	BOOL sv1586_maxthreadsperqueue;
+}
+alias SERVER_INFO_1586* PSERVER_INFO_1586, LPSERVER_INFO_1586;
+
+struct SERVER_TRANSPORT_INFO_0 {
+	DWORD  svti0_numberofvcs;
+	LPWSTR svti0_transportname;
+	PBYTE  svti0_transportaddress;
+	DWORD  svti0_transportaddresslength;
+	LPWSTR svti0_networkaddress;
+}
+alias SERVER_TRANSPORT_INFO_0* PSERVER_TRANSPORT_INFO_0,
+  LPSERVER_TRANSPORT_INFO_0;
+
+extern (Windows):
+NET_API_STATUS NetServerEnum(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,DWORD,LPCWSTR,PDWORD);
+NET_API_STATUS NetServerEnumEx(LPCWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,DWORD,LPCWSTR,LPCWSTR);
+NET_API_STATUS NetServerGetInfo(LPWSTR,DWORD,PBYTE*);
+NET_API_STATUS NetServerSetInfo(LPWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS NetServerSetInfoCommandLine(WORD,LPWSTR*);
+NET_API_STATUS NetServerDiskEnum(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS NetServerComputerNameAdd(LPWSTR,LPWSTR,LPWSTR);
+NET_API_STATUS NetServerComputerNameDel(LPWSTR,LPWSTR);
+NET_API_STATUS NetServerTransportAdd(LPWSTR,DWORD,PBYTE);
+NET_API_STATUS NetServerTransportAddEx(LPWSTR,DWORD,PBYTE);
+NET_API_STATUS NetServerTransportDel(LPWSTR,DWORD,PBYTE);
+NET_API_STATUS NetServerTransportEnum(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+BOOL SetServiceBits(SERVICE_STATUS_HANDLE,DWORD,BOOL,BOOL);
+
+const SVI1_NUM_ELEMENTS=5;
+const SVI2_NUM_ELEMENTS=40;
+const SVI3_NUM_ELEMENTS=44;
+const SV_MAX_CMD_LEN=PATHLEN;
+const SW_AUTOPROF_LOAD_MASK=1;
+const SW_AUTOPROF_SAVE_MASK=2;
+const SV_MAX_SRV_HEUR_LEN=32;
+const SV_USERS_PER_LICENSE=5;
+const SV_PLATFORM_ID_OS2=400;
+const SV_PLATFORM_ID_NT=500;
+const MAJOR_VERSION_MASK=15;
+const SV_TYPE_WORKSTATION=1;
+const SV_TYPE_SERVER=2;
+const SV_TYPE_SQLSERVER=4;
+const SV_TYPE_DOMAIN_CTRL=8;
+const SV_TYPE_DOMAIN_BAKCTRL=16;
+const SV_TYPE_TIME_SOURCE=32;
+const SV_TYPE_AFP=64;
+const SV_TYPE_NOVELL=128;
+const SV_TYPE_DOMAIN_MEMBER=256;
+const SV_TYPE_PRINTQ_SERVER=512;
+const SV_TYPE_DIALIN_SERVER=1024;
+const SV_TYPE_XENIX_SERVER=2048;
+const SV_TYPE_SERVER_UNIX=SV_TYPE_XENIX_SERVER;
+const SV_TYPE_NT=4096;
+const SV_TYPE_WFW=8192;
+const SV_TYPE_SERVER_MFPN=16384;
+const SV_TYPE_SERVER_NT=32768;
+const SV_TYPE_POTENTIAL_BROWSER=65536;
+const SV_TYPE_BACKUP_BROWSER=0x20000;
+const SV_TYPE_MASTER_BROWSER=0x40000;
+const SV_TYPE_DOMAIN_MASTER=0x80000;
+const SV_TYPE_SERVER_OSF=0x100000;
+const SV_TYPE_SERVER_VMS=0x200000;
+const SV_TYPE_WINDOWS=0x400000;
+const SV_TYPE_ALTERNATE_XPORT=0x20000000;
+const SV_TYPE_LOCAL_LIST_ONLY=0x40000000;
+const SV_TYPE_DOMAIN_ENUM=0x80000000;
+const SV_TYPE_ALL=0xFFFFFFFF;
+const SV_NODISC=(-1);
+const SV_USERSECURITY=1;
+const SV_SHARESECURITY=0;
+const SV_HIDDEN=1;
+const SV_VISIBLE=0;
+const SV_PLATFORM_ID_PARMNUM=101;
+const SV_NAME_PARMNUM=102;
+const SV_VERSION_MAJOR_PARMNUM=103;
+const SV_VERSION_MINOR_PARMNUM=104;
+const SV_TYPE_PARMNUM=105;
+const SV_COMMENT_PARMNUM=5;
+const SV_USERS_PARMNUM=107;
+const SV_DISC_PARMNUM=10;
+const SV_HIDDEN_PARMNUM=16;
+const SV_ANNOUNCE_PARMNUM=17;
+const SV_ANNDELTA_PARMNUM=18;
+const SV_USERPATH_PARMNUM=112;
+const SV_ULIST_MTIME_PARMNUM=401;
+const SV_GLIST_MTIME_PARMNUM=402;
+const SV_ALIST_MTIME_PARMNUM=403;
+const SV_ALERTS_PARMNUM=11;
+const SV_SECURITY_PARMNUM=405;
+const SV_NUMADMIN_PARMNUM=406;
+const SV_LANMASK_PARMNUM=407;
+const SV_GUESTACC_PARMNUM=408;
+const SV_CHDEVQ_PARMNUM=410;
+const SV_CHDEVJOBS_PARMNUM=411;
+const SV_CONNECTIONS_PARMNUM=412;
+const SV_SHARES_PARMNUM=413;
+const SV_OPENFILES_PARMNUM=414;
+const SV_SESSREQS_PARMNUM=417;
+const SV_ACTIVELOCKS_PARMNUM=419;
+const SV_NUMREQBUF_PARMNUM=420;
+const SV_NUMBIGBUF_PARMNUM=422;
+const SV_NUMFILETASKS_PARMNUM=423;
+const SV_ALERTSCHED_PARMNUM=37;
+const SV_ERRORALERT_PARMNUM=38;
+const SV_LOGONALERT_PARMNUM=39;
+const SV_ACCESSALERT_PARMNUM=40;
+const SV_DISKALERT_PARMNUM=41;
+const SV_NETIOALERT_PARMNUM=42;
+const SV_MAXAUDITSZ_PARMNUM=43;
+const SV_SRVHEURISTICS_PARMNUM=431;
+const SV_SESSOPENS_PARMNUM=501;
+const SV_SESSVCS_PARMNUM=502;
+const SV_OPENSEARCH_PARMNUM=503;
+const SV_SIZREQBUF_PARMNUM=504;
+const SV_INITWORKITEMS_PARMNUM=505;
+const SV_MAXWORKITEMS_PARMNUM=506;
+const SV_RAWWORKITEMS_PARMNUM=507;
+const SV_IRPSTACKSIZE_PARMNUM=508;
+const SV_MAXRAWBUFLEN_PARMNUM=509;
+const SV_SESSUSERS_PARMNUM=510;
+const SV_SESSCONNS_PARMNUM=511;
+const SV_MAXNONPAGEDMEMORYUSAGE_PARMNUM=512;
+const SV_MAXPAGEDMEMORYUSAGE_PARMNUM=513;
+const SV_ENABLESOFTCOMPAT_PARMNUM=514;
+const SV_ENABLEFORCEDLOGOFF_PARMNUM=515;
+const SV_TIMESOURCE_PARMNUM=516;
+const SV_ACCEPTDOWNLEVELAPIS_PARMNUM=517;
+const SV_LMANNOUNCE_PARMNUM=518;
+const SV_DOMAIN_PARMNUM=519;
+const SV_MAXCOPYREADLEN_PARMNUM=520;
+const SV_MAXCOPYWRITELEN_PARMNUM=521;
+const SV_MINKEEPSEARCH_PARMNUM=522;
+const SV_MAXKEEPSEARCH_PARMNUM=523;
+const SV_MINKEEPCOMPLSEARCH_PARMNUM=524;
+const SV_MAXKEEPCOMPLSEARCH_PARMNUM=525;
+const SV_THREADCOUNTADD_PARMNUM=526;
+const SV_NUMBLOCKTHREADS_PARMNUM=527;
+const SV_SCAVTIMEOUT_PARMNUM=528;
+const SV_MINRCVQUEUE_PARMNUM=529;
+const SV_MINFREEWORKITEMS_PARMNUM=530;
+const SV_XACTMEMSIZE_PARMNUM=531;
+const SV_THREADPRIORITY_PARMNUM=532;
+const SV_MAXMPXCT_PARMNUM=533;
+const SV_OPLOCKBREAKWAIT_PARMNUM=534;
+const SV_OPLOCKBREAKRESPONSEWAIT_PARMNUM=535;
+const SV_ENABLEOPLOCKS_PARMNUM=536;
+const SV_ENABLEOPLOCKFORCECLOSE_PARMNUM=537;
+const SV_ENABLEFCBOPENS_PARMNUM=538;
+const SV_ENABLERAW_PARMNUM=539;
+const SV_ENABLESHAREDNETDRIVES_PARMNUM=540;
+const SV_MINFREECONNECTIONS_PARMNUM=541;
+const SV_MAXFREECONNECTIONS_PARMNUM=542;
+const SV_INITSESSTABLE_PARMNUM=543;
+const SV_INITCONNTABLE_PARMNUM=544;
+const SV_INITFILETABLE_PARMNUM=545;
+const SV_INITSEARCHTABLE_PARMNUM=546;
+const SV_ALERTSCHEDULE_PARMNUM=547;
+const SV_ERRORTHRESHOLD_PARMNUM=548;
+const SV_NETWORKERRORTHRESHOLD_PARMNUM=549;
+const SV_DISKSPACETHRESHOLD_PARMNUM=550;
+const SV_MAXLINKDELAY_PARMNUM=552;
+const SV_MINLINKTHROUGHPUT_PARMNUM=553;
+const SV_LINKINFOVALIDTIME_PARMNUM=554;
+const SV_SCAVQOSINFOUPDATETIME_PARMNUM=555;
+const SV_MAXWORKITEMIDLETIME_PARMNUM=556;
+const SV_MAXRAWWORKITEMS_PARMNUM=557;
+const SV_PRODUCTTYPE_PARMNUM=560;
+const SV_SERVERSIZE_PARMNUM=561;
+const SV_CONNECTIONLESSAUTODISC_PARMNUM=562;
+const SV_SHARINGVIOLATIONRETRIES_PARMNUM=563;
+const SV_SHARINGVIOLATIONDELAY_PARMNUM=564;
+const SV_MAXGLOBALOPENSEARCH_PARMNUM=565;
+const SV_REMOVEDUPLICATESEARCHES_PARMNUM=566;
+const SV_LOCKVIOLATIONRETRIES_PARMNUM=567;
+const SV_LOCKVIOLATIONOFFSET_PARMNUM=568;
+const SV_LOCKVIOLATIONDELAY_PARMNUM=569;
+const SV_MDLREADSWITCHOVER_PARMNUM=570;
+const SV_CACHEDOPENLIMIT_PARMNUM=571;
+const SV_CRITICALTHREADS_PARMNUM=572;
+const SV_RESTRICTNULLSESSACCESS_PARMNUM=573;
+const SV_ENABLEWFW311DIRECTIPX_PARMNUM=574;
+const SV_OTHERQUEUEAFFINITY_PARMNUM=575;
+const SV_QUEUESAMPLESECS_PARMNUM=576;
+const SV_BALANCECOUNT_PARMNUM=577;
+const SV_PREFERREDAFFINITY_PARMNUM=578;
+const SV_MAXFREERFCBS_PARMNUM=579;
+const SV_MAXFREEMFCBS_PARMNUM=580;
+const SV_MAXFREELFCBS_PARMNUM=581;
+const SV_MAXFREEPAGEDPOOLCHUNKS_PARMNUM=582;
+const SV_MINPAGEDPOOLCHUNKSIZE_PARMNUM=583;
+const SV_MAXPAGEDPOOLCHUNKSIZE_PARMNUM=584;
+const SV_SENDSFROMPREFERREDPROCESSOR_PARMNUM=585;
+const SV_MAXTHREADSPERQUEUE_PARMNUM=586;
+const SV_COMMENT_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_COMMENT_PARMNUM);
+const SV_USERS_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_USERS_PARMNUM);
+const SV_DISC_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_DISC_PARMNUM);
+const SV_HIDDEN_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_HIDDEN_PARMNUM);
+const SV_ANNOUNCE_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_ANNOUNCE_PARMNUM);
+const SV_ANNDELTA_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_ANNDELTA_PARMNUM);
+const SV_SESSOPENS_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_SESSOPENS_PARMNUM);
+const SV_SESSVCS_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_SESSVCS_PARMNUM);
+const SV_OPENSEARCH_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_OPENSEARCH_PARMNUM);
+const SV_MAXWORKITEMS_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MAXWORKITEMS_PARMNUM);
+const SV_MAXRAWBUFLEN_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MAXRAWBUFLEN_PARMNUM);
+const SV_SESSUSERS_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_SESSUSERS_PARMNUM);
+const SV_SESSCONNS_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_SESSCONNS_PARMNUM);
+const SV_MAXNONPAGEDMEMORYUSAGE_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MAXNONPAGEDMEMORYUSAGE_PARMNUM);
+const SV_MAXPAGEDMEMORYUSAGE_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MAXPAGEDMEMORYUSAGE_PARMNUM);
+const SV_ENABLESOFTCOMPAT_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_ENABLESOFTCOMPAT_PARMNUM);
+const SV_ENABLEFORCEDLOGOFF_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_ENABLEFORCEDLOGOFF_PARMNUM);
+const SV_TIMESOURCE_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_TIMESOURCE_PARMNUM);
+const SV_LMANNOUNCE_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_LMANNOUNCE_PARMNUM);
+const SV_MAXCOPYREADLEN_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MAXCOPYREADLEN_PARMNUM);
+const SV_MAXCOPYWRITELEN_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MAXCOPYWRITELEN_PARMNUM);
+const SV_MINKEEPSEARCH_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MINKEEPSEARCH_PARMNUM);
+const SV_MAXKEEPSEARCH_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MAXKEEPSEARCH_PARMNUM);
+const SV_MINKEEPCOMPLSEARCH_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MINKEEPCOMPLSEARCH_PARMNUM);
+const SV_MAXKEEPCOMPLSEARCH_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MAXKEEPCOMPLSEARCH_PARMNUM);
+const SV_SCAVTIMEOUT_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_SCAVTIMEOUT_PARMNUM);
+const SV_MINRCVQUEUE_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MINRCVQUEUE_PARMNUM);
+const SV_MINFREEWORKITEMS_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MINFREEWORKITEMS_PARMNUM);
+const SV_MAXMPXCT_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MAXMPXCT_PARMNUM);
+const SV_OPLOCKBREAKWAIT_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_OPLOCKBREAKWAIT_PARMNUM);
+const SV_OPLOCKBREAKRESPONSEWAIT_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_OPLOCKBREAKRESPONSEWAIT_PARMNUM);
+const SV_ENABLEOPLOCKS_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_ENABLEOPLOCKS_PARMNUM);
+const SV_ENABLEOPLOCKFORCECLOSE_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_ENABLEOPLOCKFORCECLOSE_PARMNUM);
+const SV_ENABLEFCBOPENS_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_ENABLEFCBOPENS_PARMNUM);
+const SV_ENABLERAW_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_ENABLERAW_PARMNUM);
+const SV_ENABLESHAREDNETDRIVES_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_ENABLESHAREDNETDRIVES_PARMNUM);
+const SV_MINFREECONNECTIONS_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MINFREECONNECTIONS_PARMNUM);
+const SV_MAXFREECONNECTIONS_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MAXFREECONNECTIONS_PARMNUM);
+const SV_INITSESSTABLE_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_INITSESSTABLE_PARMNUM);
+const SV_INITCONNTABLE_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_INITCONNTABLE_PARMNUM);
+const SV_INITFILETABLE_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_INITFILETABLE_PARMNUM);
+const SV_INITSEARCHTABLE_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_INITSEARCHTABLE_PARMNUM);
+const SV_ALERTSCHEDULE_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_ALERTSCHEDULE_PARMNUM);
+const SV_ERRORTHRESHOLD_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_ERRORTHRESHOLD_PARMNUM);
+const SV_NETWORKERRORTHRESHOLD_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_NETWORKERRORTHRESHOLD_PARMNUM);
+const SV_DISKSPACETHRESHOLD_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_DISKSPACETHRESHOLD_PARMNUM);
+const SV_MAXLINKDELAY_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MAXLINKDELAY_PARMNUM);
+const SV_MINLINKTHROUGHPUT_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MINLINKTHROUGHPUT_PARMNUM);
+const SV_LINKINFOVALIDTIME_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_LINKINFOVALIDTIME_PARMNUM);
+const SV_SCAVQOSINFOUPDATETIME_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_SCAVQOSINFOUPDATETIME_PARMNUM);
+const SV_MAXWORKITEMIDLETIME_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MAXWORKITEMIDLETIME_PARMNUM);
+const SV_MAXRAWWORKITEMS_INFOLOEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MAXRAWWORKITEMS_PARMNUM);
+const SV_PRODUCTTYPE_INFOLOEVEL=(PARMNUM_BASE_INFOLEVEL+SV_PRODUCTTYPE_PARMNUM);
+const SV_SERVERSIZE_INFOLOEVEL=(PARMNUM_BASE_INFOLEVEL+SV_SERVERSIZE_PARMNUM);
+const SV_CONNECTIONLESSAUTODISC_INFOLOEVEL=(PARMNUM_BASE_INFOLEVEL+SV_CONNECTIONLESSAUTODISC_PARMNUM);
+const SV_SHARINGVIOLATIONRETRIES_INFOLOEVEL=(PARMNUM_BASE_INFOLEVEL+SV_SHARINGVIOLATIONRETRIES_PARMNUM);
+const SV_SHARINGVIOLATIONDELAY_INFOLOEVEL=(PARMNUM_BASE_INFOLEVEL+SV_SHARINGVIOLATIONDELAY_PARMNUM);
+const SV_MAXGLOBALOPENSEARCH_INFOLOEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MAXGLOBALOPENSEARCH_PARMNUM);
+const SV_REMOVEDUPLICATESEARCHES_INFOLOEVEL=(PARMNUM_BASE_INFOLEVEL+SV_REMOVEDUPLICATESEARCHES_PARMNUM);
+const SV_LOCKVIOLATIONRETRIES_INFOLOEVEL=(PARMNUM_BASE_INFOLEVEL+SV_LOCKVIOLATIONRETRIES_PARMNUM);
+const SV_LOCKVIOLATIONOFFSET_INFOLOEVEL=(PARMNUM_BASE_INFOLEVEL+SV_LOCKVIOLATIONOFFSET_PARMNUM);
+const SV_LOCKVIOLATIONDELAY_INFOLOEVEL=(PARMNUM_BASE_INFOLEVEL+SV_LOCKVIOLATIONDELAY_PARMNUM);
+const SV_MDLREADSWITCHOVER_INFOLOEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MDLREADSWITCHOVER_PARMNUM);
+const SV_CACHEDOPENLIMIT_INFOLOEVEL=(PARMNUM_BASE_INFOLEVEL+SV_CACHEDOPENLIMIT_PARMNUM);
+const SV_CRITICALTHREADS_INFOLOEVEL=(PARMNUM_BASE_INFOLEVEL+SV_CRITICALTHREADS_PARMNUM);
+const SV_RESTRICTNULLSESSACCESS_INFOLOEVEL=(PARMNUM_BASE_INFOLEVEL+SV_RESTRICTNULLSESSACCESS_PARMNUM);
+const SV_ENABLEWFW311DIRECTIPX_INFOLOEVEL=(PARMNUM_BASE_INFOLEVEL+SV_ENABLEWFW311DIRECTIPX_PARMNUM);
+const SV_OTHERQUEUEAFFINITY_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_OTHERQUEUEAFFINITY_PARMNUM);
+const SV_QUEUESAMPLESECS_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_QUEUESAMPLESECS_PARMNUM);
+const SV_BALANCECOUNT_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_BALANCECOUNT_PARMNUM);
+const SV_PREFERREDAFFINITY_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_PREFERREDAFFINITY_PARMNUM);
+const SV_MAXFREERFCBS_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MAXFREERFCBS_PARMNUM);
+const SV_MAXFREEMFCBS_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MAXFREEMFCBS_PARMNUM);
+const SV_MAXFREELFCBS_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MAXFREELFCBS_PARMNUM);
+const SV_MAXFREEPAGEDPOOLCHUNKS_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MAXFREEPAGEDPOOLCHUNKS_PARMNUM);
+const SV_MINPAGEDPOOLCHUNKSIZE_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MINPAGEDPOOLCHUNKSIZE_PARMNUM);
+const SV_MAXPAGEDPOOLCHUNKSIZE_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MAXPAGEDPOOLCHUNKSIZE_PARMNUM);
+const SV_SENDSFROMPREFERREDPROCESSOR_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_SENDSFROMPREFERREDPROCESSOR_PARMNUM);
+const SV_MAXTHREADSPERQUEUE_INFOLEVEL=(PARMNUM_BASE_INFOLEVEL+SV_MAXTHREADSPERQUEUE_PARMNUM);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmshare.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,204 @@
+/***********************************************************************\
+*                               lmshare.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lmshare;
+
+import win32.lmcons;
+private import win32.w32api, win32.windef;
+
+static if (_WIN32_WINNT_ONLY) {
+	pragma(lib, "netapi.lib");
+}
+/* else {
+// only for WinME, 98, 95.
+	pragma(lib, "svrapi.lib")
+}
+*/
+
+const SHARE_NETNAME_PARMNUM      = 1;
+const SHARE_TYPE_PARMNUM         = 3;
+const SHARE_REMARK_PARMNUM       = 4;
+const SHARE_PERMISSIONS_PARMNUM  = 5;
+const SHARE_MAX_USES_PARMNUM     = 6;
+const SHARE_CURRENT_USES_PARMNUM = 7;
+const SHARE_PATH_PARMNUM         = 8;
+const SHARE_PASSWD_PARMNUM       = 9;
+const SHARE_FILE_SD_PARMNUM      = 501;
+const SHARE_REMARK_INFOLEVEL   = PARMNUM_BASE_INFOLEVEL + SHARE_REMARK_PARMNUM;
+const SHARE_MAX_USES_INFOLEVEL = PARMNUM_BASE_INFOLEVEL + SHARE_MAX_USES_PARMNUM;
+const SHARE_FILE_SD_INFOLEVEL  = PARMNUM_BASE_INFOLEVEL + SHARE_FILE_SD_PARMNUM;
+
+const SHI1_NUM_ELEMENTS = 4;
+const SHI2_NUM_ELEMENTS = 10;
+
+const STYPE_DISKTREE = 0;
+const STYPE_PRINTQ   = 1;
+const STYPE_DEVICE   = 2;
+const STYPE_IPC      = 3;
+const STYPE_DFS      = 100;
+const STYPE_SPECIAL  = 0x80000000;
+
+const DWORD SHI_USES_UNLIMITED = -1;
+
+const SESS_GUEST = 1;
+const SESS_NOENCRYPTION = 2;
+const SESI1_NUM_ELEMENTS = 8;
+const SESI2_NUM_ELEMENTS = 9;
+
+const PERM_FILE_READ   = 1;
+const PERM_FILE_WRITE  = 2;
+const PERM_FILE_CREATE = 4;
+
+struct FILE_INFO_2 {
+	DWORD fi2_id;
+}
+alias FILE_INFO_2* PFILE_INFO_2, LPFILE_INFO_2;
+
+struct FILE_INFO_3 {
+	DWORD fi3_id;
+	DWORD fi3_permissions;
+	DWORD fi3_num_locks;
+	LPTSTR fi3_pathname;
+	LPTSTR fi3_username;
+}
+alias FILE_INFO_3* PFILE_INFO_3, LPFILE_INFO_3;
+
+struct SHARE_INFO_0 {
+	LPTSTR shi0_netname;
+}
+alias SHARE_INFO_0* PSHARE_INFO_0, LPSHARE_INFO_0;
+
+struct SHARE_INFO_1 {
+	LPTSTR shi1_netname;
+	DWORD shi1_type;
+	LPTSTR shi1_remark;
+}
+alias SHARE_INFO_1* PSHARE_INFO_1, LPSHARE_INFO_1;
+
+struct SHARE_INFO_2 {
+	LPTSTR shi2_netname;
+	DWORD shi2_type;
+	LPTSTR shi2_remark;
+	DWORD shi2_permissions;
+	DWORD shi2_max_uses;
+	DWORD shi2_current_uses;
+	LPTSTR shi2_path;
+	LPTSTR shi2_passwd;
+}
+alias SHARE_INFO_2* PSHARE_INFO_2, LPSHARE_INFO_2;
+
+struct SHARE_INFO_502 {
+	LPTSTR shi502_netname;
+	DWORD shi502_type;
+	LPTSTR shi502_remark;
+	DWORD shi502_permissions;
+	DWORD shi502_max_uses;
+	DWORD shi502_current_uses;
+	LPTSTR shi502_path;
+	LPTSTR shi502_passwd;
+	DWORD shi502_reserved;
+	PSECURITY_DESCRIPTOR shi502_security_descriptor;
+}
+alias SHARE_INFO_502* PSHARE_INFO_502, LPSHARE_INFO_502;
+
+struct SHARE_INFO_1004 {
+	LPTSTR shi1004_remark;
+}
+alias SHARE_INFO_1004* PSHARE_INFO_1004, LPSHARE_INFO_1004;
+
+struct SHARE_INFO_1006 {
+	DWORD shi1006_max_uses;
+}
+alias SHARE_INFO_1006* PSHARE_INFO_1006, LPSHARE_INFO_1006;
+
+struct SHARE_INFO_1501 {
+	DWORD shi1501_reserved;
+	PSECURITY_DESCRIPTOR shi1501_security_descriptor;
+}
+alias SHARE_INFO_1501* PSHARE_INFO_1501, LPSHARE_INFO_1501;
+
+struct SESSION_INFO_0 {
+	LPWSTR sesi0_cname;
+}
+alias SESSION_INFO_0* PSESSION_INFO_0, LPSESSION_INFO_0;
+
+struct SESSION_INFO_1 {
+	LPTSTR sesi1_cname;
+	LPTSTR sesi1_username;
+	DWORD sesi1_num_opens;
+	DWORD sesi1_time;
+	DWORD sesi1_idle_time;
+	DWORD sesi1_user_flags;
+}
+alias SESSION_INFO_1* PSESSION_INFO_1, LPSESSION_INFO_1;
+
+struct SESSION_INFO_2 {
+	LPTSTR sesi2_cname;
+	LPTSTR sesi2_username;
+	DWORD sesi2_num_opens;
+	DWORD sesi2_time;
+	DWORD sesi2_idle_time;
+	DWORD sesi2_user_flags;
+	LPWSTR sesi2_cltype_name;
+}
+alias SESSION_INFO_2* PSESSION_INFO_2, LPSESSION_INFO_2;
+
+struct SESSION_INFO_10 {
+	LPWSTR sesi10_cname;
+	LPWSTR sesi10_username;
+	DWORD sesi10_time;
+	DWORD sesi10_idle_time;
+}
+alias SESSION_INFO_10* PSESSION_INFO_10, LPSESSION_INFO_10;
+
+struct SESSION_INFO_502 {
+	LPWSTR sesi502_cname;
+	LPWSTR sesi502_username;
+	DWORD sesi502_num_opens;
+	DWORD sesi502_time;
+	DWORD sesi502_idle_time;
+	DWORD sesi502_user_flags;
+	LPWSTR sesi502_cltype_name;
+	LPWSTR sesi502_transport;
+}
+alias SESSION_INFO_502* PSESSION_INFO_502, LPSESSION_INFO_502;
+
+struct CONNECTION_INFO_0 {
+	DWORD coni0_id;
+}
+alias CONNECTION_INFO_0* PCONNECTION_INFO_0, LPCONNECTION_INFO_0;
+
+struct CONNECTION_INFO_1 {
+	DWORD coni1_id;
+	DWORD coni1_type;
+	DWORD coni1_num_opens;
+	DWORD coni1_num_users;
+	DWORD coni1_time;
+	LPWSTR coni1_username;
+	LPWSTR coni1_netname;
+}
+alias CONNECTION_INFO_1* PCONNECTION_INFO_1, LPCONNECTION_INFO_1;
+
+extern (Windows) {
+NET_API_STATUS NetShareAdd(LPWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS NetShareEnum(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS NetShareEnumSticky(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD resume_handle);
+NET_API_STATUS NetShareGetInfo(LPWSTR,LPWSTR,DWORD,PBYTE*);
+NET_API_STATUS NetShareSetInfo(LPWSTR,LPWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS NetShareDel(LPWSTR,LPWSTR,DWORD);
+NET_API_STATUS NetShareDelSticky(LPWSTR,LPWSTR,DWORD);
+NET_API_STATUS NetShareCheck(LPWSTR,LPWSTR,PDWORD);
+NET_API_STATUS NetSessionEnum(LPWSTR,LPWSTR,LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS NetSessionDel(LPWSTR,LPWSTR,LPWSTR);
+NET_API_STATUS NetSessionGetInfo(LPWSTR,LPWSTR,LPWSTR,DWORD,PBYTE*);
+NET_API_STATUS NetConnectionEnum(LPWSTR,LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS NetFileClose(LPWSTR,DWORD);
+NET_API_STATUS NetFileEnum(LPWSTR,LPWSTR,LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS NetFileGetInfo(LPWSTR,DWORD,DWORD,PBYTE*);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmsname.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,65 @@
+/***********************************************************************\
+*                               lmsname.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lmsname;
+
+private import win32.windef;
+
+const TCHAR[]
+	SERVICE_WORKSTATION      = "LanmanWorkstation",
+	SERVICE_LM20_WORKSTATION = "WORKSTATION",
+	WORKSTATION_DISPLAY_NAME = "Workstation",
+	SERVICE_SERVER           = "LanmanServer",
+	SERVICE_LM20_SERVER      = "SERVER",
+	SERVER_DISPLAY_NAME      = "Server",
+	SERVICE_BROWSER          = "BROWSER",
+	SERVICE_LM20_BROWSER     = SERVICE_BROWSER,
+	SERVICE_MESSENGER        = "MESSENGER",
+	SERVICE_LM20_MESSENGER   = SERVICE_MESSENGER,
+	SERVICE_NETRUN           = "NETRUN",
+	SERVICE_LM20_NETRUN      = SERVICE_NETRUN,
+	SERVICE_SPOOLER          = "SPOOLER",
+	SERVICE_LM20_SPOOLER     = SERVICE_SPOOLER,
+	SERVICE_ALERTER          = "ALERTER",
+	SERVICE_LM20_ALERTER     = SERVICE_ALERTER,
+	SERVICE_NETLOGON         = "NETLOGON",
+	SERVICE_LM20_NETLOGON    = SERVICE_NETLOGON,
+	SERVICE_NETPOPUP         = "NETPOPUP",
+	SERVICE_LM20_NETPOPUP    = SERVICE_NETPOPUP,
+	SERVICE_SQLSERVER        = "SQLSERVER",
+	SERVICE_LM20_SQLSERVER   = SERVICE_SQLSERVER,
+	SERVICE_REPL             = "REPLICATOR",
+	SERVICE_LM20_REPL        = SERVICE_REPL,
+	SERVICE_RIPL             = "REMOTEBOOT",
+	SERVICE_LM20_RIPL        = SERVICE_RIPL,
+	SERVICE_TIMESOURCE       = "TIMESOURCE",
+	SERVICE_LM20_TIMESOURCE  = SERVICE_TIMESOURCE,
+	SERVICE_AFP              = "AFP",
+	SERVICE_LM20_AFP         = SERVICE_AFP,
+	SERVICE_UPS              = "UPS",
+	SERVICE_LM20_UPS         = SERVICE_UPS,
+	SERVICE_XACTSRV          = "XACTSRV",
+	SERVICE_LM20_XACTSRV     = SERVICE_XACTSRV,
+	SERVICE_TCPIP            = "TCPIP",
+	SERVICE_LM20_TCPIP       = SERVICE_TCPIP,
+	SERVICE_NBT              = "NBT",
+	SERVICE_LM20_NBT         = SERVICE_NBT,
+	SERVICE_LMHOSTS          = "LMHOSTS",
+	SERVICE_LM20_LMHOSTS     = SERVICE_LMHOSTS,
+	SERVICE_TELNET           = "Telnet",
+	SERVICE_LM20_TELNET      = SERVICE_TELNET,
+	SERVICE_SCHEDULE         = "Schedule",
+	SERVICE_LM20_SCHEDULE    = SERVICE_SCHEDULE,
+	SERVICE_NTLMSSP          = "NtLmSsp",
+	SERVICE_DHCP             = "DHCP",
+	SERVICE_LM20_DHCP        = SERVICE_DHCP,
+	SERVICE_NWSAP            = "NwSapAgent",
+	SERVICE_LM20_NWSAP       = SERVICE_NWSAP,
+	NWSAP_DISPLAY_NAME       = "NW Sap Agent",
+	SERVICE_NWCS             = "NWCWorkstation";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmstats.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,121 @@
+/***********************************************************************\
+*                               lmstats.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lmstats;
+pragma(lib, "netapi32.lib");
+
+private import win32.lmcons, win32.windef;
+
+const ULONG
+	STATSOPT_CLR   = 1,
+	STATS_NO_VALUE = -1,
+	STATS_OVERFLOW = -2;
+
+struct STAT_SERVER_0{
+	DWORD sts0_start;
+	DWORD sts0_fopens;
+	DWORD sts0_devopens;
+	DWORD sts0_jobsqueued;
+	DWORD sts0_sopens;
+	DWORD sts0_stimedout;
+	DWORD sts0_serrorout;
+	DWORD sts0_pwerrors;
+	DWORD sts0_permerrors;
+	DWORD sts0_syserrors;
+	DWORD sts0_bytessent_low;
+	DWORD sts0_bytessent_high;
+	DWORD sts0_bytesrcvd_low;
+	DWORD sts0_bytesrcvd_high;
+	DWORD sts0_avresponse;
+	DWORD sts0_reqbufneed;
+	DWORD sts0_bigbufneed;
+}
+alias STAT_SERVER_0* PSTAT_SERVER_0, LPSTAT_SERVER_0;
+
+// #ifdef LM20_WORKSTATION_STATISTICS
+// typedef struct _STAT_WORKSTATION_0 {
+// 	DWORD stw0_start;
+// 	DWORD stw0_numNCB_r;
+// 	DWORD stw0_numNCB_s;
+// 	DWORD stw0_numNCB_a;
+// 	DWORD stw0_fiNCB_r;
+// 	DWORD stw0_fiNCB_s;
+// 	DWORD stw0_fiNCB_a;
+// 	DWORD stw0_fcNCB_r;
+// 	DWORD stw0_fcNCB_s;
+// 	DWORD stw0_fcNCB_a;
+// 	DWORD stw0_sesstart;
+// 	DWORD stw0_sessfailcon;
+// 	DWORD stw0_sessbroke;
+// 	DWORD stw0_uses;
+// 	DWORD stw0_usefail;
+// 	DWORD stw0_autorec;
+// 	DWORD stw0_bytessent_r_lo;
+// 	DWORD stw0_bytessent_r_hi;
+// 	DWORD stw0_bytesrcvd_r_lo;
+// 	DWORD stw0_bytesrcvd_r_hi;
+// 	DWORD stw0_bytessent_s_lo;
+// 	DWORD stw0_bytessent_s_hi;
+// 	DWORD stw0_bytesrcvd_s_lo;
+// 	DWORD stw0_bytesrcvd_s_hi;
+// 	DWORD stw0_bytessent_a_lo;
+// 	DWORD stw0_bytessent_a_hi;
+// 	DWORD stw0_bytesrcvd_a_lo;
+// 	DWORD stw0_bytesrcvd_a_hi;
+// 	DWORD stw0_reqbufneed;
+// 	DWORD stw0_bigbufneed;
+// } STAT_WORKSTATION_0,*PSTAT_WORKSTATION_0,*LPSTAT_WORKSTATION_0;
+// #else
+
+struct STAT_WORKSTATION_0{
+	LARGE_INTEGER StatisticsStartTime;
+	LARGE_INTEGER BytesReceived;
+	LARGE_INTEGER SmbsReceived;
+	LARGE_INTEGER PagingReadBytesRequested;
+	LARGE_INTEGER NonPagingReadBytesRequested;
+	LARGE_INTEGER CacheReadBytesRequested;
+	LARGE_INTEGER NetworkReadBytesRequested;
+	LARGE_INTEGER BytesTransmitted;
+	LARGE_INTEGER SmbsTransmitted;
+	LARGE_INTEGER PagingWriteBytesRequested;
+	LARGE_INTEGER NonPagingWriteBytesRequested;
+	LARGE_INTEGER CacheWriteBytesRequested;
+	LARGE_INTEGER NetworkWriteBytesRequested;
+	DWORD InitiallyFailedOperations;
+	DWORD FailedCompletionOperations;
+	DWORD ReadOperations;
+	DWORD RandomReadOperations;
+	DWORD ReadSmbs;
+	DWORD LargeReadSmbs;
+	DWORD SmallReadSmbs;
+	DWORD WriteOperations;
+	DWORD RandomWriteOperations;
+	DWORD WriteSmbs;
+	DWORD LargeWriteSmbs;
+	DWORD SmallWriteSmbs;
+	DWORD RawReadsDenied;
+	DWORD RawWritesDenied;
+	DWORD NetworkErrors;
+	DWORD Sessions;
+	DWORD FailedSessions;
+	DWORD Reconnects;
+	DWORD CoreConnects;
+	DWORD Lanman20Connects;
+	DWORD Lanman21Connects;
+	DWORD LanmanNtConnects;
+	DWORD ServerDisconnects;
+	DWORD HungSessions;
+	DWORD UseCount;
+	DWORD FailedUseCount;
+	DWORD CurrentCommands;
+}
+alias STAT_WORKSTATION_0* PSTAT_WORKSTATION_0, LPSTAT_WORKSTATION_0;
+
+extern (Windows):
+NET_API_STATUS NetStatisticsGet(LPWSTR,LPWSTR,DWORD,DWORD,PBYTE*);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmsvc.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,156 @@
+/***********************************************************************\
+*                                lmsvc.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lmsvc;
+
+// FIXME: Is this file deprecated? All of the functions are only for Win16.
+/**
+  Changes relative to MinGW:
+  lmsname is not imported publicly (instead, win32.lm imports it directly).
+*/
+// TODO: 5 macros
+
+private import win32.lmcons, win32.lmsname, win32.windef;
+
+const TCHAR[] SERVICE_DOS_ENCRYPTION = "ENCRYPT";
+
+const SERVICE_UNINSTALLED=0;
+const SERVICE_INSTALL_PENDING=1;
+const SERVICE_UNINSTALL_PENDING=2;
+const SERVICE_INSTALLED=3;
+const SERVICE_INSTALL_STATE=3;
+const SERVICE_PAUSE_STATE=18;
+const LM20_SERVICE_ACTIVE=0;
+const LM20_SERVICE_CONTINUE_PENDING=4;
+const LM20_SERVICE_PAUSE_PENDING=8;
+const LM20_SERVICE_PAUSED=18;
+const SERVICE_NOT_UNINSTALLABLE=0;
+const SERVICE_UNINSTALLABLE=16;
+const SERVICE_NOT_PAUSABLE=0;
+const SERVICE_PAUSABLE=32;
+const SERVICE_REDIR_PAUSED=0x700;
+const SERVICE_REDIR_DISK_PAUSED=256;
+const SERVICE_REDIR_PRINT_PAUSED=512;
+const SERVICE_REDIR_COMM_PAUSED=1024;
+const SERVICE_CTRL_INTERROGATE=0;
+const SERVICE_CTRL_PAUSE=1;
+const SERVICE_CTRL_CONTINUE=2;
+const SERVICE_CTRL_UNINSTALL=3;
+const SERVICE_CTRL_REDIR_DISK=1;
+const SERVICE_CTRL_REDIR_PRINT=2;
+const SERVICE_CTRL_REDIR_COMM=4;
+const SERVICE_IP_NO_HINT=0;
+const SERVICE_CCP_NO_HINT=0;
+const SERVICE_IP_QUERY_HINT=0x10000;
+const SERVICE_CCP_QUERY_HINT=0x10000;
+const SERVICE_IP_CHKPT_NUM=255;
+const SERVICE_CCP_CHKPT_NUM=255;
+const SERVICE_IP_WAIT_TIME=0xFF00;
+const SERVICE_CCP_WAIT_TIME=0xFF00;
+const SERVICE_IP_WAITTIME_SHIFT=8;
+const SERVICE_NTIP_WAITTIME_SHIFT=12;
+const UPPER_HINT_MASK=0xFF00;
+const LOWER_HINT_MASK=255;
+const UPPER_GET_HINT_MASK=0xFF00000;
+const LOWER_GET_HINT_MASK=0xFF00;
+const SERVICE_NT_MAXTIME=0xFFFF;
+const SERVICE_RESRV_MASK=0x1FFFF;
+const SERVICE_MAXTIME=255;
+const SERVICE_BASE=3050;
+const SERVICE_UIC_NORMAL=0;
+
+const SERVICE_UIC_BADPARMVAL = SERVICE_BASE+1;
+const SERVICE_UIC_MISSPARM = SERVICE_BASE+2;
+const SERVICE_UIC_UNKPARM = SERVICE_BASE+3;
+const SERVICE_UIC_RESOURCE = SERVICE_BASE+4;
+const SERVICE_UIC_CONFIG = SERVICE_BASE+5;
+const SERVICE_UIC_SYSTEM = SERVICE_BASE+6;
+const SERVICE_UIC_INTERNAL = SERVICE_BASE+7;
+const SERVICE_UIC_AMBIGPARM = SERVICE_BASE+8;
+const SERVICE_UIC_DUPPARM = SERVICE_BASE+9;
+const SERVICE_UIC_KILL = SERVICE_BASE+10;
+const SERVICE_UIC_EXEC = SERVICE_BASE+11;
+const SERVICE_UIC_SUBSERV = SERVICE_BASE+12;
+const SERVICE_UIC_CONFLPARM = SERVICE_BASE+13;
+const SERVICE_UIC_FILE = SERVICE_BASE+14;
+const SERVICE_UIC_M_NULL=0;
+const SERVICE_UIC_M_MEMORY = SERVICE_BASE+20;
+const SERVICE_UIC_M_DISK = SERVICE_BASE+21;
+const SERVICE_UIC_M_THREADS = SERVICE_BASE+22;
+const SERVICE_UIC_M_PROCESSES = SERVICE_BASE+23;
+const SERVICE_UIC_M_SECURITY = SERVICE_BASE+24;
+const SERVICE_UIC_M_LANROOT = SERVICE_BASE+25;
+const SERVICE_UIC_M_REDIR = SERVICE_BASE+26;
+const SERVICE_UIC_M_SERVER = SERVICE_BASE+27;
+const SERVICE_UIC_M_SEC_FILE_ERR = SERVICE_BASE+28;
+const SERVICE_UIC_M_FILES = SERVICE_BASE+29;
+const SERVICE_UIC_M_LOGS = SERVICE_BASE+30;
+const SERVICE_UIC_M_LANGROUP = SERVICE_BASE+31;
+const SERVICE_UIC_M_MSGNAME = SERVICE_BASE+32;
+const SERVICE_UIC_M_ANNOUNCE = SERVICE_BASE+33;
+const SERVICE_UIC_M_UAS = SERVICE_BASE+34;
+const SERVICE_UIC_M_SERVER_SEC_ERR = SERVICE_BASE+35;
+const SERVICE_UIC_M_WKSTA = SERVICE_BASE+37;
+const SERVICE_UIC_M_ERRLOG = SERVICE_BASE+38;
+const SERVICE_UIC_M_FILE_UW = SERVICE_BASE+39;
+const SERVICE_UIC_M_ADDPAK = SERVICE_BASE+40;
+const SERVICE_UIC_M_LAZY = SERVICE_BASE+41;
+const SERVICE_UIC_M_UAS_MACHINE_ACCT = SERVICE_BASE+42;
+const SERVICE_UIC_M_UAS_SERVERS_NMEMB = SERVICE_BASE+43;
+const SERVICE_UIC_M_UAS_SERVERS_NOGRP = SERVICE_BASE+44;
+const SERVICE_UIC_M_UAS_INVALID_ROLE = SERVICE_BASE+45;
+const SERVICE_UIC_M_NETLOGON_NO_DC = SERVICE_BASE+46;
+const SERVICE_UIC_M_NETLOGON_DC_CFLCT = SERVICE_BASE+47;
+const SERVICE_UIC_M_NETLOGON_AUTH = SERVICE_BASE+48;
+const SERVICE_UIC_M_UAS_PROLOG = SERVICE_BASE+49;
+const SERVICE2_BASE=5600;
+const SERVICE_UIC_M_NETLOGON_MPATH = SERVICE2_BASE+0;
+const SERVICE_UIC_M_LSA_MACHINE_ACCT = SERVICE2_BASE+1;
+const SERVICE_UIC_M_DATABASE_ERROR = SERVICE2_BASE+2;
+
+struct SERVICE_INFO_0 {
+	LPWSTR svci0_name;
+}
+alias SERVICE_INFO_0* PSERVICE_INFO_0, LPSERVICE_INFO_0;
+
+struct SERVICE_INFO_1 {
+	LPWSTR svci1_name;
+	DWORD svci1_status;
+	DWORD svci1_code;
+	DWORD svci1_pid;
+}
+alias SERVICE_INFO_1* PSERVICE_INFO_1, LPSERVICE_INFO_1;
+
+struct SERVICE_INFO_2 {
+	LPWSTR svci2_name;
+	DWORD svci2_status;
+	DWORD svci2_code;
+	DWORD svci2_pid;
+	LPWSTR svci2_text;
+	DWORD svci2_specific_error;
+	LPWSTR svci2_display_name;
+}
+alias SERVICE_INFO_2* PSERVICE_INFO_2, LPSERVICE_INFO_2;
+
+extern (Windows) {
+	deprecated {
+		NET_API_STATUS NetServiceControl(LPCWSTR, LPCWSTR, DWORD, DWORD,
+		  PBYTE*);
+		NET_API_STATUS NetServiceEnum(LPCWSTR, DWORD, PBYTE*, DWORD, PDWORD,
+		  PDWORD, PDWORD);
+		NET_API_STATUS NetServiceGetInfo(LPCWSTR, LPCWSTR, DWORD, PBYTE*);
+		NET_API_STATUS NetServiceInstall(LPCWSTR, LPCWSTR, DWORD, LPCWSTR*,
+		  PBYTE*);
+	}
+}
+//MACRO #define SERVICE_IP_CODE(t, n) ((long)SERVICE_IP_QUERY_HINT|(long)(n|(t<<SERVICE_IP_WAITTIME_SHIFT)))
+//MACRO #define SERVICE_CCP_CODE(t, n) ((long)SERVICE_CCP_QUERY_HINT|(long)(n|(t<<SERVICE_IP_WAITTIME_SHIFT)))
+//MACRO #define SERVICE_UIC_CODE(c, m) ((long)(((long)c<<16)|(long)(USHORT)m))
+//MACRO #define SERVICE_NT_CCP_CODE(t, n) (((long)SERVICE_CCP_QUERY_HINT)|((long)(n))|(((t)&LOWER_HINT_MASK)<<SERVICE_IP_WAITTIME_SHIFT)|(((t)&UPPER_HINT_MASK)<<SERVICE_NTIP_WAITTIME_SHIFT))
+//MACRO #define SERVICE_NT_WAIT_GET(c) ((((c)&UPPER_GET_HINT_MASK)>>SERVICE_NTIP_WAITTIME_SHIFT)|(((c)&LOWER_GET_HINT_MASK)>>SERVICE_IP_WAITTIME_SHIFT))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmuse.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,80 @@
+/***********************************************************************\
+*                                lmuse.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lmuse;
+pragma(lib, "netapi32.lib");
+
+import win32.lmuseflg;
+private import win32.lmcons, win32.windef;
+
+enum {
+	USE_LOCAL_PARMNUM = 1,
+	USE_REMOTE_PARMNUM,
+	USE_PASSWORD_PARMNUM,
+	USE_ASGTYPE_PARMNUM,
+	USE_USERNAME_PARMNUM,
+	USE_DOMAINNAME_PARMNUM
+}
+
+enum {
+	USE_OK,
+	USE_PAUSED,
+	USE_SESSLOST,
+	USE_DISCONN = USE_SESSLOST,
+	USE_NETERR,
+	USE_CONN,
+	USE_RECONN
+}
+
+const DWORD USE_WILDCARD = -1;
+
+enum {
+	USE_DISKDEV,
+	USE_SPOOLDEV,
+	USE_CHARDEV,
+	USE_IPC
+}
+
+struct USE_INFO_0 {
+	LPWSTR ui0_local;
+	LPWSTR ui0_remote;
+}
+alias USE_INFO_0* PUSE_INFO_0, LPUSE_INFO_0;
+
+struct USE_INFO_1 {
+	LPWSTR ui1_local;
+	LPWSTR ui1_remote;
+	LPWSTR ui1_password;
+	DWORD ui1_status;
+	DWORD ui1_asg_type;
+	DWORD ui1_refcount;
+	DWORD ui1_usecount;
+}
+alias USE_INFO_1* PUSE_INFO_1, LPUSE_INFO_1;
+
+struct USE_INFO_2 {
+	LPWSTR ui2_local;
+	LPWSTR ui2_remote;
+	LPWSTR ui2_password;
+	DWORD ui2_status;
+	DWORD ui2_asg_type;
+	DWORD ui2_refcount;
+	DWORD ui2_usecount;
+	LPWSTR ui2_username;
+	LPWSTR ui2_domainname;
+}
+alias USE_INFO_2* PUSE_INFO_2, LPUSE_INFO_2;
+
+extern (Windows) {
+	NET_API_STATUS NetUseAdd(LPWSTR, DWORD, PBYTE, PDWORD);
+	NET_API_STATUS NetUseDel(LPWSTR, LPWSTR, DWORD);
+	NET_API_STATUS NetUseEnum(LPWSTR, DWORD, PBYTE*, DWORD, PDWORD, PDWORD,
+	  PDWORD);
+	NET_API_STATUS NetUseGetInfo(LPWSTR, LPWSTR, DWORD, PBYTE*);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmuseflg.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,16 @@
+/***********************************************************************\
+*                               lmuseflg.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*             Translated from MinGW API for MS-Windows 3.10             *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lmuseflg;
+
+enum : uint {
+	USE_NOFORCE = 0,
+	USE_FORCE,
+	USE_LOTS_OF_FORCE // = 2
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lmwksta.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,390 @@
+/***********************************************************************\
+*                               lmwksta.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lmwksta;
+pragma(lib, "netapi32.lib");
+
+import win32.lmuseflg;
+private import win32.lmcons, win32.windef;
+
+pragma(lib, "Netapi32.lib");
+
+enum {
+	WKSTA_COMPUTERNAME_PARMNUM     = 1,
+	WKSTA_LANGROUP_PARMNUM,     // = 2
+	WKSTA_VER_MAJOR_PARMNUM        = 4,
+	WKSTA_VER_MINOR_PARMNUM,
+	WKSTA_LOGGED_ON_USERS_PARMNUM,
+	WKSTA_LANROOT_PARMNUM,
+	WKSTA_LOGON_DOMAIN_PARMNUM,
+	WKSTA_LOGON_SERVER_PARMNUM,
+	WKSTA_CHARWAIT_PARMNUM,
+	WKSTA_CHARTIME_PARMNUM,
+	WKSTA_CHARCOUNT_PARMNUM,
+	WKSTA_KEEPCONN_PARMNUM,
+	WKSTA_KEEPSEARCH_PARMNUM,
+	WKSTA_MAXCMDS_PARMNUM,
+	WKSTA_NUMWORKBUF_PARMNUM,
+	WKSTA_MAXWRKCACHE_PARMNUM,
+	WKSTA_SESSTIMEOUT_PARMNUM,
+	WKSTA_SIZERROR_PARMNUM,
+	WKSTA_NUMALERTS_PARMNUM,
+	WKSTA_NUMSERVICES_PARMNUM,
+	WKSTA_NUMCHARBUF_PARMNUM,
+	WKSTA_SIZCHARBUF_PARMNUM,     // = 23
+	WKSTA_ERRLOGSZ_PARMNUM           = 27,
+	WKSTA_PRINTBUFTIME_PARMNUM,
+	WKSTA_SIZWORKBUF_PARMNUM,
+	WKSTA_MAILSLOTS_PARMNUM,
+	WKSTA_NUMDGRAMBUF_PARMNUM,
+	WKSTA_WRKHEURISTICS_PARMNUM,
+	WKSTA_MAXTHREADS_PARMNUM,     // = 33
+	WKSTA_LOCKQUOTA_PARMNUM          = 41,
+	WKSTA_LOCKINCREMENT_PARMNUM,
+	WKSTA_LOCKMAXIMUM_PARMNUM,
+	WKSTA_PIPEINCREMENT_PARMNUM,
+	WKSTA_PIPEMAXIMUM_PARMNUM,
+	WKSTA_DORMANTFILELIMIT_PARMNUM,
+	WKSTA_CACHEFILETIMEOUT_PARMNUM,
+	WKSTA_USEOPPORTUNISTICLOCKING_PARMNUM,
+	WKSTA_USEUNLOCKBEHIND_PARMNUM,
+	WKSTA_USECLOSEBEHIND_PARMNUM,
+	WKSTA_BUFFERNAMEDPIPES_PARMNUM,
+	WKSTA_USELOCKANDREADANDUNLOCK_PARMNUM,
+	WKSTA_UTILIZENTCACHING_PARMNUM,
+	WKSTA_USERAWREAD_PARMNUM,
+	WKSTA_USERAWWRITE_PARMNUM,
+	WKSTA_USEWRITERAWWITHDATA_PARMNUM,
+	WKSTA_USEENCRYPTION_PARMNUM,
+	WKSTA_BUFFILESWITHDENYWRITE_PARMNUM,
+	WKSTA_BUFFERREADONLYFILES_PARMNUM,
+	WKSTA_FORCECORECREATEMODE_PARMNUM,
+	WKSTA_USE512BYTESMAXTRANSFER_PARMNUM,
+	WKSTA_READAHEADTHRUPUT_PARMNUM,    // = 62
+	WKSTA_PLATFORM_ID_PARMNUM             = 100,
+	WKSTA_OTH_DOMAINS_PARMNUM             = 101,
+	TRANSPORT_QUALITYOFSERVICE_PARMNUM    = 201,
+	TRANSPORT_NAME_PARMNUM                = 202
+}
+
+struct WKSTA_INFO_100{
+	DWORD wki100_platform_id;
+	LPWSTR wki100_computername;
+	LPWSTR wki100_langroup;
+	DWORD wki100_ver_major;
+	DWORD wki100_ver_minor;
+}
+alias WKSTA_INFO_100* PWKSTA_INFO_100, LPWKSTA_INFO_100;
+
+struct WKSTA_INFO_101{
+	DWORD wki101_platform_id;
+	LPWSTR wki101_computername;
+	LPWSTR wki101_langroup;
+	DWORD wki101_ver_major;
+	DWORD wki101_ver_minor;
+	LPWSTR wki101_lanroot;
+}
+alias WKSTA_INFO_101* PWKSTA_INFO_101, LPWKSTA_INFO_101;
+
+struct WKSTA_INFO_102{
+	DWORD wki102_platform_id;
+	LPWSTR wki102_computername;
+	LPWSTR wki102_langroup;
+	DWORD wki102_ver_major;
+	DWORD wki102_ver_minor;
+	LPWSTR wki102_lanroot;
+	DWORD wki102_logged_on_users;
+}
+alias WKSTA_INFO_102* PWKSTA_INFO_102, LPWKSTA_INFO_102;
+
+struct WKSTA_INFO_302{
+	DWORD wki302_char_wait;
+	DWORD wki302_collection_time;
+	DWORD wki302_maximum_collection_count;
+	DWORD wki302_keep_conn;
+	DWORD wki302_keep_search;
+	DWORD wki302_max_cmds;
+	DWORD wki302_num_work_buf;
+	DWORD wki302_siz_work_buf;
+	DWORD wki302_max_wrk_cache;
+	DWORD wki302_sess_timeout;
+	DWORD wki302_siz_error;
+	DWORD wki302_num_alerts;
+	DWORD wki302_num_services;
+	DWORD wki302_errlog_sz;
+	DWORD wki302_print_buf_time;
+	DWORD wki302_num_char_buf;
+	DWORD wki302_siz_char_buf;
+	LPWSTR wki302_wrk_heuristics;
+	DWORD wki302_mailslots;
+	DWORD wki302_num_dgram_buf;
+}
+alias WKSTA_INFO_302* PWKSTA_INFO_302, LPWKSTA_INFO_302;
+
+struct WKSTA_INFO_402{
+	DWORD wki402_char_wait;
+	DWORD wki402_collection_time;
+	DWORD wki402_maximum_collection_count;
+	DWORD wki402_keep_conn;
+	DWORD wki402_keep_search;
+	DWORD wki402_max_cmds;
+	DWORD wki402_num_work_buf;
+	DWORD wki402_siz_work_buf;
+	DWORD wki402_max_wrk_cache;
+	DWORD wki402_sess_timeout;
+	DWORD wki402_siz_error;
+	DWORD wki402_num_alerts;
+	DWORD wki402_num_services;
+	DWORD wki402_errlog_sz;
+	DWORD wki402_print_buf_time;
+	DWORD wki402_num_char_buf;
+	DWORD wki402_siz_char_buf;
+	LPWSTR wki402_wrk_heuristics;
+	DWORD wki402_mailslots;
+	DWORD wki402_num_dgram_buf;
+	DWORD wki402_max_threads;
+}
+alias WKSTA_INFO_402* PWKSTA_INFO_402, LPWKSTA_INFO_402;
+
+struct WKSTA_INFO_502{
+	DWORD wki502_char_wait;
+	DWORD wki502_collection_time;
+	DWORD wki502_maximum_collection_count;
+	DWORD wki502_keep_conn;
+	DWORD wki502_max_cmds;
+	DWORD wki502_sess_timeout;
+	DWORD wki502_siz_char_buf;
+	DWORD wki502_max_threads;
+	DWORD wki502_lock_quota;
+	DWORD wki502_lock_increment;
+	DWORD wki502_lock_maximum;
+	DWORD wki502_pipe_increment;
+	DWORD wki502_pipe_maximum;
+	DWORD wki502_cache_file_timeout;
+	DWORD wki502_dormant_file_limit;
+	DWORD wki502_read_ahead_throughput;
+	DWORD wki502_num_mailslot_buffers;
+	DWORD wki502_num_srv_announce_buffers;
+	DWORD wki502_max_illegal_datagram_events;
+	DWORD wki502_illegal_datagram_event_reset_frequency;
+	BOOL wki502_log_election_packets;
+	BOOL wki502_use_opportunistic_locking;
+	BOOL wki502_use_unlock_behind;
+	BOOL wki502_use_close_behind;
+	BOOL wki502_buf_named_pipes;
+	BOOL wki502_use_lock_read_unlock;
+	BOOL wki502_utilize_nt_caching;
+	BOOL wki502_use_raw_read;
+	BOOL wki502_use_raw_write;
+	BOOL wki502_use_write_raw_data;
+	BOOL wki502_use_encryption;
+	BOOL wki502_buf_files_deny_write;
+	BOOL wki502_buf_read_only_files;
+	BOOL wki502_force_core_create_mode;
+	BOOL wki502_use_512_byte_max_transfer;
+}
+alias WKSTA_INFO_502* PWKSTA_INFO_502, LPWKSTA_INFO_502;
+
+struct WKSTA_INFO_1010 {
+	DWORD wki1010_char_wait;
+}
+alias WKSTA_INFO_1010* PWKSTA_INFO_1010, LPWKSTA_INFO_1010;
+
+struct WKSTA_INFO_1011 {
+	DWORD wki1011_collection_time;
+}
+alias WKSTA_INFO_1011* PWKSTA_INFO_1011, LPWKSTA_INFO_1011;
+
+struct WKSTA_INFO_1012 {
+	DWORD wki1012_maximum_collection_count;
+}
+alias WKSTA_INFO_1012* PWKSTA_INFO_1012, LPWKSTA_INFO_1012;
+
+struct WKSTA_INFO_1027 {
+	DWORD wki1027_errlog_sz;
+}
+alias WKSTA_INFO_1027* PWKSTA_INFO_1027, LPWKSTA_INFO_1027;
+
+struct WKSTA_INFO_1028 {
+	DWORD wki1028_print_buf_time;
+}
+alias WKSTA_INFO_1028* PWKSTA_INFO_1028, LPWKSTA_INFO_1028;
+
+struct WKSTA_INFO_1032 {
+	DWORD wki1032_wrk_heuristics;
+}
+alias WKSTA_INFO_1032* PWKSTA_INFO_1032, LPWKSTA_INFO_1032;
+
+struct WKSTA_INFO_1013 {
+	DWORD wki1013_keep_conn;
+}
+alias WKSTA_INFO_1013* PWKSTA_INFO_1013, LPWKSTA_INFO_1013;
+
+struct WKSTA_INFO_1018 {
+	DWORD wki1018_sess_timeout;
+}
+alias WKSTA_INFO_1018* PWKSTA_INFO_1018, LPWKSTA_INFO_1018;
+
+struct WKSTA_INFO_1023 {
+	DWORD wki1023_siz_char_buf;
+}
+alias WKSTA_INFO_1023* PWKSTA_INFO_1023, LPWKSTA_INFO_1023;
+
+struct WKSTA_INFO_1033 {
+	DWORD wki1033_max_threads;
+}
+alias WKSTA_INFO_1033* PWKSTA_INFO_1033, LPWKSTA_INFO_1033;
+
+struct WKSTA_INFO_1041 {
+	DWORD wki1041_lock_quota;
+}
+alias WKSTA_INFO_1041* PWKSTA_INFO_1041, LPWKSTA_INFO_1041;
+
+struct WKSTA_INFO_1042 {
+	DWORD wki1042_lock_increment;
+}
+alias WKSTA_INFO_1042* PWKSTA_INFO_1042, LPWKSTA_INFO_1042;
+
+struct WKSTA_INFO_1043 {
+	DWORD wki1043_lock_maximum;
+}
+alias WKSTA_INFO_1043* PWKSTA_INFO_1043, LPWKSTA_INFO_1043;
+
+struct WKSTA_INFO_1044 {
+	DWORD wki1044_pipe_increment;
+}
+alias WKSTA_INFO_1044* PWKSTA_INFO_1044, LPWKSTA_INFO_1044;
+
+struct WKSTA_INFO_1045 {
+	DWORD wki1045_pipe_maximum;
+}
+alias WKSTA_INFO_1045* PWKSTA_INFO_1045, LPWKSTA_INFO_1045;
+
+struct WKSTA_INFO_1046 {
+	DWORD wki1046_dormant_file_limit;
+}
+alias WKSTA_INFO_1046* PWKSTA_INFO_1046, LPWKSTA_INFO_1046;
+
+struct WKSTA_INFO_1047 {
+	DWORD wki1047_cache_file_timeout;
+}
+alias WKSTA_INFO_1047* PWKSTA_INFO_1047, LPWKSTA_INFO_1047;
+
+struct WKSTA_INFO_1048 {
+	BOOL wki1048_use_opportunistic_locking;
+}
+alias WKSTA_INFO_1048* PWKSTA_INFO_1048, LPWKSTA_INFO_1048;
+
+struct WKSTA_INFO_1049 {
+	BOOL wki1049_use_unlock_behind;
+}
+alias WKSTA_INFO_1049* PWKSTA_INFO_1049, LPWKSTA_INFO_1049;
+
+struct WKSTA_INFO_1050 {
+	BOOL wki1050_use_close_behind;
+}
+alias WKSTA_INFO_1050* PWKSTA_INFO_1050, LPWKSTA_INFO_1050;
+
+struct WKSTA_INFO_1051 {
+	BOOL wki1051_buf_named_pipes;
+}
+alias WKSTA_INFO_1051* PWKSTA_INFO_1051, LPWKSTA_INFO_1051;
+
+struct WKSTA_INFO_1052 {
+	BOOL wki1052_use_lock_read_unlock;
+}
+alias WKSTA_INFO_1052* PWKSTA_INFO_1052, LPWKSTA_INFO_1052;
+
+struct WKSTA_INFO_1053 {
+	BOOL wki1053_utilize_nt_caching;
+}
+alias WKSTA_INFO_1053* PWKSTA_INFO_1053, LPWKSTA_INFO_1053;
+
+struct WKSTA_INFO_1054 {
+	BOOL wki1054_use_raw_read;
+}
+alias WKSTA_INFO_1054* PWKSTA_INFO_1054, LPWKSTA_INFO_1054;
+
+struct WKSTA_INFO_1055 {
+	BOOL wki1055_use_raw_write;
+}
+alias WKSTA_INFO_1055* PWKSTA_INFO_1055, LPWKSTA_INFO_1055;
+
+struct WKSTA_INFO_1056 {
+	BOOL wki1056_use_write_raw_data;
+}
+alias WKSTA_INFO_1056* PWKSTA_INFO_1056, LPWKSTA_INFO_1056;
+
+struct WKSTA_INFO_1057 {
+	BOOL wki1057_use_encryption;
+}
+alias WKSTA_INFO_1057* PWKSTA_INFO_1057, LPWKSTA_INFO_1057;
+
+struct WKSTA_INFO_1058 {
+	BOOL wki1058_buf_files_deny_write;
+}
+alias WKSTA_INFO_1058* PWKSTA_INFO_1058, LPWKSTA_INFO_1058;
+
+struct WKSTA_INFO_1059 {
+	BOOL wki1059_buf_read_only_files;
+}
+alias WKSTA_INFO_1059* PWKSTA_INFO_1059, LPWKSTA_INFO_1059;
+
+struct WKSTA_INFO_1060 {
+	BOOL wki1060_force_core_create_mode;
+}
+alias WKSTA_INFO_1060* PWKSTA_INFO_1060, LPWKSTA_INFO_1060;
+
+struct WKSTA_INFO_1061 {
+	BOOL wki1061_use_512_byte_max_transfer;
+}
+alias WKSTA_INFO_1061* PWKSTA_INFO_1061, LPWKSTA_INFO_1061;
+
+struct WKSTA_INFO_1062 {
+	DWORD wki1062_read_ahead_throughput;
+}
+alias WKSTA_INFO_1062* PWKSTA_INFO_1062, LPWKSTA_INFO_1062;
+
+struct WKSTA_USER_INFO_0 {
+	LPWSTR wkui0_username;
+}
+alias WKSTA_USER_INFO_0* PWKSTA_USER_INFO_0, LPWKSTA_USER_INFO_0;
+
+struct WKSTA_USER_INFO_1{
+	LPWSTR wkui1_username;
+	LPWSTR wkui1_logon_domain;
+	LPWSTR wkui1_oth_domains;
+	LPWSTR wkui1_logon_server;
+}
+alias WKSTA_USER_INFO_1* PWKSTA_USER_INFO_1, LPWKSTA_USER_INFO_1;
+
+struct WKSTA_USER_INFO_1101 {
+	LPWSTR wkui1101_oth_domains;
+}
+alias WKSTA_USER_INFO_1101* PWKSTA_USER_INFO_1101, LPWKSTA_USER_INFO_1101;
+
+struct WKSTA_TRANSPORT_INFO_0{
+	DWORD wkti0_quality_of_service;
+	DWORD wkti0_number_of_vcs;
+	LPWSTR wkti0_transport_name;
+	LPWSTR wkti0_transport_address;
+	BOOL wkti0_wan_ish;
+}
+alias WKSTA_TRANSPORT_INFO_0* PWKSTA_TRANSPORT_INFO_0, LPWKSTA_TRANSPORT_INFO_0;
+
+extern (Windows) {
+NET_API_STATUS NetWkstaGetInfo(LPWSTR,DWORD,PBYTE*);
+NET_API_STATUS NetWkstaSetInfo(LPWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS NetWkstaUserGetInfo(LPWSTR,DWORD,PBYTE*);
+NET_API_STATUS NetWkstaUserSetInfo(LPWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS NetWkstaUserEnum(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+NET_API_STATUS NetWkstaTransportAdd(LPWSTR,DWORD,PBYTE,PDWORD);
+NET_API_STATUS NetWkstaTransportDel(LPWSTR,LPWSTR,DWORD);
+NET_API_STATUS NetWkstaTransportEnum(LPWSTR,DWORD,PBYTE*,DWORD,PDWORD,PDWORD,PDWORD);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/lzexpand.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,48 @@
+/***********************************************************************\
+*                               lzexpand.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.lzexpand;
+pragma(lib, "lz32.lib");
+
+private import win32.winbase, win32.windef;
+
+enum : LONG {
+	LZERROR_BADINHANDLE  = -1,
+	LZERROR_BADOUTHANDLE = -2,
+	LZERROR_READ         = -3,
+	LZERROR_WRITE        = -4,
+	LZERROR_GLOBALLOC    = -5,
+	LZERROR_GLOBLOCK     = -6,
+	LZERROR_BADVALUE     = -7,
+	LZERROR_UNKNOWNALG   = -8
+}
+
+extern (Windows):
+deprecated {
+	LONG CopyLZFile(INT, INT);
+	void LZDone();
+	INT LZStart();
+}
+INT GetExpandedNameA(LPSTR, LPSTR);
+INT GetExpandedNameW(LPWSTR, LPWSTR);
+void LZClose(INT);
+LONG LZCopy(INT, INT);
+INT LZInit(INT);
+INT LZOpenFileA(LPSTR, LPOFSTRUCT, WORD);
+INT LZOpenFileW(LPWSTR, LPOFSTRUCT, WORD);
+INT LZRead(INT, LPSTR, INT);
+LONG LZSeek(INT, LONG, INT);
+
+version (Unicode) {
+	alias GetExpandedNameW GetExpandedName;
+	alias LZOpenFileW LZOpenFile;
+} else {
+	alias GetExpandedNameA GetExpandedName;
+	alias LZOpenFileA LZOpenFile;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/makefile	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,30 @@
+# Makefile for the Windows API project
+# Uses GNU Make-specific extensions
+
+DC := dmd.exe
+
+DFLAGS := -inline -O -release -w
+#DFLAGS := -debug -gc -unittest -w
+
+DFLAGS += -version=Unicode -version=WindowsVista
+
+########################################
+
+SUBDIRS := directx
+
+EXCLUSIONS := winsock.d
+
+########################################
+
+SOURCES := $(wildcard *.d $(addsuffix /*.d, $(SUBDIRS)))
+SOURCES := $(filter-out $(EXCLUSIONS), $(SOURCES))
+
+########################################
+
+win32.lib : $(SOURCES)
+	$(DC) $^ -lib -of$@ $(DFLAGS)
+
+clean :
+	-del win32.lib
+
+.PHONY : clean
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/mapi.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,168 @@
+/***********************************************************************\
+*                                 mapi.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.mapi;
+
+private import win32.windef;
+
+// FIXME: check types and grouping of constants
+
+enum {
+	SUCCESS_SUCCESS,
+	MAPI_USER_ABORT,
+	MAPI_E_USER_ABORT        = MAPI_USER_ABORT,
+	MAPI_E_FAILURE,
+	MAPI_E_LOGIN_FAILURE,
+	MAPI_E_LOGON_FAILURE     = MAPI_E_LOGIN_FAILURE,
+	MAPI_E_DISK_FULL	     = 4,
+	MAPI_E_INSUFFICIENT_MEMORY,
+	MAPI_E_ACCESS_DENIED,
+	MAPI_E_BLK_TOO_SMALL     = MAPI_E_ACCESS_DENIED, // = 6
+	MAPI_E_TOO_MANY_SESSIONS = 8,
+	MAPI_E_TOO_MANY_FILES,
+	MAPI_E_TOO_MANY_RECIPIENTS,
+	MAPI_E_ATTACHMENT_NOT_FOUND,
+	MAPI_E_ATTACHMENT_OPEN_FAILURE,
+	MAPI_E_ATTACHMENT_WRITE_FAILURE,
+	MAPI_E_UNKNOWN_RECIPIENT,
+	MAPI_E_BAD_RECIPTYPE,
+	MAPI_E_NO_MESSAGES,
+	MAPI_E_INVALID_MESSAGE,
+	MAPI_E_TEXT_TOO_LARGE,
+	MAPI_E_INVALID_SESSION,
+	MAPI_E_TYPE_NOT_SUPPORTED,
+	MAPI_E_AMBIGUOUS_RECIPIENT,
+	MAPI_E_AMBIGUOUS_RECIP   = MAPI_E_AMBIGUOUS_RECIPIENT,
+	MAPI_E_MESSAGE_IN_USE,
+	MAPI_E_NETWORK_FAILURE,
+	MAPI_E_INVALID_EDITFIELDS,
+	MAPI_E_INVALID_RECIPS,
+	MAPI_E_NOT_SUPPORTED  // = 26
+}
+
+enum {
+	MAPI_ORIG,
+	MAPI_TO,
+	MAPI_CC,
+	MAPI_BCC
+}
+
+const MAPI_LOGON_UI          = 0x0001;
+const MAPI_NEW_SESSION       = 0x0002;
+const MAPI_FORCE_DOWNLOAD    = 0x1000;
+const MAPI_LOGOFF_SHARED     = 0x0001;
+const MAPI_LOGOFF_UI         = 0x0002;
+const MAPI_DIALOG            = 0x0008;
+const MAPI_UNREAD_ONLY       = 0x0020;
+const MAPI_LONG_MSGID        = 0x4000;
+const MAPI_GUARANTEE_FIFO    = 0x0100;
+const MAPI_ENVELOPE_ONLY     = 0x0040;
+const MAPI_PEEK              = 0x0080;
+const MAPI_BODY_AS_FILE      = 0x0200;
+const MAPI_SUPPRESS_ATTACH   = 0x0800;
+const MAPI_AB_NOMODIFY       = 0x0400;
+const MAPI_OLE               = 0x0001;
+const MAPI_OLE_STATIC        = 0x0002;
+const MAPI_UNREAD            = 0x0001;
+const MAPI_RECEIPT_REQUESTED = 0x0002;
+const MAPI_SENT              = 0x0004;
+
+alias uint FLAGS, LHANDLE;
+alias uint* LPLHANDLE, LPULONG;
+
+struct MapiRecipDesc {
+	ULONG  ulReserved;
+	ULONG  ulRecipClass;
+	LPSTR  lpszName;
+	LPSTR  lpszAddress;
+	ULONG  ulEIDSize;
+	LPVOID lpEntryID;
+}
+alias MapiRecipDesc* lpMapiRecipDesc;
+
+struct MapiFileDesc {
+	ULONG  ulReserved;
+	ULONG  flFlags;
+	ULONG  nPosition;
+	LPSTR  lpszPathName;
+	LPSTR  lpszFileName;
+	LPVOID lpFileType;
+}
+alias MapiFileDesc* lpMapiFileDesc;
+
+struct MapiFileTagExt {
+	ULONG  ulReserved;
+	ULONG  cbTag;
+	LPBYTE lpTag;
+	ULONG  cbEncoding;
+	LPBYTE lpEncoding;
+}
+alias MapiFileTagExt* lpMapiFileTagExt;
+
+struct MapiMessage {
+	ULONG           ulReserved;
+	LPSTR           lpszSubject;
+	LPSTR           lpszNoteText;
+	LPSTR           lpszMessageType;
+	LPSTR           lpszDateReceived;
+	LPSTR           lpszConversationID;
+	FLAGS           flFlags;
+	lpMapiRecipDesc lpOriginator;
+	ULONG           nRecipCount;
+	lpMapiRecipDesc lpRecips;
+	ULONG           nFileCount;
+	lpMapiFileDesc  lpFiles;
+}
+alias MapiMessage* lpMapiMessage;
+
+extern (Pascal) {
+	ULONG MAPILogon(ULONG, LPSTR, LPSTR, FLAGS, ULONG, LPLHANDLE);
+	ULONG MAPISendMail(LHANDLE, ULONG, lpMapiMessage, FLAGS, ULONG);
+	ULONG MAPISendDocuments(ULONG, LPSTR, LPSTR, LPSTR, ULONG);
+	ULONG MAPIReadMail(LHANDLE, ULONG, LPSTR, FLAGS, ULONG, lpMapiMessage*);
+	ULONG MAPIFindNext(LHANDLE, ULONG, LPSTR, LPSTR, FLAGS, ULONG, LPSTR);
+	ULONG MAPIResolveName(LHANDLE, ULONG, LPSTR, FLAGS, ULONG,
+	  lpMapiRecipDesc*);
+	ULONG MAPIAddress(LHANDLE, ULONG, LPSTR, ULONG, LPSTR, ULONG,
+	  lpMapiRecipDesc, FLAGS, ULONG, LPULONG, lpMapiRecipDesc*);
+	ULONG MAPIFreeBuffer(LPVOID);
+	ULONG MAPIDetails(LHANDLE, ULONG, lpMapiRecipDesc, FLAGS, ULONG);
+	ULONG MAPISaveMail(LHANDLE, ULONG, lpMapiMessage lpszMessage, FLAGS,
+	  ULONG, LPSTR);
+	ULONG MAPIDeleteMail(LHANDLE lpSession, ULONG, LPSTR, FLAGS, ULONG);
+	ULONG MAPILogoff(LHANDLE, ULONG, FLAGS, ULONG);
+	// Netscape extensions
+	ULONG MAPIGetNetscapeVersion();
+	ULONG MAPI_NSCP_SynchronizeClient(LHANDLE, ULONG);
+
+	// Handles for use with GetProcAddress
+	alias ULONG function(ULONG, LPSTR, LPSTR, FLAGS, ULONG, LPLHANDLE)
+	  LPMAPILOGON;
+	alias ULONG function(LHANDLE, ULONG, lpMapiMessage, FLAGS, ULONG)
+	  LPMAPISENDMAIL;
+	alias ULONG function(ULONG, LPSTR, LPSTR, LPSTR, ULONG)
+	  LPMAPISENDDOCUMENTS;
+	alias ULONG function(LHANDLE, ULONG, LPSTR, FLAGS, ULONG, lpMapiMessage*)
+	  LPMAPIREADMAIL;
+	alias ULONG function(LHANDLE, ULONG, LPSTR, LPSTR, FLAGS, ULONG, LPSTR)
+	  LPMAPIFINDNEXT;
+	alias ULONG function(LHANDLE, ULONG, LPSTR, FLAGS, ULONG,
+	  lpMapiRecipDesc*) LPMAPIRESOLVENAME;
+	alias ULONG function(LHANDLE, ULONG, LPSTR, ULONG, LPSTR, ULONG,
+	  lpMapiRecipDesc, FLAGS, ULONG, LPULONG, lpMapiRecipDesc*) LPMAPIADDRESS;
+	alias ULONG function(LPVOID lpv) LPMAPIFREEBUFFER;
+	alias ULONG function(LHANDLE, ULONG, lpMapiRecipDesc, FLAGS, ULONG)
+	  LPMAPIDETAILS;
+	alias ULONG function(LHANDLE, ULONG, lpMapiMessage, FLAGS, ULONG, LPSTR)
+	  LPMAPISAVEMAIL;
+	alias ULONG function(LHANDLE lpSession, ULONG, LPSTR, FLAGS, ULONG)
+	  LPMAPIDELETEMAIL;
+	alias ULONG function(LHANDLE, ULONG, FLAGS, ULONG) LPMAPILOGOFF;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/mciavi.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,40 @@
+/***********************************************************************\
+*                                mciavi.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.mciavi;
+
+private import win32.mmsystem;
+
+// FIXME: check types and grouping of constants
+
+const MCI_MCIAVI_PLAY_WINDOW     = 0x01000000;
+const MCI_MCIAVI_PLAY_FULLSCREEN = 0x02000000;
+const MCI_MCIAVI_PLAY_FULLBY2    = 0x04000000;
+
+enum {
+	MCI_AVI_STATUS_FRAMES_SKIPPED     = 0x00008001,
+	MCI_AVI_STATUS_LAST_PLAY_SPEED    = 0x00008002,
+	MCI_AVI_STATUS_AUDIO_BREAKS       = 0x00008003,
+	MCI_AVI_SETVIDEO_DRAW_PROCEDURE   = 0x00008000,
+	MCI_AVI_SETVIDEO_PALETTE_COLOR    = 0x00008100,
+	MCI_AVI_SETVIDEO_PALETTE_HALFTONE = 0x0000FFFF
+}
+
+enum {
+	MCIERR_AVI_OLDAVIFORMAT  = MCIERR_CUSTOM_DRIVER_BASE + 100,
+	MCIERR_AVI_NOTINTERLEAVED,
+	MCIERR_AVI_NODISPDIB,
+	MCIERR_AVI_CANTPLAYFULLSCREEN,
+	MCIERR_AVI_TOOBIGFORVGA,
+	MCIERR_AVI_NOCOMPRESSOR,
+	MCIERR_AVI_DISPLAYERROR,
+	MCIERR_AVI_AUDIOERROR,
+	MCIERR_AVI_BADPALETTE // = MCIERR_CUSTOM_DRIVER_BASE + 108
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/mcx.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,99 @@
+/***********************************************************************\
+*                                  mcx.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.mcx;
+
+private import win32.windef;
+
+const DWORD
+	DIALOPTION_BILLING  =  64,
+	DIALOPTION_QUIET    = 128,
+	DIALOPTION_DIALTONE = 256;
+
+const DWORD
+	MDMVOLFLAG_LOW    = 1,
+	MDMVOLFLAG_MEDIUM = 2,
+	MDMVOLFLAG_HIGH   = 4;
+
+enum : DWORD {
+	MDMVOL_LOW    = 0,
+	MDMVOL_MEDIUM = 1,
+	MDMVOL_HIGH   = 2
+}
+
+const DWORD
+	MDMSPKRFLAG_OFF       = 1,
+	MDMSPKRFLAG_DIAL      = 2,
+	MDMSPKRFLAG_ON        = 4,
+	MDMSPKRFLAG_CALLSETUP = 8;
+
+enum : DWORD {
+	MDMSPKR_OFF,
+	MDMSPKR_DIAL,
+	MDMSPKR_ON,
+	MDMSPKR_CALLSETUP
+}
+
+const DWORD
+	MDM_COMPRESSION      = 0x0001,
+	MDM_ERROR_CONTROL    = 0x0002,
+	MDM_FORCED_EC        = 0x0004,
+	MDM_CELLULAR         = 0x0008,
+	MDM_FLOWCONTROL_HARD = 0x0010,
+	MDM_FLOWCONTROL_SOFT = 0x0020,
+	MDM_CCITT_OVERRIDE   = 0x0040,
+	MDM_SPEED_ADJUST     = 0x0080,
+	MDM_TONE_DIAL        = 0x0100,
+	MDM_BLIND_DIAL       = 0x0200,
+	MDM_V23_OVERRIDE     = 0x0400;
+
+struct MODEMDEVCAPS {
+	DWORD dwActualSize;
+	DWORD dwRequiredSize;
+	DWORD dwDevSpecificOffset;
+	DWORD dwDevSpecificSize;
+	DWORD dwModemProviderVersion;
+	DWORD dwModemManufacturerOffset;
+	DWORD dwModemManufacturerSize;
+	DWORD dwModemModelOffset;
+	DWORD dwModemModelSize;
+	DWORD dwModemVersionOffset;
+	DWORD dwModemVersionSize;
+	DWORD dwDialOptions;
+	DWORD dwCallSetupFailTimer;
+	DWORD dwInactivityTimeout;
+	DWORD dwSpeakerVolume;
+	DWORD dwSpeakerMode;
+	DWORD dwModemOptions;
+	DWORD dwMaxDTERate;
+	DWORD dwMaxDCERate;
+	BYTE  _abVariablePortion;
+
+	BYTE* abVariablePortion() { return &_abVariablePortion; }
+}
+alias MODEMDEVCAPS* PMODEMDEVCAPS, LPMODEMDEVCAPS;
+
+struct MODEMSETTINGS {
+	DWORD dwActualSize;
+	DWORD dwRequiredSize;
+	DWORD dwDevSpecificOffset;
+	DWORD dwDevSpecificSize;
+	DWORD dwCallSetupFailTimer;
+	DWORD dwInactivityTimeout;
+	DWORD dwSpeakerVolume;
+	DWORD dwSpeakerMode;
+	DWORD dwPreferredModemOptions;
+	DWORD dwNegotiatedModemOptions;
+	DWORD dwNegotiatedDCERate;
+	BYTE  _abVariablePortion;
+
+	BYTE* abVariablePortion() { return &_abVariablePortion; }
+}
+alias MODEMSETTINGS* PMODEMSETTINGS, LPMODEMSETTINGS;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/mgmtapi.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,47 @@
+/***********************************************************************\
+*                                mgmtapi.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.mgmtapi;
+
+import win32.snmp;
+private import win32.windef;
+
+enum {
+	SNMP_MGMTAPI_TIMEOUT = 40,
+	SNMP_MGMTAPI_SELECT_FDERRORS,
+	SNMP_MGMTAPI_TRAP_ERRORS,
+	SNMP_MGMTAPI_TRAP_DUPINIT,
+	SNMP_MGMTAPI_NOTRAPS,
+	SNMP_MGMTAPI_AGAIN,
+	SNMP_MGMTAPI_INVALID_CTL,
+	SNMP_MGMTAPI_INVALID_SESSION,
+	SNMP_MGMTAPI_INVALID_BUFFER // = 48
+}
+
+const MGMCTL_SETAGENTPORT = 1;
+
+alias PVOID LPSNMP_MGR_SESSION;
+
+extern (Windows) {
+	BOOL SnmpMgrClose(LPSNMP_MGR_SESSION);
+	BOOL SnmpMgrCtl(LPSNMP_MGR_SESSION, DWORD, LPVOID, DWORD, LPVOID, DWORD,
+	  LPDWORD);
+	BOOL SnmpMgrGetTrap(AsnObjectIdentifier*, AsnNetworkAddress*,
+	  AsnInteger*, AsnInteger*, AsnTimeticks*, SnmpVarBindList*);
+	BOOL SnmpMgrGetTrapEx(AsnObjectIdentifier*, AsnNetworkAddress*,
+	  AsnNetworkAddress*, AsnInteger*, AsnInteger*, AsnOctetString*,
+	  AsnTimeticks*, SnmpVarBindList*);
+	BOOL SnmpMgrOidToStr(AsnObjectIdentifier*, LPSTR*);
+	LPSNMP_MGR_SESSION SnmpMgrOpen(LPSTR, LPSTR, INT, INT);
+	INT SnmpMgrRequest(LPSNMP_MGR_SESSION, BYTE, SnmpVarBindList*,
+	  AsnInteger*, AsnInteger*);
+	BOOL SnmpMgrStrToOid(LPSTR, AsnObjectIdentifier*);
+	BOOL SnmpMgrTrapListen(HANDLE*);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/mmsystem.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,2269 @@
+/***********************************************************************\
+*                               mmsystem.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.mmsystem;
+pragma(lib, "winmm.lib");
+
+/*	The #defines MAKEFOURCC, mmioFOURCC, sndAlias are used to define
+ *	compile-time constants, so they are implemented as templates.
+ */
+
+private import win32.w32api, win32.windef, win32.winver;
+
+align(1):
+
+const MAXPNAMELEN = 32;
+const MAXERRORLENGTH = 256;
+const MAX_JOYSTICKOEMVXDNAME = 260;
+
+const TIME_MS      = 1;
+const TIME_SAMPLES = 2;
+const TIME_BYTES   = 4;
+const TIME_SMPTE   = 8;
+const TIME_MIDI    = 16;
+const TIME_TICKS   = 32;
+
+template MAKEFOURCC(char c0, char c1, char c2, char c3)
+{
+	const DWORD MAKEFOURCC = c0 | (c1<<8) | (c2<<16) | (cast(DWORD)c3 <<24);
+}
+
+template mmioFOURCC(char c0, char c1, char c2, char c3)
+{
+	const DWORD mmioFOURCC = c0 | (c1<<8) | (c2<<16) | (cast(DWORD)c3 <<24);
+}
+
+enum {
+	MM_JOY1MOVE            = 0x3A0,
+	MM_JOY2MOVE,
+	MM_JOY1ZMOVE,
+	MM_JOY2ZMOVE,       // = 0x3A3
+	MM_JOY1BUTTONDOWN      = 0x3B5,
+	MM_JOY2BUTTONDOWN,
+	MM_JOY1BUTTONUP,
+	MM_JOY2BUTTONUP,
+	MM_MCINOTIFY,       // = 0x3B9
+	MM_WOM_OPEN            = 0x3BB,
+	MM_WOM_CLOSE,
+	MM_WOM_DONE,
+	MM_WIM_OPEN,
+	MM_WIM_CLOSE,
+	MM_WIM_DATA,
+	MM_MIM_OPEN,
+	MM_MIM_CLOSE,
+	MM_MIM_DATA,
+	MM_MIM_LONGDATA,
+	MM_MIM_ERROR,
+	MM_MIM_LONGERROR,
+	MM_MOM_OPEN,
+	MM_MOM_CLOSE,
+	MM_MOM_DONE,        // = 0x3C9
+	MM_DRVM_OPEN           = 0x3D0,
+	MM_DRVM_CLOSE,
+	MM_DRVM_DATA,
+	MM_DRVM_ERROR,
+	MM_STREAM_OPEN,
+	MM_STREAM_CLOSE,
+	MM_STREAM_DONE,
+	MM_STREAM_ERROR,    // = 0x3D7
+	MM_MOM_POSITIONCB      = 0x3CA,
+	MM_MCISIGNAL,
+	MM_MIM_MOREDATA,    // = 0x3CC
+	MM_MIXM_LINE_CHANGE    = 0x3D0,
+	MM_MIXM_CONTROL_CHANGE = 0x3D1
+}
+
+const MMSYSERR_BASE     =    0;
+const WAVERR_BASE       =   32;
+const MIDIERR_BASE      =   64;
+const TIMERR_BASE       =   96;
+const JOYERR_BASE       =  160;
+const MCIERR_BASE       =  256;
+const MIXERR_BASE       = 1024;
+const MCI_STRING_OFFSET =  512;
+const MCI_VD_OFFSET     = 1024;
+const MCI_CD_OFFSET     = 1088;
+const MCI_WAVE_OFFSET   = 1152;
+const MCI_SEQ_OFFSET    = 1216;
+
+enum {
+	MMSYSERR_NOERROR        = 0,
+	MMSYSERR_ERROR          = MMSYSERR_BASE+1,
+	MMSYSERR_BADDEVICEID,
+	MMSYSERR_NOTENABLED,
+	MMSYSERR_ALLOCATED,
+	MMSYSERR_INVALHANDLE,
+	MMSYSERR_NODRIVER,
+	MMSYSERR_NOMEM,
+	MMSYSERR_NOTSUPPORTED,
+	MMSYSERR_BADERRNUM,
+	MMSYSERR_INVALFLAG,
+	MMSYSERR_INVALPARAM,
+	MMSYSERR_HANDLEBUSY,
+	MMSYSERR_INVALIDALIAS,
+	MMSYSERR_BADDB,
+	MMSYSERR_KEYNOTFOUND,
+	MMSYSERR_READERROR,
+	MMSYSERR_WRITEERROR,
+	MMSYSERR_DELETEERROR,
+	MMSYSERR_VALNOTFOUND,
+	MMSYSERR_NODRIVERCB, // = MMSYSERR_BASE+20
+	MMSYSERR_LASTERROR      = MMSYSERR_NODRIVERCB
+}
+
+enum {
+	DRV_LOAD = 1,
+	DRV_ENABLE,
+	DRV_OPEN,
+	DRV_CLOSE,
+	DRV_DISABLE,
+	DRV_FREE,
+	DRV_CONFIGURE,
+	DRV_QUERYCONFIGURE,
+	DRV_INSTALL,
+	DRV_REMOVE,
+	DRV_EXITSESSION,
+	DRV_POWER
+}
+
+const DRV_RESERVED = 0x800;
+const DRV_USER = 0x4000;
+
+const DRVCNF_CANCEL = 0;
+const DRVCNF_OK = 1;
+const DRVCNF_RESTART = 2;
+const DRV_CANCEL = DRVCNF_CANCEL;
+const DRV_OK = DRVCNF_OK;
+const DRV_RESTART = DRVCNF_RESTART;
+const DRV_MCI_FIRST = DRV_RESERVED;
+const DRV_MCI_LAST  = DRV_RESERVED + 0xFFF;
+
+const CALLBACK_TYPEMASK = 0x70000;
+const CALLBACK_NULL     = 0;
+const CALLBACK_WINDOW   = 0x10000;
+const CALLBACK_TASK     = 0x20000;
+const CALLBACK_FUNCTION = 0x30000;
+const CALLBACK_THREAD   = CALLBACK_TASK;
+const CALLBACK_EVENT    = 0x50000;
+
+const SND_SYNC=0;
+const SND_ASYNC=1;
+const SND_NODEFAULT=2;
+const SND_MEMORY=4;
+const SND_LOOP=8;
+const SND_NOSTOP=16;
+const SND_NOWAIT=0x2000;
+const SND_ALIAS=0x10000;
+const SND_ALIAS_ID=0x110000;
+const SND_FILENAME=0x20000;
+const SND_RESOURCE=0x40004;
+const SND_PURGE=0x40;
+const SND_APPLICATION=0x80;
+const SND_ALIAS_START=0;
+
+template sndAlias(char c0, char c1)
+{
+	const DWORD sndAlias = SND_ALIAS_START + c0 | (c1<<8);
+}
+
+const SND_ALIAS_SYSTEMASTERISK    = sndAlias!('S','*');
+const SND_ALIAS_SYSTEMQUESTION    = sndAlias!('S','?');
+const SND_ALIAS_SYSTEMHAND        = sndAlias!('S','H');
+const SND_ALIAS_SYSTEMEXIT        = sndAlias!('S','E');
+const SND_ALIAS_SYSTEMSTART       = sndAlias!('S','S');
+const SND_ALIAS_SYSTEMWELCOME     = sndAlias!('S','W');
+const SND_ALIAS_SYSTEMEXCLAMATION = sndAlias!('S','!');
+const SND_ALIAS_SYSTEMDEFAULT     = sndAlias!('S','D');
+
+enum {
+	WAVERR_BADFORMAT  = (WAVERR_BASE + 0),
+	WAVERR_STILLPLAYING,
+	WAVERR_UNPREPARED,
+	WAVERR_SYNC,  // = WAVERR_BASE + 3;
+	WAVERR_LASTERROR = WAVERR_SYNC
+}
+
+const WOM_OPEN  = MM_WOM_OPEN;
+const WOM_CLOSE = MM_WOM_CLOSE;
+const WOM_DONE  = MM_WOM_DONE;
+const WIM_OPEN  = MM_WIM_OPEN;
+const WIM_CLOSE = MM_WIM_CLOSE;
+const WIM_DATA  = MM_WIM_DATA;
+
+const UINT WAVE_MAPPER= -1;  // FIXME: This doesn't make sense!
+const WAVE_FORMAT_QUERY=1;
+const WAVE_ALLOWSYNC=2;
+const WAVE_MAPPED=4;
+const WAVE_FORMAT_DIRECT=8;
+const WAVE_FORMAT_DIRECT_QUERY=(WAVE_FORMAT_QUERY|WAVE_FORMAT_DIRECT);
+const WHDR_DONE=1;
+const WHDR_PREPARED=2;
+const WHDR_BEGINLOOP=4;
+const WHDR_ENDLOOP=8;
+const WHDR_INQUEUE=16;
+
+const WAVECAPS_PITCH=1;
+const WAVECAPS_PLAYBACKRATE=2;
+const WAVECAPS_VOLUME=4;
+const WAVECAPS_LRVOLUME=8;
+const WAVECAPS_SYNC=16;
+const WAVECAPS_SAMPLEACCURATE=32;
+const WAVECAPS_DIRECTSOUND=64;
+
+const WAVE_INVALIDFORMAT=0;
+const WAVE_FORMAT_1M08=1;
+const WAVE_FORMAT_1S08=2;
+const WAVE_FORMAT_1M16=4;
+const WAVE_FORMAT_1S16=8;
+const WAVE_FORMAT_2M08=16;
+const WAVE_FORMAT_2S08=32;
+const WAVE_FORMAT_2M16=64;
+const WAVE_FORMAT_2S16=128;
+const WAVE_FORMAT_4M08=256;
+const WAVE_FORMAT_4S08=512;
+const WAVE_FORMAT_4M16=1024;
+const WAVE_FORMAT_4S16=2048;
+const WAVE_FORMAT_PCM=1;
+
+enum {
+	MIDIERR_UNPREPARED = MIDIERR_BASE,
+	MIDIERR_STILLPLAYING,
+	MIDIERR_NOMAP,
+	MIDIERR_NOTREADY,
+	MIDIERR_NODEVICE,
+	MIDIERR_INVALIDSETUP,
+	MIDIERR_BADOPENMODE,
+	MIDIERR_DONT_CONTINUE, // = MIDIERR_BASE+7
+	MIDIERR_LASTERROR = MIDIERR_DONT_CONTINUE
+}
+
+const MIDIPATCHSIZE=128;
+
+const MIM_OPEN=MM_MIM_OPEN;
+const MIM_CLOSE=MM_MIM_CLOSE;
+const MIM_DATA=MM_MIM_DATA;
+const MIM_LONGDATA=MM_MIM_LONGDATA;
+const MIM_ERROR=MM_MIM_ERROR;
+const MIM_LONGERROR=MM_MIM_LONGERROR;
+const MOM_OPEN=MM_MOM_OPEN;
+const MOM_CLOSE=MM_MOM_CLOSE;
+const MOM_DONE=MM_MOM_DONE;
+const MIM_MOREDATA=MM_MIM_MOREDATA;
+const MOM_POSITIONCB=MM_MOM_POSITIONCB;
+
+const UINT MIDIMAPPER= -1; // FIXME: uint is nonsense for this!
+const UINT MIDI_MAPPER= -1; // FIXME: uint is nonsense for this!
+const MIDI_IO_STATUS=32;
+const MIDI_CACHE_ALL=1;
+const MIDI_CACHE_BESTFIT=2;
+const MIDI_CACHE_QUERY=3;
+const MIDI_UNCACHE=4;
+const MOD_MIDIPORT=1;
+const MOD_SYNTH=2;
+const MOD_SQSYNTH=3;
+const MOD_FMSYNTH=4;
+const MOD_MAPPER=5;
+const MIDICAPS_VOLUME=1;
+const MIDICAPS_LRVOLUME=2;
+const MIDICAPS_CACHE=4;
+const MIDICAPS_STREAM=8;
+const MHDR_DONE=1;
+const MHDR_PREPARED=2;
+const MHDR_INQUEUE=4;
+const MHDR_ISSTRM=8;
+const MEVT_F_SHORT=0;
+const MEVT_F_LONG=0x80000000;
+const MEVT_F_CALLBACK=0x40000000;
+
+BYTE MEVT_EVENTTYPE(DWORD x) { return cast(BYTE)((x>>24) &0xFF); }
+DWORD MEVT_EVENTPARM(DWORD x) { return x & 0xFFFFFF; }
+
+const MEVT_SHORTMSG=0;
+const MEVT_TEMPO=1;
+const MEVT_NOP=2;
+
+const BYTE MEVT_LONGMSG = 0x80;
+const BYTE MEVT_COMMENT = 0x82;
+const BYTE MEVT_VERSION = 0x84;
+
+const MIDISTRM_ERROR = -2;
+
+const MIDIPROP_SET = 0x80000000;
+const MIDIPROP_GET = 0x40000000;
+const MIDIPROP_TIMEDIV = 1;
+const MIDIPROP_TEMPO = 2;
+
+const UINT AUX_MAPPER = -1;
+
+const AUXCAPS_CDAUDIO=1;
+const AUXCAPS_AUXIN=2;
+const AUXCAPS_VOLUME=1;
+const AUXCAPS_LRVOLUME=2;
+const MIXER_SHORT_NAME_CHARS=16;
+const MIXER_LONG_NAME_CHARS=64;
+const MIXERR_INVALLINE=MIXERR_BASE;
+const MIXERR_INVALCONTROL=(MIXERR_BASE+1);
+const MIXERR_INVALVALUE=(MIXERR_BASE+2);
+const MIXERR_LASTERROR=(MIXERR_BASE+2);
+
+const MIXER_OBJECTF_HANDLE=0x80000000;
+const MIXER_OBJECTF_MIXER=0;
+const MIXER_OBJECTF_HMIXER=(MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIXER);
+const MIXER_OBJECTF_WAVEOUT=0x10000000;
+const MIXER_OBJECTF_HWAVEOUT=(MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_WAVEOUT);
+const MIXER_OBJECTF_WAVEIN=0x20000000;
+const MIXER_OBJECTF_HWAVEIN=(MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_WAVEIN);
+const MIXER_OBJECTF_MIDIOUT=0x30000000;
+const MIXER_OBJECTF_HMIDIOUT=(MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIDIOUT);
+const MIXER_OBJECTF_MIDIIN=0x40000000;
+const MIXER_OBJECTF_HMIDIIN=(MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIDIIN);
+const MIXER_OBJECTF_AUX=0x50000000;
+
+const MIXERLINE_LINEF_ACTIVE=1;
+const MIXERLINE_LINEF_DISCONNECTED=0x8000;
+const MIXERLINE_LINEF_SOURCE=0x80000000;
+
+const MIXERLINE_COMPONENTTYPE_DST_FIRST=0;
+const MIXERLINE_COMPONENTTYPE_DST_UNDEFINED=MIXERLINE_COMPONENTTYPE_DST_FIRST;
+const MIXERLINE_COMPONENTTYPE_DST_DIGITAL=(MIXERLINE_COMPONENTTYPE_DST_FIRST+1);
+const MIXERLINE_COMPONENTTYPE_DST_LINE=(MIXERLINE_COMPONENTTYPE_DST_FIRST+2);
+const MIXERLINE_COMPONENTTYPE_DST_MONITOR=(MIXERLINE_COMPONENTTYPE_DST_FIRST+3);
+const MIXERLINE_COMPONENTTYPE_DST_SPEAKERS=(MIXERLINE_COMPONENTTYPE_DST_FIRST+4);
+const MIXERLINE_COMPONENTTYPE_DST_HEADPHONES=(MIXERLINE_COMPONENTTYPE_DST_FIRST+5);
+const MIXERLINE_COMPONENTTYPE_DST_TELEPHONE=(MIXERLINE_COMPONENTTYPE_DST_FIRST+6);
+const MIXERLINE_COMPONENTTYPE_DST_WAVEIN=(MIXERLINE_COMPONENTTYPE_DST_FIRST+7);
+const MIXERLINE_COMPONENTTYPE_DST_VOICEIN=(MIXERLINE_COMPONENTTYPE_DST_FIRST+8);
+const MIXERLINE_COMPONENTTYPE_DST_LAST=(MIXERLINE_COMPONENTTYPE_DST_FIRST+8);
+const MIXERLINE_COMPONENTTYPE_SRC_FIRST=0x1000;
+const MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED=MIXERLINE_COMPONENTTYPE_SRC_FIRST;
+const MIXERLINE_COMPONENTTYPE_SRC_DIGITAL=(MIXERLINE_COMPONENTTYPE_SRC_FIRST+1);
+const MIXERLINE_COMPONENTTYPE_SRC_LINE=(MIXERLINE_COMPONENTTYPE_SRC_FIRST+2);
+const MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE=(MIXERLINE_COMPONENTTYPE_SRC_FIRST+3);
+const MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER=(MIXERLINE_COMPONENTTYPE_SRC_FIRST+4);
+const MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC=(MIXERLINE_COMPONENTTYPE_SRC_FIRST+5);
+const MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE=(MIXERLINE_COMPONENTTYPE_SRC_FIRST+6);
+const MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER=(MIXERLINE_COMPONENTTYPE_SRC_FIRST+7);
+const MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT=(MIXERLINE_COMPONENTTYPE_SRC_FIRST+8);
+const MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY=(MIXERLINE_COMPONENTTYPE_SRC_FIRST+9);
+const MIXERLINE_COMPONENTTYPE_SRC_ANALOG=(MIXERLINE_COMPONENTTYPE_SRC_FIRST+10);
+const MIXERLINE_COMPONENTTYPE_SRC_LAST=(MIXERLINE_COMPONENTTYPE_SRC_FIRST+10);
+
+enum {
+	MIXERLINE_TARGETTYPE_UNDEFINED = 0,
+	MIXERLINE_TARGETTYPE_WAVEOUT,
+	MIXERLINE_TARGETTYPE_WAVEIN,
+	MIXERLINE_TARGETTYPE_MIDIOUT,
+	MIXERLINE_TARGETTYPE_MIDIIN,
+	MIXERLINE_TARGETTYPE_AUX // =5
+}
+
+const MIXER_GETLINEINFOF_DESTINATION=0;
+const MIXER_GETLINEINFOF_SOURCE=1;
+const MIXER_GETLINEINFOF_LINEID=2;
+const MIXER_GETLINEINFOF_COMPONENTTYPE=3;
+const MIXER_GETLINEINFOF_TARGETTYPE=4;
+const MIXER_GETLINEINFOF_QUERYMASK=15;
+
+const MIXERCONTROL_CONTROLF_UNIFORM=1;
+const MIXERCONTROL_CONTROLF_MULTIPLE=2;
+const MIXERCONTROL_CONTROLF_DISABLED=0x80000000;
+const MIXERCONTROL_CT_CLASS_MASK=0xF0000000;
+const MIXERCONTROL_CT_CLASS_CUSTOM=0;
+const MIXERCONTROL_CT_CLASS_METER=0x10000000;
+const MIXERCONTROL_CT_CLASS_SWITCH=0x20000000;
+const MIXERCONTROL_CT_CLASS_NUMBER=0x30000000;
+const MIXERCONTROL_CT_CLASS_SLIDER=0x40000000;
+const MIXERCONTROL_CT_CLASS_FADER=0x50000000;
+const MIXERCONTROL_CT_CLASS_TIME=0x60000000;
+const MIXERCONTROL_CT_CLASS_LIST=0x70000000;
+const MIXERCONTROL_CT_SUBCLASS_MASK=0xF000000;
+const MIXERCONTROL_CT_SC_SWITCH_BOOLEAN=0;
+const MIXERCONTROL_CT_SC_SWITCH_BUTTON=0x1000000;
+const MIXERCONTROL_CT_SC_METER_POLLED=0;
+const MIXERCONTROL_CT_SC_TIME_MICROSECS=0;
+const MIXERCONTROL_CT_SC_TIME_MILLISECS=0x1000000;
+const MIXERCONTROL_CT_SC_LIST_SINGLE=0;
+const MIXERCONTROL_CT_SC_LIST_MULTIPLE=0x1000000;
+const MIXERCONTROL_CT_UNITS_MASK=0xFF0000;
+const MIXERCONTROL_CT_UNITS_CUSTOM=0;
+const MIXERCONTROL_CT_UNITS_BOOLEAN=0x10000;
+const MIXERCONTROL_CT_UNITS_SIGNED=0x20000;
+const MIXERCONTROL_CT_UNITS_UNSIGNED=0x30000;
+const MIXERCONTROL_CT_UNITS_DECIBELS=0x40000;
+const MIXERCONTROL_CT_UNITS_PERCENT=0x50000;
+
+const MIXERCONTROL_CONTROLTYPE_CUSTOM=(MIXERCONTROL_CT_CLASS_CUSTOM|MIXERCONTROL_CT_UNITS_CUSTOM);
+const MIXERCONTROL_CONTROLTYPE_BOOLEANMETER=(MIXERCONTROL_CT_CLASS_METER|MIXERCONTROL_CT_SC_METER_POLLED|MIXERCONTROL_CT_UNITS_BOOLEAN);
+const MIXERCONTROL_CONTROLTYPE_SIGNEDMETER=(MIXERCONTROL_CT_CLASS_METER|MIXERCONTROL_CT_SC_METER_POLLED|MIXERCONTROL_CT_UNITS_SIGNED);
+const MIXERCONTROL_CONTROLTYPE_PEAKMETER=(MIXERCONTROL_CONTROLTYPE_SIGNEDMETER+1);
+const MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER=(MIXERCONTROL_CT_CLASS_METER|MIXERCONTROL_CT_SC_METER_POLLED|MIXERCONTROL_CT_UNITS_UNSIGNED);
+const MIXERCONTROL_CONTROLTYPE_BOOLEAN=(MIXERCONTROL_CT_CLASS_SWITCH|MIXERCONTROL_CT_SC_SWITCH_BOOLEAN|MIXERCONTROL_CT_UNITS_BOOLEAN);
+const MIXERCONTROL_CONTROLTYPE_ONOFF=(MIXERCONTROL_CONTROLTYPE_BOOLEAN+1);
+const MIXERCONTROL_CONTROLTYPE_MUTE=(MIXERCONTROL_CONTROLTYPE_BOOLEAN+2);
+const MIXERCONTROL_CONTROLTYPE_MONO=(MIXERCONTROL_CONTROLTYPE_BOOLEAN+3);
+const MIXERCONTROL_CONTROLTYPE_LOUDNESS=(MIXERCONTROL_CONTROLTYPE_BOOLEAN+4);
+const MIXERCONTROL_CONTROLTYPE_STEREOENH=(MIXERCONTROL_CONTROLTYPE_BOOLEAN+5);
+const MIXERCONTROL_CONTROLTYPE_BUTTON=(MIXERCONTROL_CT_CLASS_SWITCH|MIXERCONTROL_CT_SC_SWITCH_BUTTON|MIXERCONTROL_CT_UNITS_BOOLEAN);
+const MIXERCONTROL_CONTROLTYPE_DECIBELS=(MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_DECIBELS);
+const MIXERCONTROL_CONTROLTYPE_SIGNED=(MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_SIGNED);
+const MIXERCONTROL_CONTROLTYPE_UNSIGNED=(MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_UNSIGNED);
+const MIXERCONTROL_CONTROLTYPE_PERCENT=(MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_PERCENT);
+const MIXERCONTROL_CONTROLTYPE_SLIDER=(MIXERCONTROL_CT_CLASS_SLIDER|MIXERCONTROL_CT_UNITS_SIGNED);
+const MIXERCONTROL_CONTROLTYPE_PAN=(MIXERCONTROL_CONTROLTYPE_SLIDER+1);
+const MIXERCONTROL_CONTROLTYPE_QSOUNDPAN=(MIXERCONTROL_CONTROLTYPE_SLIDER+2);
+const MIXERCONTROL_CONTROLTYPE_FADER=(MIXERCONTROL_CT_CLASS_FADER|MIXERCONTROL_CT_UNITS_UNSIGNED);
+const MIXERCONTROL_CONTROLTYPE_VOLUME=(MIXERCONTROL_CONTROLTYPE_FADER+1);
+const MIXERCONTROL_CONTROLTYPE_BASS=(MIXERCONTROL_CONTROLTYPE_FADER+2);
+const MIXERCONTROL_CONTROLTYPE_TREBLE=(MIXERCONTROL_CONTROLTYPE_FADER+3);
+const MIXERCONTROL_CONTROLTYPE_EQUALIZER=(MIXERCONTROL_CONTROLTYPE_FADER+4);
+const MIXERCONTROL_CONTROLTYPE_SINGLESELECT=(MIXERCONTROL_CT_CLASS_LIST|MIXERCONTROL_CT_SC_LIST_SINGLE|MIXERCONTROL_CT_UNITS_BOOLEAN);
+const MIXERCONTROL_CONTROLTYPE_MUX=(MIXERCONTROL_CONTROLTYPE_SINGLESELECT+1);
+const MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT=(MIXERCONTROL_CT_CLASS_LIST|MIXERCONTROL_CT_SC_LIST_MULTIPLE|MIXERCONTROL_CT_UNITS_BOOLEAN);
+const MIXERCONTROL_CONTROLTYPE_MIXER=(MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT+1);
+const MIXERCONTROL_CONTROLTYPE_MICROTIME=(MIXERCONTROL_CT_CLASS_TIME|MIXERCONTROL_CT_SC_TIME_MICROSECS|MIXERCONTROL_CT_UNITS_UNSIGNED);
+const MIXERCONTROL_CONTROLTYPE_MILLITIME=(MIXERCONTROL_CT_CLASS_TIME|MIXERCONTROL_CT_SC_TIME_MILLISECS|MIXERCONTROL_CT_UNITS_UNSIGNED);
+
+const MIXER_GETLINECONTROLSF_ALL=0;
+const MIXER_GETLINECONTROLSF_ONEBYID=1;
+const MIXER_GETLINECONTROLSF_ONEBYTYPE=2;
+const MIXER_GETLINECONTROLSF_QUERYMASK=15;
+const MIXER_GETCONTROLDETAILSF_VALUE=0;
+const MIXER_GETCONTROLDETAILSF_LISTTEXT=1;
+const MIXER_GETCONTROLDETAILSF_QUERYMASK=15;
+const MIXER_SETCONTROLDETAILSF_VALUE=0;
+const MIXER_SETCONTROLDETAILSF_CUSTOM=1;
+const MIXER_SETCONTROLDETAILSF_QUERYMASK=15;
+
+const TIMERR_NOERROR=0;
+const TIMERR_NOCANDO=(TIMERR_BASE+1);
+const TIMERR_STRUCT=(TIMERR_BASE+33);
+const TIME_ONESHOT=0;
+const TIME_PERIODIC=1;
+const TIME_CALLBACK_FUNCTION=0;
+const TIME_CALLBACK_EVENT_SET=16;
+const TIME_CALLBACK_EVENT_PULSE=32;
+
+static if (WINVER >= 0x0501) {
+
+const TIME_KILL_SYNCHRONOUS=0x0100;
+
+}
+
+const JOYERR_NOERROR = 0;
+const JOYERR_PARMS=(JOYERR_BASE+5);
+const JOYERR_NOCANDO=(JOYERR_BASE+6);
+const JOYERR_UNPLUGGED=(JOYERR_BASE+7);
+
+const JOY_BUTTON1=1;
+const JOY_BUTTON2=2;
+const JOY_BUTTON3=4;
+const JOY_BUTTON4=8;
+const JOY_BUTTON1CHG=256;
+const JOY_BUTTON2CHG=512;
+const JOY_BUTTON3CHG=1024;
+const JOY_BUTTON4CHG=2048;
+const JOY_BUTTON5=257;
+const JOY_BUTTON6=513;
+const JOY_BUTTON7=1025;
+const JOY_BUTTON8=2049;
+const JOY_BUTTON9=256;
+const JOY_BUTTON10=512;
+const JOY_BUTTON11=1024;
+const JOY_BUTTON12=2048;
+const JOY_BUTTON13=4096;
+const JOY_BUTTON14=8192;
+const JOY_BUTTON15=16384;
+const JOY_BUTTON16=32768;
+const JOY_BUTTON17=65536;
+const JOY_BUTTON18=0x20000;
+const JOY_BUTTON19=0x40000;
+const JOY_BUTTON20=0x80000;
+const JOY_BUTTON21=0x100000;
+const JOY_BUTTON22=0x200000;
+const JOY_BUTTON23=0x400000;
+const JOY_BUTTON24=0x800000;
+const JOY_BUTTON25=0x1000000;
+const JOY_BUTTON26=0x2000000;
+const JOY_BUTTON27=0x4000000;
+const JOY_BUTTON28=0x8000000;
+const JOY_BUTTON29=0x10000000;
+const JOY_BUTTON30=0x20000000;
+const JOY_BUTTON31=0x40000000;
+const JOY_BUTTON32=0x80000000;
+
+enum  : DWORD {
+	JOY_POVCENTERED = -1,
+	JOY_POVFORWARD  = 0,
+	JOY_POVBACKWARD = 18000,
+	JOY_POVLEFT     = 27000,
+	JOY_POVRIGHT    = 9000
+}
+
+const DWORD
+	JOY_RETURNX        = 0x00000001,
+	JOY_RETURNY        = 0x00000002,
+	JOY_RETURNZ        = 0x00000004,
+	JOY_RETURNR        = 0x00000008,
+	JOY_RETURNU        = 0x00000010,
+	JOY_RETURNV        = 0x00000020,
+	JOY_RETURNPOV      = 0x00000040,
+	JOY_RETURNBUTTONS  = 0x00000080,
+	JOY_RETURNRAWDATA  = 0x00000100,
+	JOY_RETURNPOVCTS   = 0x00000200,
+	JOY_RETURNCENTERED = 0x00000400,
+	JOY_USEDEADZONE    = 0x00000800,
+	JOY_RETURNALL      = JOY_RETURNX | JOY_RETURNY | JOY_RETURNZ | JOY_RETURNR
+	                     | JOY_RETURNU | JOY_RETURNV | JOY_RETURNPOV
+	                     | JOY_RETURNBUTTONS,
+	JOY_CAL_READALWAYS = 0x00010000,
+	JOY_CAL_READXYONLY = 0x00020000,
+	JOY_CAL_READ3      = 0x00040000,
+	JOY_CAL_READ4      = 0x00080000,
+	JOY_CAL_READXONLY  = 0x00100000,
+	JOY_CAL_READYONLY  = 0x00200000,
+	JOY_CAL_READ5      = 0x00400000,
+	JOY_CAL_READ6      = 0x00800000,
+	JOY_CAL_READZONLY  = 0x01000000,
+	JOY_CAL_READRONLY  = 0x02000000,
+	JOY_CAL_READUONLY  = 0x04000000,
+	JOY_CAL_READVONLY  = 0x08000000;
+
+const JOYSTICKID1=0;
+const JOYSTICKID2=1;
+
+const JOYCAPS_HASZ=1;
+const JOYCAPS_HASR=2;
+const JOYCAPS_HASU=4;
+const JOYCAPS_HASV=8;
+const JOYCAPS_HASPOV=16;
+const JOYCAPS_POV4DIR=32;
+const JOYCAPS_POVCTS=64;
+
+const MMIOERR_BASE=256;
+const MMIOERR_FILENOTFOUND=(MMIOERR_BASE+1);
+const MMIOERR_OUTOFMEMORY=(MMIOERR_BASE+2);
+const MMIOERR_CANNOTOPEN=(MMIOERR_BASE+3);
+const MMIOERR_CANNOTCLOSE=(MMIOERR_BASE+4);
+const MMIOERR_CANNOTREAD=(MMIOERR_BASE+5);
+const MMIOERR_CANNOTWRITE=(MMIOERR_BASE+6);
+const MMIOERR_CANNOTSEEK=(MMIOERR_BASE+7);
+const MMIOERR_CANNOTEXPAND=(MMIOERR_BASE+8);
+const MMIOERR_CHUNKNOTFOUND=(MMIOERR_BASE+9);
+const MMIOERR_UNBUFFERED=(MMIOERR_BASE+10);
+const MMIOERR_PATHNOTFOUND=(MMIOERR_BASE+11);
+const MMIOERR_ACCESSDENIED=(MMIOERR_BASE+12);
+const MMIOERR_SHARINGVIOLATION=(MMIOERR_BASE+13);
+const MMIOERR_NETWORKERROR=(MMIOERR_BASE+14);
+const MMIOERR_TOOMANYOPENFILES=(MMIOERR_BASE+15);
+const MMIOERR_INVALIDFILE=(MMIOERR_BASE+16);
+
+const CFSEPCHAR='+';
+
+const MMIO_RWMODE=3;
+const MMIO_SHAREMODE=0x70;
+const MMIO_CREATE=0x1000;
+const MMIO_PARSE=256;
+const MMIO_DELETE=512;
+const MMIO_EXIST=0x4000;
+const MMIO_ALLOCBUF=0x10000;
+const MMIO_GETTEMP=0x20000;
+const MMIO_DIRTY=0x10000000;
+const MMIO_READ=0;
+const MMIO_WRITE=1;
+const MMIO_READWRITE=2;
+const MMIO_COMPAT=0;
+const MMIO_EXCLUSIVE=16;
+const MMIO_DENYWRITE=32;
+const MMIO_DENYREAD=0x30;
+const MMIO_DENYNONE=64;
+const MMIO_FHOPEN=16;
+const MMIO_EMPTYBUF=16;
+const MMIO_TOUPPER=16;
+const MMIO_INSTALLPROC=0x10000;
+const MMIO_GLOBALPROC=0x10000000;
+const MMIO_REMOVEPROC=0x20000;
+const MMIO_UNICODEPROC=0x1000000;
+const MMIO_FINDPROC=0x40000;
+const MMIO_FINDCHUNK=16;
+const MMIO_FINDRIFF=32;
+const MMIO_FINDLIST=64;
+const MMIO_CREATERIFF=32;
+const MMIO_CREATELIST=64;
+const MMIOM_READ=MMIO_READ;
+const MMIOM_WRITE=MMIO_WRITE;
+const MMIOM_SEEK=2;
+const MMIOM_OPEN=3;
+const MMIOM_CLOSE=4;
+const MMIOM_WRITEFLUSH=5;
+const MMIOM_RENAME=6;
+const MMIOM_USER=0x8000;
+
+const FOURCC_RIFF = mmioFOURCC!('R', 'I', 'F', 'F');
+const FOURCC_LIST = mmioFOURCC!('L', 'I', 'S', 'T');
+const FOURCC_DOS  = mmioFOURCC!('D', 'O', 'S', ' ');
+const FOURCC_MEM  = mmioFOURCC!('M', 'E', 'M', ' ');
+
+const MMIO_DEFAULTBUFFER=8192;
+
+enum {
+	MCIERR_INVALID_DEVICE_ID = MCIERR_BASE + 1,
+	MCIERR_UNRECOGNIZED_KEYWORD = MCIERR_BASE + 3,
+	MCIERR_UNRECOGNIZED_COMMAND = MCIERR_BASE + 5,
+	MCIERR_HARDWARE,
+	MCIERR_INVALID_DEVICE_NAME,
+	MCIERR_OUT_OF_MEMORY,
+	MCIERR_DEVICE_OPEN,
+	MCIERR_CANNOT_LOAD_DRIVER,
+	MCIERR_MISSING_COMMAND_STRING,
+	MCIERR_PARAM_OVERFLOW,
+	MCIERR_MISSING_STRING_ARGUMENT,
+	MCIERR_BAD_INTEGER,
+	MCIERR_PARSER_INTERNAL,
+	MCIERR_DRIVER_INTERNAL,
+	MCIERR_MISSING_PARAMETER,
+	MCIERR_UNSUPPORTED_FUNCTION,
+	MCIERR_FILE_NOT_FOUND,
+	MCIERR_DEVICE_NOT_READY,
+	MCIERR_INTERNAL,
+	MCIERR_DRIVER,
+	MCIERR_CANNOT_USE_ALL,
+	MCIERR_MULTIPLE,
+	MCIERR_EXTENSION_NOT_FOUND,
+	MCIERR_OUTOFRANGE, // = MCIERR_BASE+26
+	MCIERR_FLAGS_NOT_COMPATIBLE = MCIERR_BASE + 28,
+	MCIERR_FILE_NOT_SAVED = MCIERR_BASE + 30,
+	MCIERR_DEVICE_TYPE_REQUIRED,
+	MCIERR_DEVICE_LOCKED,
+	MCIERR_DUPLICATE_ALIAS,
+	MCIERR_BAD_CONSTANT,
+	MCIERR_MUST_USE_SHAREABLE,
+	MCIERR_MISSING_DEVICE_NAME,
+	MCIERR_BAD_TIME_FORMAT,
+	MCIERR_NO_CLOSING_QUOTE,
+	MCIERR_DUPLICATE_FLAGS,
+	MCIERR_INVALID_FILE,
+	MCIERR_NULL_PARAMETER_BLOCK,
+	MCIERR_UNNAMED_RESOURCE,
+	MCIERR_NEW_REQUIRES_ALIAS,
+	MCIERR_NOTIFY_ON_AUTO_OPEN,
+	MCIERR_NO_ELEMENT_ALLOWED,
+	MCIERR_NONAPPLICABLE_FUNCTION,
+	MCIERR_ILLEGAL_FOR_AUTO_OPEN,
+	MCIERR_FILENAME_REQUIRED,
+	MCIERR_EXTRA_CHARACTERS,
+	MCIERR_DEVICE_NOT_INSTALLED,
+	MCIERR_GET_CD,
+	MCIERR_SET_CD,
+	MCIERR_SET_DRIVE,
+	MCIERR_DEVICE_LENGTH,
+	MCIERR_DEVICE_ORD_LENGTH,
+	MCIERR_NO_INTEGER, // = MCIERR_BASE + 56
+	MCIERR_WAVE_OUTPUTSINUSE = MCIERR_BASE + 64,
+	MCIERR_WAVE_SETOUTPUTINUSE,
+	MCIERR_WAVE_INPUTSINUSE,
+	MCIERR_WAVE_SETINPUTINUSE,
+	MCIERR_WAVE_OUTPUTUNSPECIFIED,
+	MCIERR_WAVE_INPUTUNSPECIFIED,
+	MCIERR_WAVE_OUTPUTSUNSUITABLE,
+	MCIERR_WAVE_SETOUTPUTUNSUITABLE,
+	MCIERR_WAVE_INPUTSUNSUITABLE,
+	MCIERR_WAVE_SETINPUTUNSUITABLE, // = MCIERR_BASE + 73
+	MCIERR_SEQ_DIV_INCOMPATIBLE = MCIERR_BASE + 80,
+	MCIERR_SEQ_PORT_INUSE,
+	MCIERR_SEQ_PORT_NONEXISTENT,
+	MCIERR_SEQ_PORT_MAPNODEVICE,
+	MCIERR_SEQ_PORT_MISCERROR,
+	MCIERR_SEQ_TIMER,
+	MCIERR_SEQ_PORTUNSPECIFIED,
+	MCIERR_SEQ_NOMIDIPRESENT, // = MCIERR_BASE + 87
+	MCIERR_NO_WINDOW = MCIERR_BASE + 90,
+	MCIERR_CREATEWINDOW,
+	MCIERR_FILE_READ,
+	MCIERR_FILE_WRITE,
+	MCIERR_NO_IDENTITY // = MCIERR_BASE + 94
+}
+const MCIERR_CUSTOM_DRIVER_BASE = MCIERR_BASE + 256;
+
+const MCI_FIRST=DRV_MCI_FIRST;
+const MCI_OPEN=0x803;
+const MCI_CLOSE=0x804;
+const MCI_ESCAPE=0x805;
+const MCI_PLAY=0x806;
+const MCI_SEEK=0x807;
+const MCI_STOP=0x808;
+const MCI_PAUSE=0x809;
+const MCI_INFO=0x80A;
+const MCI_GETDEVCAPS=0x80B;
+const MCI_SPIN=0x80C;
+const MCI_SET=0x80D;
+const MCI_STEP=0x80E;
+const MCI_RECORD=0x80F;
+const MCI_SYSINFO=0x810;
+const MCI_BREAK=0x811;
+const MCI_SAVE=0x813;
+const MCI_STATUS=0x814;
+const MCI_CUE=0x830;
+const MCI_REALIZE=0x840;
+const MCI_WINDOW=0x841;
+const MCI_PUT=0x842;
+const MCI_WHERE=0x843;
+const MCI_FREEZE=0x844;
+const MCI_UNFREEZE=0x845;
+const MCI_LOAD=0x850;
+const MCI_CUT=0x851;
+const MCI_COPY=0x852;
+const MCI_PASTE=0x853;
+const MCI_UPDATE=0x854;
+const MCI_RESUME=0x855;
+const MCI_DELETE=0x856;
+const MCI_USER_MESSAGES=(DRV_MCI_FIRST+0x400);
+const MCI_LAST=0xFFF;
+
+const MCIDEVICEID MCI_ALL_DEVICE_ID = -1;
+
+const MCI_DEVTYPE_VCR=513;
+const MCI_DEVTYPE_VIDEODISC=514;
+const MCI_DEVTYPE_OVERLAY=515;
+const MCI_DEVTYPE_CD_AUDIO=516;
+const MCI_DEVTYPE_DAT=517;
+const MCI_DEVTYPE_SCANNER=518;
+const MCI_DEVTYPE_ANIMATION=519;
+const MCI_DEVTYPE_DIGITAL_VIDEO=520;
+const MCI_DEVTYPE_OTHER=521;
+const MCI_DEVTYPE_WAVEFORM_AUDIO=522;
+const MCI_DEVTYPE_SEQUENCER=523;
+const MCI_DEVTYPE_FIRST=MCI_DEVTYPE_VCR;
+const MCI_DEVTYPE_LAST=MCI_DEVTYPE_SEQUENCER;
+const MCI_DEVTYPE_FIRST_USER=0x1000;
+const MCI_MODE_NOT_READY=(MCI_STRING_OFFSET+12);
+const MCI_MODE_STOP=(MCI_STRING_OFFSET+13);
+const MCI_MODE_PLAY=(MCI_STRING_OFFSET+14);
+const MCI_MODE_RECORD=(MCI_STRING_OFFSET+15);
+const MCI_MODE_SEEK=(MCI_STRING_OFFSET+16);
+const MCI_MODE_PAUSE=(MCI_STRING_OFFSET+17);
+const MCI_MODE_OPEN=(MCI_STRING_OFFSET+18);
+const MCI_FORMAT_MILLISECONDS=0;
+const MCI_FORMAT_HMS=1;
+const MCI_FORMAT_MSF=2;
+const MCI_FORMAT_FRAMES=3;
+const MCI_FORMAT_SMPTE_24=4;
+const MCI_FORMAT_SMPTE_25=5;
+const MCI_FORMAT_SMPTE_30=6;
+const MCI_FORMAT_SMPTE_30DROP=7;
+const MCI_FORMAT_BYTES=8;
+const MCI_FORMAT_SAMPLES=9;
+const MCI_FORMAT_TMSF=10;
+
+
+
+
+// Macros
+BYTE MCI_HMS_HOUR(DWORD t) { return cast(BYTE)(t); }
+BYTE MCI_HMS_MINUTE(DWORD t) { return cast(BYTE)(t>>>8); }
+BYTE MCI_HMS_SECOND(DWORD t) { return cast(BYTE)( t>>>16); }
+DWORD MCI_MAKE_HMS(BYTE h, BYTE m, BYTE s) { return h |(m<<8)|(cast(DWORD)(s)<<16); }
+DWORD MCI_MAKE_MSF(BYTE m, BYTE s, BYTE f) { return m |(s<<8)|(cast(DWORD)(f)<<16); }
+DWORD MCI_MAKE_TMSF(BYTE t, BYTE m, BYTE s, BYTE f) {
+ return t |(m<<8)|(s<<16)|(cast(DWORD)(f)<< 24); }
+
+BYTE MCI_MSF_MINUTE(DWORD t) { return cast(BYTE)(t); }
+BYTE MCI_MSF_SECOND(DWORD t) { return cast(BYTE)(t >>> 8); }
+BYTE MCI_MSF_FRAME(DWORD t)  {  return cast(BYTE)(t >>> 16); }
+
+BYTE MCI_TMSF_TRACK(DWORD t)  { return cast(BYTE)(t); }
+BYTE MCI_TMSF_MINUTE(DWORD t) { return cast(BYTE)(t>>8); }
+BYTE MCI_TMSF_SECOND(DWORD t) { return cast(BYTE)(t>>16); }
+BYTE MCI_TMSF_FRAME(DWORD t)  { return cast(BYTE)(t>>24); }
+
+
+const MCI_NOTIFY_SUCCESSFUL=1;
+const MCI_NOTIFY_SUPERSEDED=2;
+const MCI_NOTIFY_ABORTED=4;
+const MCI_NOTIFY_FAILURE=8;
+const MCI_NOTIFY=1;
+const MCI_WAIT=2;
+const MCI_FROM=4;
+const MCI_TO=8;
+const MCI_TRACK=16;
+const MCI_OPEN_SHAREABLE=256;
+const MCI_OPEN_ELEMENT=512;
+const MCI_OPEN_ALIAS=1024;
+const MCI_OPEN_ELEMENT_ID=2048;
+const MCI_OPEN_TYPE_ID=0x1000;
+const MCI_OPEN_TYPE=0x2000;
+const MCI_SEEK_TO_START=256;
+const MCI_SEEK_TO_END=512;
+const MCI_STATUS_ITEM=256;
+const MCI_STATUS_START=512;
+const MCI_STATUS_LENGTH=1;
+const MCI_STATUS_POSITION=2;
+const MCI_STATUS_NUMBER_OF_TRACKS=3;
+const MCI_STATUS_MODE=4;
+const MCI_STATUS_MEDIA_PRESENT=5;
+const MCI_STATUS_TIME_FORMAT=6;
+const MCI_STATUS_READY=7;
+const MCI_STATUS_CURRENT_TRACK=8;
+const MCI_INFO_PRODUCT=256;
+const MCI_INFO_FILE=512;
+const MCI_INFO_MEDIA_UPC=1024;
+const MCI_INFO_MEDIA_IDENTITY=2048;
+const MCI_INFO_NAME=0x1000;
+const MCI_INFO_COPYRIGHT=0x2000;
+
+const MCI_GETDEVCAPS_ITEM=256;
+const MCI_GETDEVCAPS_CAN_RECORD=1;
+const MCI_GETDEVCAPS_HAS_AUDIO=2;
+const MCI_GETDEVCAPS_HAS_VIDEO=3;
+const MCI_GETDEVCAPS_DEVICE_TYPE=4;
+const MCI_GETDEVCAPS_USES_FILES=5;
+const MCI_GETDEVCAPS_COMPOUND_DEVICE=6;
+const MCI_GETDEVCAPS_CAN_EJECT=7;
+const MCI_GETDEVCAPS_CAN_PLAY=8;
+const MCI_GETDEVCAPS_CAN_SAVE=9;
+
+const MCI_SYSINFO_QUANTITY=256;
+const MCI_SYSINFO_OPEN=512;
+const MCI_SYSINFO_NAME=1024;
+const MCI_SYSINFO_INSTALLNAME=2048;
+const MCI_SET_DOOR_OPEN=256;
+const MCI_SET_DOOR_CLOSED=512;
+const MCI_SET_TIME_FORMAT=1024;
+const MCI_SET_AUDIO=2048;
+const MCI_SET_VIDEO=0x1000;
+const MCI_SET_ON=0x2000;
+const MCI_SET_OFF=0x4000;
+
+const MCI_SET_AUDIO_ALL=0;
+const MCI_SET_AUDIO_LEFT=1;
+const MCI_SET_AUDIO_RIGHT=2;
+
+const MCI_BREAK_KEY=256;
+const MCI_BREAK_HWND=512;
+const MCI_BREAK_OFF=1024;
+
+const MCI_RECORD_INSERT=256;
+const MCI_RECORD_OVERWRITE=512;
+const MCI_SAVE_FILE=256;
+const MCI_LOAD_FILE=256;
+
+const MCI_VD_MODE_PARK=(MCI_VD_OFFSET+1);
+const MCI_VD_MEDIA_CLV=(MCI_VD_OFFSET+2);
+const MCI_VD_MEDIA_CAV=(MCI_VD_OFFSET+3);
+const MCI_VD_MEDIA_OTHER=(MCI_VD_OFFSET+4);
+
+const MCI_VD_FORMAT_TRACK=0x4001;
+const MCI_VD_PLAY_REVERSE=0x10000;
+const MCI_VD_PLAY_FAST=0x20000;
+const MCI_VD_PLAY_SPEED=0x40000;
+const MCI_VD_PLAY_SCAN=0x80000;
+const MCI_VD_PLAY_SLOW=0x100000;
+const MCI_VD_SEEK_REVERSE=0x10000;
+const MCI_VD_STATUS_SPEED=0x4002;
+const MCI_VD_STATUS_FORWARD=0x4003;
+const MCI_VD_STATUS_MEDIA_TYPE=0x4004;
+const MCI_VD_STATUS_SIDE=0x4005;
+const MCI_VD_STATUS_DISC_SIZE=0x4006;
+const MCI_VD_GETDEVCAPS_CLV=0x10000;
+const MCI_VD_GETDEVCAPS_CAV=0x20000;
+const MCI_VD_SPIN_UP=0x10000;
+const MCI_VD_SPIN_DOWN=0x20000;
+const MCI_VD_GETDEVCAPS_CAN_REVERSE=0x4002;
+const MCI_VD_GETDEVCAPS_FAST_RATE=0x4003;
+const MCI_VD_GETDEVCAPS_SLOW_RATE=0x4004;
+const MCI_VD_GETDEVCAPS_NORMAL_RATE=0x4005;
+const MCI_VD_STEP_FRAMES=0x10000;
+const MCI_VD_STEP_REVERSE=0x20000;
+const MCI_VD_ESCAPE_STRING=256;
+
+const MCI_CDA_STATUS_TYPE_TRACK=0x4001;
+const MCI_CDA_TRACK_AUDIO=MCI_CD_OFFSET;
+const MCI_CDA_TRACK_OTHER=(MCI_CD_OFFSET+1);
+
+const MCI_WAVE_PCM=MCI_WAVE_OFFSET;
+const MCI_WAVE_MAPPER=(MCI_WAVE_OFFSET+1);
+const MCI_WAVE_OPEN_BUFFER=0x10000;
+const MCI_WAVE_SET_FORMATTAG=0x10000;
+const MCI_WAVE_SET_CHANNELS=0x20000;
+const MCI_WAVE_SET_SAMPLESPERSEC=0x40000;
+const MCI_WAVE_SET_AVGBYTESPERSEC=0x80000;
+const MCI_WAVE_SET_BLOCKALIGN=0x100000;
+const MCI_WAVE_SET_BITSPERSAMPLE=0x200000;
+const MCI_WAVE_INPUT=0x400000;
+const MCI_WAVE_OUTPUT=0x800000;
+const MCI_WAVE_STATUS_FORMATTAG=0x4001;
+const MCI_WAVE_STATUS_CHANNELS=0x4002;
+const MCI_WAVE_STATUS_SAMPLESPERSEC=0x4003;
+const MCI_WAVE_STATUS_AVGBYTESPERSEC=0x4004;
+const MCI_WAVE_STATUS_BLOCKALIGN=0x4005;
+const MCI_WAVE_STATUS_BITSPERSAMPLE=0x4006;
+const MCI_WAVE_STATUS_LEVEL=0x4007;
+const MCI_WAVE_SET_ANYINPUT=0x4000000;
+const MCI_WAVE_SET_ANYOUTPUT=0x8000000;
+const MCI_WAVE_GETDEVCAPS_INPUTS=0x4001;
+const MCI_WAVE_GETDEVCAPS_OUTPUTS=0x4002;
+
+const MCI_SEQ_DIV_PPQN=MCI_SEQ_OFFSET;
+const MCI_SEQ_DIV_SMPTE_24=(MCI_SEQ_OFFSET+1);
+const MCI_SEQ_DIV_SMPTE_25=(MCI_SEQ_OFFSET+2);
+const MCI_SEQ_DIV_SMPTE_30DROP=(MCI_SEQ_OFFSET+3);
+const MCI_SEQ_DIV_SMPTE_30=(MCI_SEQ_OFFSET+4);
+const MCI_SEQ_FORMAT_SONGPTR=0x4001;
+const MCI_SEQ_FILE=0x4002;
+const MCI_SEQ_MIDI=0x4003;
+const MCI_SEQ_SMPTE=0x4004;
+const MCI_SEQ_NONE=65533;
+const MCI_SEQ_MAPPER=65535;
+
+const MCI_SEQ_STATUS_TEMPO=0x4002;
+const MCI_SEQ_STATUS_PORT=0x4003;
+const MCI_SEQ_STATUS_SLAVE=0x4007;
+const MCI_SEQ_STATUS_MASTER=0x4008;
+const MCI_SEQ_STATUS_OFFSET=0x4009;
+const MCI_SEQ_STATUS_DIVTYPE=0x400A;
+const MCI_SEQ_STATUS_NAME=0x400B;
+const MCI_SEQ_STATUS_COPYRIGHT=0x400C;
+
+const MCI_SEQ_SET_TEMPO=0x10000;
+const MCI_SEQ_SET_PORT=0x20000;
+const MCI_SEQ_SET_SLAVE=0x40000;
+const MCI_SEQ_SET_MASTER=0x80000;
+const MCI_SEQ_SET_OFFSET=0x1000000;
+
+const MCI_ANIM_OPEN_WS=0x10000;
+const MCI_ANIM_OPEN_PARENT=0x20000;
+const MCI_ANIM_OPEN_NOSTATIC=0x40000;
+const MCI_ANIM_PLAY_SPEED=0x10000;
+const MCI_ANIM_PLAY_REVERSE=0x20000;
+const MCI_ANIM_PLAY_FAST=0x40000;
+const MCI_ANIM_PLAY_SLOW=0x80000;
+const MCI_ANIM_PLAY_SCAN=0x100000;
+const MCI_ANIM_STEP_REVERSE=0x10000;
+const MCI_ANIM_STEP_FRAMES=0x20000;
+const MCI_ANIM_STATUS_SPEED=0x4001;
+const MCI_ANIM_STATUS_FORWARD=0x4002;
+const MCI_ANIM_STATUS_HWND=0x4003;
+const MCI_ANIM_STATUS_HPAL=0x4004;
+const MCI_ANIM_STATUS_STRETCH=0x4005;
+const MCI_ANIM_INFO_TEXT=0x10000;
+
+const MCI_ANIM_GETDEVCAPS_CAN_REVERSE=0x4001;
+const MCI_ANIM_GETDEVCAPS_FAST_RATE=0x4002;
+const MCI_ANIM_GETDEVCAPS_SLOW_RATE=0x4003;
+const MCI_ANIM_GETDEVCAPS_NORMAL_RATE=0x4004;
+const MCI_ANIM_GETDEVCAPS_PALETTES=0x4006;
+const MCI_ANIM_GETDEVCAPS_CAN_STRETCH=0x4007;
+const MCI_ANIM_GETDEVCAPS_MAX_WINDOWS=0x4008;
+
+const MCI_ANIM_REALIZE_NORM=0x10000;
+const MCI_ANIM_REALIZE_BKGD=0x20000;
+
+const MCI_ANIM_WINDOW_HWND=0x10000;
+const MCI_ANIM_WINDOW_STATE=0x40000;
+const MCI_ANIM_WINDOW_TEXT=0x80000;
+const MCI_ANIM_WINDOW_ENABLE_STRETCH=0x100000;
+const MCI_ANIM_WINDOW_DISABLE_STRETCH=0x200000;
+const MCI_ANIM_WINDOW_DEFAULT=0x0;
+
+const MCI_ANIM_RECT=0x10000;
+const MCI_ANIM_PUT_SOURCE=0x20000;
+const MCI_ANIM_PUT_DESTINATION=0x40000;
+const MCI_ANIM_WHERE_SOURCE=0x20000;
+const MCI_ANIM_WHERE_DESTINATION=0x40000;
+const MCI_ANIM_UPDATE_HDC=0x20000;
+
+const MCI_OVLY_OPEN_WS=0x10000;
+const MCI_OVLY_OPEN_PARENT=0x20000;
+const MCI_OVLY_STATUS_HWND=0x4001;
+const MCI_OVLY_STATUS_STRETCH=0x4002;
+const MCI_OVLY_INFO_TEXT=0x10000;
+const MCI_OVLY_GETDEVCAPS_CAN_STRETCH=0x4001;
+const MCI_OVLY_GETDEVCAPS_CAN_FREEZE=0x4002;
+const MCI_OVLY_GETDEVCAPS_MAX_WINDOWS=0x4003;
+const MCI_OVLY_WINDOW_HWND=0x10000;
+const MCI_OVLY_WINDOW_STATE=0x40000;
+const MCI_OVLY_WINDOW_TEXT=0x80000;
+const MCI_OVLY_WINDOW_ENABLE_STRETCH=0x100000;
+const MCI_OVLY_WINDOW_DISABLE_STRETCH=0x200000;
+const MCI_OVLY_WINDOW_DEFAULT=0x0;
+const MCI_OVLY_RECT=0x10000;
+const MCI_OVLY_PUT_SOURCE=0x20000;
+const MCI_OVLY_PUT_DESTINATION=0x40000;
+const MCI_OVLY_PUT_FRAME=0x80000;
+const MCI_OVLY_PUT_VIDEO=0x100000;
+const MCI_OVLY_WHERE_SOURCE=0x20000;
+const MCI_OVLY_WHERE_DESTINATION=0x40000;
+const MCI_OVLY_WHERE_FRAME=0x80000;
+const MCI_OVLY_WHERE_VIDEO=0x100000;
+
+const NEWTRANSPARENT=3;
+const QUERYROPSUPPORT=40;
+const SELECTDIB=41;
+
+LONG DIBINDEX(WORD n) {
+	return MAKELONG(n,0x10FF);
+}
+const CAPS1=94;
+const C1_TRANSPARENT=1;
+
+const SEEK_SET=0;
+const SEEK_CUR=1;
+const SEEK_END=2;
+
+alias DWORD MCIERROR;
+alias UINT MCIDEVICEID;
+alias UINT function (MCIDEVICEID,DWORD) YIELDPROC;
+alias UINT MMVERSION;
+alias UINT MMRESULT;
+
+struct MMTIME {
+	UINT wType;
+	union {
+		DWORD ms;
+		DWORD sample;
+		DWORD cb;
+		DWORD ticks;
+		struct smpte {
+			BYTE hour;
+			BYTE min;
+			BYTE sec;
+			BYTE frame;
+			BYTE fps;
+			BYTE dummy;
+			BYTE pad[2];
+		};
+		struct midi {
+			DWORD songptrpos;
+		}
+	}
+}
+alias MMTIME* PMMTIME, LPMMTIME;
+
+typedef HANDLE HDRVR;
+
+struct DRVCONFIGINFO {
+	DWORD dwDCISize;
+	LPCWSTR lpszDCISectionName;
+	LPCWSTR lpszDCIAliasName;
+}
+alias DRVCONFIGINFO * PDRVCONFIGINFO, LPDRVCONFIGINFO;
+
+struct DRVCONFIGINFOEX {
+	DWORD dwDCISize;
+	LPCWSTR lpszDCISectionName;
+	LPCWSTR lpszDCIAliasName;
+	DWORD dnDevNode;
+}
+alias DRVCONFIGINFOEX* PDRVCONFIGINFOEX, LPDRVCONFIGINFOEX;
+
+extern(Windows):
+
+/+FIXME: I couldn't find these in MSDN.
+alias void function (HDRVR,UINT,DWORD,DWORD,DWORD) DRVCALLBACK;
+LRESULT DRIVERPROC (DWORD,HDRVR,UINT,LPARAM,LPARAM);
+alias DRVCALLBACK* LPDRVCALLBACK, PDRVCALLBACK;
+
+alias DRVCALLBACK WAVECALLBACK;
+alias WAVECALLBACK* LPWAVECALLBACK;
+
+alias DRVCALLBACK MIDICALLBACK;
+alias MIDICALLBACK* LPMIDICALLBACK;
+
++/
+
+typedef HANDLE HWAVE;
+typedef HANDLE HWAVEIN;
+typedef HANDLE HWAVEOUT;
+
+alias HWAVEIN* LPHWAVEIN;
+alias HWAVEOUT* LPHWAVEOUT;
+
+struct WAVEHDR {
+	LPSTR lpData;
+	DWORD dwBufferLength;
+	DWORD dwBytesRecorded;
+	DWORD dwUser;
+	DWORD dwFlags;
+	DWORD dwLoops;
+	WAVEHDR *lpNext;
+	DWORD reserved;
+}
+alias WAVEHDR* PWAVEHDR, LPWAVEHDR;
+
+struct WAVEOUTCAPSA {
+	WORD wMid;
+	WORD wPid;
+	MMVERSION vDriverVersion;
+	CHAR szPname[MAXPNAMELEN];
+	DWORD dwFormats;
+	WORD wChannels;
+	WORD wReserved1;
+	DWORD dwSupport;
+}
+alias WAVEOUTCAPSA* PWAVEOUTCAPSA, LPWAVEOUTCAPSA;
+
+struct WAVEOUTCAPSW {
+	WORD wMid;
+	WORD wPid;
+	MMVERSION vDriverVersion;
+	WCHAR szPname[MAXPNAMELEN];
+	DWORD dwFormats;
+	WORD wChannels;
+	WORD wReserved1;
+	DWORD dwSupport;
+}
+alias WAVEOUTCAPSW* PWAVEOUTCAPSW, LPWAVEOUTCAPSW;
+
+struct WAVEINCAPSA {
+	WORD wMid;
+	WORD wPid;
+	MMVERSION vDriverVersion;
+	CHAR szPname[MAXPNAMELEN];
+	DWORD dwFormats;
+	WORD wChannels;
+	WORD wReserved1;
+}
+alias WAVEINCAPSA* PWAVEINCAPSA, LPWAVEINCAPSA;
+
+struct WAVEINCAPSW {
+	WORD wMid;
+	WORD wPid;
+	MMVERSION vDriverVersion;
+	WCHAR szPname[MAXPNAMELEN];
+	DWORD dwFormats;
+	WORD wChannels;
+	WORD wReserved1;
+}
+alias WAVEINCAPSW* PWAVEINCAPSW, LPWAVEINCAPSW;
+
+struct WAVEFORMAT {
+	WORD wFormatTag;
+	WORD nChannels;
+	DWORD nSamplesPerSec;
+	DWORD nAvgBytesPerSec;
+	WORD nBlockAlign;
+}
+alias WAVEFORMAT* PWAVEFORMAT, LPWAVEFORMAT;
+
+struct PCMWAVEFORMAT {
+	WAVEFORMAT wf;
+	WORD wBitsPerSample;
+}
+alias PCMWAVEFORMAT* PPCMWAVEFORMAT, LPPCMWAVEFORMAT;
+
+struct WAVEFORMATEX {
+	WORD wFormatTag;
+	WORD nChannels;
+	DWORD nSamplesPerSec;
+	DWORD nAvgBytesPerSec;
+	WORD nBlockAlign;
+	WORD wBitsPerSample;
+	WORD cbSize;
+}
+alias WAVEFORMATEX* PWAVEFORMATEX, LPWAVEFORMATEX;
+alias WAVEFORMATEX* LPCWAVEFORMATEX;
+
+typedef HANDLE HMIDI;
+typedef HANDLE HMIDIIN;
+typedef HANDLE HMIDIOUT;
+typedef HANDLE HMIDISTRM;
+
+alias HMIDI* LPHMIDI;
+alias HMIDIIN* LPHMIDIIN;
+alias HMIDIOUT* LPHMIDIOUT;
+alias HMIDISTRM* LPHMIDISTRM;
+
+alias WORD PATCHARRAY[MIDIPATCHSIZE];
+alias WORD* LPPATCHARRAY;
+alias WORD KEYARRAY[MIDIPATCHSIZE];
+alias WORD* LPKEYARRAY;
+
+struct MIDIOUTCAPSA {
+	WORD wMid;
+	WORD wPid;
+	MMVERSION vDriverVersion;
+	CHAR szPname[MAXPNAMELEN];
+	WORD wTechnology;
+	WORD wVoices;
+	WORD wNotes;
+	WORD wChannelMask;
+	DWORD dwSupport;
+}
+alias MIDIOUTCAPSA* PMIDIOUTCAPSA, LPMIDIOUTCAPSA;
+
+struct MIDIOUTCAPSW {
+	WORD wMid;
+	WORD wPid;
+	MMVERSION vDriverVersion;
+	WCHAR szPname[MAXPNAMELEN];
+	WORD wTechnology;
+	WORD wVoices;
+	WORD wNotes;
+	WORD wChannelMask;
+	DWORD dwSupport;
+}
+alias MIDIOUTCAPSW* PMIDIOUTCAPSW, LPMIDIOUTCAPSW;
+
+struct MIDIINCAPSA {
+	WORD wMid;
+	WORD wPid;
+	MMVERSION vDriverVersion;
+	CHAR szPname[MAXPNAMELEN];
+	DWORD dwSupport;
+}
+alias MIDIINCAPSA* PMIDIINCAPSA, LPMIDIINCAPSA;
+
+struct MIDIINCAPSW {
+	WORD wMid;
+	WORD wPid;
+	MMVERSION vDriverVersion;
+	WCHAR szPname[MAXPNAMELEN];
+	DWORD dwSupport;
+}
+alias MIDIINCAPSW* PMIDIINCAPSW, LPMIDIINCAPSW;
+
+struct MIDIHDR {
+	LPSTR lpData;
+	DWORD dwBufferLength;
+	DWORD dwBytesRecorded;
+	DWORD dwUser;
+	DWORD dwFlags;
+	MIDIHDR *lpNext;
+	DWORD reserved;
+	DWORD dwOffset;
+	DWORD dwReserved[8];
+}
+alias MIDIHDR* PMIDIHDR, LPMIDIHDR;
+
+struct MIDIEVENT {
+	DWORD dwDeltaTime;
+	DWORD dwStreamID;
+	DWORD dwEvent;
+	DWORD dwParms[1];
+}
+
+struct MIDISTRMBUFFVER {
+	DWORD dwVersion;
+	DWORD dwMid;
+	DWORD dwOEMVersion;
+}
+
+struct MIDIPROPTIMEDIV {
+	DWORD cbStruct;
+	DWORD dwTimeDiv;
+}
+alias MIDIPROPTIMEDIV* LPMIDIPROPTIMEDIV;
+
+struct MIDIPROPTEMPO {
+	DWORD cbStruct;
+	DWORD dwTempo;
+}
+alias MIDIPROPTEMPO* LPMIDIPROPTEMPO;
+
+struct AUXCAPSA {
+	WORD wMid;
+	WORD wPid;
+	MMVERSION vDriverVersion;
+	CHAR szPname[MAXPNAMELEN];
+	WORD wTechnology;
+	WORD wReserved1;
+	DWORD dwSupport;
+}
+alias AUXCAPSA* PAUXCAPSA, LPAUXCAPSA;
+
+struct AUXCAPSW {
+	WORD wMid;
+	WORD wPid;
+	MMVERSION vDriverVersion;
+	WCHAR szPname[MAXPNAMELEN];
+	WORD wTechnology;
+	WORD wReserved1;
+	DWORD dwSupport;
+}
+alias AUXCAPSW* PAUXCAPSW, LPAUXCAPSW;
+
+typedef HANDLE HMIXEROBJ;
+alias HMIXEROBJ* LPHMIXEROBJ;
+
+typedef HANDLE HMIXER;
+alias HMIXER* LPHMIXER;
+
+struct MIXERCAPSA {
+	WORD wMid;
+	WORD wPid;
+	MMVERSION vDriverVersion;
+	CHAR szPname[MAXPNAMELEN];
+	DWORD fdwSupport;
+	DWORD cDestinations;
+}
+alias MIXERCAPSA* PMIXERCAPSA, LPMIXERCAPSA;
+
+struct MIXERCAPSW {
+	WORD wMid;
+	WORD wPid;
+	MMVERSION vDriverVersion;
+	WCHAR szPname[MAXPNAMELEN];
+	DWORD fdwSupport;
+	DWORD cDestinations;
+}
+alias MIXERCAPSW* PMIXERCAPSW, LPMIXERCAPSW;
+
+struct MIXERLINEA {
+	DWORD cbStruct;
+	DWORD dwDestination;
+	DWORD dwSource;
+	DWORD dwLineID;
+	DWORD fdwLine;
+	DWORD dwUser;
+	DWORD dwComponentType;
+	DWORD cChannels;
+	DWORD cConnections;
+	DWORD cControls;
+	CHAR szShortName[MIXER_SHORT_NAME_CHARS];
+	CHAR szName[MIXER_LONG_NAME_CHARS];
+	struct Target {
+		DWORD dwType;
+		DWORD dwDeviceID;
+		WORD wMid;
+		WORD wPid;
+		MMVERSION vDriverVersion;
+		CHAR szPname[MAXPNAMELEN];
+	}
+}
+alias MIXERLINEA* PMIXERLINEA, LPMIXERLINEA;
+
+struct MIXERLINEW {
+	DWORD cbStruct;
+	DWORD dwDestination;
+	DWORD dwSource;
+	DWORD dwLineID;
+	DWORD fdwLine;
+	DWORD dwUser;
+	DWORD dwComponentType;
+	DWORD cChannels;
+	DWORD cConnections;
+	DWORD cControls;
+	WCHAR szShortName[MIXER_SHORT_NAME_CHARS];
+	WCHAR szName[MIXER_LONG_NAME_CHARS];
+	struct Target {
+		DWORD dwType;
+		DWORD dwDeviceID;
+		WORD wMid;
+		WORD wPid;
+		MMVERSION vDriverVersion;
+		WCHAR szPname[MAXPNAMELEN];
+	}
+}
+alias MIXERLINEW* PMIXERLINEW, LPMIXERLINEW;
+
+struct MIXERCONTROLA {
+	DWORD cbStruct;
+	DWORD dwControlID;
+	DWORD dwControlType;
+	DWORD fdwControl;
+	DWORD cMultipleItems;
+	CHAR szShortName[MIXER_SHORT_NAME_CHARS];
+	CHAR szName[MIXER_LONG_NAME_CHARS];
+	union _Bounds {
+		struct {
+			LONG lMinimum;
+			LONG lMaximum;
+		}
+		struct {
+			DWORD dwMinimum;
+			DWORD dwMaximum;
+		}
+		DWORD dwReserved[6];
+	}
+	_Bounds Bounds;
+	union _Metrics {
+		DWORD cSteps;
+		DWORD cbCustomData;
+		DWORD dwReserved[6];
+	}
+	_Metrics Metrics;
+}
+alias MIXERCONTROLA* PMIXERCONTROLA, LPMIXERCONTROLA;
+
+struct MIXERCONTROLW {
+	DWORD cbStruct;
+	DWORD dwControlID;
+	DWORD dwControlType;
+	DWORD fdwControl;
+	DWORD cMultipleItems;
+	WCHAR szShortName[MIXER_SHORT_NAME_CHARS];
+	WCHAR szName[MIXER_LONG_NAME_CHARS];
+	union _Bounds {
+		struct {
+			LONG lMinimum;
+			LONG lMaximum;
+		}
+		struct {
+			DWORD dwMinimum;
+			DWORD dwMaximum;
+		}
+		DWORD dwReserved[6];
+	}
+	_Bounds Bounds;	
+	union _Metrics {
+		DWORD cSteps;
+		DWORD cbCustomData;
+		DWORD dwReserved[6];
+	}
+	_Metrics Metrics;	
+}
+
+alias MIXERCONTROLW* PMIXERCONTROLW, LPMIXERCONTROLW;
+
+struct MIXERLINECONTROLSA {
+	DWORD cbStruct;
+	DWORD dwLineID;
+	union {
+		DWORD dwControlID;
+		DWORD dwControlType;
+	}
+	DWORD cControls;
+	DWORD cbmxctrl;
+	LPMIXERCONTROLA pamxctrl;
+}
+alias MIXERLINECONTROLSA* PMIXERLINECONTROLSA, LPMIXERLINECONTROLSA;
+
+struct MIXERLINECONTROLSW {
+	DWORD cbStruct;
+	DWORD dwLineID;
+	union {
+		DWORD dwControlID;
+		DWORD dwControlType;
+	}
+	DWORD cControls;
+	DWORD cbmxctrl;
+	LPMIXERCONTROLW pamxctrl;
+}
+alias MIXERLINECONTROLSW* PMIXERLINECONTROLSW, LPMIXERLINECONTROLSW;
+
+struct MIXERCONTROLDETAILS {
+	DWORD cbStruct;
+	DWORD dwControlID;
+	DWORD cChannels;
+	union {
+		HWND hwndOwner;
+		DWORD cMultipleItems;
+	}
+	DWORD cbDetails;
+	PVOID paDetails;
+}
+alias MIXERCONTROLDETAILS* PMIXERCONTROLDETAILS, LPMIXERCONTROLDETAILS;
+
+struct MIXERCONTROLDETAILS_LISTTEXTA {
+	DWORD dwParam1;
+	DWORD dwParam2;
+	CHAR szName[MIXER_LONG_NAME_CHARS];
+}
+alias MIXERCONTROLDETAILS_LISTTEXTA* PMIXERCONTROLDETAILS_LISTTEXTA,LPMIXERCONTROLDETAILS_LISTTEXTA;
+
+struct MIXERCONTROLDETAILS_LISTTEXTW {
+	DWORD dwParam1;
+	DWORD dwParam2;
+	WCHAR szName[MIXER_LONG_NAME_CHARS];
+}
+alias MIXERCONTROLDETAILS_LISTTEXTW* PMIXERCONTROLDETAILS_LISTTEXTW,LPMIXERCONTROLDETAILS_LISTTEXTW;
+
+struct MIXERCONTROLDETAILS_BOOLEAN {
+	LONG fValue;
+}
+alias MIXERCONTROLDETAILS_BOOLEAN* PMIXERCONTROLDETAILS_BOOLEAN, LPMIXERCONTROLDETAILS_BOOLEAN;
+
+struct MIXERCONTROLDETAILS_SIGNED {
+	LONG lValue;
+}
+alias MIXERCONTROLDETAILS_SIGNED* PMIXERCONTROLDETAILS_SIGNED, LPMIXERCONTROLDETAILS_SIGNED;
+
+struct MIXERCONTROLDETAILS_UNSIGNED {
+	DWORD dwValue;
+}
+alias MIXERCONTROLDETAILS_UNSIGNED* PMIXERCONTROLDETAILS_UNSIGNED, LPMIXERCONTROLDETAILS_UNSIGNED;
+
+alias void function (UINT,UINT,DWORD,DWORD,DWORD) LPTIMECALLBACK;
+
+struct TIMECAPS {
+	UINT wPeriodMin;
+	UINT wPeriodMax;
+}
+alias TIMECAPS* PTIMECAPS, LPTIMECAPS;
+
+struct JOYCAPSA {
+	WORD wMid;
+	WORD wPid;
+	CHAR szPname[MAXPNAMELEN];
+	UINT wXmin;
+	UINT wXmax;
+	UINT wYmin;
+	UINT wYmax;
+	UINT wZmin;
+	UINT wZmax;
+	UINT wNumButtons;
+	UINT wPeriodMin;
+	UINT wPeriodMax;
+	UINT wRmin;
+	UINT wRmax;
+	UINT wUmin;
+	UINT wUmax;
+	UINT wVmin;
+	UINT wVmax;
+	UINT wCaps;
+	UINT wMaxAxes;
+	UINT wNumAxes;
+	UINT wMaxButtons;
+	CHAR szRegKey[MAXPNAMELEN];
+	CHAR szOEMVxD[MAX_JOYSTICKOEMVXDNAME];
+}
+alias JOYCAPSA* PJOYCAPSA, LPJOYCAPSA;
+
+struct JOYCAPSW {
+	WORD wMid;
+	WORD wPid;
+	WCHAR szPname[MAXPNAMELEN];
+	UINT wXmin;
+	UINT wXmax;
+	UINT wYmin;
+	UINT wYmax;
+	UINT wZmin;
+	UINT wZmax;
+	UINT wNumButtons;
+	UINT wPeriodMin;
+	UINT wPeriodMax;
+	UINT wRmin;
+	UINT wRmax;
+	UINT wUmin;
+	UINT wUmax;
+	UINT wVmin;
+	UINT wVmax;
+	UINT wCaps;
+	UINT wMaxAxes;
+	UINT wNumAxes;
+	UINT wMaxButtons;
+	WCHAR szRegKey[MAXPNAMELEN];
+	WCHAR szOEMVxD[MAX_JOYSTICKOEMVXDNAME];
+}
+alias JOYCAPSW* PJOYCAPSW, LPJOYCAPSW;
+
+struct JOYINFO {
+	UINT wXpos;
+	UINT wYpos;
+	UINT wZpos;
+	UINT wButtons;
+}
+alias JOYINFO* PJOYINFO, LPJOYINFO;
+
+struct JOYINFOEX {
+	DWORD dwSize;
+	DWORD dwFlags;
+	DWORD dwXpos;
+	DWORD dwYpos;
+	DWORD dwZpos;
+	DWORD dwRpos;
+	DWORD dwUpos;
+	DWORD dwVpos;
+	DWORD dwButtons;
+	DWORD dwButtonNumber;
+	DWORD dwPOV;
+	DWORD dwReserved1;
+	DWORD dwReserved2;
+}
+alias JOYINFOEX* PJOYINFOEX, LPJOYINFOEX;
+
+alias DWORD FOURCC;
+alias char* HPSTR;
+
+typedef HANDLE HMMIO;
+
+alias LRESULT function (LPSTR,UINT,LPARAM,LPARAM) LPMMIOPROC;
+
+struct MMIOINFO {
+	DWORD dwFlags;
+	FOURCC fccIOProc;
+	LPMMIOPROC pIOProc;
+	UINT wErrorRet;
+	HTASK htask;
+	LONG cchBuffer;
+	HPSTR pchBuffer;
+	HPSTR pchNext;
+	HPSTR pchEndRead;
+	HPSTR pchEndWrite;
+	LONG lBufOffset;
+	LONG lDiskOffset;
+	DWORD adwInfo[3];
+	DWORD dwReserved1;
+	DWORD dwReserved2;
+	HMMIO hmmio;
+}
+alias MMIOINFO* PMMIOINFO, LPMMIOINFO;
+alias  MMIOINFO* LPCMMIOINFO;
+
+struct MMCKINFO {
+	FOURCC ckid;
+	DWORD cksize;
+	FOURCC fccType;
+	DWORD dwDataOffset;
+	DWORD dwFlags;
+}
+alias MMCKINFO* PMMCKINFO, LPMMCKINFO;
+alias  MMCKINFO* LPCMMCKINFO;
+
+struct MCI_GENERIC_PARMS {
+	DWORD dwCallback;
+}
+alias MCI_GENERIC_PARMS* PMCI_GENERIC_PARMS, LPMCI_GENERIC_PARMS;
+
+struct MCI_OPEN_PARMSA {
+	DWORD dwCallback;
+	MCIDEVICEID wDeviceID;
+	LPCSTR lpstrDeviceType;
+	LPCSTR lpstrElementName;
+	LPCSTR lpstrAlias;
+}
+alias MCI_OPEN_PARMSA* PMCI_OPEN_PARMSA, LPMCI_OPEN_PARMSA;
+
+struct MCI_OPEN_PARMSW {
+	DWORD dwCallback;
+	MCIDEVICEID wDeviceID;
+	LPCWSTR lpstrDeviceType;
+	LPCWSTR lpstrElementName;
+	LPCWSTR lpstrAlias;
+}
+alias MCI_OPEN_PARMSW* PMCI_OPEN_PARMSW, LPMCI_OPEN_PARMSW;
+
+struct MCI_PLAY_PARMS {
+	DWORD dwCallback;
+	DWORD dwFrom;
+	DWORD dwTo;
+}
+alias MCI_PLAY_PARMS* PMCI_PLAY_PARMS, LPMCI_PLAY_PARMS;
+
+struct MCI_SEEK_PARMS {
+	DWORD dwCallback;
+	DWORD dwTo;
+}
+alias MCI_SEEK_PARMS* PMCI_SEEK_PARMS, LPMCI_SEEK_PARMS;
+
+struct MCI_STATUS_PARMS {
+	DWORD dwCallback;
+	DWORD dwReturn;
+	DWORD dwItem;
+	DWORD dwTrack;
+}
+alias MCI_STATUS_PARMS* PMCI_STATUS_PARMS, LPMCI_STATUS_PARMS;
+
+struct MCI_INFO_PARMSA {
+	DWORD dwCallback;
+	LPSTR lpstrReturn;
+	DWORD dwRetSize;
+}
+alias MCI_INFO_PARMSA* LPMCI_INFO_PARMSA;
+
+struct MCI_INFO_PARMSW {
+	DWORD dwCallback;
+	LPWSTR lpstrReturn;
+	DWORD dwRetSize;
+}
+alias MCI_INFO_PARMSW* LPMCI_INFO_PARMSW;
+
+struct MCI_GETDEVCAPS_PARMS {
+	DWORD dwCallback;
+	DWORD dwReturn;
+	DWORD dwItem;
+}
+alias MCI_GETDEVCAPS_PARMS* PMCI_GETDEVCAPS_PARMS, LPMCI_GETDEVCAPS_PARMS;
+
+struct MCI_SYSINFO_PARMSA {
+	DWORD dwCallback;
+	LPSTR lpstrReturn;
+	DWORD dwRetSize;
+	DWORD dwNumber;
+	UINT wDeviceType;
+}
+alias MCI_SYSINFO_PARMSA* PMCI_SYSINFO_PARMSA, LPMCI_SYSINFO_PARMSA;
+
+struct MCI_SYSINFO_PARMSW {
+	DWORD dwCallback;
+	LPWSTR lpstrReturn;
+	DWORD dwRetSize;
+	DWORD dwNumber;
+	UINT wDeviceType;
+}
+alias MCI_SYSINFO_PARMSW* PMCI_SYSINFO_PARMSW, LPMCI_SYSINFO_PARMSW;
+
+struct MCI_SET_PARMS {
+	DWORD dwCallback;
+	DWORD dwTimeFormat;
+	DWORD dwAudio;
+}
+alias MCI_SET_PARMS* PMCI_SET_PARMS, LPMCI_SET_PARMS;
+
+struct MCI_BREAK_PARMS {
+	DWORD dwCallback;
+	int nVirtKey;
+	HWND hwndBreak;
+}
+alias MCI_BREAK_PARMS* PMCI_BREAK_PARMS, LPMCI_BREAK_PARMS;
+
+struct MCI_SAVE_PARMSA {
+	DWORD dwCallback;
+	LPCSTR lpfilename;
+}
+alias MCI_SAVE_PARMSA* PMCI_SAVE_PARMSA, LPMCI_SAVE_PARMSA;
+
+struct MCI_SAVE_PARMSW {
+	DWORD dwCallback;
+	LPCWSTR lpfilename;
+}
+alias MCI_SAVE_PARMSW* PMCI_SAVE_PARMSW, LPMCI_SAVE_PARMSW;
+
+struct MCI_LOAD_PARMSA {
+	DWORD dwCallback;
+	LPCSTR lpfilename;
+}
+alias MCI_LOAD_PARMSA* PMCI_LOAD_PARMSA, LPMCI_LOAD_PARMSA;
+
+struct MCI_LOAD_PARMSW {
+	DWORD dwCallback;
+	LPCWSTR lpfilename;
+}
+alias MCI_LOAD_PARMSW* PMCI_LOAD_PARMSW, LPMCI_LOAD_PARMSW;
+
+struct MCI_RECORD_PARMS {
+	DWORD dwCallback;
+	DWORD dwFrom;
+	DWORD dwTo;
+}
+alias MCI_RECORD_PARMS* LPMCI_RECORD_PARMS;
+
+struct MCI_VD_PLAY_PARMS {
+	DWORD dwCallback;
+	DWORD dwFrom;
+	DWORD dwTo;
+	DWORD dwSpeed;
+}
+alias MCI_VD_PLAY_PARMS* PMCI_VD_PLAY_PARMS, LPMCI_VD_PLAY_PARMS;
+
+struct MCI_VD_STEP_PARMS {
+	DWORD dwCallback;
+	DWORD dwFrames;
+}
+alias MCI_VD_STEP_PARMS* PMCI_VD_STEP_PARMS, LPMCI_VD_STEP_PARMS;
+
+struct MCI_VD_ESCAPE_PARMSA {
+	DWORD dwCallback;
+	LPCSTR lpstrCommand;
+}
+alias MCI_VD_ESCAPE_PARMSA* PMCI_VD_ESCAPE_PARMSA, LPMCI_VD_ESCAPE_PARMSA;
+
+struct MCI_VD_ESCAPE_PARMSW {
+	DWORD dwCallback;
+	LPCWSTR lpstrCommand;
+}
+alias MCI_VD_ESCAPE_PARMSW* PMCI_VD_ESCAPE_PARMSW, LPMCI_VD_ESCAPE_PARMSW;
+
+struct MCI_WAVE_OPEN_PARMSA {
+	DWORD dwCallback;
+	MCIDEVICEID wDeviceID;
+	LPCSTR lpstrDeviceType;
+	LPCSTR lpstrElementName;
+	LPCSTR lpstrAlias;
+	DWORD dwBufferSeconds;
+}
+alias MCI_WAVE_OPEN_PARMSA* PMCI_WAVE_OPEN_PARMSA, LPMCI_WAVE_OPEN_PARMSA;
+
+struct MCI_WAVE_OPEN_PARMSW {
+	DWORD dwCallback;
+	MCIDEVICEID wDeviceID;
+	LPCWSTR lpstrDeviceType;
+	LPCWSTR lpstrElementName;
+	LPCWSTR lpstrAlias;
+	DWORD dwBufferSeconds;
+}
+alias MCI_WAVE_OPEN_PARMSW* PMCI_WAVE_OPEN_PARMSW, LPMCI_WAVE_OPEN_PARMSW;
+
+struct MCI_WAVE_DELETE_PARMS {
+	DWORD dwCallback;
+	DWORD dwFrom;
+	DWORD dwTo;
+}
+alias MCI_WAVE_DELETE_PARMS* PMCI_WAVE_DELETE_PARMS, LPMCI_WAVE_DELETE_PARMS;
+
+struct MCI_WAVE_SET_PARMS {
+	DWORD dwCallback;
+	DWORD dwTimeFormat;
+	DWORD dwAudio;
+	UINT wInput;
+	UINT wOutput;
+	WORD wFormatTag;
+	WORD wReserved2;
+	WORD nChannels;
+	WORD wReserved3;
+	DWORD nSamplesPerSec;
+	DWORD nAvgBytesPerSec;
+	WORD nBlockAlign;
+	WORD wReserved4;
+	WORD wBitsPerSample;
+	WORD wReserved5;
+}
+alias MCI_WAVE_SET_PARMS* PMCI_WAVE_SET_PARMS, LPMCI_WAVE_SET_PARMS;
+
+extern (Windows):
+LRESULT CloseDriver(HDRVR,LONG,LONG);
+HDRVR OpenDriver(LPCWSTR,LPCWSTR,LONG);
+LRESULT SendDriverMessage(HDRVR,UINT,LONG,LONG);
+HMODULE DrvGetModuleHandle(HDRVR);
+HMODULE GetDriverModuleHandle(HDRVR);
+LRESULT DefDriverProc(DWORD,HDRVR,UINT,LPARAM,LPARAM);
+UINT mmsystemGetVersion();
+// FIXME: I believe this next line is a mistake
+//alias OutputDebugString OutputDebugStr;
+BOOL sndPlaySoundA(LPCSTR,UINT);
+BOOL sndPlaySoundW(LPCWSTR,UINT);
+BOOL PlaySoundA(LPCSTR,HMODULE,DWORD);
+BOOL PlaySoundW(LPCWSTR,HMODULE,DWORD);
+UINT waveOutGetNumDevs();
+MMRESULT waveOutGetDevCapsA(UINT,LPWAVEOUTCAPSA,UINT);
+MMRESULT waveOutGetDevCapsW(UINT,LPWAVEOUTCAPSW,UINT);
+MMRESULT waveOutGetVolume(HWAVEOUT,PDWORD);
+MMRESULT waveOutSetVolume(HWAVEOUT,DWORD);
+MMRESULT waveOutGetErrorTextA(MMRESULT,LPSTR,UINT);
+MMRESULT waveOutGetErrorTextW(MMRESULT,LPWSTR,UINT);
+MMRESULT waveOutOpen(LPHWAVEOUT,UINT,LPCWAVEFORMATEX,DWORD,DWORD,DWORD);
+MMRESULT waveOutClose(HWAVEOUT);
+MMRESULT waveOutPrepareHeader(HWAVEOUT,LPWAVEHDR,UINT);
+MMRESULT waveOutUnprepareHeader(HWAVEOUT,LPWAVEHDR,UINT);
+MMRESULT waveOutWrite(HWAVEOUT,LPWAVEHDR,UINT);
+MMRESULT waveOutPause(HWAVEOUT);
+MMRESULT waveOutRestart(HWAVEOUT);
+MMRESULT waveOutReset(HWAVEOUT);
+MMRESULT waveOutBreakLoop(HWAVEOUT);
+MMRESULT waveOutGetPosition(HWAVEOUT,LPMMTIME,UINT);
+MMRESULT waveOutGetPitch(HWAVEOUT,PDWORD);
+MMRESULT waveOutSetPitch(HWAVEOUT,DWORD);
+MMRESULT waveOutGetPlaybackRate(HWAVEOUT,PDWORD);
+MMRESULT waveOutSetPlaybackRate(HWAVEOUT,DWORD);
+MMRESULT waveOutGetID(HWAVEOUT,LPUINT);
+MMRESULT waveOutMessage(HWAVEOUT,UINT,DWORD,DWORD);
+UINT waveInGetNumDevs();
+MMRESULT waveInGetDevCapsA(UINT,LPWAVEINCAPSA,UINT);
+MMRESULT waveInGetDevCapsW(UINT,LPWAVEINCAPSW,UINT);
+MMRESULT waveInGetErrorTextA(MMRESULT,LPSTR,UINT);
+MMRESULT waveInGetErrorTextW(MMRESULT,LPWSTR,UINT);
+MMRESULT waveInOpen(LPHWAVEIN,UINT,LPCWAVEFORMATEX,DWORD,DWORD,DWORD);
+MMRESULT waveInClose(HWAVEIN);
+MMRESULT waveInPrepareHeader(HWAVEIN,LPWAVEHDR,UINT);
+MMRESULT waveInUnprepareHeader(HWAVEIN,LPWAVEHDR,UINT);
+MMRESULT waveInAddBuffer(HWAVEIN,LPWAVEHDR,UINT);
+MMRESULT waveInStart(HWAVEIN);
+MMRESULT waveInStop(HWAVEIN);
+MMRESULT waveInReset(HWAVEIN);
+MMRESULT waveInGetPosition(HWAVEIN,LPMMTIME,UINT);
+MMRESULT waveInGetID(HWAVEIN,LPUINT);
+MMRESULT waveInMessage(HWAVEIN,UINT,DWORD,DWORD);
+UINT midiOutGetNumDevs();
+MMRESULT midiStreamOpen(LPHMIDISTRM,LPUINT,DWORD,DWORD,DWORD,DWORD);
+MMRESULT midiStreamClose(HMIDISTRM);
+MMRESULT midiStreamProperty(HMIDISTRM,LPBYTE,DWORD);
+MMRESULT midiStreamPosition(HMIDISTRM,LPMMTIME,UINT);
+MMRESULT midiStreamOut(HMIDISTRM,LPMIDIHDR,UINT);
+MMRESULT midiStreamPause(HMIDISTRM);
+MMRESULT midiStreamRestart(HMIDISTRM);
+MMRESULT midiStreamStop(HMIDISTRM);
+MMRESULT midiConnect(HMIDI,HMIDIOUT,PVOID);
+MMRESULT midiDisconnect(HMIDI,HMIDIOUT,PVOID);
+MMRESULT midiOutGetDevCapsA(UINT,LPMIDIOUTCAPSA,UINT);
+MMRESULT midiOutGetDevCapsW(UINT,LPMIDIOUTCAPSW,UINT);
+MMRESULT midiOutGetVolume(HMIDIOUT,PDWORD);
+MMRESULT midiOutSetVolume(HMIDIOUT,DWORD);
+MMRESULT midiOutGetErrorTextA(MMRESULT,LPSTR,UINT);
+MMRESULT midiOutGetErrorTextW(MMRESULT,LPWSTR,UINT);
+MMRESULT midiOutOpen(LPHMIDIOUT,UINT,DWORD,DWORD,DWORD);
+MMRESULT midiOutClose(HMIDIOUT);
+MMRESULT midiOutPrepareHeader(HMIDIOUT,LPMIDIHDR,UINT);
+MMRESULT midiOutUnprepareHeader(HMIDIOUT,LPMIDIHDR,UINT);
+MMRESULT midiOutShortMsg(HMIDIOUT,DWORD);
+MMRESULT midiOutLongMsg(HMIDIOUT,LPMIDIHDR,UINT);
+MMRESULT midiOutReset(HMIDIOUT);
+MMRESULT midiOutCachePatches(HMIDIOUT,UINT,LPWORD,UINT);
+MMRESULT midiOutCacheDrumPatches(HMIDIOUT,UINT,LPWORD,UINT);
+MMRESULT midiOutGetID(HMIDIOUT,LPUINT);
+MMRESULT midiOutMessage(HMIDIOUT,UINT,DWORD,DWORD);
+UINT midiInGetNumDevs();
+MMRESULT midiInGetDevCapsA(UINT,LPMIDIINCAPSA,UINT);
+MMRESULT midiInGetDevCapsW(UINT,LPMIDIINCAPSW,UINT);
+MMRESULT midiInGetErrorTextA(MMRESULT,LPSTR,UINT);
+MMRESULT midiInGetErrorTextW(MMRESULT,LPWSTR,UINT);
+MMRESULT midiInOpen(LPHMIDIIN,UINT,DWORD,DWORD,DWORD);
+MMRESULT midiInClose(HMIDIIN);
+MMRESULT midiInPrepareHeader(HMIDIIN,LPMIDIHDR,UINT);
+MMRESULT midiInUnprepareHeader(HMIDIIN,LPMIDIHDR,UINT);
+MMRESULT midiInAddBuffer(HMIDIIN,LPMIDIHDR,UINT);
+MMRESULT midiInStart(HMIDIIN);
+MMRESULT midiInStop(HMIDIIN);
+MMRESULT midiInReset(HMIDIIN);
+MMRESULT midiInGetID(HMIDIIN,LPUINT);
+MMRESULT midiInMessage(HMIDIIN,UINT,DWORD,DWORD);
+UINT auxGetNumDevs();
+MMRESULT auxGetDevCapsA(UINT,LPAUXCAPSA,UINT);
+MMRESULT auxGetDevCapsW(UINT,LPAUXCAPSW,UINT);
+MMRESULT auxSetVolume(UINT,DWORD);
+MMRESULT auxGetVolume(UINT,PDWORD);
+MMRESULT auxOutMessage(UINT,UINT,DWORD,DWORD);
+UINT mixerGetNumDevs();
+MMRESULT mixerGetDevCapsA(UINT,LPMIXERCAPSA,UINT);
+MMRESULT mixerGetDevCapsW(UINT,LPMIXERCAPSW,UINT);
+MMRESULT mixerOpen(LPHMIXER,UINT,DWORD,DWORD,DWORD);
+MMRESULT mixerClose(HMIXER);
+DWORD mixerMessage(HMIXER,UINT,DWORD,DWORD);
+MMRESULT mixerGetLineInfoA(HMIXEROBJ,LPMIXERLINEA,DWORD);
+MMRESULT mixerGetLineInfoW(HMIXEROBJ,LPMIXERLINEW,DWORD);
+MMRESULT mixerGetID(HMIXEROBJ,PUINT,DWORD);
+MMRESULT mixerGetLineControlsA(HMIXEROBJ,LPMIXERLINECONTROLSA,DWORD);
+MMRESULT mixerGetLineControlsW(HMIXEROBJ,LPMIXERLINECONTROLSW,DWORD);
+MMRESULT mixerGetControlDetailsA(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD);
+MMRESULT mixerGetControlDetailsW(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD);
+MMRESULT mixerSetControlDetails(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD);
+MMRESULT timeGetSystemTime(LPMMTIME,UINT);
+DWORD timeGetTime();
+MMRESULT timeSetEvent(UINT,UINT,LPTIMECALLBACK,DWORD,UINT);
+MMRESULT timeKillEvent(UINT);
+MMRESULT timeGetDevCaps(LPTIMECAPS,UINT);
+MMRESULT timeBeginPeriod(UINT);
+MMRESULT timeEndPeriod(UINT);
+UINT joyGetNumDevs();
+MMRESULT joyGetDevCapsA(UINT,LPJOYCAPSA,UINT);
+MMRESULT joyGetDevCapsW(UINT,LPJOYCAPSW,UINT);
+MMRESULT joyGetPos(UINT,LPJOYINFO);
+MMRESULT joyGetPosEx(UINT,LPJOYINFOEX);
+MMRESULT joyGetThreshold(UINT,LPUINT);
+MMRESULT joyReleaseCapture(UINT);
+MMRESULT joySetCapture(HWND,UINT,UINT,BOOL);
+MMRESULT joySetThreshold(UINT,UINT);
+FOURCC mmioStringToFOURCCA(LPCSTR,UINT);
+FOURCC mmioStringToFOURCCW(LPCWSTR,UINT);
+LPMMIOPROC mmioInstallIOProcA(FOURCC,LPMMIOPROC,DWORD);
+LPMMIOPROC mmioInstallIOProcW(FOURCC,LPMMIOPROC,DWORD);
+HMMIO mmioOpenA(LPSTR,LPMMIOINFO,DWORD);
+HMMIO mmioOpenW(LPWSTR,LPMMIOINFO,DWORD);
+MMRESULT mmioRenameA(LPCSTR,LPCSTR,LPCMMIOINFO,DWORD);
+MMRESULT mmioRenameW(LPCWSTR,LPCWSTR,LPCMMIOINFO,DWORD);
+MMRESULT mmioClose(HMMIO,UINT);
+LONG mmioRead(HMMIO,HPSTR,LONG);
+LONG mmioWrite(HMMIO,LPCSTR,LONG);
+LONG mmioSeek(HMMIO,LONG,int);
+MMRESULT mmioGetInfo(HMMIO,LPMMIOINFO,UINT);
+MMRESULT mmioSetInfo(HMMIO,LPCMMIOINFO,UINT);
+MMRESULT mmioSetBuffer(HMMIO,LPSTR,LONG,UINT);
+MMRESULT mmioFlush(HMMIO,UINT);
+MMRESULT mmioAdvance(HMMIO,LPMMIOINFO,UINT);
+LRESULT mmioSendMessage(HMMIO,UINT,LPARAM,LPARAM);
+MMRESULT mmioDescend(HMMIO,LPMMCKINFO, MMCKINFO*,UINT);
+MMRESULT mmioAscend(HMMIO,LPMMCKINFO,UINT);
+MMRESULT mmioCreateChunk(HMMIO,LPMMCKINFO,UINT);
+MCIERROR mciSendCommandA(MCIDEVICEID,UINT,DWORD,DWORD);
+MCIERROR mciSendCommandW(MCIDEVICEID,UINT,DWORD,DWORD);
+MCIERROR mciSendStringA(LPCSTR,LPSTR,UINT,HWND);
+MCIERROR mciSendStringW(LPCWSTR,LPWSTR,UINT,HWND);
+MCIDEVICEID mciGetDeviceIDA(LPCSTR);
+MCIDEVICEID mciGetDeviceIDW(LPCWSTR);
+MCIDEVICEID mciGetDeviceIDFromElementIDA(DWORD,LPCSTR);
+MCIDEVICEID mciGetDeviceIDFromElementIDW(DWORD,LPCWSTR);
+BOOL mciGetErrorStringA(MCIERROR,LPSTR,UINT);
+BOOL mciGetErrorStringW(MCIERROR,LPWSTR,UINT);
+BOOL mciSetYieldProc(MCIDEVICEID,YIELDPROC,DWORD);
+HTASK mciGetCreatorTask(MCIDEVICEID);
+YIELDPROC mciGetYieldProc(MCIDEVICEID,PDWORD);
+
+struct MCI_SEQ_SET_PARMS {
+	DWORD dwCallback;
+	DWORD dwTimeFormat;
+	DWORD dwAudio;
+	DWORD dwTempo;
+	DWORD dwPort;
+	DWORD dwSlave;
+	DWORD dwMaster;
+	DWORD dwOffset;
+}
+alias MCI_SEQ_SET_PARMS* PMCI_SEQ_SET_PARMS, LPMCI_SEQ_SET_PARMS;
+
+struct MCI_ANIM_OPEN_PARMSA {
+	DWORD dwCallback;
+	MCIDEVICEID wDeviceID;
+	LPCSTR lpstrDeviceType;
+	LPCSTR lpstrElementName;
+	LPCSTR lpstrAlias;
+	DWORD dwStyle;
+	HWND hWndParent;
+}
+alias MCI_ANIM_OPEN_PARMSA* PMCI_ANIM_OPEN_PARMSA, LPMCI_ANIM_OPEN_PARMSA;
+
+struct MCI_ANIM_OPEN_PARMSW {
+	DWORD dwCallback;
+	MCIDEVICEID wDeviceID;
+	LPCWSTR lpstrDeviceType;
+	LPCWSTR lpstrElementName;
+	LPCWSTR lpstrAlias;
+	DWORD dwStyle;
+	HWND hWndParent;
+}
+alias MCI_ANIM_OPEN_PARMSW* PMCI_ANIM_OPEN_PARMSW, LPMCI_ANIM_OPEN_PARMSW;
+
+struct MCI_ANIM_PLAY_PARMS {
+	DWORD dwCallback;
+	DWORD dwFrom;
+	DWORD dwTo;
+	DWORD dwSpeed;
+}
+alias MCI_ANIM_PLAY_PARMS* PMCI_ANIM_PLAY_PARMS, LPMCI_ANIM_PLAY_PARMS;
+
+struct MCI_ANIM_STEP_PARMS {
+	DWORD dwCallback;
+	DWORD dwFrames;
+}
+alias MCI_ANIM_STEP_PARMS* PMCI_ANIM_STEP_PARMS, LPMCI_ANIM_STEP_PARMS;
+
+struct MCI_ANIM_WINDOW_PARMSA {
+	DWORD dwCallback;
+	HWND hWnd;
+	UINT nCmdShow;
+	LPCSTR lpstrText;
+}
+alias MCI_ANIM_WINDOW_PARMSA* PMCI_ANIM_WINDOW_PARMSA, LPMCI_ANIM_WINDOW_PARMSA;
+
+struct MCI_ANIM_WINDOW_PARMSW {
+	DWORD dwCallback;
+	HWND hWnd;
+	UINT nCmdShow;
+	LPCWSTR lpstrText;
+}
+alias MCI_ANIM_WINDOW_PARMSW* PMCI_ANIM_WINDOW_PARMSW, LPMCI_ANIM_WINDOW_PARMSW;
+
+struct MCI_ANIM_RECT_PARMS {
+	DWORD dwCallback;
+	//#ifdef MCI_USE_OFFEXT
+	//	POINT ptOffset;
+	//	POINT ptExtent;
+	//#else
+	RECT rc;
+	//#endif
+}
+alias MCI_ANIM_RECT_PARMS* PMCI_ANIM_RECT_PARMS, LPMCI_ANIM_RECT_PARMS;
+
+struct MCI_ANIM_UPDATE_PARMS {
+	DWORD dwCallback;
+	RECT rc;
+	HDC hDC;
+}
+alias MCI_ANIM_UPDATE_PARMS* PMCI_ANIM_UPDATE_PARMS, LPMCI_ANIM_UPDATE_PARMS;
+
+struct MCI_OVLY_OPEN_PARMSA {
+	DWORD dwCallback;
+	MCIDEVICEID wDeviceID;
+	LPCSTR lpstrDeviceType;
+	LPCSTR lpstrElementName;
+	LPCSTR lpstrAlias;
+	DWORD dwStyle;
+	HWND hWndParent;
+}
+alias MCI_OVLY_OPEN_PARMSA* PMCI_OVLY_OPEN_PARMSA, LPMCI_OVLY_OPEN_PARMSA;
+
+struct MCI_OVLY_OPEN_PARMSW {
+	DWORD dwCallback;
+	MCIDEVICEID wDeviceID;
+	LPCWSTR lpstrDeviceType;
+	LPCWSTR lpstrElementName;
+	LPCWSTR lpstrAlias;
+	DWORD dwStyle;
+	HWND hWndParent;
+}
+alias MCI_OVLY_OPEN_PARMSW* PMCI_OVLY_OPEN_PARMSW, LPMCI_OVLY_OPEN_PARMSW;
+
+struct MCI_OVLY_WINDOW_PARMSA {
+	DWORD dwCallback;
+	HWND hWnd;
+	UINT nCmdShow;
+	LPCSTR lpstrText;
+}
+alias MCI_OVLY_WINDOW_PARMSA* PMCI_OVLY_WINDOW_PARMSA, LPMCI_OVLY_WINDOW_PARMSA;
+
+struct MCI_OVLY_WINDOW_PARMSW {
+	DWORD dwCallback;
+	HWND hWnd;
+	UINT nCmdShow;
+	LPCWSTR lpstrText;
+}
+alias MCI_OVLY_WINDOW_PARMSW* PMCI_OVLY_WINDOW_PARMSW, LPMCI_OVLY_WINDOW_PARMSW;
+
+struct MCI_OVLY_RECT_PARMS {
+	DWORD dwCallback;
+	//#ifdef MCI_USE_OFFEXT
+	//	POINT ptOffset;
+	//	POINT ptExtent;
+	//#else
+	RECT rc;
+	//#endif
+}
+alias MCI_OVLY_RECT_PARMS* PMCI_OVLY_RECT_PARMS, LPMCI_OVLY_RECT_PARMS;
+
+struct MCI_OVLY_SAVE_PARMSA {
+	DWORD dwCallback;
+	LPCSTR lpfilename;
+	RECT rc;
+}
+alias MCI_OVLY_SAVE_PARMSA* PMCI_OVLY_SAVE_PARMSA, LPMCI_OVLY_SAVE_PARMSA;
+
+struct MCI_OVLY_SAVE_PARMSW {
+	DWORD dwCallback;
+	LPCWSTR lpfilename;
+	RECT rc;
+}
+alias MCI_OVLY_SAVE_PARMSW* PMCI_OVLY_SAVE_PARMSW, LPMCI_OVLY_SAVE_PARMSW;
+
+struct MCI_OVLY_LOAD_PARMSA {
+	DWORD dwCallback;
+	LPCSTR lpfilename;
+	RECT rc;
+}
+alias MCI_OVLY_LOAD_PARMSA* PMCI_OVLY_LOAD_PARMSA, LPMCI_OVLY_LOAD_PARMSA;
+
+struct MCI_OVLY_LOAD_PARMSW {
+	DWORD dwCallback;
+	LPCWSTR lpfilename;
+	RECT rc;
+}
+alias MCI_OVLY_LOAD_PARMSW* PMCI_OVLY_LOAD_PARMSW, LPMCI_OVLY_LOAD_PARMSW;
+
+version(Unicode) {
+	alias WAVEOUTCAPSW WAVEOUTCAPS;
+	alias WAVEINCAPSW WAVEINCAPS;
+	alias MIDIOUTCAPSW MIDIOUTCAPS;
+	alias MIDIINCAPSW MIDIINCAPS;
+	alias AUXCAPSW AUXCAPS;
+	alias MIXERCAPSW MIXERCAPS;
+	alias MIXERLINEW MIXERLINE;
+	alias MIXERCONTROLA MIXERCONTROL;
+	alias MIXERLINECONTROLSW MIXERLINECONTROLS;
+	alias MIXERCONTROLDETAILS_LISTTEXTW MIXERCONTROLDETAILS_LISTTEXT;
+	alias JOYCAPSW JOYCAPS;
+	alias MCI_OPEN_PARMSW MCI_OPEN_PARMS;
+	alias MCI_INFO_PARMSW MCI_INFO_PARMS;
+	alias MCI_SYSINFO_PARMSW MCI_SYSINFO_PARMS;
+	alias MCI_SAVE_PARMSW MCI_SAVE_PARMS;
+	alias MCI_LOAD_PARMSW MCI_LOAD_PARMS;
+	alias MCI_VD_ESCAPE_PARMSW MCI_VD_ESCAPE_PARMS;
+	alias MCI_WAVE_OPEN_PARMSW MCI_WAVE_OPEN_PARMS;
+	alias MCI_ANIM_OPEN_PARMSW MCI_ANIM_OPEN_PARMS;
+	alias MCI_ANIM_WINDOW_PARMSW MCI_ANIM_WINDOW_PARMS;
+	alias MCI_OVLY_OPEN_PARMSW MCI_OVLY_OPEN_PARMS;
+	alias MCI_OVLY_WINDOW_PARMSW MCI_OVLY_WINDOW_PARMS;
+	alias MCI_OVLY_SAVE_PARMSW MCI_OVLY_SAVE_PARMS;
+
+	alias sndPlaySoundW sndPlaySound;
+	alias PlaySoundW PlaySound;
+	alias waveOutGetDevCapsW waveOutGetDevCaps;
+	alias waveOutGetErrorTextW waveOutGetErrorText;
+	alias waveInGetDevCapsW waveInGetDevCaps;
+	alias waveInGetErrorTextW waveInGetErrorText;
+	alias midiOutGetDevCapsW midiOutGetDevCaps;
+	alias midiOutGetErrorTextW midiOutGetErrorText;
+	alias midiInGetDevCapsW midiInGetDevCaps;
+	alias midiInGetErrorTextW midiInGetErrorText;
+	alias auxGetDevCapsW auxGetDevCaps;
+	alias mixerGetDevCapsW mixerGetDevCaps;
+	alias mixerGetLineInfoW mixerGetLineInfo;
+	alias mixerGetLineControlsW mixerGetLineControls;
+	alias mixerGetControlDetailsW mixerGetControlDetails;
+	alias joyGetDevCapsW joyGetDevCaps;
+	alias mmioInstallIOProcW mmioInstallIOProc;
+	alias mmioStringToFOURCCW mmioStringToFOURCC;
+	alias mmioOpenW mmioOpen;
+	alias mmioRenameW mmioRename;
+	alias mciSendCommandW mciSendCommand;
+	alias mciSendStringW mciSendString;
+	alias mciGetDeviceIDW mciGetDeviceID;
+	alias mciGetDeviceIDFromElementIDW mciGetDeviceIDFromElementID;
+	alias mciGetErrorStringW mciGetErrorString;
+
+} else {
+	alias WAVEOUTCAPSA WAVEOUTCAPS;
+	alias WAVEINCAPSA WAVEINCAPS;
+	alias MIDIOUTCAPSA MIDIOUTCAPS;
+	alias MIDIINCAPSA MIDIINCAPS;
+	alias AUXCAPSA AUXCAPS;
+	alias MIXERCAPSA MIXERCAPS;
+	alias MIXERLINEA MIXERLINE;
+	alias MIXERCONTROLA MIXERCONTROL;
+	alias MIXERLINECONTROLSA MIXERLINECONTROLS;
+	alias MIXERCONTROLDETAILS_LISTTEXTA MIXERCONTROLDETAILS_LISTTEXT;
+	alias JOYCAPSA JOYCAPS;
+	alias MCI_OPEN_PARMSA MCI_OPEN_PARMS;
+	alias MCI_INFO_PARMSA MCI_INFO_PARMS;
+	alias MCI_SYSINFO_PARMSA MCI_SYSINFO_PARMS;
+	alias MCI_SAVE_PARMSA MCI_SAVE_PARMS;
+	alias MCI_LOAD_PARMSA MCI_LOAD_PARMS;
+	alias MCI_VD_ESCAPE_PARMSA MCI_VD_ESCAPE_PARMS;
+	alias MCI_WAVE_OPEN_PARMSA MCI_WAVE_OPEN_PARMS;
+	alias MCI_ANIM_OPEN_PARMSA MCI_ANIM_OPEN_PARMS;
+	alias MCI_ANIM_WINDOW_PARMSA MCI_ANIM_WINDOW_PARMS;
+	alias MCI_OVLY_OPEN_PARMSA MCI_OVLY_OPEN_PARMS;
+	alias MCI_OVLY_WINDOW_PARMSA MCI_OVLY_WINDOW_PARMS;
+	alias MCI_OVLY_SAVE_PARMSA MCI_OVLY_SAVE_PARMS;
+
+	alias sndPlaySoundA sndPlaySound;
+	alias PlaySoundA PlaySound;
+	alias waveOutGetDevCapsA waveOutGetDevCaps;
+	alias waveOutGetErrorTextA waveOutGetErrorText;
+	alias waveInGetDevCapsA waveInGetDevCaps;
+	alias waveInGetErrorTextA waveInGetErrorText;
+	alias midiOutGetDevCapsA midiOutGetDevCaps;
+	alias midiOutGetErrorTextA midiOutGetErrorText;
+	alias midiInGetDevCapsA midiInGetDevCaps;
+	alias midiInGetErrorTextA midiInGetErrorText;
+	alias auxGetDevCapsA auxGetDevCaps;
+	alias mixerGetDevCapsA mixerGetDevCaps;
+	alias mixerGetLineInfoA mixerGetLineInfo;
+	alias mixerGetLineControlsA mixerGetLineControls;
+	alias mixerGetControlDetailsA mixerGetControlDetails;
+	alias joyGetDevCapsA joyGetDevCaps;
+	alias mmioInstallIOProcA mmioInstallIOProc;
+	alias mmioStringToFOURCCA mmioStringToFOURCC;
+	alias mmioOpenA mmioOpen;
+	alias mmioRenameA mmioRename;
+	alias mciSendCommandA mciSendCommand;
+	alias mciSendStringA mciSendString;
+	alias mciGetDeviceIDA mciGetDeviceID;
+	alias mciGetDeviceIDFromElementIDA mciGetDeviceIDFromElementID;
+	alias mciGetErrorStringA mciGetErrorString;
+}
+
+alias WAVEOUTCAPS* PWAVEOUTCAPS, LPWAVEOUTCAPS;
+alias WAVEINCAPS* PWAVEINCAPS, LPWAVEINCAPS;
+alias MIDIOUTCAPS* PMIDIOUTCAPS, LPMIDIOUTCAPS;
+alias MIDIINCAPS* PMIDIINCAPS, LPMIDIINCAPS;
+alias AUXCAPS* PAUXCAPS, LPAUXCAPS;
+alias MIXERCAPS* PMIXERCAPS, LPMIXERCAPS;
+alias MIXERLINE* PMIXERLINE, LPMIXERLINE;
+alias MIXERCONTROL* PMIXERCONTROL, LPMIXERCONTROL;
+alias MIXERLINECONTROLS* PMIXERLINECONTROLS, LPMIXERLINECONTROLS;
+alias MIXERCONTROLDETAILS_LISTTEXT* PMIXERCONTROLDETAILS_LISTTEXT, LPMIXERCONTROLDETAILS_LISTTEXT;
+alias JOYCAPS* PJOYCAPS, LPJOYCAPS;
+alias MCI_OPEN_PARMS* PMCI_OPEN_PARMS, LPMCI_OPEN_PARMS;
+alias MCI_INFO_PARMS* LPMCI_INFO_PARMS;
+alias MCI_SYSINFO_PARMS* PMCI_SYSINFO_PARMS, LPMCI_SYSINFO_PARMS;
+alias MCI_SAVE_PARMS* PMCI_SAVE_PARMS, LPMCI_SAVE_PARMS;
+alias MCI_LOAD_PARMS* PMCI_LOAD_PARMS, LPMCI_LOAD_PARMS;
+alias MCI_VD_ESCAPE_PARMS* PMCI_VD_ESCAPE_PARMS, LPMCI_VD_ESCAPE_PARMS;
+alias MCI_WAVE_OPEN_PARMS* PMCI_WAVE_OPEN_PARMS, LPMCI_WAVE_OPEN_PARMS;
+alias MCI_ANIM_OPEN_PARMS* PMCI_ANIM_OPEN_PARMS, LPMCI_ANIM_OPEN_PARMS;
+alias MCI_ANIM_WINDOW_PARMS* PMCI_ANIM_WINDOW_PARMS, LPMCI_ANIM_WINDOW_PARMS;
+alias MCI_OVLY_OPEN_PARMS* PMCI_OVLY_OPEN_PARMS, LPMCI_OVLY_OPEN_PARMS;
+alias MCI_OVLY_WINDOW_PARMS* PMCI_OVLY_WINDOW_PARMS, LPMCI_OVLY_WINDOW_PARMS;
+alias MCI_OVLY_SAVE_PARMS* PMCI_OVLY_SAVE_PARMS, LPMCI_OVLY_SAVE_PARMS;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/msacm.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,172 @@
+/***********************************************************************\
+*                                msacm.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.msacm;
+
+private import win32.basetsd, win32.mmsystem, win32.windef;
+
+alias HANDLE HACMDRIVERID, HACMDRIVER;
+alias HANDLE* LPHACMDRIVER;
+
+/* Comment from MinGW
+	found through experimentation
+ */
+const size_t
+	ACMDRIVERDETAILS_SHORTNAME_CHARS =  32,
+	ACMDRIVERDETAILS_LONGNAME_CHARS  = 128,
+	ACMDRIVERDETAILS_COPYRIGHT_CHARS =  80,
+	ACMDRIVERDETAILS_LICENSING_CHARS = 128;
+
+/* Comment from MinGW
+	I don't know the right values for these macros
+ */
+const size_t
+	ACMFORMATDETAILS_FORMAT_CHARS       = 256,
+	ACMFORMATTAGDETAILS_FORMATTAG_CHARS = 256,
+	ACMDRIVERDETAILS_FEATURES_CHARS     = 256;
+
+struct ACMFORMATDETAILSA {
+	DWORD          cbStruct = ACMFORMATDETAILSA.sizeof;  // are they?
+	DWORD          dwFormatIndex;
+	DWORD          dwFormatTag;
+	DWORD          fdwSupport;
+	LPWAVEFORMATEX pwfx;
+	DWORD          cbwfx;
+	char[ACMFORMATDETAILS_FORMAT_CHARS] szFormat;
+}
+alias ACMFORMATDETAILSA* LPACMFORMATDETAILSA;
+
+struct ACMFORMATDETAILSW {
+	DWORD          cbStruct = ACMFORMATDETAILSW.sizeof;
+	DWORD          dwFormatIndex;
+	DWORD          dwFormatTag;
+	DWORD          fdwSupport;
+	LPWAVEFORMATEX pwfx;
+	DWORD          cbwfx;
+	WCHAR[ACMFORMATDETAILS_FORMAT_CHARS] szFormat;
+}
+alias ACMFORMATDETAILSW* LPACMFORMATDETAILSW;
+
+struct ACMFORMATTAGDETAILSA {
+	DWORD cbStruct = ACMFORMATTAGDETAILSA.sizeof;
+	DWORD dwFormatTagIndex;
+	DWORD dwFormatTag;
+	DWORD cbFormatSize;
+	DWORD fdwSupport;
+	DWORD cStandardFormats;
+	char[ACMFORMATTAGDETAILS_FORMATTAG_CHARS] szFormatTag;
+}
+alias ACMFORMATTAGDETAILSA* LPACMFORMATTAGDETAILSA;
+
+struct ACMFORMATTAGDETAILSW {
+	DWORD cbStruct = ACMFORMATTAGDETAILSW.sizeof;
+	DWORD dwFormatTagIndex;
+	DWORD dwFormatTag;
+	DWORD cbFormatSize;
+	DWORD fdwSupport;
+	DWORD cStandardFormats;
+	WCHAR[ACMFORMATTAGDETAILS_FORMATTAG_CHARS] szFormatTag;
+}
+alias ACMFORMATTAGDETAILSW* LPACMFORMATTAGDETAILSW;
+
+struct ACMDRIVERDETAILSA {
+	DWORD  cbStruct = ACMDRIVERDETAILSA.sizeof;
+	FOURCC fccType;
+	FOURCC fccComp;
+	WORD   wMid;
+	WORD   wPid;
+	DWORD  vdwACM;
+	DWORD  vdwDriver;
+	DWORD  fdwSupport;
+	DWORD  cFormatTags;
+	DWORD  cFilterTags;
+	HICON  hicon;
+	char[ACMDRIVERDETAILS_SHORTNAME_CHARS] szShortName;
+	char[ACMDRIVERDETAILS_LONGNAME_CHARS]  szLongName;
+	char[ACMDRIVERDETAILS_COPYRIGHT_CHARS] szCopyright;
+	char[ACMDRIVERDETAILS_LICENSING_CHARS] szLicensing;
+	char[ACMDRIVERDETAILS_FEATURES_CHARS]  szFeatures;
+}
+alias ACMDRIVERDETAILSA* LPACMDRIVERDETAILSA;
+
+struct ACMDRIVERDETAILSW {
+	DWORD  cbStruct = ACMDRIVERDETAILSW.sizeof;
+	FOURCC fccType;
+	FOURCC fccComp;
+	WORD   wMid;
+	WORD   wPid;
+	DWORD  vdwACM;
+	DWORD  vdwDriver;
+	DWORD  fdwSupport;
+	DWORD  cFormatTags;
+	DWORD  cFilterTags;
+	HICON  hicon;
+	WCHAR[ACMDRIVERDETAILS_SHORTNAME_CHARS] szShortName;
+	WCHAR[ACMDRIVERDETAILS_LONGNAME_CHARS]  szLongName;
+	WCHAR[ACMDRIVERDETAILS_COPYRIGHT_CHARS] szCopyright;
+	WCHAR[ACMDRIVERDETAILS_LICENSING_CHARS] szLicensing;
+	WCHAR[ACMDRIVERDETAILS_FEATURES_CHARS]  szFeatures;
+}
+alias ACMDRIVERDETAILSW* LPACMDRIVERDETAILSW;
+
+extern (Windows) {
+	alias BOOL function(HACMDRIVERID hadid, LPACMFORMATDETAILSA pafd,
+	  DWORD_PTR dwInstance, DWORD fdwSupport) ACMFORMATENUMCBA;
+	alias BOOL function(HACMDRIVERID hadid, LPACMFORMATDETAILSW pafd,
+	  DWORD_PTR dwInstance, DWORD fdwSupport) ACMFORMATENUMCBW;
+	alias BOOL function(HACMDRIVERID hadid, LPACMFORMATTAGDETAILSA paftd,
+	  DWORD_PTR dwInstance, DWORD fdwSupport) ACMFORMATTAGENUMCBA;
+	alias BOOL function(HACMDRIVERID hadid, LPACMFORMATTAGDETAILSW paftd,
+	  DWORD_PTR dwInstance, DWORD fdwSupport) ACMFORMATTAGENUMCBW;
+	alias BOOL function(HACMDRIVERID hadid, DWORD_PTR dwInstance,
+	  DWORD fdwSupport) ACMDRIVERENUMCB;
+
+	MMRESULT acmDriverOpen(LPHACMDRIVER phad, HACMDRIVERID hadid,
+	  DWORD fdwOpen);
+	MMRESULT acmDriverEnum(ACMDRIVERENUMCB fnCallback, DWORD_PTR dwInstance,
+	  DWORD fdwEnum);
+	MMRESULT acmFormatEnumA(HACMDRIVER had, LPACMFORMATDETAILSA pafd,
+	  ACMFORMATENUMCBA fnCallback, DWORD_PTR dwInstance, DWORD fdwEnum);
+	MMRESULT acmFormatEnumW(HACMDRIVER had, LPACMFORMATDETAILSW pafd,
+	  ACMFORMATENUMCBW fnCallback, DWORD_PTR dwInstance, DWORD fdwEnum);
+	MMRESULT acmDriverClose(HACMDRIVER had, DWORD fdwClose);
+	MMRESULT acmDriverDetailsA(HACMDRIVERID hadid, LPACMDRIVERDETAILSA padd,
+	  DWORD fdwDetails);
+	MMRESULT acmDriverDetailsW(HACMDRIVERID hadid, LPACMDRIVERDETAILSW padd,
+	  DWORD fdwDetails);
+	MMRESULT acmFormatTagEnumA(HACMDRIVER had, LPACMFORMATTAGDETAILSA paftd,
+	  ACMFORMATTAGENUMCBA fnCallback, DWORD_PTR dwInstance, DWORD fdwEnum);
+	MMRESULT acmFormatTagEnumW(HACMDRIVER had, LPACMFORMATTAGDETAILSW paftd,
+	  ACMFORMATTAGENUMCBW fnCallback, DWORD_PTR dwInstance, DWORD fdwEnum);
+}
+
+version (Unicode) {
+	alias ACMFORMATDETAILSW ACMFORMATDETAILS;
+	alias ACMFORMATTAGDETAILSW ACMFORMATTAGDETAILS;
+	alias ACMDRIVERDETAILSW ACMDRIVERDETAILS;
+	alias ACMFORMATENUMCBW ACMFORMATENUMCB;
+	alias ACMFORMATTAGENUMCBW ACMFORMATTAGENUMCB;
+	alias acmFormatEnumW acmFormatEnum;
+	alias acmDriverDetailsW acmDriverDetails;
+	alias acmFormatTagEnumW acmFormatTagEnum;
+} else {
+	alias ACMFORMATDETAILSA ACMFORMATDETAILS;
+	alias ACMFORMATTAGDETAILSA ACMFORMATTAGDETAILS;
+	alias ACMDRIVERDETAILSA ACMDRIVERDETAILS;
+	alias ACMFORMATENUMCBA ACMFORMATENUMCB;
+	alias ACMFORMATTAGENUMCBA ACMFORMATTAGENUMCB;
+	alias acmFormatEnumA acmFormatEnum;
+	alias acmDriverDetailsA acmDriverDetails;
+	alias acmFormatTagEnumA acmFormatTagEnum;
+}
+
+alias ACMFORMATDETAILS* LPACMFORMATDETAILS;
+alias ACMFORMATTAGDETAILS* LPACMFORMATTAGDETAILS;
+alias ACMDRIVERDETAILS* LPACMDRIVERDETAILS;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/mshtml.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,536 @@
+/***********************************************************************\
+*                                mshtml.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.mshtml;
+
+private import win32.basetyps, win32.oaidl, win32.unknwn,
+  win32.windef, win32.wtypes;
+
+// These are used in this file, but not defined in MinGW.
+interface IHTMLStyleSheet {};
+alias IHTMLStyle LPHTMLSTYLE;
+alias IHTMLStyleSheet LPHTMLSTYLESHEET;
+interface IHTMLLocation {};
+alias IHTMLLocation LPHTMLLOCATION;
+interface IHTMLFramesCollection {};
+alias IHTMLFramesCollection LPHTMLFRAMESCOLLECTION;
+interface IHTMLStyleSheetsCollection {};
+alias IHTMLStyleSheetsCollection LPHTMLSTYLESHEETSCOLLECTION;
+interface IHTMLStyle {};
+interface IHTMLFiltersCollection {};
+alias IHTMLFiltersCollection LPHTMLFILTERSCOLLECTION;
+interface IOmHistory : IDispatch {
+	HRESULT get_length(short* p);
+	HRESULT back(VARIANT*);
+	HRESULT forward(VARIANT*);
+	HRESULT go(VARIANT*);
+};
+alias IOmHistory LPOMHISTORY;
+interface IOmNavigator {};
+alias IOmNavigator LPOMNAVIGATOR;
+interface IHTMLImageElementFactory {};
+alias IHTMLImageElementFactory LPHTMLIMAGEELEMENTFACTORY;
+interface IHTMLEventObj {};
+alias IHTMLEventObj LPHTMLEVENTOBJ;
+interface IHTMLScreen {};
+alias IHTMLScreen LPHTMLSCREEN;
+interface IHTMLOptionElementFactory {};
+alias IHTMLOptionElementFactory LPHTMLOPTIONELEMENTFACTORY;
+
+interface IHTMLLinkElement : public IDispatch {
+	HRESULT put_href(BSTR);
+	HRESULT get_href(BSTR*);
+	HRESULT put_rel(BSTR);
+	HRESULT get_rel(BSTR*);
+	HRESULT put_rev(BSTR);
+	HRESULT get_rev(BSTR*);
+	HRESULT put_type(BSTR);
+	HRESULT get_type(BSTR*);
+	HRESULT get_readyState(BSTR*);
+	HRESULT put_onreadystatechange(VARIANT);
+	HRESULT get_onreadystatechange(VARIANT*);
+	HRESULT put_onload(VARIANT);
+	HRESULT get_onload(VARIANT*);
+	HRESULT put_onerror(VARIANT);
+	HRESULT get_onerror(VARIANT*);
+	HRESULT get_styleSheet(LPHTMLSTYLESHEET*);
+	HRESULT put_disabled(VARIANT_BOOL);
+	HRESULT get_disabled(VARIANT_BOOL*);
+	HRESULT put_media(BSTR);
+	HRESULT get_media(BSTR*);
+}
+alias IHTMLLinkElement LPHTMLLINKELEMENT;
+
+interface IHTMLImgElement : public IDispatch {
+	HRESULT put_isMap(VARIANT_BOOL);
+	HRESULT get_isMap(VARIANT_BOOL*);
+	HRESULT put_useMap(BSTR);
+	HRESULT get_useMap(BSTR*);
+	HRESULT get_mimeType(BSTR*);
+	HRESULT get_fileSize(BSTR*);
+	HRESULT get_fileCreatedDate(BSTR*);
+	HRESULT get_fileModifiedDate(BSTR*);
+	HRESULT get_fileUpdatedDate(BSTR*);
+	HRESULT get_protocol(BSTR*);
+	HRESULT get_href(BSTR*);
+	HRESULT get_nameProp(BSTR*);
+	HRESULT put_border(VARIANT);
+	HRESULT get_border(VARIANT*);
+	HRESULT put_vspace(LONG);
+	HRESULT get_vspace(LONG*);
+	HRESULT put_hspace(LONG);
+	HRESULT get_hspace(LONG*);
+	HRESULT put_alt(BSTR);
+	HRESULT get_alt(BSTR*);
+	HRESULT put_src(BSTR);
+	HRESULT get_src(BSTR*);
+	HRESULT put_lowsrc(BSTR);
+	HRESULT get_lowsrc(BSTR*);
+	HRESULT put_vrml(BSTR);
+	HRESULT get_vrml(BSTR*);
+	HRESULT put_dynsrc(BSTR);
+	HRESULT get_dynsrc(BSTR*);
+	HRESULT get_readyState(BSTR*);
+	HRESULT get_complete(VARIANT_BOOL*);
+	HRESULT put_loop(VARIANT);
+	HRESULT get_loop(VARIANT*);
+	HRESULT put_align(BSTR);
+	HRESULT get_align(BSTR*);
+	HRESULT put_onload(VARIANT);
+	HRESULT get_onload(VARIANT*);
+	HRESULT put_onerror(VARIANT);
+	HRESULT get_onerror(VARIANT*);
+	HRESULT put_onabort(VARIANT);
+	HRESULT get_onabort(VARIANT*);
+	HRESULT put_name(BSTR);
+	HRESULT get_name(BSTR*);
+	HRESULT put_width(LONG);
+	HRESULT get_width(LONG*);
+	HRESULT put_height(LONG);
+	HRESULT get_height(LONG*);
+	HRESULT put_start(BSTR);
+	HRESULT get_start(BSTR*);
+}
+alias IHTMLImgElement LPHTMLIMGELEMENT;
+
+interface IHTMLElementCollection : public IDispatch {
+	HRESULT toString(BSTR*);
+	HRESULT put_length(LONG);
+	HRESULT get_length(LONG*);
+	HRESULT get__newEnum(IUnknown*);
+	HRESULT item(VARIANT,VARIANT,IDispatch* pDisp);
+	HRESULT tags(VARIANT,IDispatch* pdisp);
+}
+alias IHTMLElementCollection LPHTMLELEMENTCOLLECTION;
+
+interface IHTMLDocument : public IDispatch {
+	HRESULT get_Script(IDispatch*);
+}
+
+interface IHTMLDocument2 : public IHTMLDocument {
+	HRESULT get_all(LPHTMLELEMENTCOLLECTION*);
+	HRESULT get_body(LPHTMLELEMENT*);
+	HRESULT get_activeElement(LPHTMLELEMENT*);
+	HRESULT get_images(LPHTMLELEMENTCOLLECTION*);
+	HRESULT get_applets(LPHTMLELEMENTCOLLECTION*);
+	HRESULT get_links(LPHTMLELEMENTCOLLECTION*);
+	HRESULT get_forms(LPHTMLELEMENTCOLLECTION*);
+	HRESULT get_anchors(LPHTMLELEMENTCOLLECTION*);
+	HRESULT put_title(BSTR);
+	HRESULT get_title(BSTR*);
+	HRESULT get_scripts(LPHTMLELEMENTCOLLECTION*);
+	HRESULT put_designMode(BSTR);
+	HRESULT get_designMode(BSTR*);
+	HRESULT get_selection(LPHTMLSELECTIONOBJECT*);
+	HRESULT get_readyState(BSTR*);
+	HRESULT get_frames(IHTMLFramesCollection2*);
+	HRESULT get_embeds(LPHTMLELEMENTCOLLECTION*);
+	HRESULT get_plugins(LPHTMLELEMENTCOLLECTION*);
+	HRESULT put_alinkColor(VARIANT);
+	HRESULT get_alinkColor(VARIANT*);
+	HRESULT put_bgColor(VARIANT);
+	HRESULT get_bgColor(VARIANT*);
+	HRESULT put_fgColor(VARIANT);
+	HRESULT get_fgColor(VARIANT*);
+	HRESULT put_linkColor(VARIANT);
+	HRESULT get_linkColor(VARIANT*);
+	HRESULT put_vlinkColor(VARIANT);
+	HRESULT get_vlinkColor(VARIANT*);
+	HRESULT get_referrer(BSTR*);
+	HRESULT get_location(LPHTMLLOCATION*);
+	HRESULT get_lastModified(BSTR*);
+	HRESULT put_url(BSTR);
+	HRESULT get_url(BSTR*);
+	HRESULT put_domain(BSTR);
+	HRESULT get_domain(BSTR*);
+	HRESULT put_cookie(BSTR);
+	HRESULT get_cookie(BSTR*);
+	HRESULT put_expands(VARIANT_BOOL);
+	HRESULT get_expands(VARIANT_BOOL*);
+	HRESULT put_charset(BSTR);
+	HRESULT get_charset(BSTR*);
+	HRESULT put_defaultCharset(BSTR);
+	HRESULT get_defaultCharset(BSTR*);
+	HRESULT get_mimeType(BSTR*);
+	HRESULT get_fileSize(BSTR*);
+	HRESULT get_fileCreatedDate(BSTR*);
+	HRESULT get_fileModifiedDate(BSTR*);
+	HRESULT get_fileUpdatedDate(BSTR*);
+	HRESULT get_security(BSTR*);
+	HRESULT get_protocol(BSTR*);
+	HRESULT get_nameProp(BSTR*);
+	HRESULT write(SAFEARRAY*);
+	HRESULT writeln(SAFEARRAY*);
+	HRESULT open(BSTR,VARIANT,VARIANT,VARIANT,IDispatch*);
+	HRESULT close();
+	HRESULT clear();
+	HRESULT queryCommandSupported(BSTR,VARIANT_BOOL*);
+	HRESULT queryCommandEnabled(BSTR,VARIANT_BOOL*);
+	HRESULT queryCommandState(BSTR,VARIANT_BOOL*);
+	HRESULT queryCommandIndeterm(BSTR,VARIANT_BOOL*);
+	HRESULT queryCommandText(BSTR,BSTR*);
+	HRESULT queryCommandValue(BSTR,VARIANT*);
+	HRESULT execCommand(BSTR,VARIANT_BOOL,VARIANT,VARIANT_BOOL*);
+	HRESULT execCommandShowHelp(BSTR,VARIANT_BOOL*);
+	HRESULT createElement(BSTR,LPHTMLELEMENT*);
+	HRESULT put_onhelp(VARIANT);
+	HRESULT get_onhelp(VARIANT*);
+	HRESULT put_onclick(VARIANT);
+	HRESULT get_onclick(VARIANT*);
+	HRESULT put_ondblclick(VARIANT);
+	HRESULT get_ondblclick(VARIANT*);
+	HRESULT put_onkeyup(VARIANT);
+	HRESULT get_onkeyup(VARIANT*);
+	HRESULT put_onkeydown(VARIANT);
+	HRESULT get_onkeydown(VARIANT*);
+	HRESULT put_onkeypress(VARIANT);
+	HRESULT get_onkeypress(VARIANT*);
+	HRESULT put_onmouseup(VARIANT);
+	HRESULT get_onmouseup(VARIANT*);
+	HRESULT put_onmousedown(VARIANT);
+	HRESULT get_onmousedown(VARIANT*);
+	HRESULT put_onmousemove(VARIANT);
+	HRESULT get_onmousemove(VARIANT*);
+	HRESULT put_onmouseout(VARIANT);
+	HRESULT get_onmouseout(VARIANT*);
+	HRESULT put_onmouseover(VARIANT);
+	HRESULT get_onmouseover(VARIANT*);
+	HRESULT put_onreadystatechange(VARIANT);
+	HRESULT get_onreadystatechange(VARIANT*);
+	HRESULT put_onafterupdate(VARIANT);
+	HRESULT get_onafterupdate(VARIANT*);
+	HRESULT put_onrowexit(VARIANT);
+	HRESULT get_onrowexit(VARIANT*);
+	HRESULT put_onrowenter(VARIANT);
+	HRESULT get_onrowenter(VARIANT*);
+	HRESULT put_ondragstart(VARIANT);
+	HRESULT get_ondragstart(VARIANT*);
+	HRESULT put_onselectstart(VARIANT);
+	HRESULT get_onselectstart(VARIANT*);
+	HRESULT elementFromPoint(LONG,LONG,LPHTMLELEMENT*);
+	HRESULT get_parentWindow(LPHTMLWINDOW2*);
+	HRESULT get_styleSheets(LPHTMLSTYLESHEETSCOLLECTION*);
+	HRESULT put_onbeforeupdate(VARIANT);
+	HRESULT get_onbeforeupdate(VARIANT*);
+	HRESULT put_onerrorupdate(VARIANT);
+	HRESULT get_onerrorupdate(VARIANT*);
+	HRESULT toString(BSTR*);
+	HRESULT createStyleSheet(BSTR,LONG,LPHTMLSTYLESHEET*);
+}
+
+interface IHTMLSelectionObject : public IDispatch {
+	HRESULT createRange(IDispatch*);
+	HRESULT empty();
+	HRESULT clear();
+	HRESULT get_type(BSTR*);
+}
+alias IHTMLSelectionObject LPHTMLSELECTIONOBJECT;
+
+interface IHTMLTxtRange : public IDispatch {
+	HRESULT get_htmlText(BSTR*);
+	HRESULT put_text(BSTR);
+	HRESULT get_text(BSTR*);
+	HRESULT parentElement(LPHTMLELEMENT*);
+	HRESULT duplicate(IHTMLTxtRange*);
+	HRESULT inRange(IHTMLTxtRange,VARIANT_BOOL*);
+	HRESULT isEqual(IHTMLTxtRange,VARIANT_BOOL*);
+	HRESULT scrollIntoView(VARIANT_BOOL);
+	HRESULT collapse(VARIANT_BOOL);
+	HRESULT expand(BSTR,VARIANT_BOOL*);
+	HRESULT move(BSTR,LONG,LONG*);
+	HRESULT moveStart(BSTR,LONG,LONG*);
+	HRESULT moveEnd(BSTR,LONG,LONG*);
+	HRESULT select();
+	HRESULT pasteHTML(BSTR);
+	HRESULT moveToElementText(LPHTMLELEMENT);
+	HRESULT setEndPoint(BSTR,IHTMLTxtRange);
+	HRESULT compareEndPoints(BSTR,IHTMLTxtRange,LONG*);
+	HRESULT findText(BSTR,LONG,LONG,VARIANT_BOOL*);
+	HRESULT moveToPoint(LONG,LONG);
+	HRESULT getBookmark(BSTR*);
+	HRESULT moveToBookbark(BSTR,VARIANT_BOOL*);
+	HRESULT queryCommandSupported(BSTR,VARIANT_BOOL*);
+	HRESULT queryCommandEnabled(BSTR,VARIANT_BOOL*);
+	HRESULT queryCommandState(BSTR,VARIANT_BOOL*);
+	HRESULT queryCommandIndeterm(BSTR,VARIANT_BOOL*);
+	HRESULT queryCommandText(BSTR,BSTR*);
+	HRESULT queryCommandValue(BSTR,VARIANT*);
+	HRESULT execCommand(BSTR,VARIANT_BOOL,VARIANT,VARIANT_BOOL*);
+	HRESULT execCommandShowHelp(BSTR,VARIANT_BOOL*);
+}
+
+interface IHTMLElement : public IDispatch {
+	HRESULT setAttribute(BSTR,VARIANT,LONG);
+	HRESULT getAttribute(BSTR,LONG,VARIANT*);
+	HRESULT removeAttribute(BSTR,LONG,VARIANT_BOOL*);
+	HRESULT put_className(BSTR);
+	HRESULT get_className(ref BSTR);
+	HRESULT put_id(BSTR);
+	HRESULT get_id(ref BSTR);
+	HRESULT get_tagName(ref BSTR);
+	HRESULT get_parentElement(LPHTMLELEMENT*);
+	HRESULT get_style(LPHTMLSTYLE*);
+	HRESULT put_onhelp(VARIANT);
+	HRESULT get_onhelp(VARIANT*);
+	HRESULT put_onclick(VARIANT);
+	HRESULT get_onclick(VARIANT*);
+	HRESULT put_ondblclick(VARIANT);
+	HRESULT get_ondblclick(VARIANT*);
+	HRESULT put_onkeydown(VARIANT);
+	HRESULT get_onkeydown(VARIANT*);
+	HRESULT put_onkeyup(VARIANT);
+	HRESULT get_onkeyup(VARIANT*);
+	HRESULT put_onkeypress(VARIANT);
+	HRESULT get_onkeypress(VARIANT*);
+	HRESULT put_onmouseout(VARIANT);
+	HRESULT get_onmouseout(VARIANT*);
+	HRESULT put_onmouseover(VARIANT);
+	HRESULT get_onmouseover(VARIANT*);
+	HRESULT put_onmousemove(VARIANT);
+	HRESULT get_onmousemove(VARIANT*);
+	HRESULT put_onmousedown(VARIANT);
+	HRESULT get_onmousedown(VARIANT*);
+	HRESULT put_onmouseup(VARIANT);
+	HRESULT get_onmouseup(VARIANT*);
+	HRESULT get_document(IDispatch*);
+	HRESULT put_title(BSTR);
+	HRESULT get_title(ref BSTR);
+	HRESULT put_language(BSTR);
+	HRESULT get_language(ref BSTR);
+	HRESULT put_onselectstart(VARIANT);
+	HRESULT get_onselectstart(VARIANT*);
+	HRESULT scrollIntoView(VARIANT);
+	HRESULT contains(LPHTMLELEMENT,VARIANT_BOOL*);
+	HRESULT get_source3Index(LONG*);
+	HRESULT get_recordNumber(VARIANT*);
+	HRESULT put_lang(BSTR);
+	HRESULT get_lang(ref BSTR);
+	HRESULT get_offsetLeft(LONG*);
+	HRESULT get_offsetTop(LONG*);
+	HRESULT get_offsetWidth(LONG*);
+	HRESULT get_offsetHeight(LONG*);
+	HRESULT get_offsetParent(LPHTMLELEMENT*);
+	HRESULT put_innerHTML(BSTR);
+	HRESULT get_innerHTML(ref BSTR);
+	HRESULT put_innerText(BSTR);
+	HRESULT get_innerText(ref BSTR);
+	HRESULT put_outerHTML(BSTR);
+	HRESULT get_outerHTML(ref BSTR);
+	HRESULT put_outerText(BSTR);
+	HRESULT get_outerText(ref BSTR);
+	HRESULT insertAdjacentHTML(BSTR,BSTR);
+	HRESULT insertAdjacentText(BSTR,BSTR);
+	HRESULT get_parentTextEdit(LPHTMLELEMENT*);
+	HRESULT isTextEdit(VARIANT_BOOL*);
+	HRESULT click();
+	HRESULT get_filters(LPHTMLFILTERSCOLLECTION*);
+	HRESULT put_ondragstart(VARIANT);
+	HRESULT get_ondragstart(VARIANT*);
+	HRESULT toString(BSTR*);
+	HRESULT put_onbeforeupdate(VARIANT);
+	HRESULT get_onbeforeupdate(VARIANT*);
+	HRESULT put_onafterupdate(VARIANT);
+	HRESULT get_onafterupdate(VARIANT*);
+	HRESULT put_onerrorupdate(VARIANT);
+	HRESULT get_onerrorupdate(VARIANT*);
+	HRESULT put_onrowexit(VARIANT);
+	HRESULT get_onrowexit(VARIANT*);
+	HRESULT put_onrowenter(VARIANT);
+	HRESULT get_onrowenter(VARIANT*);
+	HRESULT put_ondatasetchanged(VARIANT);
+	HRESULT get_ondatasetchanged(VARIANT*);
+	HRESULT put_ondataavailable(VARIANT);
+	HRESULT get_ondataavailable(VARIANT*);
+	HRESULT put_ondatasetcomplete(VARIANT);
+	HRESULT get_ondatasetcomplete(VARIANT*);
+	HRESULT put_onfilterchange(VARIANT);
+	HRESULT get_onfilterchange(VARIANT*);
+	HRESULT get_children(IDispatch*);
+	HRESULT get_all(IDispatch*);
+}
+alias IHTMLElement LPHTMLELEMENT;
+
+interface IHTMLFramesCollection2 : public IDispatch {
+	HRESULT item(VARIANT*,VARIANT*);
+	HRESULT get_length(LONG*);
+}
+
+interface IHTMLWindow2 : public IHTMLFramesCollection2 {
+	HRESULT get_frames(IHTMLFramesCollection2*);
+	HRESULT put_defaultStatus(BSTR);
+	HRESULT get_defaultStatus(BSTR*);
+	HRESULT put_status(BSTR);
+	HRESULT get_status(BSTR*);
+	HRESULT setTimeout(BSTR,LONG,VARIANT*,LONG*);
+	HRESULT clearTimeout(LONG);
+	HRESULT alert(BSTR);
+	HRESULT confirm(BSTR,VARIANT_BOOL*);
+	HRESULT prompt(BSTR,BSTR,VARIANT*);
+	HRESULT get_Image(LPHTMLIMAGEELEMENTFACTORY*);
+	HRESULT get_location(LPHTMLLOCATION*);
+	HRESULT get_history(LPOMHISTORY*);
+	HRESULT close();
+	HRESULT put_opener(VARIANT);
+	HRESULT get_opener(VARIANT*);
+	HRESULT get_navigator(LPOMNAVIGATOR*);
+	HRESULT put_name(BSTR);
+	HRESULT get_name(BSTR*);
+	HRESULT get_parent(LPHTMLWINDOW2*);
+	HRESULT open(BSTR,BSTR,BSTR,VARIANT_BOOL,LPHTMLWINDOW2*);
+	HRESULT get_self(LPHTMLWINDOW2*);
+	HRESULT get_top(LPHTMLWINDOW2*);
+	HRESULT get_window(LPHTMLWINDOW2*);
+	HRESULT navigate(BSTR);
+	HRESULT put_onfocus(VARIANT);
+	HRESULT get_onfocus(VARIANT*);
+	HRESULT put_onblur(VARIANT);
+	HRESULT get_onblur(VARIANT*);
+	HRESULT put_onload(VARIANT);
+	HRESULT get_onload(VARIANT*);
+	HRESULT put_onbeforeunload(VARIANT);
+	HRESULT get_onbeforeunload(VARIANT*);
+	HRESULT put_onunload(VARIANT);
+	HRESULT get_onunload(VARIANT*);
+	HRESULT put_onhelp(VARIANT);
+	HRESULT get_onhelp(VARIANT*);
+	HRESULT put_onerror(VARIANT);
+	HRESULT get_onerror(VARIANT*);
+	HRESULT put_onresize(VARIANT);
+	HRESULT get_onresize(VARIANT*);
+	HRESULT put_onscroll(VARIANT);
+	HRESULT get_onscroll(VARIANT*);
+	HRESULT get_document(IHTMLDocument2*);
+	HRESULT get_event(LPHTMLEVENTOBJ*);
+	HRESULT get__newEnum(IUnknown*);
+	HRESULT showModalDialog(BSTR,VARIANT*,VARIANT*,VARIANT*);
+	HRESULT showHelp(BSTR,VARIANT,BSTR);
+	HRESULT get_screen(LPHTMLSCREEN*);
+	HRESULT get_Option(LPHTMLOPTIONELEMENTFACTORY*);
+	HRESULT focus();
+	HRESULT get_closed(VARIANT_BOOL*);
+	HRESULT blur();
+	HRESULT scroll(long,long);
+	HRESULT get_clientInformation(LPOMNAVIGATOR*);
+	HRESULT setInterval(BSTR,long,VARIANT*,long*);
+	HRESULT clearInterval(long);
+	HRESULT put_offscreenBuffering(VARIANT);
+	HRESULT get_offscreenBuffering(VARIANT*);
+	HRESULT execScript(BSTR,BSTR,VARIANT*);
+	HRESULT toString(BSTR*);
+	HRESULT scrollBy(LONG,LONG);
+	HRESULT scrollTo(LONG,LONG);
+	HRESULT moveTo(LONG,LONG);
+	HRESULT moveBy(LONG,LONG);
+	HRESULT resizeTo(LONG,LONG);
+	HRESULT resizeBy(LONG,LONG);
+	HRESULT get_external(IDispatch*);
+}
+alias IHTMLWindow2 LPHTMLWINDOW2;
+
+interface IHTMLFrameBase : public IDispatch {
+	HRESULT put_src(BSTR);
+	HRESULT get_src(BSTR*);
+	HRESULT put_name(BSTR);
+	HRESULT get_name(BSTR*);
+	HRESULT put_border(VARIANT);
+	HRESULT get_border(VARIANT*);
+	HRESULT put_frameBorder(BSTR);
+	HRESULT get_frameBorder(BSTR*);
+	HRESULT put_frameSpacing(VARIANT);
+	HRESULT get_frameSpacing(VARIANT*);
+	HRESULT put_marginWidth(VARIANT);
+	HRESULT get_marginWidth(VARIANT*);
+	HRESULT put_marginHeight(VARIANT);
+	HRESULT get_marginHeight(VARIANT*);
+	HRESULT put_noResize(VARIANT_BOOL);
+	HRESULT get_noResize(VARIANT_BOOL*);
+	HRESULT put_scrolling(BSTR);
+	HRESULT get_scrolling(BSTR*);
+}
+
+interface IHTMLFrameBase2 : public IDispatch {
+	HRESULT get_contentWindow(IHTMLWindow2 *);
+	HRESULT put_onload(VARIANT);
+	HRESULT get_onload(VARIANT*);
+	HRESULT put_onreadystatechange(VARIANT);
+	HRESULT get_onreadystatechange(VARIANT*);
+	HRESULT get_readyState(BSTR*);
+	HRESULT put_allowTransparency(VARIANT_BOOL);
+	HRESULT get_allowTransparency(VARIANT_BOOL*);
+}
+
+interface IHTMLFrameBase3 : public IDispatch {
+	HRESULT put_longDesc(BSTR);
+	HRESULT get_longDesc(BSTR*);
+}
+
+interface IHTMLBodyElement : public IDispatch {
+	HRESULT put_background(BSTR);
+	HRESULT get_background(BSTR*);
+	HRESULT put_bgProperties(BSTR);
+	HRESULT get_bgProperties(BSTR*);
+	HRESULT put_leftMargin(VARIANT);
+	HRESULT get_leftMargin(VARIANT*);
+	HRESULT put_topMargin(VARIANT);
+	HRESULT get_topMargin(VARIANT*);
+	HRESULT put_rightMargin(VARIANT);
+	HRESULT get_rightMargin(VARIANT*);
+	HRESULT put_bottomMargin(VARIANT);
+	HRESULT get_bottomMargin(VARIANT*);
+	HRESULT put_noWrap(VARIANT_BOOL);
+	HRESULT get_noWrap(VARIANT_BOOL*);
+	HRESULT put_bgColor(VARIANT);
+	HRESULT get_bgColor(VARIANT*);
+	HRESULT put_text(VARIANT);
+	HRESULT get_text(VARIANT*);
+	HRESULT put_link(VARIANT);
+	HRESULT get_link(VARIANT*);
+	HRESULT put_vLink(VARIANT);
+	HRESULT get_vLink(VARIANT*);
+	HRESULT put_aLink(VARIANT);
+	HRESULT get_aLink(VARIANT*);
+	HRESULT put_onload(VARIANT);
+	HRESULT get_onload(VARIANT*);
+	HRESULT put_onunload(VARIANT);
+	HRESULT get_onunload(VARIANT*);
+	HRESULT put_scroll(BSTR);
+	HRESULT get_scroll(BSTR*);
+	HRESULT put_onselect(VARIANT);
+	HRESULT get_onselect(VARIANT*);
+	HRESULT put_onbeforeunload(VARIANT);
+	HRESULT get_onbeforeunload(VARIANT*);
+	HRESULT createTextRange(IHTMLTxtRange*);
+}
+
+interface IHTMLBodyElement2 : public IDispatch {
+	HRESULT put_onbeforeprint(VARIANT);
+	HRESULT get_onbeforeprint(VARIANT*);
+	HRESULT put_onafterprint(VARIANT);
+	HRESULT get_onafterprint(VARIANT*);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/mswsock.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,203 @@
+/***********************************************************************\
+*                               mswsock.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                             by Daniel Keep                            *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.mswsock;
+
+import win32.winbase, win32.windef;
+private import win32.basetyps, win32.w32api;
+
+// FIXME: clean up Windows version support
+
+version (Win32_Winsock2) pragma(msg,
+ "Version Win32_Winsock2 is deprecated; Winsock2 is now imported by default");
+
+// Pull in Winsock1 if the user has put "Win32_Winsock1" on the compile
+// line; otherwise, default to Winsock2.
+version (Win32_Winsock1) {
+	import win32.winsock;
+} else {
+	import win32.winsock2;
+}
+
+static if (_WIN32_WINNT_ONLY) {
+	static if (_WIN32_WINNT >= 0x500) {
+		enum {
+			/* WinNT5+:
+			   ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
+			SO_MAXDG             = 0x7009,
+			SO_MAXPATHDG         = 0x700A,
+		}
+	}
+
+	enum {
+		/* WinNT4+:
+		   ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options_for_windows_nt_4_0_2.htm */
+		SO_CONNDATA              = 0x7000,
+		SO_CONNOPT               = 0x7001,
+		SO_DISCDATA              = 0x7002,
+		SO_DISCOPT               = 0x7003,
+		SO_CONNDATALEN           = 0x7004,
+		SO_CONNOPTLEN            = 0x7005,
+		SO_DISCDATALEN           = 0x7006,
+		SO_DISCOPTLEN            = 0x7007,
+
+		/* WinNT4:
+		   ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
+		SO_UPDATE_ACCEPT_CONTENT = 0x700B,
+	}
+}
+
+enum {
+	/* Win95+, WinNT4+ but apparently shouldn't used: mark as deprecated?
+	   ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
+	SO_OPENTYPE                  = 0x7008,
+
+	/* Win95+; these two are passed to the SO_OPENTYPE option as arguments,
+	   so would they be deprecated as well?
+	   ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
+	SO_SYNCHRONOUS_ALERT         = 0x0010,
+	SO_SYNCHRONOUS_NONALERT      = 0x0020,
+
+	/* Win95:
+	   ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
+	SO_CONNECT_TIME              = 0x700C,
+}
+
+
+static if (_WIN32_WINNT_ONLY) {
+	enum {
+		TCP_BSDURGENT = 0x7000,
+	}
+
+	/* These *appear* to be constants for passing to the TransmitFile /
+	   TransmitPackets functions, which are available in WinNT3.51+
+	   ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmitfile_2.htm */
+	enum {
+		TF_DISCONNECT         = 1,
+		TF_REUSE_SOCKET       = 2,
+		TF_WRITE_BEHIND       = 4,
+		TF_USE_DEFAULT_WORKER = 0,
+		TF_USE_SYSTEM_THREAD  = 16,
+		TF_USE_KERNEL_APC     = 32
+	}
+}
+
+/* Win95+, WinNT3.51+
+   ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmit_file_buffers_2.htm */
+struct TRANSMIT_FILE_BUFFERS {
+	PVOID Head;
+	DWORD HeadLength;
+	PVOID Tail;
+	DWORD TailLength;
+}
+alias TRANSMIT_FILE_BUFFERS* PTRANSMIT_FILE_BUFFERS, LPTRANSMIT_FILE_BUFFERS;
+
+extern(Windows) {
+	/* Win95+, WinNT3.51+
+	   ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/wsarecvex_2.htm */
+	int WSARecvEx(SOCKET, char*, int, int*);
+
+	/* Win95+, WinNT3.51+
+	   ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/getacceptexSOCKADDRs_2.htm */
+	VOID GetAcceptExSockaddrs(PVOID, DWORD, DWORD, DWORD, SOCKADDR**, LPINT, SOCKADDR**, LPINT);
+
+	static if (_WIN32_WINNT_ONLY) {
+		/* WinNT3.51+
+		   ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmitfile_2.htm */
+		BOOL TransmitFile(SOCKET, HANDLE, DWORD, DWORD, LPOVERLAPPED, LPTRANSMIT_FILE_BUFFERS, DWORD);
+
+		/* WinNT3.51+
+		   ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/acceptex_2.htm */
+		alias BOOL function(SOCKET, SOCKET, PVOID, DWORD, DWORD, DWORD, LPDWORD, LPOVERLAPPED) LPFN_ACCEPTEX;
+        const GUID WSAID_ACCEPTEX = {0xb5367df1,0xcbac,0x11cf,[0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92]};
+
+        alias BOOL function(SOCKET, SOCKADDR*, int, PVOID, DWORD, LPDWORD, LPOVERLAPPED) LPFN_CONNECTEX;
+        const GUID WSAID_CONNECTEX = {0x25a207b9,0xddf3,0x4660,[0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e]};
+	}
+}
+
+version(Win32_Winsock1) {
+} else {
+	static if (WINVER > 0x501) {
+		/*	These appear to be constants for the TRANSMIT_PACKETS_ELEMENT
+		 *	structure below, so I've given them the same minimum version
+		 */
+		enum {
+			TP_ELEMENT_FILE   = 1,
+			TP_ELEMENT_MEMORY = 2,
+			TP_ELEMENT_EOP    = 4
+		}
+
+		/*	WinXP+, Srv2k3+
+		 *	ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmit_packets_element_2.htm
+		 */
+		struct TRANSMIT_PACKETS_ELEMENT {
+			ULONG dwElFlags;
+			ULONG cLength;
+			union {
+				struct {
+					LARGE_INTEGER nFileOffset;
+					HANDLE        hFile;
+				}
+				PVOID pBuffer;
+			}
+		}
+
+		/*	WinXP+, Server2003+:
+		 *	ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/wsamsg_2.htm
+		 */
+		struct WSAMSG {
+			LPSOCKADDR name;
+			INT        namelen;
+			LPWSABUF   lpBuffers;
+			DWORD      dwBufferCount;
+			WSABUF     Control;
+			DWORD      dwFlags;
+		}
+
+		alias WSAMSG* PWSAMSG, LPWSAMSG;
+
+		/* According to MSDN docs, the WSAMSG.Control buffer starts with a
+		   cmsghdr header of the following form.  See also RFC 2292. */
+		/* DK: Confirmed.  So I suppose these should get the same version as
+		   WSAMSG... */
+		struct WSACMSGHDR {
+			UINT cmsg_len;
+			INT  cmsg_level;
+			INT  cmsg_type;
+			// followed by UCHAR cmsg_data[];
+		}
+
+		/* TODO: Standard Posix.1g macros as per RFC 2292, with WSA_uglification. */
+		/* DK: MinGW doesn't define these, and neither does the MSDN docs.  Might have
+		   to actually look up RFC 2292... */
+		/+
+		#if 0
+		#define WSA_CMSG_FIRSTHDR(mhdr)
+		#define WSA_CMSG_NXTHDR(mhdr, cmsg)
+		#define WSA_CMSG_SPACE(length)
+		#define WSA_CMSG_LEN(length)
+		#endif
+		+/
+
+		extern(Windows)
+		{
+			/*	WinXP+, Srv2k3+
+			 *	ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/disconnectex_2.htm
+			 */
+			BOOL DisconnectEx(SOCKET, LPOVERLAPPED, DWORD, DWORD);
+
+			/*	WinXP+, Srv2k3+
+			 *	ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/wsarecvmsg_2.htm
+			 */
+			int WSARecvMsg(SOCKET, LPWSAMSG, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/nb30.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,237 @@
+/***********************************************************************\
+*                                 nb30.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.nb30;
+
+private import win32.windef;
+
+const size_t
+	NCBNAMSZ =  16,
+	MAX_LANA = 254;
+
+// FIXME: are these really two sets of constants?
+enum : UCHAR {
+	REGISTERING     = 0,
+	REGISTERED      = 4,
+	DEREGISTERED,
+	DUPLICATE,
+	DUPLICATE_DEREG, // = 7
+	UNIQUE_NAME     = 0,
+	GROUP_NAME      = 0x80,
+	NAME_FLAGS_MASK = 0x87
+}
+
+enum : UCHAR {
+	LISTEN_OUTSTANDING = 1,
+	CALL_PENDING,
+	SESSION_ESTABLISHED,
+	HANGUP_PENDING,
+	HANGUP_COMPLETE,
+	SESSION_ABORTED // = 6
+}
+
+const char[4]
+	ALL_TRANSPORTS = "M\0\0\0",
+	MS_NBF         = "MNBF";
+
+enum : UCHAR {
+	NCBCALL        = 0x10,
+	NCBLISTEN,
+	NCBHANGUP,  // = 0x12
+	NCBSEND        = 0x14,
+	NCBRECV,
+	NCBRECVANY,
+	NCBCHAINSEND, // = 0x17
+	NCBDGSEND      = 0x20,
+	NCBDGRECV,
+	NCBDGSENDBC,
+	NCBDGRECVBC, // = 0x23,
+	NCBADDNAME     = 0x30,
+	NCBDELNAME,
+	NCBRESET,
+	NCBASTAT,
+	NCBSSTAT,
+	NCBCANCEL,
+	NCBADDGRNAME,
+	NCBENUM,    // = 0x37
+	NCBUNLINK      = 0x70,
+	NCBSENDNA,
+	NCBCHAINSENDNA,
+	NCBLANSTALERT, // = 0x73
+	NCBACTION      = 0x77,
+	NCBFINDNAME,
+	NCBTRACE    // = 0x79
+}
+
+const UCHAR ASYNCH = 0x80;
+
+enum : UCHAR {
+	NRC_GOODRET     = 0x00,
+	NRC_BUFLEN      = 0x01,
+	NRC_ILLCMD      = 0x03,
+	NRC_CMDTMO      = 0x05,
+	NRC_INCOMP,
+	NRC_BADDR,
+	NRC_SNUMOUT,
+	NRC_NORES,
+	NRC_SCLOSED,
+	NRC_CMDCAN,  // = 0x0b
+	NRC_DUPNAME     = 0x0d,
+	NRC_NAMTFUL,
+	NRC_ACTSES,  // = 0x0f,
+	NRC_LOCTFUL     = 0x11,
+	NRC_REMTFUL,
+	NRC_ILLNN,
+	NRC_NOCALL,
+	NRC_NOWILD,
+	NRC_INUSE,
+	NRC_NAMERR,
+	NRC_SABORT,
+	NRC_NAMCONF, // = 0x19
+	NRC_IFBUSY      = 0x21,
+	NRC_TOOMANY,
+	NRC_BRIDGE,
+	NRC_CANOCCR, // = 0x24
+	NRC_CANCEL      = 0x26,
+	NRC_DUPENV      = 0x30,
+	NRC_ENVNOTDEF   = 0x34,
+	NRC_OSRESNOTAV,
+	NRC_MAXAPPS,
+	NRC_NOSAPS,
+	NRC_NORESOURCES,
+	NRC_INVADDRESS, // = 0x39
+	NRC_INVDDID     = 0x3B,
+	NRC_LOCKFAIL    = 0x3C,
+	NRC_OPENERR     = 0x3f,
+	NRC_SYSTEM      = 0x40,
+	NRC_PENDING     = 0xff
+}
+
+struct ACTION_HEADER {
+	union {
+		/*	transport_id is defined as a ULONG, but both the above constants
+		 *	and the documented description suggest it should be a char[4]
+		 */
+		ULONG   transport_id;
+		char[4] c_transport_id;
+	}
+	USHORT action_code;
+	USHORT reserved;
+}
+alias ACTION_HEADER* PACTION_HEADER;
+
+struct ADAPTER_STATUS {
+	UCHAR[6] adapter_address;
+	UCHAR    rev_major;
+	UCHAR    reserved0;
+	UCHAR    adapter_type;
+	UCHAR    rev_minor;
+	WORD     duration;
+	WORD     frmr_recv;
+	WORD     frmr_xmit;
+	WORD     iframe_recv_err;
+	WORD     xmit_aborts;
+	DWORD    xmit_success;
+	DWORD    recv_success;
+	WORD     iframe_xmit_err;
+	WORD     recv_buff_unavail;
+	WORD     t1_timeouts;
+	WORD     ti_timeouts;
+	DWORD    reserved1;
+	WORD     free_ncbs;
+	WORD     max_cfg_ncbs;
+	WORD     max_ncbs;
+	WORD     xmit_buf_unavail;
+	WORD     max_dgram_size;
+	WORD     pending_sess;
+	WORD     max_cfg_sess;
+	WORD     max_sess;
+	WORD     max_sess_pkt_size;
+	WORD     name_count;
+}
+alias ADAPTER_STATUS* PADAPTER_STATUS;
+
+struct FIND_NAME_BUFFER {
+	/*	From Win32 API docs
+	 *
+	 *	length
+	 *		Specifies the length, in bytes, of the FIND_NAME_BUFFER
+	 *		structure. Although this structure always occupies 33 bytes,
+	 *		not all of the structure is necessarily valid.
+	 *
+	 *	On this basis, should length be initialised?
+	 */
+	UCHAR     length;
+	UCHAR     access_control;
+	UCHAR     frame_control;
+	UCHAR[6]  destination_addr;
+	UCHAR[6]  source_addr;
+	UCHAR[18] routing_info;
+}
+alias FIND_NAME_BUFFER* PFIND_NAME_BUFFER;
+
+struct FIND_NAME_HEADER {
+	WORD  node_count;
+	UCHAR reserved;
+	UCHAR unique_group;
+}
+alias FIND_NAME_HEADER* PFIND_NAME_HEADER;
+
+struct LANA_ENUM {
+	UCHAR             length;
+	UCHAR[MAX_LANA+1] lana;
+}
+alias LANA_ENUM* PLANA_ENUM;
+
+struct NAME_BUFFER {
+	UCHAR[NCBNAMSZ] name;
+	UCHAR           name_num;
+	UCHAR           name_flags;
+}
+alias NAME_BUFFER* PNAME_BUFFER;
+
+struct NCB {
+	UCHAR           ncb_command;
+	UCHAR           ncb_retcode;
+	UCHAR           ncb_lsn;
+	UCHAR           ncb_num;
+	PUCHAR          ncb_buffer;
+	WORD            ncb_length;
+	UCHAR[NCBNAMSZ] ncb_callname;
+	UCHAR[NCBNAMSZ] ncb_name;
+	UCHAR           ncb_rto;
+	UCHAR           ncb_sto;
+	extern (Windows) void function(NCB*) ncb_post;
+	UCHAR           ncb_lana_num;
+	UCHAR           ncb_cmd_cplt;
+	UCHAR           ncb_reserve[10];
+	HANDLE          ncb_event;
+}
+alias NCB* PNCB;
+
+struct SESSION_BUFFER {
+	UCHAR           lsn;
+	UCHAR           state;
+	UCHAR[NCBNAMSZ] local_name;
+	UCHAR[NCBNAMSZ] remote_name;
+	UCHAR           rcvs_outstanding;
+	UCHAR           sends_outstanding;
+}
+alias SESSION_BUFFER* PSESSION_BUFFER;
+
+struct SESSION_HEADER {
+	UCHAR sess_name;
+	UCHAR num_sess;
+	UCHAR rcv_dg_outstanding;
+	UCHAR rcv_any_outstanding;
+}
+alias SESSION_HEADER* PSESSION_HEADER;
+
+extern (Windows) UCHAR Netbios(PNCB);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/nddeapi.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,162 @@
+/***********************************************************************\
+*                               nddeapi.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.nddeapi;
+
+private import win32.windef;
+
+// FIXME: check types and grouping of constants
+
+/+
+#ifndef CNLEN /* also in lmcons.h */
+#define CNLEN 15
+#define UNCLEN (CNLEN + 2)
+#endif
++/
+
+const char    SEP_CHAR  = ',';
+const char[]  BAR_CHAR  = "|";
+const wchar   SEP_WCHAR = ',';
+const wchar[] BAR_WCHAR = "|";
+
+enum {
+	NDDE_NO_ERROR,
+	NDDE_ACCESS_DENIED,
+	NDDE_BUF_TOO_SMALL,
+	NDDE_ERROR_MORE_DATA,
+	NDDE_INVALID_SERVER,
+	NDDE_INVALID_SHARE,
+	NDDE_INVALID_PARAMETER,
+	NDDE_INVALID_LEVEL,
+	NDDE_INVALID_PASSWORD,
+	NDDE_INVALID_ITEMNAME,
+	NDDE_INVALID_TOPIC,
+	NDDE_INTERNAL_ERROR,
+	NDDE_OUT_OF_MEMORY,
+	NDDE_INVALID_APPNAME,
+	NDDE_NOT_IMPLEMENTED,
+	NDDE_SHARE_ALREADY_EXIST,
+	NDDE_SHARE_NOT_EXIST,
+	NDDE_INVALID_FILENAME,
+	NDDE_NOT_RUNNING,
+	NDDE_INVALID_WINDOW,
+	NDDE_INVALID_SESSION,
+	NDDE_INVALID_ITEM_LIST,
+	NDDE_SHARE_DATA_CORRUPTED,
+	NDDE_REGISTRY_ERROR,
+	NDDE_CANT_ACCESS_SERVER,
+	NDDE_INVALID_SPECIAL_COMMAND,
+	NDDE_INVALID_SECURITY_DESC,
+	NDDE_TRUST_SHARE_FAIL
+}
+
+const size_t
+	MAX_NDDESHARENAME = 256,
+	MAX_DOMAINNAME = 15,
+	MAX_USERNAME = 15,
+	MAX_APPNAME = 255,
+	MAX_TOPICNAME = 255,
+	MAX_ITEMNAME = 255;
+
+const NDDEF_NOPASSWORDPROMPT = 1;
+const NDDEF_NOCACHELOOKUP    = 2;
+const NDDEF_STRIP_NDDE       = 4;
+
+const SHARE_TYPE_OLD         = 1;
+const SHARE_TYPE_NEW         = 2;
+const SHARE_TYPE_STATIC      = 4;
+
+const uint
+	NDDE_CMD_SHOW_MASK     = 0x0000FFFF,
+	NDDE_TRUST_CMD_SHOW    = 0x10000000,
+	NDDE_TRUST_SHARE_DEL   = 0x20000000,
+	NDDE_TRUST_SHARE_INIT  = 0x40000000,
+	NDDE_TRUST_SHARE_START = 0x80000000;
+
+struct NDdeShareInfo_tag {
+	LONG    lRevision;
+	LPTSTR  lpszShareName;
+	LONG    lShareType;
+	LPTSTR  lpszAppTopicList;
+	LONG    fSharedFlag;
+	LONG    fService;
+	LONG    fStartAppFlag;
+	LONG    nCmdShow;
+	LONG[2] qModifyId;
+	LONG    cNumItems;
+	LPTSTR  lpszItemList;
+}
+extern (C) {	// huh?
+	NDdeShareInfo_tag  NDDESHAREINFO;
+	NDdeShareInfo_tag* PNDDESHAREINFO;
+}
+
+extern (Windows) {
+	UINT NDdeGetErrorStringA(UINT, LPSTR, DWORD);
+	UINT NDdeGetErrorStringW(UINT, LPWSTR, DWORD);
+	UINT NDdeGetShareSecurityA(LPSTR, LPSTR, SECURITY_INFORMATION,
+	  PSECURITY_DESCRIPTOR, DWORD, PDWORD);
+	UINT NDdeGetShareSecurityW(LPWSTR, LPWSTR, SECURITY_INFORMATION,
+	  PSECURITY_DESCRIPTOR, DWORD, PDWORD);
+	UINT NDdeGetTrustedShareA(LPSTR, LPSTR, PDWORD, PDWORD, PDWORD);
+	UINT NDdeGetTrustedShareW(LPWSTR, LPWSTR, PDWORD, PDWORD, PDWORD);
+	BOOL NDdeIsValidShareNameA(LPSTR);
+	BOOL NDdeIsValidShareNameW(LPWSTR);
+	BOOL NDdeIsValidAppTopicListA(LPSTR);
+	BOOL NDdeIsValidAppTopicListW(LPWSTR);
+	UINT NDdeSetShareSecurityA(LPSTR, LPSTR, SECURITY_INFORMATION,
+	  PSECURITY_DESCRIPTOR);
+	UINT NDdeSetShareSecurityW(LPWSTR, LPWSTR, SECURITY_INFORMATION,
+	  PSECURITY_DESCRIPTOR);
+	UINT NDdeSetTrustedShareA(LPSTR, LPSTR, DWORD);
+	UINT NDdeSetTrustedShareW(LPWSTR, LPWSTR, DWORD);
+	UINT NDdeShareAddA(LPSTR, UINT, PSECURITY_DESCRIPTOR, PBYTE, DWORD);
+	UINT NDdeShareAddW(LPWSTR, UINT, PSECURITY_DESCRIPTOR, PBYTE, DWORD);
+	UINT NDdeShareDelA(LPSTR, LPSTR, UINT);
+	UINT NDdeShareDelW(LPWSTR, LPWSTR, UINT);
+	UINT NDdeShareEnumA(LPSTR, UINT, PBYTE, DWORD, PDWORD, PDWORD);
+	UINT NDdeShareEnumW(LPWSTR, UINT, PBYTE, DWORD, PDWORD, PDWORD);
+	UINT NDdeShareGetInfoA(LPSTR, LPSTR, UINT, PBYTE, DWORD, PDWORD, PWORD);
+	UINT NDdeShareGetInfoW(LPWSTR, LPWSTR, UINT, PBYTE, DWORD, PDWORD, PWORD);
+	UINT NDdeShareSetInfoA(LPSTR, LPSTR, UINT, PBYTE, DWORD, WORD);
+	UINT NDdeShareSetInfoW(LPWSTR, LPWSTR, UINT, PBYTE, DWORD, WORD);
+	UINT NDdeTrustedShareEnumA(LPSTR, UINT, PBYTE, DWORD, PDWORD, PDWORD);
+	UINT NDdeTrustedShareEnumW(LPWSTR, UINT, PBYTE, DWORD, PDWORD, PDWORD);
+}
+
+version (Unicode) {
+	alias NDdeShareAddW NDdeShareAdd;
+	alias NDdeShareDelW NDdeShareDel;
+	alias NDdeSetShareSecurityW NDdeSetShareSecurity;
+	alias NDdeGetShareSecurityW NDdeGetShareSecurity;
+	alias NDdeShareEnumW NDdeShareEnum;
+	alias NDdeShareGetInfoW NDdeShareGetInfo;
+	alias NDdeShareSetInfoW NDdeShareSetInfo;
+	alias NDdeGetErrorStringW NDdeGetErrorString;
+	alias NDdeIsValidShareNameW NDdeIsValidShareName;
+	alias NDdeIsValidAppTopicListW NDdeIsValidAppTopicList;
+	alias NDdeSetTrustedShareW NDdeSetTrustedShare;
+	alias NDdeGetTrustedShareW NDdeGetTrustedShare;
+	alias NDdeTrustedShareEnumW NDdeTrustedShareEnum;
+} else {
+	alias NDdeShareAddA NDdeShareAdd;
+	alias NDdeShareDelA NDdeShareDel;
+	alias NDdeSetShareSecurityA NDdeSetShareSecurity;
+	alias NDdeGetShareSecurityA NDdeGetShareSecurity;
+	alias NDdeShareEnumA NDdeShareEnum;
+	alias NDdeShareGetInfoA NDdeShareGetInfo;
+	alias NDdeShareSetInfoA NDdeShareSetInfo;
+	alias NDdeGetErrorStringA NDdeGetErrorString;
+	alias NDdeIsValidShareNameA NDdeIsValidShareName;
+	alias NDdeIsValidAppTopicListA NDdeIsValidAppTopicList;
+	alias NDdeSetTrustedShareA NDdeSetTrustedShare;
+	alias NDdeGetTrustedShareA NDdeGetTrustedShare;
+	alias NDdeTrustedShareEnumA NDdeTrustedShareEnum;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/nspapi.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,148 @@
+/***********************************************************************\
+*                                nspapi.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.nspapi;
+
+private import win32.basetyps, win32.windef;
+
+// FIXME: check types of constants
+
+enum {
+	NS_ALL         =  0,
+
+	NS_SAP,
+	NS_NDS,
+	NS_PEER_BROWSE,
+
+	NS_TCPIP_LOCAL = 10,
+	NS_TCPIP_HOSTS,
+	NS_DNS,
+	NS_NETBT,
+	NS_WINS,
+
+	NS_NBP         = 20,
+
+	NS_MS          = 30,
+	NS_STDA,
+	NS_NTDS,
+
+	NS_X500        = 40,
+	NS_NIS,
+	NS_NISPLUS,
+
+	NS_WRQ         = 50
+}
+
+enum {
+	SERVICE_REGISTER   = 1,
+	SERVICE_DEREGISTER = 2,
+	SERVICE_FLUSH      = 3,
+	SERVICE_FLAG_HARD  = 2
+}
+
+/*	MinGW makes the next section conditional on winsock.h or winsock2.h
+ *	being included.  But that doesn't translate well into D.
+ */
+version (Win32_Winsock1) {
+	import win32.winsock;
+} else {
+	import win32.winsock2;
+}
+
+struct SOCKET_ADDRESS {
+	LPSOCKADDR lpSockaddr;
+	INT        iSockaddrLength;
+}
+alias SOCKET_ADDRESS* PSOCKET_ADDRESS, LPSOCKET_ADDRESS;
+
+struct CSADDR_INFO {
+	SOCKET_ADDRESS LocalAddr;
+	SOCKET_ADDRESS RemoteAddr;
+	INT            iSocketType;
+	INT            iProtocol;
+}
+alias CSADDR_INFO* PCSADDR_INFO, LPCSADDR_INFO;
+
+struct BLOB {
+	ULONG cbSize;
+	BYTE* pBlobData;
+}
+alias BLOB* PBLOB, LPBLOB;
+
+struct SERVICE_ADDRESS {
+	DWORD dwAddressType;
+	DWORD dwAddressFlags;
+	DWORD dwAddressLength;
+	DWORD dwPrincipalLength;
+	BYTE* lpAddress;
+	BYTE* lpPrincipal;
+}
+
+struct SERVICE_ADDRESSES {
+	DWORD           dwAddressCount;
+	SERVICE_ADDRESS _Addresses;
+
+	SERVICE_ADDRESS* Addresses() { return &_Addresses; }
+}
+alias SERVICE_ADDRESSES* PSERVICE_ADDRESSES, LPSERVICE_ADDRESSES;
+
+struct SERVICE_INFOA {
+	LPGUID lpServiceType;
+	LPSTR  lpServiceName;
+	LPSTR  lpComment;
+	LPSTR  lpLocale;
+	DWORD  dwDisplayHint;
+	DWORD  dwVersion;
+	DWORD  dwTime;
+	LPSTR  lpMachineName;
+	LPSERVICE_ADDRESSES lpServiceAddress;
+	BLOB   ServiceSpecificInfo;
+}
+alias SERVICE_INFOA* LPSERVICE_INFOA;
+
+struct SERVICE_INFOW {
+	LPGUID lpServiceType;
+	LPWSTR lpServiceName;
+	LPWSTR lpComment;
+	LPWSTR lpLocale;
+	DWORD  dwDisplayHint;
+	DWORD  dwVersion;
+	DWORD  dwTime;
+	LPWSTR lpMachineName;
+	LPSERVICE_ADDRESSES lpServiceAddress;
+	BLOB   ServiceSpecificInfo;
+}
+alias SERVICE_INFOW* LPSERVICE_INFOW;
+
+alias void* LPSERVICE_ASYNC_INFO;
+
+extern (Windows) {
+	INT SetServiceA(DWORD, DWORD, DWORD, LPSERVICE_INFOA,
+	  LPSERVICE_ASYNC_INFO, LPDWORD);
+	INT SetServiceW(DWORD, DWORD, DWORD, LPSERVICE_INFOW,
+	  LPSERVICE_ASYNC_INFO, LPDWORD);
+	INT GetAddressByNameA(DWORD, LPGUID, LPSTR, LPINT, DWORD,
+	  LPSERVICE_ASYNC_INFO, LPVOID, LPDWORD, LPSTR, LPDWORD);
+	INT GetAddressByNameW(DWORD, LPGUID, LPWSTR, LPINT, DWORD,
+	  LPSERVICE_ASYNC_INFO, LPVOID, LPDWORD, LPWSTR, LPDWORD);
+}
+
+version (Unicode) {
+	alias SERVICE_INFOW SERVICE_INFO;
+	alias SetServiceW SetService;
+	alias GetAddressByNameW GetAddressByName;
+} else {
+	alias SERVICE_INFOA SERVICE_INFO;
+	alias SetServiceA SetService;
+	alias GetAddressByNameA GetAddressByName;
+}
+
+alias SERVICE_INFO _SERVICE_INFO;
+alias SERVICE_INFO* LPSERVICE_INFO;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/ntdef.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,79 @@
+/***********************************************************************\
+*                                ntdef.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.ntdef;
+
+private import win32.basetsd, win32.subauth, win32.windef, win32.winnt;
+
+const uint
+	OBJ_INHERIT          = 0x0002,
+	OBJ_PERMANENT        = 0x0010,
+	OBJ_EXCLUSIVE        = 0x0020,
+	OBJ_CASE_INSENSITIVE = 0x0040,
+	OBJ_OPENIF           = 0x0080,
+	OBJ_OPENLINK         = 0x0100,
+	OBJ_VALID_ATTRIBUTES = 0x01F2;
+
+void InitializeObjectAttributes(OBJECT_ATTRIBUTES* p, UNICODE_STRING* n,
+	  uint a, HANDLE r, void* s) {
+	with (*p) {
+		Length = OBJECT_ATTRIBUTES.sizeof;
+		RootDirectory = r;
+		Attributes = a;
+		ObjectName = n;
+		SecurityDescriptor = s;
+		SecurityQualityOfService = null;
+	}
+}
+
+bool NT_SUCCESS(int x) { return x >= 0; }
+
+/*	In MinGW, NTSTATUS, UNICODE_STRING, STRING and their associated pointer
+ *	type aliases are defined in ntdef.h, ntsecapi.h and subauth.h, each of
+ *	which checks that none of the others is already included.
+ */
+alias int  NTSTATUS;
+alias int* PNTSTATUS;
+
+struct UNICODE_STRING {
+	USHORT Length;
+	USHORT MaximumLength;
+	PWSTR  Buffer;
+}
+alias UNICODE_STRING* PUNICODE_STRING, PCUNICODE_STRING;
+
+struct STRING {
+	USHORT Length;
+	USHORT MaximumLength;
+	PCHAR  Buffer;
+}
+alias STRING  ANSI_STRING, OEM_STRING;
+alias STRING* PSTRING, PANSI_STRING, POEM_STRING;
+
+alias LARGE_INTEGER  PHYSICAL_ADDRESS;
+alias LARGE_INTEGER* PPHYSICAL_ADDRESS;
+
+enum SECTION_INHERIT {
+	ViewShare = 1,
+	ViewUnmap
+}
+
+/*	In MinGW, this is defined in ntdef.h and ntsecapi.h, each of which checks
+ *	that the other isn't already included.
+ */
+struct OBJECT_ATTRIBUTES {
+	ULONG           Length = OBJECT_ATTRIBUTES.sizeof;
+	HANDLE          RootDirectory;
+	PUNICODE_STRING ObjectName;
+	ULONG           Attributes;
+	PVOID           SecurityDescriptor;
+	PVOID           SecurityQualityOfService;
+}
+alias OBJECT_ATTRIBUTES* POBJECT_ATTRIBUTES;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/ntdll.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,27 @@
+/***********************************************************************\
+*                                ntdll.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*             Translated from MinGW API for MS-Windows 3.10             *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.ntdll;
+
+private import win32.w32api;
+
+// http://www.matcode.com/undocwin.h.txt
+static assert (_WIN32_WINNT_ONLY,
+	"win32.ntdll is available only if version WindowsNTonly, WindowsXP, "
+	"Windows2003 or WindowsVista is set");
+
+
+enum SHUTDOWN_ACTION {
+	ShutdownNoReboot,
+	ShutdownReboot,
+	ShutdownPowerOff
+}
+
+extern (Windows) uint NtShutdownSystem(SHUTDOWN_ACTION Action);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/ntldap.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,58 @@
+/***********************************************************************\
+*                                ntldap.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.ntldap;
+
+/*	TOTHINKABOUT: These constants don't have ANSI/Unicode versioned
+ *	aliases.  Should we merge them anyway?
+ */
+
+const char[]
+	LDAP_SERVER_ASQ_OID                    = "1.2.840.113556.1.4.1504",
+	LDAP_SERVER_DIRSYNC_OID                = "1.2.840.113556.1.4.841",
+	LDAP_SERVER_SD_FLAGS_OID               = "1.2.840.113556.1.4.801",
+	LDAP_SERVER_FAST_BIND_OID              = "1.2.840.113556.1.4.1781",
+	LDAP_MATCHING_RULE_BIT_OR              = "1.2.840.113556.1.4.804",
+	LDAP_MATCHING_RULE_BIT_AND             = "1.2.840.113556.1.4.803",
+	LDAP_SERVER_EXTENDED_DN_OID            = "1.2.840.113556.1.4.529",
+	LDAP_SERVER_LAZY_COMMIT_OID            = "1.2.840.113556.1.4.619",
+	LDAP_SERVER_TREE_DELETE_OID            = "1.2.840.113556.1.4.805",
+	LDAP_SERVER_VERIFY_NAME_OID            = "1.2.840.113556.1.4.1338",
+	LDAP_SERVER_SHOW_DELETED_OID           = "1.2.840.113556.1.4.417",
+	LDAP_SERVER_NOTIFICATION_OID           = "1.2.840.113556.1.4.528",
+	LDAP_SERVER_DOMAIN_SCOPE_OID           = "1.2.840.113556.1.4.1339",
+	LDAP_CAP_ACTIVE_DIRECTORY_OID          = "1.2.840.113556.1.4.800",
+	LDAP_SERVER_SEARCH_OPTIONS_OID         = "1.2.840.113556.1.4.1340",
+	LDAP_CAP_ACTIVE_DIRECTORY_V51_OID      = "1.2.840.113556.1.4.1670",
+	LDAP_SERVER_PERMISSIVE_MODIFY_OID      = "1.2.840.113556.1.4.1413",
+	LDAP_SERVER_CROSSDOM_MOVE_TARGET_OID   = "1.2.840.113556.1.4.521";
+
+const wchar[]
+	LDAP_SERVER_ASQ_OID_W                  = "1.2.840.113556.1.4.1504",
+	LDAP_SERVER_DIRSYNC_OID_W              = "1.2.840.113556.1.4.841",
+	LDAP_SERVER_SD_FLAGS_OID_W             = "1.2.840.113556.1.4.801",
+	LDAP_SERVER_FAST_BIND_OID_W            = "1.2.840.113556.1.4.1781",
+	LDAP_MATCHING_RULE_BIT_OR_W            = "1.2.840.113556.1.4.804",
+	LDAP_MATCHING_RULE_BIT_AND_W           = "1.2.840.113556.1.4.803",
+	LDAP_SERVER_EXTENDED_DN_OID_W          = "1.2.840.113556.1.4.529",
+	LDAP_SERVER_LAZY_COMMIT_OID_W          = "1.2.840.113556.1.4.619",
+	LDAP_SERVER_TREE_DELETE_OID_W          = "1.2.840.113556.1.4.805",
+	LDAP_SERVER_VERIFY_NAME_OID_W          = "1.2.840.113556.1.4.1338",
+	LDAP_SERVER_SHOW_DELETED_OID_W         = "1.2.840.113556.1.4.417",
+	LDAP_SERVER_NOTIFICATION_OID_W         = "1.2.840.113556.1.4.528",
+	LDAP_SERVER_DOMAIN_SCOPE_OID_W         = "1.2.840.113556.1.4.1339",
+	LDAP_CAP_ACTIVE_DIRECTORY_OID_W        = "1.2.840.113556.1.4.800",
+	LDAP_SERVER_SEARCH_OPTIONS_OID_W       = "1.2.840.113556.1.4.1340",
+	LDAP_CAP_ACTIVE_DIRECTORY_V51_OID_W    = "1.2.840.113556.1.4.1670",
+	LDAP_SERVER_PERMISSIVE_MODIFY_OID_W    = "1.2.840.113556.1.4.1413",
+	LDAP_SERVER_CROSSDOM_MOVE_TARGET_OID_W = "1.2.840.113556.1.4.521";
+
+const SERVER_SEARCH_FLAG_DOMAIN_SCOPE = 1;
+const SERVER_SEARCH_FLAG_PHANTOM_ROOT = 2;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/ntsecapi.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,793 @@
+/***********************************************************************\
+*                              ntsecapi.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.ntsecapi;
+
+private import
+  win32.basetyps, win32.ntdef, win32.windef, win32.winnt, win32.w32api;
+
+// FIXME: check types and grouping of constants
+// FIXME: check Windows version support
+
+const KERB_WRAP_NO_ENCRYPT        = 0x80000001;
+
+const LOGON_GUEST                 = 0x00000001;
+const LOGON_NOENCRYPTION          = 0x00000002;
+const LOGON_CACHED_ACCOUNT        = 0x00000004;
+const LOGON_USED_LM_PASSWORD      = 0x00000008;
+const LOGON_EXTRA_SIDS            = 0x00000020;
+const LOGON_SUBAUTH_SESSION_KEY   = 0x00000040;
+const LOGON_SERVER_TRUST_ACCOUNT  = 0x00000080;
+const LOGON_NTLMV2_ENABLED        = 0x00000100;
+const LOGON_RESOURCE_GROUPS       = 0x00000200;
+const LOGON_PROFILE_PATH_RETURNED = 0x00000400;
+const LOGON_GRACE_LOGON           = 0x01000000;
+
+enum {
+	LSA_MODE_PASSWORD_PROTECTED = 1,
+	LSA_MODE_INDIVIDUAL_ACCOUNTS,
+	LSA_MODE_MANDATORY_ACCESS,
+	LSA_MODE_LOG_FULL
+}
+
+bool LSA_SUCCESS(int x) { return x >= 0; }
+
+/*	TOTHINKABOUT: These constants don't have ANSI/Unicode versioned
+ *	aliases.  Should we merge them anyway?
+ */
+const char[]  MICROSOFT_KERBEROS_NAME_A = "Kerberos";
+const wchar[] MICROSOFT_KERBEROS_NAME_W = "Kerberos";
+const char[]  MSV1_0_PACKAGE_NAME  = "MICROSOFT_AUTHENTICATION_PACKAGE_V1_0";
+const wchar[] MSV1_0_PACKAGE_NAMEW = "MICROSOFT_AUTHENTICATION_PACKAGE_V1_0";
+
+const MSV1_0_ALLOW_SERVER_TRUST_ACCOUNT      =       32;
+const MSV1_0_ALLOW_WORKSTATION_TRUST_ACCOUNT =     2048;
+const MSV1_0_CLEARTEXT_PASSWORD_ALLOWED      =        2;
+const MSV1_0_CRED_LM_PRESENT                 =        1;
+const MSV1_0_CRED_NT_PRESENT                 =        2;
+const MSV1_0_CRED_VERSION                    =        0;
+const MSV1_0_DONT_TRY_GUEST_ACCOUNT          =       16;
+const MSV1_0_MAX_NTLM3_LIFE                  =     1800;
+const MSV1_0_MAX_AVL_SIZE                    =    64000;
+const MSV1_0_MNS_LOGON                       = 16777216;
+
+const size_t
+	MSV1_0_CHALLENGE_LENGTH          = 8,
+	MSV1_0_LANMAN_SESSION_KEY_LENGTH = 8,
+	MSV1_0_NTLM3_RESPONSE_LENGTH     = 16,
+	MSV1_0_NTLM3_OWF_LENGTH          = 16,
+	MSV1_0_NTLM3_INPUT_LENGTH        = MSV1_0_NTLM3_RESPONSE.sizeof
+	                                   - MSV1_0_NTLM3_RESPONSE_LENGTH,
+	MSV1_0_OWF_PASSWORD_LENGTH       = 16,
+	MSV1_0_PACKAGE_NAMEW_LENGTH      = MSV1_0_PACKAGE_NAMEW.sizeof
+	                                   - WCHAR.sizeof;
+
+const MSV1_0_RETURN_USER_PARAMETERS      =          8;
+const MSV1_0_RETURN_PASSWORD_EXPIRY      =         64;
+const MSV1_0_RETURN_PROFILE_PATH         =        512;
+const MSV1_0_SUBAUTHENTICATION_DLL_EX    =    1048576;
+const MSV1_0_SUBAUTHENTICATION_DLL       = 0xff000000;
+const MSV1_0_SUBAUTHENTICATION_DLL_SHIFT =         24;
+const MSV1_0_SUBAUTHENTICATION_DLL_RAS   =          2;
+const MSV1_0_SUBAUTHENTICATION_DLL_IIS   =        132;
+const MSV1_0_SUBAUTHENTICATION_FLAGS     = 0xff000000;
+const MSV1_0_TRY_GUEST_ACCOUNT_ONLY      =        256;
+const MSV1_0_TRY_SPECIFIED_DOMAIN_ONLY   =       1024;
+const MSV1_0_UPDATE_LOGON_STATISTICS     =          4;
+const MSV1_0_USE_CLIENT_CHALLENGE        =        128;
+const MSV1_0_USER_SESSION_KEY_LENGTH     =         16;
+
+const char[]
+	MSV1_0_SUBAUTHENTICATION_KEY
+	  = `System\CurrentControlSet\Control\Lsa\MSV1_0`,
+	MSV1_0_SUBAUTHENTICATION_VALUE = "Auth";
+
+const ACCESS_MASK
+	POLICY_VIEW_LOCAL_INFORMATION   = 0x0001,
+	POLICY_VIEW_AUDIT_INFORMATION   = 0x0002,
+	POLICY_GET_PRIVATE_INFORMATION  = 0x0004,
+	POLICY_TRUST_ADMIN              = 0x0008,
+	POLICY_CREATE_ACCOUNT           = 0x0010,
+	POLICY_CREATE_SECRET            = 0x0020,
+	POLICY_CREATE_PRIVILEGE         = 0x0040,
+	POLICY_SET_DEFAULT_QUOTA_LIMITS = 0x0080,
+	POLICY_SET_AUDIT_REQUIREMENTS   = 0x0100,
+	POLICY_AUDIT_LOG_ADMIN          = 0x0200,
+	POLICY_SERVER_ADMIN             = 0x0400,
+	POLICY_LOOKUP_NAMES             = 0x0800,
+
+	POLICY_READ                     = STANDARD_RIGHTS_READ     | 0x0006,
+	POLICY_WRITE                    = STANDARD_RIGHTS_WRITE    | 0x07F8,
+	POLICY_EXECUTE                  = STANDARD_RIGHTS_EXECUTE  | 0x0801,
+	POLICY_ALL_ACCESS               = STANDARD_RIGHTS_REQUIRED | 0x0FFF;
+
+const POLICY_AUDIT_EVENT_UNCHANGED = 0;
+const POLICY_AUDIT_EVENT_SUCCESS   = 1;
+const POLICY_AUDIT_EVENT_FAILURE   = 2;
+const POLICY_AUDIT_EVENT_NONE      = 4;
+const POLICY_AUDIT_EVENT_MASK      = 7;
+
+enum {
+	POLICY_LOCATION_LOCAL = 1,
+	POLICY_LOCATION_DS
+}
+
+enum : uint {
+	POLICY_MACHINE_POLICY_LOCAL     =          0,
+	POLICY_MACHINE_POLICY_DEFAULTED,
+	POLICY_MACHINE_POLICY_EXPLICIT,
+	POLICY_MACHINE_POLICY_UNKNOWN   = 0xFFFFFFFF
+}
+
+
+const POLICY_QOS_SCHANEL_REQUIRED            = 0x0001;
+const POLICY_QOS_OUTBOUND_INTEGRITY          = 0x0002;
+const POLICY_QOS_OUTBOUND_CONFIDENTIALITY    = 0x0004;
+const POLICY_QOS_INBOUND_INTEGREITY          = 0x0008;
+const POLICY_QOS_INBOUND_CONFIDENTIALITY     = 0x0010;
+const POLICY_QOS_ALLOW_LOCAL_ROOT_CERT_STORE = 0x0020;
+const POLICY_QOS_RAS_SERVER_ALLOWED          = 0x0040;
+const POLICY_QOS_DHCP_SERVER_ALLOWD          = 0x0080;
+
+const POLICY_KERBEROS_FORWARDABLE  = 1;
+const POLICY_KERBEROS_PROXYABLE    = 2;
+const POLICY_KERBEROS_RENEWABLE    = 4;
+const POLICY_KERBEROS_POSTDATEABLE = 8;
+
+const char[]
+	SAM_PASSWORD_CHANGE_NOTIFY_ROUTINE = "PasswordChangeNotify",
+	SAM_INIT_NOTIFICATION_ROUTINE      = "InitializeChangeNotify",
+	SAM_PASSWORD_FILTER_ROUTINE        = "PasswordFilter";
+
+const TCHAR[]
+	SE_INTERACTIVE_LOGON_NAME          = "SeInteractiveLogonRight",
+	SE_NETWORK_LOGON_NAME              = "SeNetworkLogonRight",
+	SE_BATCH_LOGON_NAME                = "SeBatchLogonRight",
+	SE_SERVICE_LOGON_NAME              = "SeServiceLogonRight";
+
+enum {
+	TRUST_ATTRIBUTE_NON_TRANSITIVE =         1,
+	TRUST_ATTRIBUTE_UPLEVEL_ONLY   =         2,
+	TRUST_ATTRIBUTE_TREE_PARENT    =   4194304,
+	TRUST_ATTRIBUTES_VALID         = -16580609
+}
+
+enum {
+	TRUST_AUTH_TYPE_NONE,
+	TRUST_AUTH_TYPE_NT4OWF,
+	TRUST_AUTH_TYPE_CLEAR
+}
+
+enum {
+	TRUST_DIRECTION_DISABLED,
+	TRUST_DIRECTION_INBOUND,
+	TRUST_DIRECTION_OUTBOUND,
+	TRUST_DIRECTION_BIDIRECTIONAL
+}
+
+enum {
+	TRUST_TYPE_DOWNLEVEL = 1,
+	TRUST_TYPE_UPLEVEL,
+	TRUST_TYPE_MIT,
+	TRUST_TYPE_DCE
+}
+
+alias UNICODE_STRING LSA_UNICODE_STRING;
+alias UNICODE_STRING* PLSA_UNICODE_STRING;
+alias STRING LSA_STRING;
+alias STRING* PLSA_STRING;
+
+enum MSV1_0_LOGON_SUBMIT_TYPE {
+	MsV1_0InteractiveLogon       = 2,
+	MsV1_0Lm20Logon,
+	MsV1_0NetworkLogon,
+	MsV1_0SubAuthLogon,
+	MsV1_0WorkstationUnlockLogon = 7
+}
+alias MSV1_0_LOGON_SUBMIT_TYPE* PMSV1_0_LOGON_SUBMIT_TYPE;
+
+enum MSV1_0_PROFILE_BUFFER_TYPE {
+	MsV1_0InteractiveProfile = 2,
+	MsV1_0Lm20LogonProfile,
+	MsV1_0SmartCardProfile
+}
+alias MSV1_0_PROFILE_BUFFER_TYPE* PMSV1_0_PROFILE_BUFFER_TYPE;
+
+
+enum MSV1_0_AVID {
+	MsvAvEOL,
+	MsvAvNbComputerName,
+	MsvAvNbDomainName,
+	MsvAvDnsComputerName,
+	MsvAvDnsDomainName
+}
+
+enum MSV1_0_PROTOCOL_MESSAGE_TYPE {
+	MsV1_0Lm20ChallengeRequest = 0,
+	MsV1_0Lm20GetChallengeResponse,
+	MsV1_0EnumerateUsers,
+	MsV1_0GetUserInfo,
+	MsV1_0ReLogonUsers,
+	MsV1_0ChangePassword,
+	MsV1_0ChangeCachedPassword,
+	MsV1_0GenericPassthrough,
+	MsV1_0CacheLogon,
+	MsV1_0SubAuth,
+	MsV1_0DeriveCredential,
+	MsV1_0CacheLookup
+}
+alias MSV1_0_PROTOCOL_MESSAGE_TYPE* PMSV1_0_PROTOCOL_MESSAGE_TYPE;
+
+enum POLICY_LSA_SERVER_ROLE {
+	PolicyServerRoleBackup = 2,
+	PolicyServerRolePrimary
+}
+alias POLICY_LSA_SERVER_ROLE* PPOLICY_LSA_SERVER_ROLE;
+
+enum POLICY_SERVER_ENABLE_STATE {
+	PolicyServerEnabled = 2,
+	PolicyServerDisabled
+}
+alias POLICY_SERVER_ENABLE_STATE* PPOLICY_SERVER_ENABLE_STATE;
+
+enum POLICY_INFORMATION_CLASS {
+	PolicyAuditLogInformation = 1,
+	PolicyAuditEventsInformation,
+	PolicyPrimaryDomainInformation,
+	PolicyPdAccountInformation,
+	PolicyAccountDomainInformation,
+	PolicyLsaServerRoleInformation,
+	PolicyReplicaSourceInformation,
+	PolicyDefaultQuotaInformation,
+	PolicyModificationInformation,
+	PolicyAuditFullSetInformation,
+	PolicyAuditFullQueryInformation,
+	PolicyDnsDomainInformation,
+	PolicyEfsInformation
+}
+alias POLICY_INFORMATION_CLASS* PPOLICY_INFORMATION_CLASS;
+
+enum POLICY_AUDIT_EVENT_TYPE {
+	AuditCategorySystem,
+	AuditCategoryLogon,
+	AuditCategoryObjectAccess,
+	AuditCategoryPrivilegeUse,
+	AuditCategoryDetailedTracking,
+	AuditCategoryPolicyChange,
+	AuditCategoryAccountManagement,
+	AuditCategoryDirectoryServiceAccess,
+	AuditCategoryAccountLogon
+}
+alias POLICY_AUDIT_EVENT_TYPE* PPOLICY_AUDIT_EVENT_TYPE;
+
+enum POLICY_LOCAL_INFORMATION_CLASS {
+	PolicyLocalAuditEventsInformation = 1,
+	PolicyLocalPdAccountInformation,
+	PolicyLocalAccountDomainInformation,
+	PolicyLocalLsaServerRoleInformation,
+	PolicyLocalReplicaSourceInformation,
+	PolicyLocalModificationInformation,
+	PolicyLocalAuditFullSetInformation,
+	PolicyLocalAuditFullQueryInformation,
+	PolicyLocalDnsDomainInformation,
+	PolicyLocalIPSecReferenceInformation,
+	PolicyLocalMachinePasswordInformation,
+	PolicyLocalQualityOfServiceInformation,
+	PolicyLocalPolicyLocationInformation
+}
+alias POLICY_LOCAL_INFORMATION_CLASS* PPOLICY_LOCAL_INFORMATION_CLASS;
+
+enum POLICY_DOMAIN_INFORMATION_CLASS {
+	PolicyDomainIPSecReferenceInformation = 1,
+	PolicyDomainQualityOfServiceInformation,
+	PolicyDomainEfsInformation,
+	PolicyDomainPublicKeyInformation,
+	PolicyDomainPasswordPolicyInformation,
+	PolicyDomainLockoutInformation,
+	PolicyDomainKerberosTicketInformation
+}
+alias POLICY_DOMAIN_INFORMATION_CLASS* PPOLICY_DOMAIN_INFORMATION_CLASS;
+
+enum SECURITY_LOGON_TYPE {
+	Interactive = 2,
+	Network,
+	Batch,
+	Service,
+	Proxy,
+	Unlock
+}
+alias SECURITY_LOGON_TYPE* PSECURITY_LOGON_TYPE;
+
+enum TRUSTED_INFORMATION_CLASS {
+	TrustedDomainNameInformation = 1,
+	TrustedControllersInformation,
+	TrustedPosixOffsetInformation,
+	TrustedPasswordInformation,
+	TrustedDomainInformationBasic,
+	TrustedDomainInformationEx,
+	TrustedDomainAuthInformation,
+	TrustedDomainFullInformation
+}
+alias TRUSTED_INFORMATION_CLASS* PTRUSTED_INFORMATION_CLASS;
+
+struct DOMAIN_PASSWORD_INFORMATION {
+	USHORT        MinPasswordLength;
+	USHORT        PasswordHistoryLength;
+	ULONG         PasswordProperties;
+	LARGE_INTEGER MaxPasswordAge;
+	LARGE_INTEGER MinPasswordAge;
+}
+alias DOMAIN_PASSWORD_INFORMATION* PDOMAIN_PASSWORD_INFORMATION;
+
+struct LSA_ENUMERATION_INFORMATION {
+	PSID Sid;
+}
+alias LSA_ENUMERATION_INFORMATION* PLSA_ENUMERATION_INFORMATION;
+
+alias OBJECT_ATTRIBUTES LSA_OBJECT_ATTRIBUTES;
+alias OBJECT_ATTRIBUTES* PLSA_OBJECT_ATTRIBUTES;
+
+struct LSA_TRUST_INFORMATION {
+	LSA_UNICODE_STRING Name;
+	PSID               Sid;
+}
+alias LSA_TRUST_INFORMATION TRUSTED_DOMAIN_INFORMATION_BASIC;
+alias LSA_TRUST_INFORMATION* PLSA_TRUST_INFORMATION;
+/*	in MinGW (further down the code):
+ *		typedef PLSA_TRUST_INFORMATION *PTRUSTED_DOMAIN_INFORMATION_BASIC;
+ *	but it doesn't look right....
+ */
+alias LSA_TRUST_INFORMATION** PTRUSTED_DOMAIN_INFORMATION_BASIC;
+
+struct LSA_REFERENCED_DOMAIN_LIST {
+	ULONG                  Entries;
+	PLSA_TRUST_INFORMATION Domains;
+}
+alias LSA_REFERENCED_DOMAIN_LIST* PLSA_REFERENCED_DOMAIN_LIST;
+
+struct LSA_TRANSLATED_SID {
+	SID_NAME_USE Use;
+	ULONG        RelativeId;
+	LONG         DomainIndex;
+}
+alias LSA_TRANSLATED_SID* PLSA_TRANSLATED_SID;
+
+struct LSA_TRANSLATED_NAME {
+	SID_NAME_USE       Use;
+	LSA_UNICODE_STRING Name;
+	LONG               DomainIndex;
+}
+alias LSA_TRANSLATED_NAME* PLSA_TRANSLATED_NAME;
+
+struct MSV1_0_INTERACTIVE_LOGON {
+	MSV1_0_LOGON_SUBMIT_TYPE MessageType;
+	UNICODE_STRING           LogonDomainName;
+	UNICODE_STRING           UserName;
+	UNICODE_STRING           Password;
+}
+alias MSV1_0_INTERACTIVE_LOGON* PMSV1_0_INTERACTIVE_LOGON;
+
+struct MSV1_0_INTERACTIVE_PROFILE {
+	MSV1_0_PROFILE_BUFFER_TYPE MessageType;
+	USHORT                     LogonCount;
+	USHORT                     BadPasswordCount;
+	LARGE_INTEGER              LogonTime;
+	LARGE_INTEGER              LogoffTime;
+	LARGE_INTEGER              KickOffTime;
+	LARGE_INTEGER              PasswordLastSet;
+	LARGE_INTEGER              PasswordCanChange;
+	LARGE_INTEGER              PasswordMustChange;
+	UNICODE_STRING             LogonScript;
+	UNICODE_STRING             HomeDirectory;
+	UNICODE_STRING             FullName;
+	UNICODE_STRING             ProfilePath;
+	UNICODE_STRING             HomeDirectoryDrive;
+	UNICODE_STRING             LogonServer;
+	ULONG                      UserFlags;
+}
+alias MSV1_0_INTERACTIVE_PROFILE* PMSV1_0_INTERACTIVE_PROFILE;
+
+struct MSV1_0_LM20_LOGON {
+	MSV1_0_LOGON_SUBMIT_TYPE       MessageType;
+	UNICODE_STRING                 LogonDomainName;
+	UNICODE_STRING                 UserName;
+	UNICODE_STRING                 Workstation;
+	UCHAR[MSV1_0_CHALLENGE_LENGTH] ChallengeToClient;
+	STRING                         CaseSensitiveChallengeResponse;
+	STRING                         CaseInsensitiveChallengeResponse;
+	ULONG                          ParameterControl;
+}
+alias MSV1_0_LM20_LOGON* PMSV1_0_LM20_LOGON;
+
+static if (_WIN32_WINNT_ONLY && _WIN32_WINNT >= 0x500) {
+	struct MSV1_0_SUBAUTH_LOGON {
+		MSV1_0_LOGON_SUBMIT_TYPE       MessageType;
+		UNICODE_STRING                 LogonDomainName;
+		UNICODE_STRING                 UserName;
+		UNICODE_STRING                 Workstation;
+		UCHAR[MSV1_0_CHALLENGE_LENGTH] ChallengeToClient;
+		STRING                         AuthenticationInfo1;
+		STRING                         AuthenticationInfo2;
+		ULONG                          ParameterControl;
+		ULONG                          SubAuthPackageId;
+	}
+	alias MSV1_0_SUBAUTH_LOGON* PMSV1_0_SUBAUTH_LOGON;
+}
+
+struct MSV1_0_LM20_LOGON_PROFILE {
+	MSV1_0_PROFILE_BUFFER_TYPE              MessageType;
+	LARGE_INTEGER                           KickOffTime;
+	LARGE_INTEGER                           LogoffTime;
+	ULONG                                   UserFlags;
+	UCHAR[MSV1_0_USER_SESSION_KEY_LENGTH]   UserSessionKey;
+	UNICODE_STRING                          LogonDomainName;
+	UCHAR[MSV1_0_LANMAN_SESSION_KEY_LENGTH] LanmanSessionKey;
+	UNICODE_STRING                          LogonServer;
+	UNICODE_STRING                          UserParameters;
+}
+alias MSV1_0_LM20_LOGON_PROFILE* PMSV1_0_LM20_LOGON_PROFILE;
+
+struct MSV1_0_SUPPLEMENTAL_CREDENTIAL {
+	ULONG Version;
+	ULONG Flags;
+	UCHAR[MSV1_0_OWF_PASSWORD_LENGTH] LmPassword;
+	UCHAR[MSV1_0_OWF_PASSWORD_LENGTH] NtPassword;
+}
+alias MSV1_0_SUPPLEMENTAL_CREDENTIAL* PMSV1_0_SUPPLEMENTAL_CREDENTIAL;
+
+struct MSV1_0_NTLM3_RESPONSE {
+	UCHAR[MSV1_0_NTLM3_RESPONSE_LENGTH] Response;
+	UCHAR     RespType;
+	UCHAR     HiRespType;
+	USHORT    Flags;
+	ULONG     MsgWord;
+	ULONGLONG TimeStamp;
+	UCHAR[MSV1_0_CHALLENGE_LENGTH]      ChallengeFromClient;
+	ULONG     AvPairsOff;
+	UCHAR     _Buffer;
+	UCHAR*    Buffer() { return &_Buffer; }
+}
+alias MSV1_0_NTLM3_RESPONSE* PMSV1_0_NTLM3_RESPONSE;
+
+struct  MSV1_0_AV_PAIR {
+	USHORT AvId;
+	USHORT AvLen;
+}
+alias MSV1_0_AV_PAIR* PMSV1_0_AV_PAIR;
+
+struct MSV1_0_CHANGEPASSWORD_REQUEST {
+	MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+	UNICODE_STRING DomainName;
+	UNICODE_STRING AccountName;
+	UNICODE_STRING OldPassword;
+	UNICODE_STRING NewPassword;
+	BOOLEAN        Impersonating;
+}
+alias MSV1_0_CHANGEPASSWORD_REQUEST* PMSV1_0_CHANGEPASSWORD_REQUEST;
+
+struct MSV1_0_CHANGEPASSWORD_RESPONSE {
+	MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+	BOOLEAN                      PasswordInfoValid;
+	DOMAIN_PASSWORD_INFORMATION  DomainPasswordInfo;
+}
+alias MSV1_0_CHANGEPASSWORD_RESPONSE* PMSV1_0_CHANGEPASSWORD_RESPONSE;
+
+struct MSV1_0_SUBAUTH_REQUEST {
+	MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+	ULONG  SubAuthPackageId;
+	ULONG  SubAuthInfoLength;
+	PUCHAR SubAuthSubmitBuffer;
+}
+alias MSV1_0_SUBAUTH_REQUEST* PMSV1_0_SUBAUTH_REQUEST;
+
+struct MSV1_0_SUBAUTH_RESPONSE {
+	MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+	ULONG  SubAuthInfoLength;
+	PUCHAR SubAuthReturnBuffer;
+}
+alias MSV1_0_SUBAUTH_RESPONSE* PMSV1_0_SUBAUTH_RESPONSE;
+
+const MSV1_0_DERIVECRED_TYPE_SHA1 = 0;
+
+struct MSV1_0_DERIVECRED_REQUEST {
+	MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+	LUID   LogonId;
+	ULONG  DeriveCredType;
+	ULONG  DeriveCredInfoLength;
+	UCHAR  _DeriveCredSubmitBuffer;
+	UCHAR* DeriveCredSubmitBuffer() { return &_DeriveCredSubmitBuffer; }
+}
+alias MSV1_0_DERIVECRED_REQUEST* PMSV1_0_DERIVECRED_REQUEST;
+
+struct MSV1_0_DERIVECRED_RESPONSE {
+	MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+	ULONG  DeriveCredInfoLength;
+	UCHAR  _DeriveCredReturnBuffer;
+	UCHAR* DeriveCredReturnBuffer() { return &_DeriveCredReturnBuffer; }
+}
+alias MSV1_0_DERIVECRED_RESPONSE* PMSV1_0_DERIVECRED_RESPONSE;
+
+alias uint LSA_ENUMERATION_HANDLE, LSA_OPERATIONAL_MODE,
+  POLICY_AUDIT_EVENT_OPTIONS;
+alias uint* PLSA_ENUMERATION_HANDLE, PLSA_OPERATIONAL_MODE,
+  PPOLICY_AUDIT_EVENT_OPTIONS;
+
+struct POLICY_PRIVILEGE_DEFINITION {
+	LSA_UNICODE_STRING Name;
+	LUID LocalValue;
+}
+alias POLICY_PRIVILEGE_DEFINITION* PPOLICY_PRIVILEGE_DEFINITION;
+
+struct POLICY_AUDIT_LOG_INFO {
+	ULONG         AuditLogPercentFull;
+	ULONG         MaximumLogSize;
+	LARGE_INTEGER AuditRetentionPeriod;
+	BOOLEAN       AuditLogFullShutdownInProgress;
+	LARGE_INTEGER TimeToShutdown;
+	ULONG         NextAuditRecordId;
+}
+alias POLICY_AUDIT_LOG_INFO* PPOLICY_AUDIT_LOG_INFO;
+
+struct POLICY_AUDIT_EVENTS_INFO {
+	BOOLEAN                     AuditingMode;
+	PPOLICY_AUDIT_EVENT_OPTIONS EventAuditingOptions;
+	ULONG                       MaximumAuditEventCount;
+}
+alias POLICY_AUDIT_EVENTS_INFO* PPOLICY_AUDIT_EVENTS_INFO;
+
+struct POLICY_ACCOUNT_DOMAIN_INFO {
+	LSA_UNICODE_STRING DomainName;
+	PSID               DomainSid;
+}
+alias POLICY_ACCOUNT_DOMAIN_INFO* PPOLICY_ACCOUNT_DOMAIN_INFO;
+
+struct POLICY_PRIMARY_DOMAIN_INFO {
+	LSA_UNICODE_STRING Name;
+	PSID               Sid;
+}
+alias POLICY_PRIMARY_DOMAIN_INFO* PPOLICY_PRIMARY_DOMAIN_INFO;
+
+struct POLICY_DNS_DOMAIN_INFO {
+	LSA_UNICODE_STRING Name;
+	LSA_UNICODE_STRING DnsDomainName;
+	LSA_UNICODE_STRING DnsTreeName;
+	GUID               DomainGuid;
+	PSID               Sid;
+}
+alias POLICY_DNS_DOMAIN_INFO* PPOLICY_DNS_DOMAIN_INFO;
+
+struct POLICY_PD_ACCOUNT_INFO {
+	LSA_UNICODE_STRING Name;
+}
+alias POLICY_PD_ACCOUNT_INFO* PPOLICY_PD_ACCOUNT_INFO;
+
+struct POLICY_LSA_SERVER_ROLE_INFO {
+	POLICY_LSA_SERVER_ROLE LsaServerRole;
+}
+alias POLICY_LSA_SERVER_ROLE_INFO* PPOLICY_LSA_SERVER_ROLE_INFO;
+
+struct POLICY_REPLICA_SOURCE_INFO {
+	LSA_UNICODE_STRING ReplicaSource;
+	LSA_UNICODE_STRING ReplicaAccountName;
+}
+alias POLICY_REPLICA_SOURCE_INFO* PPOLICY_REPLICA_SOURCE_INFO;
+
+struct POLICY_DEFAULT_QUOTA_INFO {
+	QUOTA_LIMITS QuotaLimits;
+}
+alias POLICY_DEFAULT_QUOTA_INFO* PPOLICY_DEFAULT_QUOTA_INFO;
+
+struct POLICY_MODIFICATION_INFO {
+	LARGE_INTEGER ModifiedId;
+	LARGE_INTEGER DatabaseCreationTime;
+}
+alias POLICY_MODIFICATION_INFO* PPOLICY_MODIFICATION_INFO;
+
+struct POLICY_AUDIT_FULL_SET_INFO {
+	BOOLEAN ShutDownOnFull;
+}
+alias POLICY_AUDIT_FULL_SET_INFO* PPOLICY_AUDIT_FULL_SET_INFO;
+
+struct POLICY_AUDIT_FULL_QUERY_INFO {
+	BOOLEAN ShutDownOnFull;
+	BOOLEAN LogIsFull;
+}
+alias POLICY_AUDIT_FULL_QUERY_INFO* PPOLICY_AUDIT_FULL_QUERY_INFO;
+
+struct POLICY_EFS_INFO {
+	ULONG InfoLength;
+	PUCHAR EfsBlob;
+}
+alias POLICY_EFS_INFO* PPOLICY_EFS_INFO;
+
+struct POLICY_LOCAL_IPSEC_REFERENCE_INFO {
+	LSA_UNICODE_STRING ObjectPath;
+}
+alias POLICY_LOCAL_IPSEC_REFERENCE_INFO* PPOLICY_LOCAL_IPSEC_REFERENCE_INFO;
+
+struct POLICY_LOCAL_MACHINE_PASSWORD_INFO {
+	LARGE_INTEGER PasswordChangeInterval;
+}
+alias POLICY_LOCAL_MACHINE_PASSWORD_INFO* PPOLICY_LOCAL_MACHINE_PASSWORD_INFO;
+
+struct POLICY_LOCAL_POLICY_LOCATION_INFO {
+	ULONG PolicyLocation;
+}
+alias POLICY_LOCAL_POLICY_LOCATION_INFO* PPOLICY_LOCAL_POLICY_LOCATION_INFO;
+
+struct POLICY_LOCAL_QUALITY_OF_SERVICE_INFO{
+	ULONG QualityOfService;
+}
+alias POLICY_LOCAL_QUALITY_OF_SERVICE_INFO
+  POLICY_DOMAIN_QUALITY_OF_SERVICE_INFO;
+alias POLICY_LOCAL_QUALITY_OF_SERVICE_INFO*
+  PPOLICY_LOCAL_QUALITY_OF_SERVICE_INFO,
+  PPOLICY_DOMAIN_QUALITY_OF_SERVICE_INFO;
+
+struct POLICY_DOMAIN_PUBLIC_KEY_INFO {
+	ULONG  InfoLength;
+	PUCHAR PublicKeyInfo;
+}
+alias POLICY_DOMAIN_PUBLIC_KEY_INFO* PPOLICY_DOMAIN_PUBLIC_KEY_INFO;
+
+struct POLICY_DOMAIN_LOCKOUT_INFO {
+	LARGE_INTEGER LockoutDuration;
+	LARGE_INTEGER LockoutObservationWindow;
+	USHORT        LockoutThreshold;
+}
+alias POLICY_DOMAIN_LOCKOUT_INFO* PPOLICY_DOMAIN_LOCKOUT_INFO;
+
+struct POLICY_DOMAIN_PASSWORD_INFO {
+	USHORT        MinPasswordLength;
+	USHORT        PasswordHistoryLength;
+	ULONG         PasswordProperties;
+	LARGE_INTEGER MaxPasswordAge;
+	LARGE_INTEGER MinPasswordAge;
+}
+alias POLICY_DOMAIN_PASSWORD_INFO* PPOLICY_DOMAIN_PASSWORD_INFO;
+
+struct POLICY_DOMAIN_KERBEROS_TICKET_INFO {
+	ULONG         AuthenticationOptions;
+	LARGE_INTEGER MinTicketAge;
+	LARGE_INTEGER MaxTicketAge;
+	LARGE_INTEGER MaxRenewAge;
+	LARGE_INTEGER ProxyLifetime;
+	LARGE_INTEGER ForceLogoff;
+}
+alias POLICY_DOMAIN_KERBEROS_TICKET_INFO* PPOLICY_DOMAIN_KERBEROS_TICKET_INFO;
+
+alias HANDLE LSA_HANDLE;
+alias HANDLE* PLSA_HANDLE;
+
+struct TRUSTED_DOMAIN_NAME_INFO {
+	LSA_UNICODE_STRING Name;
+}
+alias TRUSTED_DOMAIN_NAME_INFO* PTRUSTED_DOMAIN_NAME_INFO;
+
+struct TRUSTED_CONTROLLERS_INFO {
+	ULONG               Entries;
+	PLSA_UNICODE_STRING Names;
+}
+alias TRUSTED_CONTROLLERS_INFO* PTRUSTED_CONTROLLERS_INFO;
+
+struct TRUSTED_POSIX_OFFSET_INFO {
+	ULONG Offset;
+}
+alias TRUSTED_POSIX_OFFSET_INFO* PTRUSTED_POSIX_OFFSET_INFO;
+
+struct TRUSTED_PASSWORD_INFO {
+	LSA_UNICODE_STRING Password;
+	LSA_UNICODE_STRING OldPassword;
+}
+alias TRUSTED_PASSWORD_INFO* PTRUSTED_PASSWORD_INFO;
+
+struct TRUSTED_DOMAIN_INFORMATION_EX {
+	LSA_UNICODE_STRING Name;
+	LSA_UNICODE_STRING FlatName;
+	PSID               Sid;
+	ULONG              TrustDirection;
+	ULONG              TrustType;
+	ULONG              TrustAttributes;
+}
+alias TRUSTED_DOMAIN_INFORMATION_EX* PTRUSTED_DOMAIN_INFORMATION_EX;
+
+struct LSA_AUTH_INFORMATION {
+	LARGE_INTEGER LastUpdateTime;
+	ULONG         AuthType;
+	ULONG         AuthInfoLength;
+	PUCHAR        AuthInfo;
+}
+alias LSA_AUTH_INFORMATION* PLSA_AUTH_INFORMATION;
+
+struct TRUSTED_DOMAIN_AUTH_INFORMATION {
+	ULONG                 IncomingAuthInfos;
+	PLSA_AUTH_INFORMATION IncomingAuthenticationInformation;
+	PLSA_AUTH_INFORMATION IncomingPreviousAuthenticationInformation;
+	ULONG                 OutgoingAuthInfos;
+	PLSA_AUTH_INFORMATION OutgoingAuthenticationInformation;
+	PLSA_AUTH_INFORMATION OutgoingPreviousAuthenticationInformation;
+}
+alias TRUSTED_DOMAIN_AUTH_INFORMATION* PTRUSTED_DOMAIN_AUTH_INFORMATION;
+
+struct TRUSTED_DOMAIN_FULL_INFORMATION {
+	TRUSTED_DOMAIN_INFORMATION_EX   Information;
+	TRUSTED_POSIX_OFFSET_INFO       PosixOffset;
+	TRUSTED_DOMAIN_AUTH_INFORMATION AuthInformation;
+}
+alias TRUSTED_DOMAIN_FULL_INFORMATION* PTRUSTED_DOMAIN_FULL_INFORMATION;
+
+extern (Windows) {
+	NTSTATUS LsaAddAccountRights(LSA_HANDLE, PSID, PLSA_UNICODE_STRING,
+	  ULONG);
+	NTSTATUS LsaCallAuthenticationPackage(HANDLE, ULONG, PVOID, ULONG,
+	  PVOID*, PULONG, PNTSTATUS);
+	NTSTATUS LsaClose(LSA_HANDLE);
+	NTSTATUS LsaConnectUntrusted(PHANDLE);
+	NTSTATUS LsaCreateTrustedDomainEx(LSA_HANDLE,
+	  PTRUSTED_DOMAIN_INFORMATION_EX, PTRUSTED_DOMAIN_AUTH_INFORMATION,
+	  ACCESS_MASK, PLSA_HANDLE);
+	NTSTATUS LsaDeleteTrustedDomain(LSA_HANDLE, PSID);
+	NTSTATUS LsaDeregisterLogonProcess(HANDLE);
+	NTSTATUS LsaEnumerateAccountRights(LSA_HANDLE, PSID, PLSA_UNICODE_STRING*,
+	  PULONG);
+	NTSTATUS LsaEnumerateAccountsWithUserRight(LSA_HANDLE,
+	  PLSA_UNICODE_STRING, PVOID*, PULONG);
+	NTSTATUS LsaEnumerateTrustedDomains(LSA_HANDLE, PLSA_ENUMERATION_HANDLE,
+	  PVOID*, ULONG, PULONG);
+	NTSTATUS LsaEnumerateTrustedDomainsEx(LSA_HANDLE, PLSA_ENUMERATION_HANDLE,
+	  TRUSTED_INFORMATION_CLASS, PVOID*, ULONG, PULONG);
+	NTSTATUS LsaFreeMemory(PVOID);
+	NTSTATUS LsaFreeReturnBuffer(PVOID);
+	NTSTATUS LsaLogonUser(HANDLE, PLSA_STRING, SECURITY_LOGON_TYPE, ULONG,
+	  PVOID, ULONG, PTOKEN_GROUPS, PTOKEN_SOURCE, PVOID*, PULONG, PLUID,
+	  PHANDLE, PQUOTA_LIMITS, PNTSTATUS);
+	NTSTATUS LsaLookupAuthenticationPackage(HANDLE, PLSA_STRING, PULONG);
+	NTSTATUS LsaLookupNames(LSA_HANDLE, ULONG, PLSA_UNICODE_STRING,
+	  PLSA_REFERENCED_DOMAIN_LIST*, PLSA_TRANSLATED_SID*);
+	NTSTATUS LsaLookupSids(LSA_HANDLE, ULONG, PSID*,
+	  PLSA_REFERENCED_DOMAIN_LIST*, PLSA_TRANSLATED_NAME*);
+	ULONG LsaNtStatusToWinError(NTSTATUS);
+	NTSTATUS LsaOpenPolicy(PLSA_UNICODE_STRING, PLSA_OBJECT_ATTRIBUTES,
+	  ACCESS_MASK, PLSA_HANDLE);
+	NTSTATUS LsaQueryDomainInformationPolicy(LSA_HANDLE,
+	  POLICY_DOMAIN_INFORMATION_CLASS, PVOID*);
+	NTSTATUS LsaQueryInformationPolicy(LSA_HANDLE, POLICY_INFORMATION_CLASS,
+	  PVOID*);
+	NTSTATUS LsaQueryLocalInformationPolicy(LSA_HANDLE,
+	  POLICY_LOCAL_INFORMATION_CLASS, PVOID*);
+	NTSTATUS LsaQueryTrustedDomainInfo(LSA_HANDLE, PSID,
+	  TRUSTED_INFORMATION_CLASS, PVOID*);
+	NTSTATUS LsaQueryTrustedDomainInfoByName(LSA_HANDLE, PLSA_UNICODE_STRING,
+	  TRUSTED_INFORMATION_CLASS, PVOID*);
+	NTSTATUS LsaRegisterLogonProcess(PLSA_STRING, PHANDLE,
+	  PLSA_OPERATIONAL_MODE);
+	NTSTATUS LsaRemoveAccountRights(LSA_HANDLE, PSID, BOOLEAN,
+	  PLSA_UNICODE_STRING, ULONG);
+	NTSTATUS LsaRetrievePrivateData(LSA_HANDLE, PLSA_UNICODE_STRING,
+	  PLSA_UNICODE_STRING*);
+	NTSTATUS LsaSetDomainInformationPolicy(LSA_HANDLE,
+	  POLICY_DOMAIN_INFORMATION_CLASS, PVOID);
+	NTSTATUS LsaSetInformationPolicy(LSA_HANDLE, POLICY_INFORMATION_CLASS,
+	  PVOID);
+	NTSTATUS LsaSetLocalInformationPolicy(LSA_HANDLE,
+	  POLICY_LOCAL_INFORMATION_CLASS, PVOID);
+	NTSTATUS LsaSetTrustedDomainInformation(LSA_HANDLE, PSID,
+	  TRUSTED_INFORMATION_CLASS, PVOID);
+	NTSTATUS LsaSetTrustedDomainInfoByName(LSA_HANDLE, PLSA_UNICODE_STRING,
+	  TRUSTED_INFORMATION_CLASS, PVOID);
+	NTSTATUS LsaStorePrivateData(LSA_HANDLE, PLSA_UNICODE_STRING,
+	  PLSA_UNICODE_STRING);
+}
+
+alias NTSTATUS function(PUNICODE_STRING, ULONG, PUNICODE_STRING)
+  PSAM_PASSWORD_NOTIFICATION_ROUTINE;
+alias BOOLEAN function() PSAM_INIT_NOTIFICATION_ROUTINE;
+alias BOOLEAN function(PUNICODE_STRING, PUNICODE_STRING,
+  PUNICODE_STRING, BOOLEAN) PSAM_PASSWORD_FILTER_ROUTINE;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/oaidl.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,672 @@
+/***********************************************************************\
+*                                oaidl.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.oaidl;
+
+private import win32.basetyps, win32.unknwn, win32.windef, win32.wtypes;
+
+const DISPID_UNKNOWN = -1;
+const DISPID_VALUE = 0;
+const DISPID_PROPERTYPUT = -3;
+const DISPID_NEWENUM = -4;
+const DISPID_EVALUATE = -5;
+const DISPID_CONSTRUCTOR = -6;
+const DISPID_DESTRUCTOR = -7;
+const DISPID_COLLECT = -8;
+
+const FADF_AUTO = 1;
+const FADF_STATIC = 2;
+const FADF_EMBEDDED = 4;
+const FADF_FIXEDSIZE = 16;
+const FADF_RECORD = 32;
+const FADF_HAVEIID = 64;
+const FADF_HAVEVARTYPE = 128;
+const FADF_BSTR = 256;
+const FADF_UNKNOWN = 512;
+const FADF_DISPATCH = 1024;
+const FADF_VARIANT = 2048;
+const FADF_RESERVED = 0xf0e8;
+const FADF_DATADELETED = 0x1000;
+const FADF_CREATEVECTOR = 0x2000;
+
+const PARAMFLAG_NONE = 0;
+const PARAMFLAG_FIN = 1;
+const PARAMFLAG_FOUT = 2;
+const PARAMFLAG_FLCID = 4;
+const PARAMFLAG_FRETVAL = 8;
+const PARAMFLAG_FOPT = 16;
+const PARAMFLAG_FHASDEFAULT = 32;
+
+const IDLFLAG_NONE = PARAMFLAG_NONE;
+const IDLFLAG_FIN = PARAMFLAG_FIN;
+const IDLFLAG_FOUT = PARAMFLAG_FOUT;
+const IDLFLAG_FLCID = PARAMFLAG_FLCID;
+const IDLFLAG_FRETVAL = PARAMFLAG_FRETVAL;
+
+const IMPLTYPEFLAG_FDEFAULT       = 1;
+const IMPLTYPEFLAG_FSOURCE        = 2;
+const IMPLTYPEFLAG_FRESTRICTED    = 4;
+const IMPLTYPEFLAG_FDEFAULTVTABLE = 8;
+
+
+enum SYSKIND {
+	SYS_WIN16,
+	SYS_WIN32,
+	SYS_MAC
+}
+
+enum LIBFLAGS {
+	LIBFLAG_FRESTRICTED   = 1,
+	LIBFLAG_FCONTROL      = 2,
+	LIBFLAG_FHIDDEN       = 4,
+	LIBFLAG_FHASDISKIMAGE = 8
+}
+
+struct TLIBATTR {
+	GUID guid;
+	LCID lcid;
+	SYSKIND syskind;
+	WORD wMajorVerNum;
+	WORD wMinorVerNum;
+	WORD wLibFlags;
+}
+alias TLIBATTR* LPTLIBATTR;
+
+alias CY CURRENCY;
+
+struct SAFEARRAYBOUND {
+	ULONG cElements;
+	LONG lLbound;
+}
+alias SAFEARRAYBOUND* LPSAFEARRAYBOUND;
+
+struct SAFEARR_BSTR {
+	ULONG Size;
+	wireBSTR* aBstr;
+}
+
+struct SAFEARR_UNKNOWN {
+	ULONG Size;
+	IUnknown** apUnknown;
+}
+
+struct SAFEARR_DISPATCH {
+	ULONG Size;
+	LPDISPATCH* apDispatch;
+}
+
+struct SAFEARR_VARIANT {
+	ULONG Size;
+	_wireVARIANT* aVariant;
+}
+
+enum SF_TYPE {
+	SF_ERROR=VARENUM.VT_ERROR,
+	SF_I1=VARENUM.VT_I1,
+	SF_I2=VARENUM.VT_I2,
+	SF_I4=VARENUM.VT_I4,
+	SF_I8=VARENUM.VT_I8,
+	SF_BSTR=VARENUM.VT_BSTR,
+	SF_UNKNOWN=VARENUM.VT_UNKNOWN,
+	SF_DISPATCH=VARENUM.VT_DISPATCH,
+	SF_VARIANT=VARENUM.VT_VARIANT
+}
+
+struct _wireBRECORD {
+	ULONG fFlags;
+	ULONG clSize;
+	LPRECORDINFO* pRecInfo;
+	byte* pRecord;
+}
+alias _wireBRECORD* wireBRECORD;
+
+struct SAFEARR_BRECORD {
+	ULONG Size;
+	wireBRECORD* aRecord;
+}
+
+struct SAFEARR_HAVEIID {
+	ULONG Size;
+	IUnknown** apUnknown;
+	IID iid;
+}
+
+struct SAFEARRAYUNION {
+	ULONG sfType;
+	union _u {
+		SAFEARR_BSTR BstrStr;
+		SAFEARR_UNKNOWN UnknownStr;
+		SAFEARR_DISPATCH DispatchStr;
+		SAFEARR_VARIANT VariantStr;
+		SAFEARR_BRECORD RecordStr;
+		SAFEARR_HAVEIID HaveIidStr;
+		BYTE_SIZEDARR ByteStr;
+		WORD_SIZEDARR WordStr;
+		DWORD_SIZEDARR LongStr;
+		HYPER_SIZEDARR HyperStr;
+	}
+	_u u;	
+}
+
+struct _wireSAFEARRAY {
+	USHORT cDims;
+	USHORT fFeatures;
+	ULONG cbElements;
+	ULONG cLocks;
+	SAFEARRAYUNION uArrayStructs;
+	SAFEARRAYBOUND rgsabound[1];
+}
+alias _wireSAFEARRAY* wireSAFEARRAY;
+
+alias wireSAFEARRAY* wirePSAFEARRAY;
+
+struct SAFEARRAY {
+	USHORT cDims;
+	USHORT fFeatures;
+	ULONG cbElements;
+	ULONG cLocks;
+	PVOID pvData;
+	SAFEARRAYBOUND rgsabound[1];
+}
+alias SAFEARRAY* LPSAFEARRAY;
+
+struct VARIANT {
+	union {
+		struct {
+			VARTYPE vt;
+			WORD wReserved1;
+			WORD wReserved2;
+			WORD wReserved3;
+			union {
+				int lVal;
+				LONGLONG llVal;
+				ubyte bVal;
+				short iVal;
+				float fltVal;
+				double dblVal;
+				VARIANT_BOOL  boolVal;
+				SCODE scode;
+				CY cyVal;
+				DATE date;
+				BSTR bstrVal;
+				IUnknown punkVal;
+				IDispatch pdispVal;
+				SAFEARRAY* parray;
+				ubyte* pbVal;
+				short* piVal;
+				int* plVal;
+				float* pfltVal;
+				double* pdblVal;
+				VARIANT_BOOL* pboolVal;
+				_VARIANT_BOOL*  pbool;
+				SCODE* pscode;
+				CY* pcyVal;
+				DATE* pdate;
+				BSTR* pbstrVal;
+				IUnknown* ppunkVal;
+				IDispatch* ppdispVal;
+				SAFEARRAY** pparray;
+				VARIANT* pvarVal;
+				void* byref;
+				CHAR cVal;
+				USHORT uiVal;
+				ULONG ulVal;
+				ULONGLONG ullVal;
+				INT intVal;
+				UINT uintVal;
+				DECIMAL* pdecVal;
+				CHAR*  pcVal;
+				USHORT*  puiVal;
+				ULONG*  pulVal;
+				INT*  pintVal;
+				UINT*  puintVal;
+				struct {
+					PVOID pvRecord;
+					IRecordInfo pRecInfo;
+				}
+			}
+		}
+		DECIMAL decVal;
+	}
+}
+alias VARIANT* LPVARIANT;
+
+alias VARIANT VARIANTARG;
+alias VARIANT* LPVARIANTARG;
+
+struct _wireVARIANT {
+	DWORD clSize;
+	DWORD rpcReserved;
+	USHORT vt;
+	USHORT wReserved1;
+	USHORT wReserved2;
+	USHORT wReserved3;
+	union {
+		LONG lVal;
+		LONGLONG llVal;
+		BYTE bVal;
+		SHORT iVal;
+		FLOAT fltVal;
+		DOUBLE dblVal;
+		VARIANT_BOOL boolVal;
+		SCODE scode;
+		CY cyVal;
+		DATE date;
+		wireBSTR bstrVal;
+		IUnknown* punkVal;
+		LPDISPATCH pdispVal;
+		wirePSAFEARRAY parray;
+		wireBRECORD brecVal;
+		BYTE* pbVal;
+		SHORT* piVal;
+		LONG* plVal;
+		FLOAT* pfltVal;
+		DOUBLE* pdblVal;
+		VARIANT_BOOL* pboolVal;
+		SCODE* pscode;
+		CY* pcyVal;
+		DATE* pdate;
+		wireBSTR* pbstrVal;
+		IUnknown** ppunkVal;
+		LPDISPATCH* ppdispVal;
+		wirePSAFEARRAY* pparray;
+		wireVARIANT* pvarVal;
+		CHAR cVal;
+		USHORT uiVal;
+		ULONG ulVal;
+		ULONGLONG ullVal;
+		INT intVal;
+		UINT uintVal;
+		DECIMAL decVal;
+		DECIMAL* pdecVal;
+		CHAR* pcVal;
+		USHORT* puiVal;
+		ULONG* pulVal;
+		INT* pintVal;
+		UINT* puintVal;
+	}
+}
+alias _wireVARIANT* wireVARIANT;
+
+alias LONG DISPID;
+alias DISPID MEMBERID;
+alias DWORD HREFTYPE;
+
+enum TYPEKIND {
+	TKIND_ENUM, TKIND_RECORD, TKIND_MODULE, TKIND_INTERFACE, TKIND_DISPATCH,
+	TKIND_COCLASS, TKIND_ALIAS, TKIND_UNION, TKIND_MAX
+}
+
+struct TYPEDESC {
+	union {
+		TYPEDESC* lptdesc;
+		ARRAYDESC* lpadesc;
+		HREFTYPE hreftype;
+	}
+	VARTYPE vt;
+}
+
+struct ARRAYDESC {
+	TYPEDESC tdescElem;
+	USHORT cDims;
+	SAFEARRAYBOUND rgbounds[1];
+}
+
+struct PARAMDESCEX {
+	ULONG cBytes;
+	VARIANTARG varDefaultValue;
+}
+alias PARAMDESCEX* LPPARAMDESCEX;
+
+struct PARAMDESC {
+	LPPARAMDESCEX pparamdescex;
+	USHORT wParamFlags;
+}
+alias PARAMDESC* LPPARAMDESC;
+
+struct IDLDESC {
+	ULONG dwReserved;
+	USHORT wIDLFlags;
+}
+alias IDLDESC* LPIDLDESC;
+
+struct ELEMDESC {
+	TYPEDESC tdesc;
+	union {
+		IDLDESC idldesc;
+		PARAMDESC paramdesc;
+	}
+}
+alias ELEMDESC* LPELEMDESC;
+
+struct TYPEATTR {
+	GUID guid;
+	LCID lcid;
+	DWORD dwReserved;
+	MEMBERID memidConstructor;
+	MEMBERID memidDestructor;
+	LPOLESTR lpstrSchema;
+	ULONG cbSizeInstance;
+	TYPEKIND typekind;
+	WORD cFuncs;
+	WORD cVars;
+	WORD cImplTypes;
+	WORD cbSizeVft;
+	WORD cbAlignment;
+	WORD wTypeFlags;
+	WORD wMajorVerNum;
+	WORD wMinorVerNum;
+	TYPEDESC tdescAlias;
+	IDLDESC idldescType;
+}
+alias TYPEATTR* LPTYPEATTR;
+
+struct DISPPARAMS {
+	VARIANTARG* rgvarg;
+	DISPID* rgdispidNamedArgs;
+	UINT cArgs;
+	UINT cNamedArgs;
+}
+
+struct EXCEPINFO {
+	WORD wCode;
+	WORD wReserved;
+	BSTR bstrSource;
+	BSTR bstrDescription;
+	BSTR bstrHelpFile;
+	DWORD dwHelpContext;
+	PVOID pvReserved;
+	extern (Windows) {
+	HRESULT function (EXCEPINFO* ) pfnDeferredFillIn;
+	}
+	SCODE scode;
+}
+alias EXCEPINFO* LPEXCEPINFO;
+
+enum CALLCONV {
+	CC_FASTCALL,
+	CC_CDECL,
+	CC_MSCPASCAL,
+	CC_PASCAL=CC_MSCPASCAL,
+	CC_MACPASCAL,
+	CC_STDCALL,
+	CC_FPFASTCALL,
+	CC_SYSCALL,
+	CC_MPWCDECL,
+	CC_MPWPASCAL,
+	CC_MAX=CC_MPWPASCAL
+}
+
+enum FUNCKIND {
+	FUNC_VIRTUAL,
+	FUNC_PUREVIRTUAL,
+	FUNC_NONVIRTUAL,
+	FUNC_STATIC,
+	FUNC_DISPATCH
+}
+
+enum INVOKEKIND {
+	INVOKE_FUNC           = 1,
+	INVOKE_PROPERTYGET    = 2,
+	INVOKE_PROPERTYPUT    = 4,
+	INVOKE_PROPERTYPUTREF = 8
+}
+
+struct FUNCDESC {
+	MEMBERID memid;
+	SCODE* lprgscode;
+	ELEMDESC* lprgelemdescParam;
+	FUNCKIND funckind;
+	INVOKEKIND invkind;
+	CALLCONV callconv;
+	SHORT cParams;
+	SHORT cParamsOpt;
+	SHORT oVft;
+	SHORT cScodes;
+	ELEMDESC elemdescFunc;
+	WORD wFuncFlags;
+}
+alias FUNCDESC* LPFUNCDESC;
+
+enum VARKIND {
+	VAR_PERINSTANCE, VAR_STATIC, VAR_CONST, VAR_DISPATCH
+}
+
+struct VARDESC {
+	MEMBERID memid;
+	LPOLESTR lpstrSchema;
+	union {
+		ULONG oInst;
+		VARIANT* lpvarValue;
+	}
+	ELEMDESC elemdescVar;
+	WORD wVarFlags;
+	VARKIND varkind;
+}
+alias VARDESC* LPVARDESC;
+
+enum TYPEFLAGS {
+	TYPEFLAG_FAPPOBJECT     = 1,
+	TYPEFLAG_FCANCREATE     = 2,
+	TYPEFLAG_FLICENSED      = 4,
+	TYPEFLAG_FPREDECLID     = 8,
+	TYPEFLAG_FHIDDEN        = 16,
+	TYPEFLAG_FCONTROL       = 32,
+	TYPEFLAG_FDUAL          = 64,
+	TYPEFLAG_FNONEXTENSIBLE = 128,
+	TYPEFLAG_FOLEAUTOMATION = 256,
+	TYPEFLAG_FRESTRICTED    = 512,
+	TYPEFLAG_FAGGREGATABLE  = 1024,
+	TYPEFLAG_FREPLACEABLE   = 2048,
+	TYPEFLAG_FDISPATCHABLE  = 4096,
+	TYPEFLAG_FREVERSEBIND   = 8192
+}
+
+enum FUNCFLAGS {
+	FUNCFLAG_FRESTRICTED = 1,
+	FUNCFLAG_FSOURCE = 2,
+	FUNCFLAG_FBINDABLE = 4,
+	FUNCFLAG_FREQUESTEDIT = 8,
+	FUNCFLAG_FDISPLAYBIND = 16,
+	FUNCFLAG_FDEFAULTBIND = 32,
+	FUNCFLAG_FHIDDEN = 64,
+	FUNCFLAG_FUSESGETLASTERROR = 128,
+	FUNCFLAG_FDEFAULTCOLLELEM = 256,
+	FUNCFLAG_FUIDEFAULT = 512,
+	FUNCFLAG_FNONBROWSABLE = 1024,
+	FUNCFLAG_FREPLACEABLE = 2048,
+	FUNCFLAG_FIMMEDIATEBIND = 4096
+}
+
+enum VARFLAGS {
+	VARFLAG_FREADONLY = 1,
+	VARFLAG_FSOURCE = 2,
+	VARFLAG_FBINDABLE = 4,
+	VARFLAG_FREQUESTEDIT = 8,
+	VARFLAG_FDISPLAYBIND = 16,
+	VARFLAG_FDEFAULTBIND = 32,
+	VARFLAG_FHIDDEN = 64,
+	VARFLAG_FRESTRICTED = 128,
+	VARFLAG_FDEFAULTCOLLELEM = 256,
+	VARFLAG_FUIDEFAULT = 512,
+	VARFLAG_FNONBROWSABLE = 1024,
+	VARFLAG_FREPLACEABLE = 2048,
+	VARFLAG_FIMMEDIATEBIND = 4096
+}
+
+struct CLEANLOCALSTORAGE {
+	IUnknown* pInterface;
+	PVOID pStorage;
+	DWORD flags;
+}
+
+struct CUSTDATAITEM {
+	GUID guid;
+	VARIANTARG varValue;
+}
+alias CUSTDATAITEM* LPCUSTDATAITEM;
+
+struct CUSTDATA {
+	DWORD cCustData;
+	LPCUSTDATAITEM prgCustData;
+}
+alias CUSTDATA* LPCUSTDATA;
+
+enum DESCKIND {
+	DESCKIND_NONE = 0,
+	DESCKIND_FUNCDESC = DESCKIND_NONE+1,
+	DESCKIND_VARDESC = DESCKIND_FUNCDESC+1,
+	DESCKIND_TYPECOMP = DESCKIND_VARDESC+1,
+	DESCKIND_IMPLICITAPPOBJ = DESCKIND_TYPECOMP+1,
+	DESCKIND_MAX = DESCKIND_IMPLICITAPPOBJ+1
+}
+
+union BINDPTR {
+	LPFUNCDESC lpfuncdesc;
+	LPVARDESC lpvardesc;
+	LPTYPECOMP lptcomp;
+}
+alias BINDPTR* LPBINDPTR;
+
+interface IDispatch : public IUnknown {
+	HRESULT GetTypeInfoCount(UINT*);
+	HRESULT GetTypeInfo(UINT, LCID, LPTYPEINFO*);
+	HRESULT GetIDsOfNames(REFIID, LPOLESTR*, UINT, LCID, DISPID*);
+	HRESULT Invoke(DISPID, REFIID, LCID, WORD, DISPPARAMS*, VARIANT*, EXCEPINFO*, UINT*);
+}
+alias IDispatch LPDISPATCH;
+
+interface IEnumVARIANT : public IUnknown {
+	HRESULT Next(ULONG, VARIANT*, ULONG*);
+	HRESULT Skip(ULONG);
+	HRESULT Reset();
+	HRESULT Clone(IEnumVARIANT**);
+}
+alias IEnumVARIANT LPENUMVARIANT;
+
+interface ITypeComp : public IUnknown {
+	HRESULT Bind(LPOLESTR, ULONG, WORD, LPTYPEINFO*, DESCKIND*, LPBINDPTR);
+	HRESULT BindType(LPOLESTR, ULONG, LPTYPEINFO*, LPTYPECOMP*);
+}
+alias ITypeComp LPTYPECOMP;
+
+interface ITypeInfo : public IUnknown {
+	HRESULT GetTypeAttr(LPTYPEATTR*);
+	HRESULT GetTypeComp(LPTYPECOMP*);
+	HRESULT GetFuncDesc(UINT, LPFUNCDESC*);
+	HRESULT GetVarDesc(UINT, LPVARDESC*);
+	HRESULT GetNames(MEMBERID, BSTR*, UINT, UINT*);
+	HRESULT GetRefTypeOfImplType(UINT, HREFTYPE*);
+	HRESULT GetImplTypeFlags(UINT, INT*);
+	HRESULT GetIDsOfNames(LPOLESTR*, UINT, MEMBERID*);
+	HRESULT Invoke(PVOID, MEMBERID, WORD, DISPPARAMS*, VARIANT*, EXCEPINFO*,
+	  UINT*);
+	HRESULT GetDocumentation(MEMBERID, BSTR*, BSTR*, DWORD*, BSTR*);
+	HRESULT GetDllEntry(MEMBERID, INVOKEKIND, BSTR*, BSTR*, WORD*);
+	HRESULT GetRefTypeInfo(HREFTYPE, LPTYPEINFO*);
+	HRESULT AddressOfMember(MEMBERID, INVOKEKIND, PVOID*);
+	HRESULT CreateInstance(LPUNKNOWN, REFIID, PVOID*);
+	HRESULT GetMops(MEMBERID, BSTR*);
+	HRESULT GetContainingTypeLib(LPTYPELIB*, UINT*);
+	void ReleaseTypeAttr(LPTYPEATTR);
+	void ReleaseFuncDesc(LPFUNCDESC);
+	void ReleaseVarDesc(LPVARDESC);
+}
+alias ITypeInfo LPTYPEINFO;
+
+interface ITypeInfo2 : public ITypeInfo {
+	HRESULT GetTypeKind(TYPEKIND*);
+	HRESULT GetTypeFlags(ULONG*);
+	HRESULT GetFuncIndexOfMemId(MEMBERID, INVOKEKIND, UINT*);
+	HRESULT GetVarIndexOfMemId(MEMBERID, UINT*);
+	HRESULT GetCustData(REFGUID, VARIANT*);
+	HRESULT GetFuncCustData(UINT, REFGUID, VARIANT*);
+	HRESULT GetParamCustData(UINT, UINT, REFGUID, VARIANT*);
+	HRESULT GetVarCustData(UINT, REFGUID, VARIANT*);
+	HRESULT GetImplTypeCustData(UINT, REFGUID, VARIANT*);
+	HRESULT GetDocumentation2(MEMBERID, LCID, BSTR*, DWORD*, BSTR*);
+	HRESULT GetAllCustData(CUSTDATA*);
+	HRESULT GetAllFuncCustData(UINT, CUSTDATA*);
+	HRESULT GetAllParamCustData(UINT, UINT, CUSTDATA*);
+	HRESULT GetAllVarCustData(UINT, CUSTDATA*);
+	HRESULT GetAllImplTypeCustData(UINT, CUSTDATA*);
+}
+alias ITypeInfo2 LPTYPEINFO2;
+
+interface ITypeLib : public IUnknown {
+	UINT GetTypeInfoCount();
+	HRESULT GetTypeInfo(UINT, ITypeInfo**);
+	HRESULT GetTypeInfoType(UINT, TYPEKIND*);
+	HRESULT GetTypeInfoOfGuid(REFGUID, ITypeInfo**);
+	HRESULT GetLibAttr(TLIBATTR**);
+	HRESULT GetTypeComp(ITypeComp*);
+	HRESULT GetDocumentation(INT, BSTR*, BSTR*, DWORD*, BSTR*);
+	HRESULT IsName(LPOLESTR, ULONG, BOOL*);
+	HRESULT FindName(LPOLESTR, ULONG, ITypeInfo**, MEMBERID*, USHORT*);
+	void ReleaseTLibAttr(TLIBATTR*);
+}
+alias ITypeLib LPTYPELIB;
+
+interface ITypeLib2 : public ITypeLib {
+	HRESULT GetCustData(REFGUID, VARIANT*);
+	HRESULT GetLibStatistics(ULONG*, ULONG*);
+	HRESULT GetDocumentation2(INT, LCID, BSTR*, DWORD*, BSTR*);
+	HRESULT GetAllCustData(CUSTDATA*);
+}
+alias ITypeLib2 LPTYPELIB2;
+
+interface IErrorInfo : public IUnknown {
+	HRESULT GetGUID(GUID*);
+	HRESULT GetSource(BSTR*);
+	HRESULT GetDescription(BSTR*);
+	HRESULT GetHelpFile(BSTR*);
+	HRESULT GetHelpContext(DWORD*);
+}
+alias IErrorInfo LPERRORINFO;
+
+interface ICreateErrorInfo : public IUnknown {
+	HRESULT SetGUID(REFGUID);
+	HRESULT SetSource(LPOLESTR);
+	HRESULT SetDescription(LPOLESTR);
+	HRESULT SetHelpFile(LPOLESTR);
+	HRESULT SetHelpContext(DWORD);
+}
+alias ICreateErrorInfo* LPCREATEERRORINFO;
+
+interface ISupportErrorInfo : public IUnknown {
+	HRESULT InterfaceSupportsErrorInfo(REFIID);
+}
+alias ISupportErrorInfo LPSUPPORTERRORINFO;
+
+interface IRecordInfo : public IUnknown {
+	HRESULT RecordInit(PVOID);
+	HRESULT RecordClear(PVOID);
+	HRESULT RecordCopy(PVOID, PVOID);
+	HRESULT GetGuid(GUID*);
+	HRESULT GetName(BSTR*);
+	HRESULT GetSize(ULONG*);
+	HRESULT GetTypeInfo(ITypeInfo**);
+	HRESULT GetField(PVOID, LPCOLESTR, VARIANT*);
+	HRESULT GetFieldNoCopy(PVOID, LPCOLESTR, VARIANT*, PVOID*);
+	HRESULT PutField (ULONG, PVOID, LPCOLESTR, VARIANT*);
+	HRESULT PutFieldNoCopy(ULONG, PVOID, LPCOLESTR, VARIANT*);
+	HRESULT GetFieldNames(ULONG*, BSTR*);
+	BOOL IsMatchingType();
+	PVOID RecordCreate();
+	HRESULT RecordCreateCopy(PVOID, PVOID*);
+	HRESULT RecordDestroy (PVOID);
+}
+alias IRecordInfo LPRECORDINFO;
+
+interface ITypeMarshal : public IUnknown {
+	HRESULT Size(PVOID, DWORD, PVOID, ULONG*);
+	HRESULT Marshal(PVOID, DWORD, PVOID, ULONG, BYTE*, ULONG*);
+	HRESULT Unmarshal(PVOID, DWORD, ULONG, BYTE*, ULONG*);
+	HRESULT Free(PVOID);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/objbase.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,207 @@
+/***********************************************************************\
+*                               objbase.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.objbase;
+pragma(lib, "ole32.lib");
+
+import win32.cguid, win32.objidl, win32.unknwn, win32.wtypes;
+private import win32.basetyps, win32.objfwd, win32.rpcdce, win32.winbase,
+  win32.windef;
+
+// DAC: Not needed for D?
+//MACRO #define LISet32(li, v) ((li).HighPart=(v)<0?-1:0, (li).LowPart=(v))
+//MACRO #define ULISet32(li, v) ((li).HighPart=0, (li).LowPart=(v))
+
+const CLSCTX_ALL    = CLSCTX.CLSCTX_INPROC_SERVER|CLSCTX.CLSCTX_INPROC_HANDLER|CLSCTX.CLSCTX_LOCAL_SERVER;
+const CLSCTX_INPROC = CLSCTX.CLSCTX_INPROC_SERVER|CLSCTX.CLSCTX_INPROC_HANDLER;
+const CLSCTX_SERVER = CLSCTX.CLSCTX_INPROC_SERVER|CLSCTX.CLSCTX_LOCAL_SERVER|CLSCTX.CLSCTX_REMOTE_SERVER;
+const MARSHALINTERFACE_MIN=500;
+const CWCSTORAGENAME=32;
+
+const STGM_DIRECT           = 0;
+const STGM_TRANSACTED       = 0x10000L;
+const STGM_SIMPLE           = 0x8000000L;
+const STGM_READ             = 0;
+const STGM_WRITE            = 1;
+const STGM_READWRITE        = 2;
+const STGM_SHARE_DENY_NONE  = 0x40;
+const STGM_SHARE_DENY_READ  = 0x30;
+const STGM_SHARE_DENY_WRITE = 0x20;
+const STGM_SHARE_EXCLUSIVE  = 0x10;
+const STGM_PRIORITY         = 0x40000L;
+const STGM_DELETEONRELEASE  = 0x4000000;
+const STGM_NOSCRATCH        = 0x100000;
+const STGM_CREATE           = 0x1000;
+const STGM_CONVERT          = 0x20000;
+const STGM_NOSNAPSHOT       = 0x200000;
+const STGM_FAILIFTHERE      = 0;
+
+const ASYNC_MODE_COMPATIBILITY = 1;
+const ASYNC_MODE_DEFAULT       = 0;
+
+const STGTY_REPEAT = 256;
+const STG_TOEND = 0xFFFFFFFF;
+const STG_LAYOUT_SEQUENTIAL  = 0;
+const STG_LAYOUT_INTERLEAVED = 1;
+
+const COM_RIGHTS_EXECUTE            = 1;
+const COM_RIGHTS_SAFE_FOR_SCRIPTING = 2;
+
+const STGOPTIONS_VERSION = 2;
+
+enum STGFMT {
+	STGFMT_STORAGE = 0,
+	STGFMT_FILE = 3,
+	STGFMT_ANY = 4,
+	STGFMT_DOCFILE = 5
+}
+
+struct STGOPTIONS {
+	USHORT usVersion;
+	USHORT reserved;
+	ULONG ulSectorSize;
+	WCHAR* pwcsTemplateFile;
+}
+
+enum REGCLS {
+	REGCLS_SINGLEUSE = 0,
+	REGCLS_MULTIPLEUSE = 1,
+	REGCLS_MULTI_SEPARATE = 2
+}
+
+/*
+BOOL IsEqualGUID(GUID rguid1, GUID rguid2) {
+	return rguid1 == rguid2;
+}
+*/
+
+extern (Windows) BOOL IsEqualGUID(
+  REFGUID rguid1,
+  REFGUID rguid2
+);
+
+alias IsEqualGUID IsEqualIID;
+alias IsEqualGUID IsEqualCLSID;
+
+enum COINIT {
+	COINIT_APARTMENTTHREADED = 2,
+	COINIT_MULTITHREADED     = 0,
+	COINIT_DISABLE_OLE1DDE   = 4,
+	COINIT_SPEED_OVER_MEMORY = 8
+}
+
+enum STDMSHLFLAGS {
+	SMEXF_SERVER  = 1,
+	SMEXF_HANDLER
+}
+
+extern(Windows) {
+	alias HRESULT function(REFCLSID, REFIID, PVOID*) LPFNGETCLASSOBJECT;
+	alias HRESULT function() LPFNCANUNLOADNOW;
+
+	DWORD CoBuildVersion();
+	HRESULT CoInitialize(PVOID);
+	HRESULT CoInitializeEx(LPVOID, DWORD);
+	void CoUninitialize();
+	HRESULT CoGetMalloc(DWORD, LPMALLOC*);
+	DWORD CoGetCurrentProcess();
+	HRESULT CoRegisterMallocSpy(LPMALLOCSPY);
+	HRESULT CoRevokeMallocSpy();
+	HRESULT CoCreateStandardMalloc(DWORD, IMalloc**);
+	//#ifdef DBG
+	ULONG DebugCoGetRpcFault();
+	void DebugCoSetRpcFault(ULONG);
+	//#endif
+	HRESULT CoGetClassObject(REFCLSID, DWORD, COSERVERINFO*, REFIID, PVOID*);
+	HRESULT CoRegisterClassObject(REFCLSID, LPUNKNOWN, DWORD, DWORD, PDWORD);
+	HRESULT CoRevokeClassObject(DWORD);
+	HRESULT CoGetMarshalSizeMax(ULONG*, REFIID, LPUNKNOWN, DWORD, PVOID, DWORD);
+	HRESULT CoMarshalInterface(LPSTREAM, REFIID, LPUNKNOWN, DWORD, PVOID, DWORD);
+	HRESULT CoUnmarshalInterface(LPSTREAM, REFIID, PVOID*);
+	HRESULT CoMarshalHresult(LPSTREAM, HRESULT);
+	HRESULT CoUnmarshalHresult(LPSTREAM, HRESULT*);
+	HRESULT CoReleaseMarshalData(LPSTREAM);
+	HRESULT CoDisconnectObject(LPUNKNOWN, DWORD);
+	HRESULT CoLockObjectExternal(LPUNKNOWN, BOOL, BOOL);
+	HRESULT CoGetStandardMarshal(REFIID, LPUNKNOWN, DWORD, PVOID, DWORD, LPMARSHAL*);
+	HRESULT CoGetStdMarshalEx(LPUNKNOWN, DWORD, LPUNKNOWN*);
+	BOOL CoIsHandlerConnected(LPUNKNOWN);
+	BOOL CoHasStrongExternalConnections(LPUNKNOWN);
+	HRESULT CoMarshalInterThreadInterfaceInStream(REFIID, LPUNKNOWN, LPSTREAM*);
+	HRESULT CoGetInterfaceAndReleaseStream(LPSTREAM, REFIID, PVOID*);
+	HRESULT CoCreateFreeThreadedMarshaler(LPUNKNOWN, LPUNKNOWN*);
+	HINSTANCE CoLoadLibrary(LPOLESTR, BOOL);
+	void CoFreeLibrary(HINSTANCE);
+	void CoFreeAllLibraries();
+	void CoFreeUnusedLibraries();
+	HRESULT CoCreateInstance(REFCLSID, LPUNKNOWN, DWORD, REFIID, PVOID*);
+	HRESULT CoCreateInstanceEx(REFCLSID, IUnknown*, DWORD, COSERVERINFO*, DWORD, MULTI_QI*);
+	HRESULT StringFromCLSID(REFCLSID, LPOLESTR*);
+	HRESULT CLSIDFromString(LPOLESTR, LPCLSID);
+	HRESULT StringFromIID(REFIID, LPOLESTR*);
+	HRESULT IIDFromString(LPOLESTR, LPIID);
+	BOOL CoIsOle1Class(REFCLSID);
+	HRESULT ProgIDFromCLSID(REFCLSID, LPOLESTR*);
+	HRESULT CLSIDFromProgID(LPCOLESTR, LPCLSID);
+	int StringFromGUID2(REFGUID, LPOLESTR, int);
+	HRESULT CoCreateGuid(GUID*);
+	BOOL CoFileTimeToDosDateTime(FILETIME*, LPWORD, LPWORD);
+	BOOL CoDosDateTimeToFileTime(WORD, WORD, FILETIME*);
+	HRESULT CoFileTimeNow(FILETIME*);
+	HRESULT CoRegisterMessageFilter(LPMESSAGEFILTER, LPMESSAGEFILTER*);
+	HRESULT CoGetTreatAsClass(REFCLSID, LPCLSID);
+	HRESULT CoTreatAsClass(REFCLSID, REFCLSID);
+	HRESULT DllGetClassObject(REFCLSID, REFIID, PVOID*);
+	HRESULT DllCanUnloadNow();
+	PVOID CoTaskMemAlloc(ULONG);
+	PVOID CoTaskMemRealloc(PVOID, ULONG);
+	void CoTaskMemFree(PVOID);
+	HRESULT CreateDataAdviseHolder(LPDATAADVISEHOLDER*);
+	HRESULT CreateDataCache(LPUNKNOWN, REFCLSID, REFIID, PVOID*);
+	HRESULT StgCreateDocfile(OLECHAR*, DWORD, DWORD, IStorage**);
+	HRESULT StgCreateDocfileOnILockBytes(ILockBytes*, DWORD, DWORD, IStorage**);
+	HRESULT StgOpenStorage(OLECHAR*, IStorage, DWORD, SNB, DWORD, IStorage*);
+	HRESULT StgOpenStorageOnILockBytes(ILockBytes*, IStorage*, DWORD, SNB, DWORD, IStorage**);
+	HRESULT StgIsStorageFile(OLECHAR*);
+	HRESULT StgIsStorageILockBytes(ILockBytes*);
+	HRESULT StgSetTimes(OLECHAR *, FILETIME *, FILETIME *, FILETIME *);
+	HRESULT StgCreateStorageEx(WCHAR*, DWORD, DWORD, DWORD, STGOPTIONS*, void*, REFIID, void**);
+	HRESULT StgOpenStorageEx(WCHAR*, DWORD, DWORD, DWORD, STGOPTIONS*, void*, REFIID, void**);
+	HRESULT BindMoniker(LPMONIKER, DWORD, REFIID, PVOID*);
+	HRESULT CoGetObject(LPCWSTR, BIND_OPTS*, REFIID, void**);
+	HRESULT MkParseDisplayName(LPBC, LPCOLESTR, ULONG*, LPMONIKER*);
+	HRESULT MonikerRelativePathTo(LPMONIKER, LPMONIKER, LPMONIKER*, BOOL);
+	HRESULT MonikerCommonPrefixWith(LPMONIKER, LPMONIKER, LPMONIKER*);
+	HRESULT CreateBindCtx(DWORD, LPBC*);
+	HRESULT CreateGenericComposite(LPMONIKER, LPMONIKER, LPMONIKER*);
+	HRESULT GetClassFile (LPCOLESTR, CLSID*);
+	HRESULT CreateFileMoniker(LPCOLESTR, LPMONIKER*);
+	HRESULT CreateItemMoniker(LPCOLESTR, LPCOLESTR, LPMONIKER*);
+	HRESULT CreateAntiMoniker(LPMONIKER*);
+	HRESULT CreatePointerMoniker(LPUNKNOWN, LPMONIKER*);
+	HRESULT GetRunningObjectTable(DWORD, LPRUNNINGOBJECTTABLE*);
+	HRESULT CoInitializeSecurity(PSECURITY_DESCRIPTOR, LONG, SOLE_AUTHENTICATION_SERVICE*, void*, DWORD, DWORD, void*, DWORD, void*);
+	HRESULT CoGetCallContext(REFIID, void**);
+	HRESULT CoQueryProxyBlanket(IUnknown*, DWORD*, DWORD*, OLECHAR**, DWORD*, DWORD*, RPC_AUTH_IDENTITY_HANDLE*, DWORD*);
+	HRESULT CoSetProxyBlanket(IUnknown*, DWORD, DWORD, OLECHAR*, DWORD, DWORD, RPC_AUTH_IDENTITY_HANDLE, DWORD);
+	HRESULT CoCopyProxy(IUnknown*, IUnknown**);
+	HRESULT CoQueryClientBlanket(DWORD*, DWORD*, OLECHAR**, DWORD*, DWORD*, RPC_AUTHZ_HANDLE*, DWORD*);
+	HRESULT CoImpersonateClient();
+	HRESULT CoRevertToSelf();
+	HRESULT CoQueryAuthenticationServices(DWORD*, SOLE_AUTHENTICATION_SERVICE**);
+	HRESULT CoSwitchCallContext(IUnknown*, IUnknown**);
+	HRESULT CoGetInstanceFromFile(COSERVERINFO*, CLSID*, IUnknown*, DWORD, DWORD, OLECHAR*, DWORD, MULTI_QI*);
+	HRESULT CoGetInstanceFromIStorage(COSERVERINFO*, CLSID*, IUnknown*, DWORD, IStorage*, DWORD, MULTI_QI*);
+	ULONG CoAddRefServerProcess();
+	ULONG CoReleaseServerProcess();
+	HRESULT CoResumeClassObjects();
+	HRESULT CoSuspendClassObjects();
+	HRESULT CoGetPSClsid(REFIID, CLSID*);
+	HRESULT CoRegisterPSClsid(REFIID, REFCLSID);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/objfwd.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,103 @@
+/***********************************************************************\
+*                                objfwd.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.objfwd;
+
+private import win32.objidl;
+
+/+
+// Forward declararions are not necessary in D.
+extern(Windows) {
+	interface IMoniker;
+	interface IStream;
+	interface IMarshal;
+	interface IMalloc;
+	interface IMallocSpy;
+	interface IMessageFilter;
+	interface IPersist;
+	interface IPersistStream;
+	interface IRunningObjectTable;
+	interface IBindCtx;
+	interface IAdviseSink;
+	interface IAdviseSink2;
+	interface IDataObject;
+	interface IDataAdviseHolder;
+
+	interface IEnumMoniker;
+	interface IEnumFORMATETC;
+	interface IEnumSTATDATA;
+	interface IEnumSTATSTG;
+	interface IEnumSTATPROPSTG;
+	interface IEnumString;
+	interface IEnumUnknown;
+	interface IStorage;
+	interface IPersistStorage;
+	interface ILockBytes;
+	interface IStdMarshalInfo;
+	interface IExternalConnection;
+	interface IRunnableObject;
+	interface IROTData;
+	interface IPersistFile;
+	interface IRootStorage;
+	interface IPropertyStorage;
+	interface IEnumSTATPROPSETSTG;
+	interface IPropertySetStorage;
+	interface IClientSecurity;
+	interface IServerSecurity;
+	interface IClassActivator;
+	interface IFillLockBytes;
+	interface IProgressNotify;
+	interface ILayoutStorage;
+	interface IRpcProxyBuffer;
+	interface IRpcChannelBuffer;
+	interface IRpcStubBuffer;
+}
++/
+alias IMoniker LPMONIKER;
+alias IStream LPSTREAM;
+alias IMarshal LPMARSHAL;
+alias IMalloc LPMALLOC;
+alias IMallocSpy LPMALLOCSPY;
+alias IMessageFilter LPMESSAGEFILTER;
+alias IPersist LPPERSIST;
+alias IPersistStream LPPERSISTSTREAM;
+alias IRunningObjectTable LPRUNNINGOBJECTTABLE;
+alias IBindCtx LPBINDCTX, LPBC;
+alias IAdviseSink LPADVISESINK;
+alias IAdviseSink2 LPADVISESINK2;
+alias IDataObject LPDATAOBJECT;
+alias IDataAdviseHolder LPDATAADVISEHOLDER;
+alias IEnumMoniker LPENUMMONIKER;
+alias IEnumFORMATETC LPENUMFORMATETC;
+alias IEnumSTATDATA LPENUMSTATDATA;
+alias IEnumSTATSTG LPENUMSTATSTG;
+alias IEnumSTATPROPSTG LPENUMSTATPROPSTG;
+alias IEnumString LPENUMSTRING;
+alias IEnumUnknown LPENUMUNKNOWN;
+alias IStorage LPSTORAGE;
+alias IPersistStorage LPPERSISTSTORAGE;
+alias ILockBytes LPLOCKBYTES;
+alias IStdMarshalInfo LPSTDMARSHALINFO;
+alias IExternalConnection LPEXTERNALCONNECTION;
+alias IRunnableObject LPRUNNABLEOBJECT;
+alias IROTData LPROTDATA;
+alias IPersistFile LPPERSISTFILE;
+alias IRootStorage LPROOTSTORAGE;
+alias IRpcChannelBuffer LPRPCCHANNELBUFFER;
+alias IRpcProxyBuffer LPRPCPROXYBUFFER;
+alias IRpcStubBuffer LPRPCSTUBBUFFER;
+alias IPropertyStorage LPPROPERTYSTORAGE;
+alias IEnumSTATPROPSETSTG LPENUMSTATPROPSETSTG;
+alias IPropertySetStorage LPPROPERTYSETSTORAGE;
+alias IClientSecurity LPCLIENTSECURITY;
+alias IServerSecurity LPSERVERSECURITY;
+alias IClassActivator LPCLASSACTIVATOR;
+alias IFillLockBytes LPFILLLOCKBYTES;
+alias IProgressNotify LPPROGRESSNOTIFY;
+alias ILayoutStorage LPLAYOUTSTORAGE;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/objidl.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,1307 @@
+/***********************************************************************\
+*                                objidl.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+// TODO (Don):
+// # why is "alias IPSFactoryBuffer* LPPSFACTORYBUFFER;" in this file,
+// rather than in objfwd ?
+// # do we need the proxies that are defined in this file?
+module win32.objidl;
+
+import win32.unknwn;
+import win32.objfwd;
+private import win32.windef;
+private import win32.basetyps;
+private import win32.oleidl;
+private import win32.wtypes;
+private import win32.winbase; // for FILETIME
+private import win32.rpcdce;
+
+struct  STATSTG {
+	LPOLESTR pwcsName;
+	DWORD type;
+	ULARGE_INTEGER cbSize;
+	FILETIME mtime;
+	FILETIME ctime;
+	FILETIME atime;
+	DWORD grfMode;
+	DWORD grfLocksSupported;
+	CLSID clsid;
+	DWORD grfStateBits;
+	DWORD reserved;
+}
+
+enum STGTY {
+	STGTY_STORAGE = 1,
+	STGTY_STREAM,
+	STGTY_LOCKBYTES,
+	STGTY_PROPERTY
+}
+
+enum STREAM_SEEK {
+	STREAM_SEEK_SET,
+	STREAM_SEEK_CUR,
+	STREAM_SEEK_END
+}
+
+struct INTERFACEINFO {
+	LPUNKNOWN pUnk;
+	IID iid;
+	WORD wMethod;
+}
+alias INTERFACEINFO* LPINTERFACEINFO;
+
+enum CALLTYPE {
+	CALLTYPE_TOPLEVEL = 1,
+	CALLTYPE_NESTED,
+	CALLTYPE_ASYNC,
+	CALLTYPE_TOPLEVEL_CALLPENDING,
+	CALLTYPE_ASYNC_CALLPENDING
+}
+
+enum PENDINGTYPE {
+	PENDINGTYPE_TOPLEVEL = 1,
+	PENDINGTYPE_NESTED
+}
+
+enum PENDINGMSG {
+	PENDINGMSG_CANCELCALL = 0,
+	PENDINGMSG_WAITNOPROCESS,
+	PENDINGMSG_WAITDEFPROCESS
+}
+
+alias OLECHAR** SNB;
+
+enum DATADIR {
+	DATADIR_GET = 1,
+	DATADIR_SET
+}
+alias WORD CLIPFORMAT;
+alias CLIPFORMAT* LPCLIPFORMAT;
+
+struct DVTARGETDEVICE {
+	DWORD tdSize;
+	WORD tdDriverNameOffset;
+	WORD tdDeviceNameOffset;
+	WORD tdPortNameOffset;
+	WORD tdExtDevmodeOffset;
+	BYTE tdData[1];
+}
+
+struct FORMATETC {
+	CLIPFORMAT cfFormat;
+	DVTARGETDEVICE* ptd;
+	DWORD dwAspect;
+	LONG lindex;
+	DWORD tymed;
+}
+alias FORMATETC* LPFORMATETC;
+
+struct RemSTGMEDIUM {
+	DWORD tymed;
+	DWORD dwHandleType;
+	ULONG pData;
+	uint pUnkForRelease;
+	uint cbData;
+	BYTE data[1];
+}
+
+struct HLITEM {
+	ULONG uHLID;
+	LPWSTR pwzFriendlyName;
+}
+
+struct STATDATA {
+	FORMATETC formatetc;
+	DWORD grfAdvf;
+	IAdviseSink* pAdvSink;
+	DWORD dwConnection;
+}
+
+struct STATPROPSETSTG {
+	FMTID fmtid;
+	CLSID clsid;
+	DWORD grfFlags;
+	FILETIME mtime;
+	FILETIME ctime;
+	FILETIME atime;
+}
+
+enum EXTCONN {
+	EXTCONN_STRONG   = 1,
+	EXTCONN_WEAK     = 2,
+	EXTCONN_CALLABLE = 4
+}
+
+struct MULTI_QI {
+	IID*      pIID;
+	IUnknown  pItf;
+	HRESULT   hr;
+}
+
+struct AUTH_IDENTITY {
+	USHORT* User;
+	ULONG UserLength;
+	USHORT* Domain;
+	ULONG DomainLength;
+	USHORT* Password;
+	ULONG PasswordLength;
+	ULONG Flags;
+}
+
+struct COAUTHINFO {
+	DWORD dwAuthnSvc;
+	DWORD dwAuthzSvc;
+	LPWSTR pwszServerPrincName;
+	DWORD dwAuthnLevel;
+	DWORD dwImpersonationLevel;
+	AUTH_IDENTITY* pAuthIdentityData;
+	DWORD dwCapabilities;
+}
+
+struct  COSERVERINFO {
+	DWORD dwReserved1;
+	LPWSTR pwszName;
+	COAUTHINFO* pAuthInfo;
+	DWORD dwReserved2;
+}
+
+struct BIND_OPTS {
+	DWORD cbStruct;
+	DWORD grfFlags;
+	DWORD grfMode;
+	DWORD dwTickCountDeadline;
+}
+alias BIND_OPTS* LPBIND_OPTS;
+
+struct BIND_OPTS2 {
+	DWORD cbStruct;
+	DWORD grfFlags;
+	DWORD grfMode;
+	DWORD dwTickCountDeadline;
+	DWORD dwTrackFlags;
+	DWORD dwClassContext;
+	LCID locale;
+	COSERVERINFO* pServerInfo;
+}
+alias BIND_OPTS2* LPBIND_OPTS2;
+
+enum BIND_FLAGS {
+	BIND_MAYBOTHERUSER = 1,
+	BIND_JUSTTESTEXISTENCE
+}
+
+struct STGMEDIUM {
+	DWORD tymed;
+	union {
+		HBITMAP hBitmap;
+		PVOID hMetaFilePict;
+		HENHMETAFILE hEnhMetaFile;
+		HGLOBAL hGlobal;
+		LPWSTR lpszFileName;
+		LPSTREAM pstm;
+		LPSTORAGE pstg;
+	}
+	LPUNKNOWN pUnkForRelease;
+}
+alias STGMEDIUM* LPSTGMEDIUM;
+
+enum LOCKTYPE {
+	LOCK_WRITE     = 1,
+	LOCK_EXCLUSIVE = 2,
+	LOCK_ONLYONCE  = 4
+}
+
+alias uint RPCOLEDATAREP;
+
+struct  RPCOLEMESSAGE {
+	PVOID reserved1;
+	RPCOLEDATAREP dataRepresentation;
+	PVOID Buffer;
+	ULONG cbBuffer;
+	ULONG iMethod;
+	PVOID reserved2[5];
+	ULONG rpcFlags;
+}
+alias RPCOLEMESSAGE* PRPCOLEMESSAGE;
+
+enum MKSYS {
+	MKSYS_NONE,
+	MKSYS_GENERICCOMPOSITE,
+	MKSYS_FILEMONIKER,
+	MKSYS_ANTIMONIKER,
+	MKSYS_ITEMMONIKER,
+	MKSYS_POINTERMONIKER
+}
+
+enum MKREDUCE {
+	MKRREDUCE_ALL,
+	MKRREDUCE_ONE         = 196608,
+	MKRREDUCE_TOUSER      = 131072,
+	MKRREDUCE_THROUGHUSER = 65536
+}
+
+struct RemSNB {
+	uint ulCntStr;
+	uint ulCntChar;
+	OLECHAR rgString[1];
+}
+
+enum ADVF {
+	ADVF_NODATA            = 1,
+	ADVF_PRIMEFIRST        = 2,
+	ADVF_ONLYONCE          = 4,
+	ADVFCACHE_NOHANDLER    = 8,
+	ADVFCACHE_FORCEBUILTIN = 16,
+	ADVFCACHE_ONSAVE       = 32,
+	ADVF_DATAONSTOP        = 64
+}
+
+enum TYMED {
+	TYMED_HGLOBAL  = 1,
+	TYMED_FILE     = 2,
+	TYMED_ISTREAM  = 4,
+	TYMED_ISTORAGE = 8,
+	TYMED_GDI      = 16,
+	TYMED_MFPICT   = 32,
+	TYMED_ENHMF    = 64,
+	TYMED_NULL     = 0
+}
+
+enum SERVERCALL {
+	SERVERCALL_ISHANDLED,
+	SERVERCALL_REJECTED,
+	SERVERCALL_RETRYLATER
+}
+
+struct CAUB {
+	ULONG cElems;
+	ubyte* pElems;
+}
+
+struct CAI {
+	ULONG cElems;
+	short* pElems;
+}
+
+struct CAUI {
+	ULONG cElems;
+	USHORT* pElems;
+}
+
+struct CAL {
+	ULONG cElems;
+	int* pElems;
+}
+
+struct CAUL {
+	ULONG cElems;
+	ULONG* pElems;
+}
+
+struct CAFLT {
+	ULONG cElems;
+	float* pElems;
+}
+
+struct CADBL {
+	ULONG cElems;
+	double* pElems;
+}
+
+struct CACY {
+	ULONG cElems;
+	CY* pElems;
+}
+
+struct CADATE {
+	ULONG cElems;
+	DATE* pElems;
+}
+
+struct CABSTR {
+	ULONG cElems;
+	BSTR*  pElems;
+}
+
+struct CABSTRBLOB {
+	ULONG cElems;
+	BSTRBLOB* pElems;
+}
+
+struct CABOOL {
+	ULONG cElems;
+	VARIANT_BOOL* pElems;
+}
+
+struct CASCODE {
+	ULONG cElems;
+	SCODE* pElems;
+}
+
+struct CAH {
+	ULONG cElems;
+	LARGE_INTEGER* pElems;
+}
+
+struct CAUH {
+	ULONG cElems;
+	ULARGE_INTEGER* pElems;
+}
+
+struct CALPSTR {
+	ULONG cElems;
+	LPSTR* pElems;
+}
+
+struct CALPWSTR {
+	ULONG cElems;
+	LPWSTR* pElems;
+}
+
+struct CAFILETIME {
+	ULONG cElems;
+	FILETIME* pElems;
+}
+
+struct CACLIPDATA {
+	ULONG cElems;
+	CLIPDATA* pElems;
+}
+
+struct CACLSID {
+	ULONG cElems;
+	CLSID* pElems;
+}
+alias PROPVARIANT* LPPROPVARIANT;
+
+struct CAPROPVARIANT {
+	ULONG cElems;
+	LPPROPVARIANT pElems;
+}
+
+struct PROPVARIANT {
+	VARTYPE vt;
+	WORD wReserved1;
+	WORD wReserved2;
+	WORD wReserved3;
+	union {
+		CHAR cVal;
+		UCHAR bVal;
+		short iVal;
+		USHORT uiVal;
+		VARIANT_BOOL boolVal;
+		int lVal;
+		ULONG ulVal;
+		float fltVal;
+		SCODE scode;
+		LARGE_INTEGER hVal;
+		ULARGE_INTEGER uhVal;
+		double dblVal;
+		CY cyVal;
+		DATE date;
+		FILETIME filetime;
+		CLSID* puuid;
+		BLOB blob;
+		CLIPDATA* pclipdata;
+		LPSTREAM pStream;
+		LPSTORAGE pStorage;
+		BSTR bstrVal;
+		BSTRBLOB bstrblobVal;
+		LPSTR pszVal;
+		LPWSTR pwszVal;
+		CAUB caub;
+		CAI cai;
+		CAUI caui;
+		CABOOL cabool;
+		CAL cal;
+		CAUL caul;
+		CAFLT caflt;
+		CASCODE cascode;
+		CAH cah;
+		CAUH cauh;
+		CADBL cadbl;
+		CACY cacy;
+		CADATE cadate;
+		CAFILETIME cafiletime;
+		CACLSID cauuid;
+		CACLIPDATA caclipdata;
+		CABSTR cabstr;
+		CABSTRBLOB cabstrblob;
+		CALPSTR calpstr;
+		CALPWSTR calpwstr;
+		CAPROPVARIANT capropvar;
+	}
+}
+
+struct PROPSPEC {
+	ULONG ulKind;
+	union {
+		PROPID propid;
+		LPOLESTR lpwstr;
+	}
+}
+
+struct  STATPROPSTG {
+	LPOLESTR lpwstrName;
+	PROPID propid;
+	VARTYPE vt;
+}
+
+enum PROPSETFLAG {
+	PROPSETFLAG_DEFAULT,
+	PROPSETFLAG_NONSIMPLE,
+	PROPSETFLAG_ANSI,
+	PROPSETFLAG_UNBUFFERED = 4
+}
+
+struct STORAGELAYOUT {
+	DWORD LayoutType;
+	OLECHAR* pwcsElementName;
+	LARGE_INTEGER cOffset;
+	LARGE_INTEGER cBytes;
+}
+
+struct SOLE_AUTHENTICATION_SERVICE {
+	DWORD dwAuthnSvc;
+	DWORD dwAuthzSvc;
+	OLECHAR* pPrincipalName;
+	HRESULT hr;
+}
+
+const OLECHAR* COLE_DEFAULT_PRINCIPAL = cast ( OLECHAR* )(-1);
+
+enum EOLE_AUTHENTICATION_CAPABILITIES {
+	EOAC_NONE              = 0,
+	EOAC_MUTUAL_AUTH       = 0x1,
+	EOAC_SECURE_REFS       = 0x2,
+	EOAC_ACCESS_CONTROL    = 0x4,
+	EOAC_APPID             = 0x8,
+	EOAC_DYNAMIC           = 0x10,
+	EOAC_STATIC_CLOAKING   = 0x20,
+	EOAC_DYNAMIC_CLOAKING  = 0x40,
+	EOAC_ANY_AUTHORITY     = 0x80,
+	EOAC_MAKE_FULLSIC      = 0x100,
+	EOAC_REQUIRE_FULLSIC   = 0x200,
+	EOAC_AUTO_IMPERSONATE  = 0x400,
+	EOAC_DEFAULT           = 0x800,
+	EOAC_DISABLE_AAA       = 0x1000,
+	EOAC_NO_CUSTOM_MARSHAL = 0x2000
+}
+
+struct SOLE_AUTHENTICATION_INFO {
+	DWORD dwAuthnSvc;
+	DWORD dwAuthzSvc;
+	void* pAuthInfo;
+}
+
+const void* COLE_DEFAULT_AUTHINFO = cast( void* )(-1 );
+
+struct SOLE_AUTHENTICATION_LIST {
+	DWORD cAuthInfo;
+	SOLE_AUTHENTICATION_INFO* aAuthInfo;
+}
+
+interface IEnumFORMATETC : public IUnknown {
+	  HRESULT Next(ULONG, FORMATETC*, ULONG*);
+	  HRESULT Skip(ULONG);
+	  HRESULT Reset();
+	  HRESULT Clone(IEnumFORMATETC**);
+}
+
+interface IEnumHLITEM : public IUnknown {
+	  HRESULT Next(ULONG, HLITEM*, ULONG*);
+	  HRESULT Skip(ULONG);
+	  HRESULT Reset();
+	  HRESULT Clone(IEnumHLITEM**);
+}
+
+interface IEnumSTATDATA : public IUnknown {
+	  HRESULT Next(ULONG, STATDATA*, ULONG*);
+	  HRESULT Skip(ULONG);
+	  HRESULT Reset();
+	  HRESULT Clone(IEnumSTATDATA**);
+}
+
+interface IEnumSTATPROPSETSTG : public IUnknown {
+	  HRESULT Next(ULONG, STATPROPSETSTG*, ULONG*);
+	  HRESULT Skip(ULONG);
+	  HRESULT Reset();
+	  HRESULT Clone(IEnumSTATPROPSETSTG**);
+}
+
+interface IEnumSTATPROPSTG : public IUnknown {
+	  HRESULT Next(ULONG, STATPROPSTG*, ULONG*);
+	  HRESULT Skip(ULONG);
+	  HRESULT Reset();
+	  HRESULT Clone(IEnumSTATPROPSTG**);
+}
+
+interface IEnumSTATSTG : public IUnknown {
+	  HRESULT Next(ULONG, STATSTG*, ULONG*);
+	  HRESULT Skip(ULONG);
+	  HRESULT Reset();
+	  HRESULT Clone(IEnumSTATSTG**);
+}
+
+interface IEnumString : public IUnknown {
+	  HRESULT Next(ULONG, LPOLESTR*, ULONG*);
+	  HRESULT Skip(ULONG);
+	  HRESULT Reset();
+	  HRESULT Clone(IEnumString**);
+}
+
+interface IEnumMoniker : public IUnknown {
+	  HRESULT Next(ULONG, IMoniker*, ULONG*);
+	  HRESULT Skip(ULONG);
+	  HRESULT Reset();
+	  HRESULT Clone(IEnumMoniker**);
+}
+
+
+interface IEnumUnknown : public IUnknown {
+	  HRESULT Next(ULONG, IUnknown*, ULONG*);
+	  HRESULT Skip(ULONG);
+	  HRESULT Reset();
+	  HRESULT Clone(IEnumUnknown**);
+}
+
+interface ISequentialStream : public IUnknown {
+	HRESULT Read(void*, ULONG, ULONG*);
+	HRESULT Write(void* , ULONG, ULONG*);
+}
+
+interface IStream : public ISequentialStream {
+	HRESULT Seek(LARGE_INTEGER, DWORD, ULARGE_INTEGER*);
+	HRESULT SetSize(ULARGE_INTEGER);
+	HRESULT CopyTo(IStream, ULARGE_INTEGER, ULARGE_INTEGER*, ULARGE_INTEGER*);
+	HRESULT Commit(DWORD);
+	HRESULT Revert();
+	HRESULT LockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD);
+	HRESULT UnlockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD);
+	HRESULT Stat(STATSTG*, DWORD);
+	HRESULT Clone(LPSTREAM*);
+}
+
+interface IMarshal : public IUnknown {
+	HRESULT GetUnmarshalClass(REFIID, PVOID, DWORD, PVOID, DWORD, CLSID*);
+	HRESULT GetMarshalSizeMax(REFIID, PVOID, DWORD, PVOID, PDWORD, ULONG*);
+	HRESULT MarshalInterface(IStream, REFIID, PVOID, DWORD, PVOID, DWORD);
+	HRESULT UnmarshalInterface(IStream, REFIID, void**);
+	HRESULT ReleaseMarshalData(IStream);
+	HRESULT DisconnectObject(DWORD);
+}
+
+interface IStdMarshalInfo : public IUnknown {
+	HRESULT GetClassForHandler(DWORD, PVOID, CLSID*);
+}
+
+interface IMalloc : public IUnknown {
+	void* Alloc(ULONG);
+	void* Realloc(void*, ULONG);
+	void Free(void*);
+	ULONG GetSize(void*);
+	int DidAlloc(void*);
+	void HeapMinimize();
+}
+
+interface IMallocSpy : public IUnknown {
+	ULONG PreAlloc(ULONG);
+	void* PostAlloc(void*);
+	void* PreFree(void*, BOOL);
+	void PostFree(BOOL);
+	ULONG PreRealloc(void*, ULONG, void**, BOOL);
+	void* PostRealloc(void*, BOOL);
+	void* PreGetSize(void*, BOOL);
+	ULONG PostGetSize(ULONG, BOOL);
+	void* PreDidAlloc(void*, BOOL);
+	int PostDidAlloc(void*, BOOL, int);
+	void PreHeapMinimize();
+	void PostHeapMinimize();
+}
+
+interface IMessageFilter : public IUnknown {
+	DWORD HandleInComingCall(DWORD, HTASK, DWORD, LPINTERFACEINFO);
+	DWORD RetryRejectedCall(HTASK, DWORD, DWORD);
+	DWORD MessagePending(HTASK, DWORD, DWORD);
+}
+
+
+interface IPersist : public IUnknown {
+	HRESULT GetClassID(CLSID*);
+}
+
+interface IPersistStream : public IPersist {
+	HRESULT IsDirty();
+	HRESULT Load(IStream*);
+	HRESULT Save(IStream*, BOOL);
+	HRESULT GetSizeMax(PULARGE_INTEGER);
+}
+
+interface IRunningObjectTable : public IUnknown {
+	HRESULT Register(DWORD, LPUNKNOWN, LPMONIKER, PDWORD);
+	HRESULT Revoke(DWORD);
+	HRESULT IsRunning(LPMONIKER);
+	HRESULT GetObject(LPMONIKER, LPUNKNOWN*);
+	HRESULT NoteChangeTime(DWORD, LPFILETIME);
+	HRESULT GetTimeOfLastChange(LPMONIKER, LPFILETIME);
+	HRESULT EnumRunning(IEnumMoniker**);
+}
+
+interface IBindCtx : public IUnknown {
+	HRESULT RegisterObjectBound(LPUNKNOWN);
+	HRESULT RevokeObjectBound(LPUNKNOWN);
+	HRESULT ReleaseBoundObjects();
+	HRESULT SetBindOptions(LPBIND_OPTS);
+	HRESULT GetBindOptions(LPBIND_OPTS);
+	HRESULT GetRunningObjectTable(IRunningObjectTable**);
+	HRESULT RegisterObjectParam(LPOLESTR, IUnknown*);
+	HRESULT GetObjectParam(LPOLESTR, IUnknown**);
+	HRESULT EnumObjectParam(IEnumString**);
+	HRESULT RevokeObjectParam(LPOLESTR);
+}
+
+interface IMoniker: public IPersistStream {
+	HRESULT BindToObject(IBindCtx*, IMoniker*, REFIID, PVOID*);
+	HRESULT BindToStorage(IBindCtx*, IMoniker*, REFIID, PVOID*);
+	HRESULT Reduce(IBindCtx*, DWORD, IMoniker**, IMoniker**);
+	HRESULT ComposeWith(IMoniker*, BOOL, IMoniker**);
+	HRESULT Enum(BOOL, IEnumMoniker**);
+	HRESULT IsEqual(IMoniker*);
+	HRESULT Hash(PDWORD);
+	HRESULT IsRunning(IBindCtx*, IMoniker*, IMoniker*);
+	HRESULT GetTimeOfLastChange(IBindCtx*, IMoniker*, LPFILETIME);
+	HRESULT Inverse(IMoniker**);
+	HRESULT CommonPrefixWith(IMoniker*, IMoniker**);
+	HRESULT RelativePathTo(IMoniker*, IMoniker**);
+	HRESULT GetDisplayName(IBindCtx*, IMoniker*, LPOLESTR*);
+	HRESULT ParseDisplayName(IBindCtx*, IMoniker*, LPOLESTR, ULONG*, IMoniker**);
+	HRESULT IsSystemMoniker(PDWORD);
+}
+
+interface IPersistStorage : public IPersist
+{
+	HRESULT IsDirty();
+	HRESULT InitNew(LPSTORAGE);
+	HRESULT Load(LPSTORAGE);
+	HRESULT Save(LPSTORAGE, BOOL);
+	HRESULT SaveCompleted(LPSTORAGE);
+	HRESULT HandsOffStorage();
+}
+
+interface IPersistFile : public IPersist
+{
+	HRESULT IsDirty();
+	HRESULT Load(LPCOLESTR, DWORD);
+	HRESULT Save(LPCOLESTR, BOOL);
+	HRESULT SaveCompleted(LPCOLESTR);
+	HRESULT GetCurFile(LPOLESTR*);
+}
+
+interface IAdviseSink : public IUnknown {
+	HRESULT QueryInterface(REFIID, PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	void OnDataChange(FORMATETC*, STGMEDIUM*);
+	void OnViewChange(DWORD, LONG);
+	void OnRename(IMoniker*);
+	void OnSave();
+	void OnClose();
+}
+
+interface IAdviseSink2 : public IAdviseSink
+{
+	void OnLinkSrcChange(IMoniker*);
+}
+
+interface IDataObject : public IUnknown {
+	HRESULT GetData(FORMATETC*, STGMEDIUM*);
+	HRESULT GetDataHere(FORMATETC*, STGMEDIUM*);
+	HRESULT QueryGetData(FORMATETC*);
+	HRESULT GetCanonicalFormatEtc(FORMATETC*, FORMATETC*);
+	HRESULT SetData(FORMATETC*, STGMEDIUM*, BOOL);
+	HRESULT EnumFormatEtc(DWORD, IEnumFORMATETC**);
+	HRESULT DAdvise(FORMATETC*, DWORD, IAdviseSink*, PDWORD);
+	HRESULT DUnadvise(DWORD);
+	HRESULT EnumDAdvise(IEnumSTATDATA**);
+}
+
+interface IDataAdviseHolder : public IUnknown {
+	HRESULT Advise(IDataObject*, FORMATETC*, DWORD, IAdviseSink*, PDWORD);
+	HRESULT Unadvise(DWORD);
+	HRESULT EnumAdvise(IEnumSTATDATA**);
+	HRESULT SendOnDataChange(IDataObject*, DWORD, DWORD);
+}
+
+interface IStorage : public IUnknown {
+	HRESULT CreateStream(LPCWSTR, DWORD, DWORD, DWORD, IStream*);
+	HRESULT OpenStream(LPCWSTR, PVOID, DWORD, DWORD, IStream*);
+	HRESULT CreateStorage(LPCWSTR, DWORD, DWORD, DWORD, IStorage*);
+	HRESULT OpenStorage(LPCWSTR, IStorage, DWORD, SNB, DWORD, IStorage*);
+	HRESULT CopyTo(DWORD, IID* , SNB, IStorage);
+	HRESULT MoveElementTo(LPCWSTR, IStorage, LPCWSTR, DWORD);
+	HRESULT Commit(DWORD);
+	HRESULT Revert();
+	HRESULT EnumElements(DWORD, PVOID, DWORD, IEnumSTATSTG*);
+	HRESULT DestroyElement(LPCWSTR);
+	HRESULT RenameElement(LPCWSTR, LPCWSTR);
+	HRESULT SetElementTimes(LPCWSTR, FILETIME* , FILETIME* , FILETIME* );
+	HRESULT SetClass(REFCLSID);
+	HRESULT SetStateBits(DWORD, DWORD);
+	HRESULT Stat(STATSTG*, DWORD);
+}
+
+// FIXME: GetClassID from IPersist not there - what to do about it?
+interface IRootStorage : public IPersist {
+	HRESULT QueryInterface(REFIID, PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT SwitchToFile(LPOLESTR);
+}
+
+interface IRpcChannelBuffer : public IUnknown {
+	HRESULT GetBuffer(RPCOLEMESSAGE*, REFIID);
+	HRESULT SendReceive(RPCOLEMESSAGE*, PULONG);
+	HRESULT FreeBuffer(RPCOLEMESSAGE*);
+	HRESULT GetDestCtx(PDWORD, PVOID*);
+	HRESULT IsConnected();
+}
+
+interface IRpcProxyBuffer : public IUnknown {
+	HRESULT Connect(IRpcChannelBuffer*);
+	void Disconnect();
+}
+
+interface IRpcStubBuffer : public IUnknown {
+	HRESULT Connect(LPUNKNOWN);
+	void Disconnect();
+	HRESULT Invoke(RPCOLEMESSAGE*, LPRPCSTUBBUFFER);
+	LPRPCSTUBBUFFER IsIIDSupported(REFIID);
+	ULONG CountRefs();
+	HRESULT DebugServerQueryInterface(PVOID*);
+	HRESULT DebugServerRelease(PVOID);
+}
+
+interface IPSFactoryBuffer : public IUnknown {
+	HRESULT CreateProxy(LPUNKNOWN, REFIID, LPRPCPROXYBUFFER*, PVOID*);
+	HRESULT CreateStub(REFIID, LPUNKNOWN, LPRPCSTUBBUFFER*);
+}
+alias IPSFactoryBuffer* LPPSFACTORYBUFFER;
+
+interface ILockBytes : public IUnknown {
+	HRESULT ReadAt(ULARGE_INTEGER, PVOID, ULONG, ULONG*);
+	HRESULT WriteAt(ULARGE_INTEGER, PCVOID, ULONG, ULONG*);
+	HRESULT Flush();
+	HRESULT SetSize(ULARGE_INTEGER);
+	HRESULT LockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD);
+	HRESULT UnlockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD);
+	HRESULT Stat(STATSTG*, DWORD);
+}
+
+interface IExternalConnection : public IUnknown {
+	HRESULT AddConnection(DWORD, DWORD);
+	HRESULT ReleaseConnection(DWORD, DWORD, BOOL);
+}
+
+interface IRunnableObject : public IUnknown {
+	HRESULT GetRunningClass(LPCLSID);
+	HRESULT Run(LPBC);
+	BOOL IsRunning();
+	HRESULT LockRunning(BOOL, BOOL);
+	HRESULT SetContainedObject(BOOL);
+}
+
+interface IROTData : public IUnknown {
+	HRESULT GetComparisonData(PVOID, ULONG, PULONG);
+}
+
+interface IChannelHook : public IUnknown {
+	void ClientGetSize(REFGUID, REFIID, PULONG);
+	void ClientFillBuffer(REFGUID, REFIID, PULONG, PVOID);
+	void ClientNotify(REFGUID, REFIID, ULONG, PVOID, DWORD, HRESULT);
+	void ServerNotify(REFGUID, REFIID, ULONG, PVOID, DWORD);
+	void ServerGetSize(REFGUID, REFIID, HRESULT, PULONG);
+	void ServerFillBuffer(REFGUID, REFIID, PULONG, PVOID, HRESULT);
+}
+
+interface IPropertyStorage : public IUnknown {
+	HRESULT ReadMultiple(ULONG, PROPSPEC* , PROPVARIANT*);
+	HRESULT WriteMultiple(ULONG, PROPSPEC* , PROPVARIANT*, PROPID);
+	HRESULT DeleteMultiple(ULONG, PROPSPEC* );
+	HRESULT ReadPropertyNames(ULONG, PROPID* , LPWSTR*);
+	HRESULT WritePropertyNames(ULONG, PROPID* , LPWSTR* );
+	HRESULT DeletePropertyNames(ULONG, PROPID* );
+	HRESULT SetClass(REFCLSID);
+	HRESULT Commit(DWORD);
+	HRESULT Revert();
+	HRESULT Enum(IEnumSTATPROPSTG**);
+	HRESULT Stat(STATPROPSTG*);
+	HRESULT SetTimes(FILETIME* , FILETIME* , FILETIME* );
+}
+
+interface IPropertySetStorage : public IUnknown {
+	HRESULT Create(REFFMTID, CLSID*, DWORD, DWORD, LPPROPERTYSTORAGE*);
+	HRESULT Open(REFFMTID, DWORD, LPPROPERTYSTORAGE*);
+	HRESULT Delete(REFFMTID);
+	HRESULT Enum(IEnumSTATPROPSETSTG**);
+}
+
+interface IClientSecurity : public IUnknown {
+	HRESULT QueryBlanket(PVOID, PDWORD, PDWORD, OLECHAR**, PDWORD, PDWORD, RPC_AUTH_IDENTITY_HANDLE**, PDWORD*);
+	HRESULT SetBlanket(PVOID, DWORD, DWORD, LPWSTR, DWORD, DWORD, RPC_AUTH_IDENTITY_HANDLE*, DWORD);
+	HRESULT CopyProxy(LPUNKNOWN, LPUNKNOWN*);
+}
+
+interface IServerSecurity : public IUnknown {
+	HRESULT QueryBlanket(PDWORD, PDWORD, OLECHAR**, PDWORD, PDWORD, RPC_AUTHZ_HANDLE*, PDWORD*);
+	HRESULT ImpersonateClient();
+	HRESULT RevertToSelf();
+	HRESULT IsImpersonating();
+}
+
+interface IClassActivator : public IUnknown {
+	HRESULT GetClassObject(REFCLSID, DWORD, LCID, REFIID, PVOID*);
+}
+
+interface IFillLockBytes : public IUnknown {
+	HRESULT FillAppend(void* , ULONG, PULONG);
+	HRESULT FillAt(ULARGE_INTEGER, void* , ULONG, PULONG);
+	HRESULT SetFillSize(ULARGE_INTEGER);
+	HRESULT Terminate(BOOL);
+}
+
+interface IProgressNotify : public IUnknown {
+	HRESULT OnProgress(DWORD, DWORD, BOOL, BOOL);
+}
+
+interface ILayoutStorage : public IUnknown {
+	HRESULT LayoutScript(STORAGELAYOUT*, DWORD, DWORD);
+	HRESULT BeginMonitor();
+	HRESULT EndMonitor();
+	HRESULT ReLayoutDocfile(OLECHAR*);
+}
+
+interface IGlobalInterfaceTable : public IUnknown {
+	HRESULT RegisterInterfaceInGlobal(IUnknown*, REFIID, DWORD*);
+	HRESULT RevokeInterfaceFromGlobal(DWORD);
+	HRESULT GetInterfaceFromGlobal(DWORD, REFIID, void**);
+}
+
+/+
+// These are probably unnecessary for D.
+extern (Windows) {
+HRESULT IMarshal_GetUnmarshalClass_Proxy(IMarshal*, REFIID, void*, DWORD, void*, DWORD, CLSID*);
+void IMarshal_GetUnmarshalClass_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IMarshal_GetMarshalSizeMax_Proxy(IMarshal*, REFIID, void*, DWORD, void*, DWORD, DWORD*);
+void IMarshal_GetMarshalSizeMax_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IMarshal_MarshalInterface_Proxy(IMarshal*, IStream*, REFIID, void*, DWORD, void*, DWORD);
+void IMarshal_MarshalInterface_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IMarshal_UnmarshalInterface_Proxy(IMarshal*, IStream*, REFIID, void**);
+void IMarshal_UnmarshalInterface_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IMarshal_ReleaseMarshalData_Proxy(IMarshal*, IStream*);
+void IMarshal_ReleaseMarshalData_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IMarshal_DisconnectObject_Proxy(IMarshal*, DWORD);
+void IMarshal_DisconnectObject_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void* IMalloc_Alloc_Proxy(IMalloc*, ULONG);
+void IMalloc_Alloc_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void* IMalloc_Realloc_Proxy(IMalloc*, void*, ULONG);
+void IMalloc_Realloc_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void IMalloc_Free_Proxy(IMalloc*, void*);
+void IMalloc_Free_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+ULONG IMalloc_GetSize_Proxy(IMalloc*, void*);
+void IMalloc_GetSize_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+int IMalloc_DidAlloc_Proxy(IMalloc*, void*);
+void IMalloc_DidAlloc_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void IMalloc_HeapMinimize_Proxy(IMalloc*);
+void IMalloc_HeapMinimize_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+ULONG IMallocSpy_PreAlloc_Proxy(IMallocSpy*, ULONG cbRequest);
+void IMallocSpy_PreAlloc_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void* IMallocSpy_PostAlloc_Proxy(IMallocSpy*, void*);
+void IMallocSpy_PostAlloc_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void* IMallocSpy_PreFree_Proxy(IMallocSpy*, void*, BOOL);
+void IMallocSpy_PreFree_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void IMallocSpy_PostFree_Proxy(IMallocSpy*, BOOL);
+void IMallocSpy_PostFree_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+ULONG IMallocSpy_PreRealloc_Proxy(IMallocSpy*, void*, ULONG, void**, BOOL);
+void IMallocSpy_PreRealloc_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void* IMallocSpy_PostRealloc_Proxy(IMallocSpy*, void*, BOOL);
+void IMallocSpy_PostRealloc_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void* IMallocSpy_PreGetSize_Proxy(IMallocSpy*, void*, BOOL);
+void IMallocSpy_PreGetSize_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+ULONG IMallocSpy_PostGetSize_Proxy(IMallocSpy*, ULONG, BOOL);
+void IMallocSpy_PostGetSize_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void* IMallocSpy_PreDidAlloc_Proxy(IMallocSpy*, void*, BOOL);
+void IMallocSpy_PreDidAlloc_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+int IMallocSpy_PostDidAlloc_Proxy(IMallocSpy*, void*, BOOL, int);
+void IMallocSpy_PostDidAlloc_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void IMallocSpy_PreHeapMinimize_Proxy(IMallocSpy* );
+void IMallocSpy_PreHeapMinimize_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void IMallocSpy_PostHeapMinimize_Proxy(IMallocSpy*);
+void IMallocSpy_PostHeapMinimize_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStdMarshalInfo_GetClassForHandler_Proxy(IStdMarshalInfo*, DWORD, void*, CLSID*);
+void IStdMarshalInfo_GetClassForHandler_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+DWORD IExternalConnection_AddConnection_Proxy(IExternalConnection*, DWORD, DWORD);
+void IExternalConnection_AddConnection_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+DWORD IExternalConnection_ReleaseConnection_Proxy(IExternalConnection*, DWORD, DWORD, BOOL);
+void IExternalConnection_ReleaseConnection_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumUnknown_RemoteNext_Proxy(IEnumUnknown*, ULONG, IUnknown**, ULONG*);
+void IEnumUnknown_RemoteNext_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumUnknown_Skip_Proxy(IEnumUnknown*, ULONG);
+void IEnumUnknown_Skip_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumUnknown_Reset_Proxy(IEnumUnknown* );
+void IEnumUnknown_Reset_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumUnknown_Clone_Proxy(IEnumUnknown*, IEnumUnknown**);
+void IEnumUnknown_Clone_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IBindCtx_RegisterObjectBound_Proxy(IBindCtx*, IUnknown*punk);
+void IBindCtx_RegisterObjectBound_Stub(IRpcStubBuffer*, IRpcChannelBuffer*_pRpcChannelBuffer, PRPC_MESSAGE, PDWORD);
+HRESULT IBindCtx_RevokeObjectBound_Proxy(IBindCtx*, IUnknown*punk);
+void IBindCtx_RevokeObjectBound_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IBindCtx_ReleaseBoundObjects_Proxy(IBindCtx*);
+void IBindCtx_ReleaseBoundObjects_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IBindCtx_SetBindOptions_Proxy(IBindCtx*, BIND_OPTS*);
+void IBindCtx_SetBindOptions_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IBindCtx_GetBindOptions_Proxy(IBindCtx*, BIND_OPTS*pbindopts);
+void IBindCtx_GetBindOptions_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IBindCtx_GetRunningObjectTable_Proxy(IBindCtx*, IRunningObjectTable**);
+void IBindCtx_GetRunningObjectTable_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IBindCtx_RegisterObjectParam_Proxy(IBindCtx*, LPCSTR, IUnknown*);
+void IBindCtx_RegisterObjectParam_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IBindCtx_GetObjectParam_Proxy(IBindCtx*, LPCSTR, IUnknown**);
+void IBindCtx_GetObjectParam_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IBindCtx_EnumObjectParam_Proxy(IBindCtx*, IEnumString**);
+void IBindCtx_EnumObjectParam_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IBindCtx_RevokeObjectParam_Proxy(IBindCtx*, LPCSTR);
+void IBindCtx_RevokeObjectParam_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumMoniker_RemoteNext_Proxy(IEnumMoniker*, ULONG, IMoniker**, ULONG*);
+void IEnumMoniker_RemoteNext_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumMoniker_Skip_Proxy(IEnumMoniker*, ULONG);
+void IEnumMoniker_Skip_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumMoniker_Reset_Proxy(IEnumMoniker*);
+void IEnumMoniker_Reset_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumMoniker_Clone_Proxy(IEnumMoniker*, IEnumMoniker**);
+void IEnumMoniker_Clone_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IRunnableObject_GetRunningClass_Proxy(IRunnableObject*, LPCLSID);
+void IRunnableObject_GetRunningClass_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IRunnableObject_Run_Proxy(IRunnableObject*, LPBINDCTX);
+void IRunnableObject_Run_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+BOOL IRunnableObject_IsRunning_Proxy(IRunnableObject*);
+void IRunnableObject_IsRunning_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IRunnableObject_LockRunning_Proxy(IRunnableObject*, BOOL, BOOL);
+void IRunnableObject_LockRunning_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IRunnableObject_SetContainedObject_Proxy(IRunnableObject*, BOOL);
+void IRunnableObject_SetContainedObject_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IRunningObjectTable_Register_Proxy(IRunningObjectTable*, DWORD, IUnknown*, IMoniker*, DWORD*);
+void IRunningObjectTable_Register_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IRunningObjectTable_Revoke_Proxy(IRunningObjectTable*, DWORD);
+void IRunningObjectTable_Revoke_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IRunningObjectTable_IsRunning_Proxy(IRunningObjectTable*, IMoniker*);
+void IRunningObjectTable_IsRunning_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IRunningObjectTable_GetObject_Proxy(IRunningObjectTable*, IMoniker*, IUnknown**);
+void IRunningObjectTable_GetObject_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IRunningObjectTable_NoteChangeTime_Proxy(IRunningObjectTable*, DWORD, FILETIME*);
+void IRunningObjectTable_NoteChangeTime_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IRunningObjectTable_GetTimeOfLastChange_Proxy(IRunningObjectTable*, IMoniker*, FILETIME*);
+void IRunningObjectTable_GetTimeOfLastChange_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IRunningObjectTable_EnumRunning_Proxy(IRunningObjectTable*, IEnumMoniker**);
+void IRunningObjectTable_EnumRunning_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IPersist_GetClassID_Proxy(IPersist*, CLSID*);
+void IPersist_GetClassID_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IPersistStream_IsDirty_Proxy(IPersistStream*);
+void IPersistStream_IsDirty_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IPersistStream_Load_Proxy(IPersistStream*, IStream*);
+void IPersistStream_Load_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IPersistStream_Save_Proxy(IPersistStream*, IStream*, BOOL);
+void IPersistStream_Save_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IPersistStream_GetSizeMax_Proxy(IPersistStream*, ULARGE_INTEGER*);
+void IPersistStream_GetSizeMax_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IMoniker_RemoteBindToObject_Proxy(IMoniker*, IBindCtx*, IMoniker*, REFIID, IUnknown**);
+void IMoniker_RemoteBindToObject_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IMoniker_RemoteBindToStorage_Proxy(IMoniker*, IBindCtx*, IMoniker*, REFIID, IUnknown**);
+void IMoniker_RemoteBindToStorage_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IMoniker_Reduce_Proxy(IMoniker*, IBindCtx*, DWORD, IMoniker**, IMoniker**);
+void IMoniker_Reduce_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IMoniker_ComposeWith_Proxy(IMoniker*, IMoniker*, BOOL, IMoniker**);
+void IMoniker_ComposeWith_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IMoniker_Enum_Proxy(IMoniker*, BOOL, IEnumMoniker**);
+void IMoniker_Enum_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IMoniker_IsEqual_Proxy(IMoniker*, IMoniker*);
+void IMoniker_IsEqual_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IMoniker_Hash_Proxy(IMoniker*, DWORD*);
+void IMoniker_Hash_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IMoniker_IsRunning_Proxy(IMoniker*, IBindCtx*, IMoniker*, IMoniker*);
+void IMoniker_IsRunning_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IMoniker_GetTimeOfLastChange_Proxy(IMoniker*, IBindCtx*, IMoniker*, FILETIME*);
+void IMoniker_GetTimeOfLastChange_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IMoniker_Inverse_Proxy(IMoniker*, IMoniker**);
+void IMoniker_Inverse_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IMoniker_CommonPrefixWith_Proxy(IMoniker*, IMoniker*, IMoniker**);
+void IMoniker_CommonPrefixWith_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IMoniker_RelativePathTo_Proxy(IMoniker*, IMoniker*, IMoniker**);
+void IMoniker_RelativePathTo_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IMoniker_GetDisplayName_Proxy(IMoniker*, IBindCtx*, IMoniker*, LPCSTR*);
+void IMoniker_GetDisplayName_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IMoniker_ParseDisplayName_Proxy(IMoniker*, IBindCtx*, IMoniker*, LPCSTR, ULONG*, IMoniker**);
+void IMoniker_ParseDisplayName_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IMoniker_IsSystemMoniker_Proxy(IMoniker*, DWORD*);
+void IMoniker_IsSystemMoniker_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IROTData_GetComparisonData_Proxy(IROTData*, BYTE*, ULONG cbMax, ULONG*);
+void IROTData_GetComparisonData_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumString_RemoteNext_Proxy(IEnumString*, ULONG, LPCSTR*rgelt, ULONG*);
+void IEnumString_RemoteNext_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumString_Skip_Proxy(IEnumString*, ULONG);
+void IEnumString_Skip_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumString_Reset_Proxy(IEnumString*);
+void IEnumString_Reset_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumString_Clone_Proxy(IEnumString*, IEnumString**);
+void IEnumString_Clone_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStream_RemoteRead_Proxy(IStream*, BYTE*, ULONG, ULONG*);
+void IStream_RemoteRead_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStream_RemoteWrite_Proxy(IStream*, BYTE*pv, ULONG, ULONG*);
+void IStream_RemoteWrite_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStream_RemoteSeek_Proxy(IStream*, LARGE_INTEGER, DWORD, ULARGE_INTEGER*);
+void IStream_RemoteSeek_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStream_SetSize_Proxy(IStream*, ULARGE_INTEGER);
+void IStream_SetSize_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStream_RemoteCopyTo_Proxy(IStream*, IStream*, ULARGE_INTEGER, ULARGE_INTEGER*, ULARGE_INTEGER*);
+void IStream_RemoteCopyTo_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStream_Commit_Proxy(IStream*, DWORD);
+void IStream_Commit_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStream_Revert_Proxy(IStream*);
+void IStream_Revert_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStream_LockRegion_Proxy(IStream*, ULARGE_INTEGER, ULARGE_INTEGER, DWORD);
+void IStream_LockRegion_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStream_UnlockRegion_Proxy(IStream*, ULARGE_INTEGER, ULARGE_INTEGER, DWORD);
+void IStream_UnlockRegion_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStream_Stat_Proxy(IStream*, STATSTG*, DWORD);
+void IStream_Stat_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStream_Clone_Proxy(IStream*, IStream**);
+void IStream_Clone_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumSTATSTG_RemoteNext_Proxy(IEnumSTATSTG*, ULONG, STATSTG*, ULONG*);
+void IEnumSTATSTG_RemoteNext_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumSTATSTG_Skip_Proxy(IEnumSTATSTG*, ULONG celt);
+void IEnumSTATSTG_Skip_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumSTATSTG_Reset_Proxy(IEnumSTATSTG*);
+void IEnumSTATSTG_Reset_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumSTATSTG_Clone_Proxy(IEnumSTATSTG*, IEnumSTATSTG**);
+void IEnumSTATSTG_Clone_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStorage_CreateStream_Proxy(IStorage*, OLECHAR*, DWORD, DWORD, DWORD, IStream**);
+void IStorage_CreateStream_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStorage_RemoteOpenStream_Proxy(IStorage*, OLECHAR*, uint, BYTE*, DWORD, DWORD, IStream**);
+void IStorage_RemoteOpenStream_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStorage_CreateStorage_Proxy(IStorage*, OLECHAR*, DWORD, DWORD, DWORD, IStorage**);
+void IStorage_CreateStorage_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStorage_OpenStorage_Proxy(IStorage*, OLECHAR*, IStorage*, DWORD, SNB, DWORD, IStorage**);
+void IStorage_OpenStorage_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStorage_CopyTo_Proxy(IStorage*, DWORD, IID*, SNB, IStorage*);
+void IStorage_CopyTo_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStorage_MoveElementTo_Proxy(IStorage*, OLECHAR*, IStorage*, OLECHAR*, DWORD);
+void IStorage_MoveElementTo_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStorage_Commit_Proxy(IStorage*, DWORD);
+void IStorage_Commit_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStorage_Revert_Proxy(IStorage*);
+void IStorage_Revert_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStorage_RemoteEnumElements_Proxy(IStorage*, DWORD, uint, BYTE*, DWORD, IEnumSTATSTG**);
+void IStorage_RemoteEnumElements_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStorage_DestroyElement_Proxy(IStorage*, OLECHAR*);
+void IStorage_DestroyElement_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStorage_RenameElement_Proxy(IStorage*, OLECHAR*, OLECHAR*);
+void IStorage_RenameElement_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStorage_SetElementTimes_Proxy(IStorage*, OLECHAR*, FILETIME*, FILETIME*, FILETIME*);
+void IStorage_SetElementTimes_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStorage_SetClass_Proxy(IStorage*, REFCLSID);
+void IStorage_SetClass_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStorage_SetStateBits_Proxy(IStorage*, DWORD, DWORD);
+void IStorage_SetStateBits_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IStorage_Stat_Proxy(IStorage*, STATSTG*, DWORD);
+void IStorage_Stat_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IPersistFile_IsDirty_Proxy(IPersistFile*);
+void IPersistFile_IsDirty_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IPersistFile_Load_Proxy(IPersistFile*, LPCOLESTR, DWORD);
+void IPersistFile_Load_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IPersistFile_Save_Proxy(IPersistFile*, LPCOLESTR pszFileName, BOOL);
+void IPersistFile_Save_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IPersistFile_SaveCompleted_Proxy(IPersistFile*, LPCOLESTR);
+void IPersistFile_SaveCompleted_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IPersistFile_GetCurFile_Proxy(IPersistFile*, LPCSTR*);
+void IPersistFile_GetCurFile_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IPersistStorage_IsDirty_Proxy(IPersistStorage*);
+void IPersistStorage_IsDirty_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IPersistStorage_InitNew_Proxy(IPersistStorage*, IStorage*);
+void IPersistStorage_InitNew_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IPersistStorage_Load_Proxy(IPersistStorage*, IStorage*);
+void IPersistStorage_Load_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IPersistStorage_Save_Proxy(IPersistStorage*, IStorage*, BOOL);
+void IPersistStorage_Save_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IPersistStorage_SaveCompleted_Proxy(IPersistStorage*, IStorage*);
+void IPersistStorage_SaveCompleted_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IPersistStorage_HandsOffStorage_Proxy(IPersistStorage*);
+void IPersistStorage_HandsOffStorage_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT ILockBytes_RemoteReadAt_Proxy(ILockBytes*, ULARGE_INTEGER, BYTE*, ULONG, ULONG*);
+void ILockBytes_RemoteReadAt_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT ILockBytes_RemoteWriteAt_Proxy(ILockBytes*, ULARGE_INTEGER, BYTE*pv, ULONG, ULONG*);
+void ILockBytes_RemoteWriteAt_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT ILockBytes_Flush_Proxy(ILockBytes*);
+void ILockBytes_Flush_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT ILockBytes_SetSize_Proxy(ILockBytes*, ULARGE_INTEGER);
+void ILockBytes_SetSize_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT ILockBytes_LockRegion_Proxy(ILockBytes*, ULARGE_INTEGER, ULARGE_INTEGER, DWORD);
+void ILockBytes_LockRegion_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT ILockBytes_UnlockRegion_Proxy(ILockBytes*, ULARGE_INTEGER, ULARGE_INTEGER, DWORD);
+void ILockBytes_UnlockRegion_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT ILockBytes_Stat_Proxy(ILockBytes*, STATSTG*, DWORD);
+void ILockBytes_Stat_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumFORMATETC_RemoteNext_Proxy(IEnumFORMATETC*, ULONG, FORMATETC*, ULONG*);
+void IEnumFORMATETC_RemoteNext_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumFORMATETC_Skip_Proxy(IEnumFORMATETC*, ULONG);
+void IEnumFORMATETC_Skip_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumFORMATETC_Reset_Proxy(IEnumFORMATETC*);
+void IEnumFORMATETC_Reset_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumFORMATETC_Clone_Proxy(IEnumFORMATETC*, IEnumFORMATETC**);
+void IEnumFORMATETC_Clone_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumFORMATETC_Next_Proxy(IEnumFORMATETC*, ULONG, FORMATETC*, ULONG*);
+HRESULT IEnumFORMATETC_Next_Stub(IEnumFORMATETC*, ULONG, FORMATETC*, ULONG*);
+HRESULT IEnumSTATDATA_RemoteNext_Proxy(IEnumSTATDATA*, ULONG, STATDATA*, ULONG*);
+void IEnumSTATDATA_RemoteNext_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumSTATDATA_Skip_Proxy(IEnumSTATDATA*, ULONG);
+void IEnumSTATDATA_Skip_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumSTATDATA_Reset_Proxy(IEnumSTATDATA*);
+void IEnumSTATDATA_Reset_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumSTATDATA_Clone_Proxy(IEnumSTATDATA*, IEnumSTATDATA**);
+void IEnumSTATDATA_Clone_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IEnumSTATDATA_Next_Proxy(IEnumSTATDATA*, ULONG, STATDATA*, ULONG*);
+HRESULT IEnumSTATDATA_Next_Stub(IEnumSTATDATA*, ULONG, STATDATA*, ULONG*);
+HRESULT IRootStorage_SwitchToFile_Proxy(IRootStorage*, LPCSTR);
+void IRootStorage_SwitchToFile_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void IAdviseSink_RemoteOnDataChange_Proxy(IAdviseSink*, FORMATETC*, RemSTGMEDIUM*);
+void IAdviseSink_RemoteOnDataChange_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void IAdviseSink_RemoteOnViewChange_Proxy(IAdviseSink*, DWORD, LONG);
+void IAdviseSink_RemoteOnViewChange_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void IAdviseSink_RemoteOnRename_Proxy(IAdviseSink*, IMoniker*);
+void IAdviseSink_RemoteOnRename_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void IAdviseSink_RemoteOnSave_Proxy(IAdviseSink*);
+void IAdviseSink_RemoteOnSave_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IAdviseSink_RemoteOnClose_Proxy(IAdviseSink*);
+void IAdviseSink_RemoteOnClose_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void IAdviseSink_OnDataChange_Proxy(IAdviseSink*, FORMATETC*, STGMEDIUM*);
+void IAdviseSink_OnDataChange_Stub(IAdviseSink*, FORMATETC*, RemSTGMEDIUM*);
+void IAdviseSink_OnViewChange_Proxy(IAdviseSink*, DWORD, LONG);
+void IAdviseSink_OnViewChange_Stub(IAdviseSink*, DWORD, LONG);
+void IAdviseSink_OnRename_Proxy(IAdviseSink*, IMoniker*);
+void IAdviseSink_OnRename_Stub(IAdviseSink*, IMoniker*);
+void IAdviseSink_OnSave_Proxy(IAdviseSink*);
+void IAdviseSink_OnSave_Stub(IAdviseSink*);
+void IAdviseSink_OnClose_Proxy(IAdviseSink*);
+HRESULT IAdviseSink_OnClose_Stub(IAdviseSink*);
+void IAdviseSink2_RemoteOnLinkSrcChange_Proxy(IAdviseSink2*, IMoniker*);
+void IAdviseSink2_RemoteOnLinkSrcChange_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void IAdviseSink2_OnLinkSrcChange_Proxy(IAdviseSink2*, IMoniker*);
+void IAdviseSink2_OnLinkSrcChange_Stub(IAdviseSink2*, IMoniker*);
+HRESULT IDataObject_RemoteGetData_Proxy(IDataObject*, FORMATETC*, RemSTGMEDIUM**);
+void IDataObject_RemoteGetData_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IDataObject_RemoteGetDataHere_Proxy(IDataObject*, FORMATETC*, RemSTGMEDIUM**);
+void IDataObject_RemoteGetDataHere_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IDataObject_QueryGetData_Proxy(IDataObject*, FORMATETC*);
+void IDataObject_QueryGetData_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IDataObject_GetCanonicalFormatEtc_Proxy(IDataObject*, FORMATETC*, FORMATETC*);
+void IDataObject_GetCanonicalFormatEtc_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IDataObject_RemoteSetData_Proxy(IDataObject*, FORMATETC*, RemSTGMEDIUM*, BOOL);
+void IDataObject_RemoteSetData_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IDataObject_EnumFormatEtc_Proxy(IDataObject*, DWORD, IEnumFORMATETC**);
+void IDataObject_EnumFormatEtc_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IDataObject_DAdvise_Proxy(IDataObject*, FORMATETC*, DWORD, IAdviseSink*, DWORD*);
+void IDataObject_DAdvise_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IDataObject_DUnadvise_Proxy(IDataObject*, DWORD);
+void IDataObject_DUnadvise_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IDataObject_EnumDAdvise_Proxy(IDataObject*, IEnumSTATDATA**);
+void IDataObject_EnumDAdvise_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IDataObject_GetData_Proxy(IDataObject*, FORMATETC*, STGMEDIUM*);
+HRESULT IDataObject_GetData_Stub(IDataObject*, FORMATETC*, RemSTGMEDIUM**);
+HRESULT IDataObject_GetDataHere_Proxy(IDataObject*, FORMATETC*, STGMEDIUM*);
+HRESULT IDataObject_GetDataHere_Stub(IDataObject*, FORMATETC*, RemSTGMEDIUM**);
+HRESULT IDataObject_SetData_Proxy(IDataObject*, FORMATETC*, STGMEDIUM*, BOOL);
+HRESULT IDataObject_SetData_Stub(IDataObject*, FORMATETC*, RemSTGMEDIUM*, BOOL);
+HRESULT IDataAdviseHolder_Advise_Proxy(IDataAdviseHolder*, IDataObject*, FORMATETC*, DWORD, IAdviseSink*, DWORD*);
+void IDataAdviseHolder_Advise_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IDataAdviseHolder_Unadvise_Proxy(IDataAdviseHolder*, DWORD);
+void IDataAdviseHolder_Unadvise_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IDataAdviseHolder_EnumAdvise_Proxy(IDataAdviseHolder*, IEnumSTATDATA**);
+void IDataAdviseHolder_EnumAdvise_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IDataAdviseHolder_SendOnDataChange_Proxy(IDataAdviseHolder*, IDataObject*, DWORD, DWORD);
+void IDataAdviseHolder_SendOnDataChange_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+DWORD IMessageFilter_HandleInComingCall_Proxy(IMessageFilter*, DWORD, HTASK, DWORD, LPINTERFACEINFO);
+void IMessageFilter_HandleInComingCall_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+DWORD IMessageFilter_RetryRejectedCall_Proxy(IMessageFilter*, HTASK, DWORD, DWORD);
+void IMessageFilter_RetryRejectedCall_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+DWORD IMessageFilter_MessagePending_Proxy(IMessageFilter*, HTASK, DWORD, DWORD);
+void IMessageFilter_MessagePending_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IRpcChannelBuffer_GetBuffer_Proxy(IRpcChannelBuffer*, RPCOLEMESSAGE*, REFIID);
+void IRpcChannelBuffer_GetBuffer_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IRpcChannelBuffer_SendReceive_Proxy(IRpcChannelBuffer*, RPCOLEMESSAGE*, ULONG*);
+void IRpcChannelBuffer_SendReceive_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IRpcChannelBuffer_FreeBuffer_Proxy(IRpcChannelBuffer*, RPCOLEMESSAGE*);
+void IRpcChannelBuffer_FreeBuffer_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IRpcChannelBuffer_GetDestCtx_Proxy(IRpcChannelBuffer*, DWORD*, void**);
+void IRpcChannelBuffer_GetDestCtx_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IRpcChannelBuffer_IsConnected_Proxy(IRpcChannelBuffer*);
+void IRpcChannelBuffer_IsConnected_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IRpcProxyBuffer_Connect_Proxy(IRpcProxyBuffer*, IRpcChannelBuffer*pRpcChannelBuffer);
+void IRpcProxyBuffer_Connect_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void IRpcProxyBuffer_Disconnect_Proxy(IRpcProxyBuffer*);
+void IRpcProxyBuffer_Disconnect_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IRpcStubBuffer_Connect_Proxy(IRpcStubBuffer*, IUnknown*);
+void IRpcStubBuffer_Connect_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void IRpcStubBuffer_Disconnect_Proxy(IRpcStubBuffer*);
+void IRpcStubBuffer_Disconnect_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IRpcStubBuffer_Invoke_Proxy(IRpcStubBuffer*, RPCOLEMESSAGE*, IRpcChannelBuffer*);
+void IRpcStubBuffer_Invoke_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+IRpcStubBuffer*IRpcStubBuffer_IsIIDSupported_Proxy(IRpcStubBuffer*, REFIID);
+void IRpcStubBuffer_IsIIDSupported_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+ULONG IRpcStubBuffer_CountRefs_Proxy(IRpcStubBuffer*);
+void IRpcStubBuffer_CountRefs_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IRpcStubBuffer_DebugServerQueryInterface_Proxy(IRpcStubBuffer*, void**);
+void IRpcStubBuffer_DebugServerQueryInterface_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void IRpcStubBuffer_DebugServerRelease_Proxy(IRpcStubBuffer*, void*);
+void IRpcStubBuffer_DebugServerRelease_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IPSFactoryBuffer_CreateProxy_Proxy(IPSFactoryBuffer*, IUnknown*, REFIID, IRpcProxyBuffer**, void**);
+void IPSFactoryBuffer_CreateProxy_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+HRESULT IPSFactoryBuffer_CreateStub_Proxy(IPSFactoryBuffer*, REFIID, IUnknown*, IRpcStubBuffer**);
+void IPSFactoryBuffer_CreateStub_Stub(IRpcStubBuffer*, IRpcChannelBuffer*, PRPC_MESSAGE, PDWORD);
+void SNB_to_xmit(SNB*, RemSNB**);
+void SNB_from_xmit(RemSNB*, SNB*);
+void SNB_free_inst(SNB*);
+void SNB_free_xmit(RemSNB*);
+HRESULT IEnumUnknown_Next_Proxy(IEnumUnknown*, ULONG, IUnknown**, ULONG*);
+HRESULT IEnumUnknown_Next_Stub(IEnumUnknown*, ULONG, IUnknown**, ULONG*);
+HRESULT IEnumMoniker_Next_Proxy(IEnumMoniker*, ULONG, IMoniker**, ULONG*);
+HRESULT IEnumMoniker_Next_Stub(IEnumMoniker*, ULONG, IMoniker**, ULONG*);
+HRESULT IMoniker_BindToObject_Proxy(IMoniker*, IBindCtx*, IMoniker*, REFIID, void**);
+HRESULT IMoniker_BindToObject_Stub(IMoniker*, IBindCtx*, IMoniker*, REFIID, IUnknown**);
+HRESULT IMoniker_BindToStorage_Proxy(IMoniker*, IBindCtx*, IMoniker*, REFIID, void**);
+HRESULT IMoniker_BindToStorage_Stub(IMoniker*, IBindCtx*, IMoniker*, REFIID, IUnknown**);
+HRESULT IEnumString_Next_Proxy(IEnumString*, ULONG, LPCSTR*, ULONG*);
+HRESULT IEnumString_Next_Stub(IEnumString*, ULONG, LPCSTR*, ULONG*);
+HRESULT IStream_Read_Proxy(IStream*, void*, ULONG, ULONG*);
+HRESULT IStream_Read_Stub(IStream*, BYTE*, ULONG, ULONG*);
+HRESULT IStream_Write_Proxy(IStream*, void*, ULONG, ULONG*);
+HRESULT IStream_Write_Stub(IStream*, BYTE*, ULONG, ULONG*);
+HRESULT IStream_Seek_Proxy(IStream*, LARGE_INTEGER, DWORD, ULARGE_INTEGER*);
+HRESULT IStream_Seek_Stub(IStream*, LARGE_INTEGER, DWORD, ULARGE_INTEGER*);
+HRESULT IStream_CopyTo_Proxy(IStream*, IStream*, ULARGE_INTEGER, ULARGE_INTEGER*, ULARGE_INTEGER*);
+HRESULT IStream_CopyTo_Stub(IStream*, IStream*, ULARGE_INTEGER, ULARGE_INTEGER*, ULARGE_INTEGER*);
+HRESULT IEnumSTATSTG_Next_Proxy(IEnumSTATSTG*, ULONG, STATSTG*, ULONG*);
+HRESULT IEnumSTATSTG_Next_Stub(IEnumSTATSTG*, ULONG, STATSTG*, ULONG*);
+HRESULT IStorage_OpenStream_Proxy(IStorage*, OLECHAR*, void*, DWORD, DWORD, IStream**);
+HRESULT IStorage_OpenStream_Stub(IStorage*, OLECHAR*, uint, BYTE*, DWORD, DWORD, IStream** );
+HRESULT IStorage_EnumElements_Proxy(IStorage*, DWORD, void*, DWORD, IEnumSTATSTG**);
+HRESULT IStorage_EnumElements_Stub(IStorage*, DWORD, uint, BYTE*, DWORD, IEnumSTATSTG**);
+HRESULT ILockBytes_ReadAt_Proxy(ILockBytes*, ULARGE_INTEGER, void*, ULONG, ULONG*);
+HRESULT ILockBytes_ReadAt_Stub(ILockBytes*, ULARGE_INTEGER, BYTE*, ULONG, ULONG*);
+HRESULT ILockBytes_WriteAt_Proxy(ILockBytes*, ULARGE_INTEGER, void*, ULONG, ULONG*);
+HRESULT ILockBytes_WriteAt_Stub(ILockBytes*, ULARGE_INTEGER, BYTE*, ULONG, ULONG*);
+}
++/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/objsafe.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,23 @@
+/***********************************************************************\
+*                               objsafe.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.objsafe;
+
+private import win32.basetyps, win32.unknwn, win32.windef;
+
+enum {
+	INTERFACESAFE_FOR_UNTRUSTED_CALLER = 1,
+	INTERFACESAFE_FOR_UNTRUSTED_DATA
+}
+
+interface IObjectSafety : IUnknown {
+	HRESULT GetInterfaceSafetyOptions(REFIID, DWORD*, DWORD*);
+	HRESULT SetInterfaceSafetyOptions(REFIID, DWORD, DWORD);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/ocidl.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,471 @@
+/***********************************************************************\
+*                                ocidl.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                 Part of the Internet Development SDK                  *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.ocidl;
+
+private import win32.ole2, win32.oleidl, win32.oaidl, win32.objfwd,
+  win32.windef, win32.wtypes;
+private import win32.objidl;  // for CLIPFORMAT
+private import win32.wingdi;  // for TEXTMETRICW
+private import win32.winuser; // for LPMSG
+
+interface IBindHost : public IUnknown {}
+
+interface IServiceProvider : IUnknown{
+	HRESULT QueryService(REFGUID,REFIID,void**);
+}
+
+/*
+// TODO:
+//private import win32.servprov; // for IServiceProvider
+// private import win32.urlmon; // for IBindHost. This is not included in MinGW.
+
+// win32.urlmon should contain:
+interface IBindHost : public IUnknown
+{
+	HRESULT CreateMoniker(LPOLESTR szName, IBindCtx* pBC, IMoniker** ppmk, DWORD);
+	HRESULT MonikerBindToObject(IMoniker* pMk, IBindCtx* pBC, IBindStatusCallback* pBSC, REFIID, void** );
+	HRESULT MonikerBindToStorage(IMoniker* pMk, IBindCtx* pBC, IBindStatusCallback* pBSC, REFIID, void** );
+}
+*/
+
+
+
+
+//[Yes] #ifndef OLE2ANSI
+alias TEXTMETRICW TEXTMETRICOLE;
+//} else {
+//alias TEXTMETRIC TEXTMETRICOLE;
+//}
+alias TEXTMETRICOLE* LPTEXTMETRICOLE;
+
+alias DWORD OLE_COLOR;
+alias UINT OLE_HANDLE;
+alias int OLE_XPOS_HIMETRIC;
+alias int OLE_YPOS_HIMETRIC;
+alias int OLE_XSIZE_HIMETRIC;
+alias int OLE_YSIZE_HIMETRIC;
+
+enum READYSTATE {
+	READYSTATE_UNINITIALIZED = 0,
+	READYSTATE_LOADING = 1,
+	READYSTATE_LOADED = 2,
+	READYSTATE_INTERACTIVE = 3,
+	READYSTATE_COMPLETE = 4
+}
+
+enum PROPBAG2_TYPE {
+	PROPBAG2_TYPE_UNDEFINED,
+	PROPBAG2_TYPE_DATA,
+	PROPBAG2_TYPE_URL,
+	PROPBAG2_TYPE_OBJECT,
+	PROPBAG2_TYPE_STREAM,
+	PROPBAG2_TYPE_STORAGE,
+	PROPBAG2_TYPE_MONIKER // = 6
+}
+
+struct PROPBAG2 {
+	DWORD dwType;
+	VARTYPE vt;
+	CLIPFORMAT cfType;
+	DWORD dwHint;
+	LPOLESTR pstrName;
+	CLSID clsid;
+}
+
+enum QACONTAINERFLAGS {
+	QACONTAINER_SHOWHATCHING = 1,
+	QACONTAINER_SHOWGRABHANDLES = 2,
+	QACONTAINER_USERMODE = 4,
+	QACONTAINER_DISPLAYASDEFAULT = 8,
+	QACONTAINER_UIDEAD = 16,
+	QACONTAINER_AUTOCLIP = 32,
+	QACONTAINER_MESSAGEREFLECT = 64,
+	QACONTAINER_SUPPORTSMNEMONICS = 128
+}
+
+struct QACONTAINER {
+	ULONG cbSize = this.sizeof;
+	IOleClientSite* pClientSite;
+	IAdviseSinkEx* pAdviseSink;
+	IPropertyNotifySink* pPropertyNotifySink;
+	IUnknown* pUnkEventSink;
+	DWORD dwAmbientFlags;
+	OLE_COLOR colorFore;
+	OLE_COLOR colorBack;
+	IFont* pFont;
+	IOleUndoManager* pUndoMgr;
+	DWORD dwAppearance;
+	LONG lcid;
+	HPALETTE hpal;
+	IBindHost* pBindHost;
+	IOleControlSite* pOleControlSite;
+	IServiceProvider* pServiceProvider;
+}
+
+struct QACONTROL {
+	ULONG cbSize = this.sizeof;
+	DWORD dwMiscStatus;
+	DWORD dwViewStatus;
+	DWORD dwEventCookie;
+	DWORD dwPropNotifyCookie;
+	DWORD dwPointerActivationPolicy;
+}
+
+struct POINTF {
+	float x;
+	float y;
+}
+alias POINTF* LPPOINTF;
+
+struct CONTROLINFO {
+	ULONG cb;
+	HACCEL hAccel;
+	USHORT cAccel;
+	DWORD dwFlags;
+}
+alias CONTROLINFO* LPCONTROLINFO;
+
+struct CONNECTDATA {
+	LPUNKNOWN pUnk;
+	DWORD dwCookie;
+}
+alias CONNECTDATA* LPCONNECTDATA;
+
+struct LICINFO {
+	int cbLicInfo;
+	BOOL fRuntimeKeyAvail;
+	BOOL fLicVerified;
+}
+alias LICINFO* LPLICINFO;
+
+struct CAUUID {
+	ULONG cElems;
+	GUID* pElems;
+}
+alias CAUUID* LPCAUUID;
+
+struct CALPOLESTR {
+	ULONG cElems;
+	LPOLESTR* pElems;
+}
+alias CALPOLESTR* LPCALPOLESTR;
+
+struct CADWORD {
+	ULONG cElems;
+	DWORD* pElems;
+}
+alias CADWORD* LPCADWORD;
+
+struct PROPPAGEINFO {
+	ULONG cb;
+	LPOLESTR pszTitle;
+	SIZE size;
+	LPOLESTR pszDocString;
+	LPOLESTR pszHelpFile;
+	DWORD dwHelpContext;
+}
+alias PROPPAGEINFO* LPPROPPAGEINFO;
+
+interface IOleControl : public IUnknown {
+	HRESULT GetControlInfo(LPCONTROLINFO);
+	HRESULT OnMnemonic(LPMSG);
+	HRESULT OnAmbientPropertyChange(DISPID);
+	HRESULT FreezeEvents(BOOL);
+}
+
+interface IOleControlSite : public IUnknown {
+	HRESULT OnControlInfoChanged();
+	HRESULT LockInPlaceActive(BOOL);
+	HRESULT GetExtendedControl(LPDISPATCH*);
+	HRESULT TransformCoords(POINTL*, POINTF*, DWORD);
+	HRESULT TranslateAccelerator(LPMSG, DWORD);
+	HRESULT OnFocus(BOOL);
+	HRESULT ShowPropertyFrame();
+}
+
+interface ISimpleFrameSite : public IUnknown {
+	HRESULT PreMessageFilter(HWND, UINT, WPARAM, LPARAM, LRESULT*, PDWORD);
+	HRESULT PostMessageFilter(HWND, UINT, WPARAM, LPARAM, LRESULT*, DWORD);
+}
+
+interface IErrorLog : public IUnknown {
+	HRESULT AddError(LPCOLESTR, LPEXCEPINFO);
+}
+alias IErrorLog LPERRORLOG;
+
+interface IPropertyBag : public IUnknown {
+	HRESULT Read(LPCOLESTR, LPVARIANT, LPERRORLOG);
+	HRESULT Write(LPCOLESTR, LPVARIANT);
+}
+alias IPropertyBag LPPROPERTYBAG;
+
+interface IPropertyBag2 : public IUnknown {
+	HRESULT Read(ULONG, PROPBAG2*, LPERRORLOG, VARIANT*, HRESULT*);
+	HRESULT Write(ULONG, PROPBAG2*, VARIANT*);
+	HRESULT CountProperties(ULONG*);
+	HRESULT GetPropertyInfo(ULONG, ULONG, PROPBAG2*, ULONG*);
+	HRESULT LoadObject(LPCOLESTR, DWORD, IUnknown*, LPERRORLOG);
+}
+alias IPropertyBag2 LPPROPERTYBAG2;
+
+interface IPersistPropertyBag : public IPersist {
+	HRESULT InitNew();
+	HRESULT Load(LPPROPERTYBAG, LPERRORLOG);
+	HRESULT Save(LPPROPERTYBAG, BOOL, BOOL);
+}
+
+interface IPersistPropertyBag2 : public IPersist {
+	HRESULT InitNew();
+	HRESULT Load(LPPROPERTYBAG2, LPERRORLOG);
+	HRESULT Save(LPPROPERTYBAG2, BOOL, BOOL);
+	HRESULT IsDirty();
+}
+
+interface IPersistStreamInit : public IPersist {
+	HRESULT IsDirty();
+	HRESULT Load(LPSTREAM);
+	HRESULT Save(LPSTREAM, BOOL);
+	HRESULT GetSizeMax(PULARGE_INTEGER);
+	HRESULT InitNew();
+}
+
+interface IPersistMemory : public IPersist {
+	HRESULT IsDirty();
+	HRESULT Load(PVOID, ULONG);
+	HRESULT Save(PVOID, BOOL, ULONG);
+	HRESULT GetSizeMax(PULONG);
+	HRESULT InitNew();
+}
+
+interface IPropertyNotifySink : public IUnknown {
+	HRESULT OnChanged(DISPID);
+	HRESULT OnRequestEdit(DISPID);
+}
+
+interface IProvideClassInfo : public IUnknown {
+	HRESULT GetClassInfo(LPTYPEINFO*);
+}
+
+interface IProvideClassInfo2 : public IProvideClassInfo {
+	HRESULT GetGUID(DWORD, GUID*);
+}
+
+interface IConnectionPointContainer : public IUnknown {
+	HRESULT EnumConnectionPoints(LPENUMCONNECTIONPOINTS*);
+	HRESULT FindConnectionPoint(REFIID, LPCONNECTIONPOINT*);
+}
+
+interface IEnumConnectionPoints : public IUnknown {
+	HRESULT Next(ULONG, LPCONNECTIONPOINT*, ULONG*);
+	HRESULT Skip(ULONG);
+	HRESULT Reset();
+	HRESULT Clone(LPENUMCONNECTIONPOINTS*);
+}
+alias IEnumConnectionPoints LPENUMCONNECTIONPOINTS;
+
+interface IConnectionPoint : public IUnknown {
+	HRESULT GetConnectionInterface(IID*);
+	HRESULT GetConnectionPointContainer(IConnectionPointContainer**);
+	HRESULT Advise(LPUNKNOWN, PDWORD);
+	HRESULT Unadvise(DWORD);
+	HRESULT EnumConnections(LPENUMCONNECTIONS*);
+}
+alias IConnectionPoint LPCONNECTIONPOINT;
+
+interface IEnumConnections : public IUnknown {
+	HRESULT Next(ULONG, LPCONNECTDATA, PULONG);
+	HRESULT Skip(ULONG);
+	HRESULT Reset();
+	HRESULT Clone(LPENUMCONNECTIONS*);
+}
+alias IEnumConnections LPENUMCONNECTIONS;
+
+interface IClassFactory2 : public IClassFactory {
+	HRESULT GetLicInfo(LPLICINFO);
+	HRESULT RequestLicKey(DWORD, BSTR*);
+	HRESULT CreateInstanceLic(LPUNKNOWN, LPUNKNOWN, REFIID, BSTR, PVOID*);
+}
+
+interface ISpecifyPropertyPages : public IUnknown {
+	HRESULT GetPages(CAUUID*);
+}
+
+interface IPerPropertyBrowsing : public IUnknown {
+	HRESULT GetDisplayString(DISPID, BSTR*);
+	HRESULT MapPropertyToPage(DISPID, LPCLSID);
+	HRESULT GetPredefinedStrings(DISPID, CALPOLESTR*, CADWORD*);
+	HRESULT GetPredefinedValue(DISPID, DWORD, VARIANT*);
+}
+
+interface IPropertyPageSite : public IUnknown {
+	HRESULT OnStatusChange(DWORD);
+	HRESULT GetLocaleID(LCID*);
+	HRESULT GetPageContainer(LPUNKNOWN*);
+	HRESULT TranslateAccelerator(LPMSG);
+}
+alias IPropertyPageSite LPPROPERTYPAGESITE;
+
+interface IPropertyPage : public IUnknown {
+	HRESULT SetPageSite(LPPROPERTYPAGESITE);
+	HRESULT Activate(HWND, LPCRECT, BOOL);
+	HRESULT Deactivate();
+	HRESULT GetPageInfo(LPPROPPAGEINFO);
+	HRESULT SetObjects(ULONG, LPUNKNOWN*);
+	HRESULT Show(UINT);
+	HRESULT Move(LPCRECT);
+	HRESULT IsPageDirty();
+	HRESULT Apply();
+	HRESULT Help(LPCOLESTR);
+	HRESULT TranslateAccelerator(LPMSG);
+}
+
+
+interface IPropertyPage2 : public IPropertyPage
+{ HRESULT EditProperty(DISPID);
+}
+
+interface IFont : public IUnknown {
+	HRESULT get_Name(BSTR*);
+	HRESULT put_Name(BSTR);
+	HRESULT get_Size(CY*);
+	HRESULT put_Size(CY);
+	HRESULT get_Bold(BOOL*);
+	HRESULT put_Bold(BOOL);
+	HRESULT get_Italic(BOOL*);
+	HRESULT put_Italic(BOOL);
+	HRESULT get_Underline(BOOL*);
+	HRESULT put_Underline(BOOL);
+	HRESULT get_Strikethrough(BOOL*);
+	HRESULT put_Strikethrough(BOOL);
+	HRESULT get_Weight(short*);
+	HRESULT put_Weight(short);
+	HRESULT get_Charset(short*);
+	HRESULT put_Charset(short);
+	HRESULT get_hFont(HFONT*);
+	HRESULT Clone(IFont**);
+	HRESULT IsEqual(IFont*);
+	HRESULT SetRatio(int, int);
+	HRESULT QueryTextMetrics(LPTEXTMETRICOLE);
+	HRESULT AddRefHfont(HFONT);
+	HRESULT ReleaseHfont(HFONT);
+	HRESULT SetHdc(HDC);
+}
+alias IFont LPFONT;
+
+interface IFontDisp : public IDispatch {
+}
+alias IFontDisp LPFONTDISP;
+
+interface IPicture : public IUnknown {
+	HRESULT get_Handle(OLE_HANDLE*);
+	HRESULT get_hPal(OLE_HANDLE*);
+	HRESULT get_Type(short*);
+	HRESULT get_Width(OLE_XSIZE_HIMETRIC*);
+	HRESULT get_Height(OLE_YSIZE_HIMETRIC*);
+	HRESULT Render(HDC, int, int, int, int, OLE_XPOS_HIMETRIC,
+	  OLE_YPOS_HIMETRIC, OLE_XSIZE_HIMETRIC, OLE_YSIZE_HIMETRIC, LPCRECT);
+	HRESULT set_hPal(OLE_HANDLE);
+	HRESULT get_CurDC(HDC*);
+	HRESULT SelectPicture(HDC, HDC*, OLE_HANDLE*);
+	HRESULT get_KeepOriginalFormat(BOOL*);
+	HRESULT put_KeepOriginalFormat(BOOL);
+	HRESULT PictureChanged();
+	HRESULT SaveAsFile(LPSTREAM, BOOL, LONG*);
+	HRESULT get_Attributes(PDWORD);
+}
+
+interface IPictureDisp : public IDispatch {
+}
+
+interface IOleInPlaceSiteEx : public IOleInPlaceSite {
+	HRESULT OnInPlaceActivateEx(BOOL*, DWORD);
+	HRESULT OnInPlaceDeactivateEx(BOOL);
+	HRESULT RequestUIActivate();
+}
+
+interface IObjectWithSite : public IUnknown {
+	HRESULT SetSite(IUnknown*);
+	HRESULT GetSite(REFIID, void**);
+}
+
+interface IOleInPlaceSiteWindowless : public IOleInPlaceSiteEx {
+	HRESULT CanWindowlessActivate();
+	HRESULT GetCapture();
+	HRESULT SetCapture(BOOL);
+	HRESULT GetFocus();
+	HRESULT SetFocus(BOOL);
+	HRESULT GetDC(LPCRECT, DWORD, HDC*);
+	HRESULT ReleaseDC(HDC);
+	HRESULT InvalidateRect(LPCRECT, BOOL);
+	HRESULT InvalidateRgn(HRGN, BOOL);
+	HRESULT ScrollRect(INT, INT, LPCRECT, LPCRECT);
+	HRESULT AdjustRect(LPCRECT);
+	HRESULT OnDefWindowMessage(UINT, WPARAM, LPARAM, LRESULT*);
+}
+
+interface IAdviseSinkEx : public IUnknown {
+	void OnDataChange(FORMATETC*, STGMEDIUM*);
+	void OnViewChange(DWORD, LONG);
+	void OnRename(IMoniker*);
+	void OnSave();
+	void OnClose();
+	HRESULT OnViewStatusChange(DWORD);
+}
+
+interface IPointerInactive : public IUnknown {
+	HRESULT GetActivationPolicy(DWORD*);
+	HRESULT OnInactiveMouseMove(LPCRECT, LONG, LONG, DWORD);
+	HRESULT OnInactiveSetCursor(LPCRECT, LONG, LONG, DWORD, BOOL);
+}
+
+interface IOleUndoUnit : public IUnknown {
+	HRESULT Do(LPOLEUNDOMANAGER);
+	HRESULT GetDescription(BSTR*);
+	HRESULT GetUnitType(CLSID*, LONG*);
+	HRESULT OnNextAdd();
+}
+
+interface IOleParentUndoUnit : public IOleUndoUnit {
+	HRESULT Open(IOleParentUndoUnit*);
+	HRESULT Close(IOleParentUndoUnit*, BOOL);
+	HRESULT Add(IOleUndoUnit*);
+	HRESULT FindUnit(IOleUndoUnit*);
+	HRESULT GetParentState(DWORD*);
+}
+
+interface IEnumOleUndoUnits : public IUnknown {
+	HRESULT Next(ULONG, IOleUndoUnit**, ULONG*);
+	HRESULT Skip(ULONG);
+	HRESULT Reset();
+	HRESULT Clone(IEnumOleUndoUnits**);
+}
+
+interface IOleUndoManager : public IUnknown {
+	HRESULT Open(IOleParentUndoUnit*);
+	HRESULT Close(IOleParentUndoUnit*, BOOL);
+	HRESULT Add(IOleUndoUnit*);
+	HRESULT GetOpenParentState(DWORD*);
+	HRESULT DiscardFrom(IOleUndoUnit*);
+	HRESULT UndoTo(IOleUndoUnit*);
+	HRESULT RedoTo(IOleUndoUnit*);
+	HRESULT EnumUndoable(IEnumOleUndoUnits**);
+	HRESULT EnumRedoable(IEnumOleUndoUnits**);
+	HRESULT GetLastUndoDescription(BSTR*);
+	HRESULT GetLastRedoDescription(BSTR*);
+	HRESULT Enable(BOOL);
+}
+alias IOleUndoManager LPOLEUNDOMANAGER;
+
+interface IQuickActivate : public IUnknown {
+	HRESULT QuickActivate(QACONTAINER*, QACONTROL*);
+	HRESULT SetContentExtent(LPSIZEL);
+	HRESULT GetContentExtent(LPSIZEL);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/odbcinst.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,166 @@
+/***********************************************************************\
+*                               odbcinst.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.odbcinst;
+
+import win32.sql;
+private import win32.windef;
+
+/*	FIXME: The Unicode/Ansi functions situation is a mess. How do the xxxA
+ *	versions of these functions fit into the scheme?
+ */
+
+// SQLConfigDataSource()
+enum : WORD {
+	ODBC_ADD_DSN            = 1,
+	ODBC_CONFIG_DSN         = 2,
+	ODBC_REMOVE_DSN         = 3,
+	ODBC_ADD_SYS_DSN        = 4,
+	ODBC_CONFIG_SYS_DSN     = 5,
+	ODBC_REMOVE_SYS_DSN     = 6,
+	ODBC_REMOVE_DEFAULT_DSN = 7
+}
+
+// ODBC 3.0+
+enum : WORD {
+	ODBC_INSTALL_INQUIRY  = 1,
+	ODBC_INSTALL_COMPLETE = 2
+}
+
+// ODBC 2.5+
+enum : WORD {
+	ODBC_INSTALL_DRIVER    = 1,
+	ODBC_REMOVE_DRIVER     = 2,
+	ODBC_CONFIG_DRIVER     = 3,
+	ODBC_CONFIG_DRIVER_MAX = 100
+}
+
+// ODBC 3.0+
+// SQLSetConfigMode()
+enum : UWORD {
+	ODBC_BOTH_DSN   = 0,
+	ODBC_USER_DSN   = 1,
+	ODBC_SYSTEM_DSN = 2
+}
+
+enum : DWORD {
+	ODBC_ERROR_GENERAL_ERR             = 1,
+	ODBC_ERROR_INVALID_BUFF_LEN        = 2,
+	ODBC_ERROR_INVALID_HWND            = 3,
+	ODBC_ERROR_INVALID_STR             = 4,
+	ODBC_ERROR_INVALID_REQUEST_TYPE    = 5,
+	ODBC_ERROR_COMPONENT_NOT_FOUND     = 6,
+	ODBC_ERROR_INVALID_NAME            = 7,
+	ODBC_ERROR_INVALID_KEYWORD_VALUE   = 8,
+	ODBC_ERROR_INVALID_DSN             = 9,
+	ODBC_ERROR_INVALID_INF             = 10,
+	ODBC_ERROR_REQUEST_FAILED          = 11,
+	ODBC_ERROR_INVALID_PATH            = 12,
+	ODBC_ERROR_LOAD_LIB_FAILED         = 13,
+	ODBC_ERROR_INVALID_PARAM_SEQUENCE  = 14,
+	ODBC_ERROR_INVALID_LOG_FILE        = 15,
+	ODBC_ERROR_USER_CANCELED           = 16,
+	ODBC_ERROR_USAGE_UPDATE_FAILED     = 17,
+	ODBC_ERROR_CREATE_DSN_FAILED       = 18,
+	ODBC_ERROR_WRITING_SYSINFO_FAILED  = 19,
+	ODBC_ERROR_REMOVE_DSN_FAILED       = 20,
+	ODBC_ERROR_OUT_OF_MEM              = 21,
+	ODBC_ERROR_OUTPUT_STRING_TRUNCATED = 22
+}
+
+extern (Windows):
+BOOL  ConfigDSN(HWND,WORD,LPCSTR,LPCSTR);
+BOOL  ConfigDSNW(HWND,WORD,LPCWSTR,LPCWSTR);
+BOOL  ConfigTranslator(HWND,DWORD*);
+BOOL  SQLConfigDataSource(HWND,WORD,LPCSTR,LPCSTR);
+BOOL  SQLConfigDataSourceW(HWND,WORD,LPCWSTR,LPCWSTR);
+BOOL  SQLCreateDataSource(HWND,LPCSTR);
+BOOL  SQLCreateDataSourceW(HWND,LPCWSTR);
+BOOL  SQLGetAvailableDrivers(LPCSTR,LPSTR,WORD,WORD*);
+BOOL  SQLGetAvailableDriversW(LPCWSTR,LPWSTR,WORD,WORD*);
+BOOL  SQLGetInstalledDrivers(LPSTR,WORD,WORD*);
+BOOL  SQLGetInstalledDriversW(LPWSTR,WORD,WORD*);
+int  SQLGetPrivateProfileString(LPCSTR,LPCSTR,LPCSTR,LPSTR,int,LPCSTR);
+int  SQLGetPrivateProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,int,LPCWSTR);
+BOOL  SQLGetTranslator(HWND,LPSTR,WORD,WORD*,LPSTR,WORD,WORD*,DWORD*);
+BOOL  SQLGetTranslatorW(HWND,LPWSTR,WORD,WORD*,LPWSTR,WORD,WORD*,DWORD*);
+BOOL  SQLInstallDriver(LPCSTR,LPCSTR,LPSTR,WORD,WORD*);
+BOOL  SQLInstallDriverManager(LPSTR,WORD,WORD*);
+BOOL  SQLInstallDriverManagerW(LPWSTR,WORD,WORD*);
+BOOL  SQLInstallDriverW(LPCWSTR,LPCWSTR,LPWSTR,WORD,WORD*);
+BOOL  SQLInstallODBC(HWND,LPCSTR,LPCSTR,LPCSTR);
+BOOL  SQLInstallODBCW(HWND,LPCWSTR,LPCWSTR,LPCWSTR);
+BOOL  SQLManageDataSources(HWND);
+BOOL  SQLRemoveDefaultDataSource();
+BOOL  SQLRemoveDSNFromIni(LPCSTR);
+BOOL  SQLRemoveDSNFromIniW(LPCWSTR);
+BOOL  SQLValidDSN(LPCSTR);
+BOOL  SQLValidDSNW(LPCWSTR);
+BOOL  SQLWriteDSNToIni(LPCSTR,LPCSTR);
+BOOL  SQLWriteDSNToIniW(LPCWSTR,LPCWSTR);
+BOOL  SQLWritePrivateProfileString(LPCSTR,LPCSTR,LPCSTR,LPCSTR);
+BOOL  SQLWritePrivateProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR);
+
+static if (ODBCVER >= 0x0250) {
+	BOOL  ConfigDriver(HWND,WORD,LPCSTR,LPCSTR,LPSTR,WORD,WORD*);
+	BOOL  ConfigDriverW(HWND,WORD,LPCWSTR,LPCWSTR,LPWSTR,WORD,WORD*);
+	BOOL  SQLConfigDriver(HWND,WORD,LPCSTR,LPCSTR,LPSTR,WORD,WORD*);
+	BOOL  SQLConfigDriverW(HWND,WORD,LPCWSTR,LPCWSTR,LPWSTR,WORD,WORD*);
+	deprecated {
+		BOOL  SQLInstallTranslator(LPCSTR,LPCSTR,LPCSTR,LPSTR,WORD,WORD*,WORD,LPDWORD);
+		BOOL  SQLInstallTranslatorW(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,WORD,WORD*,WORD,LPDWORD);
+	}
+	BOOL  SQLRemoveDriver(LPCSTR,BOOL,LPDWORD);
+	BOOL  SQLRemoveDriverManager(LPDWORD);
+	BOOL  SQLRemoveDriverW(LPCWSTR,BOOL,LPDWORD);
+	BOOL  SQLRemoveTranslator(LPCSTR,LPDWORD);
+	BOOL  SQLRemoveTranslatorW(LPCWSTR,LPDWORD);
+}
+static if (ODBCVER >= 0x0300) {
+	BOOL  SQLGetConfigMode(UWORD*);
+	BOOL  SQLInstallDriverEx(LPCSTR,LPCSTR,LPSTR,WORD,WORD*,WORD,LPDWORD);
+	BOOL  SQLInstallDriverExW(LPCWSTR,LPCWSTR,LPWSTR,WORD,WORD*,WORD,LPDWORD);
+	SQLRETURN  SQLInstallerError(WORD,DWORD*,LPSTR,WORD,WORD*);
+	SQLRETURN  SQLInstallerErrorW(WORD,DWORD*,LPWSTR,WORD,WORD*);
+	BOOL  SQLInstallTranslatorEx(LPCSTR,LPCSTR,LPSTR,WORD,WORD*,WORD,LPDWORD);
+	BOOL  SQLInstallTranslatorExW(LPCWSTR,LPCWSTR,LPWSTR,WORD,WORD*,WORD,LPDWORD);
+	SQLRETURN  SQLPostInstallerError(DWORD,LPCSTR);
+	SQLRETURN  SQLPostInstallerErrorW(DWORD,LPCWSTR);
+	BOOL  SQLReadFileDSN(LPCSTR,LPCSTR,LPCSTR,LPSTR,WORD,WORD*);
+	BOOL  SQLReadFileDSNW(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,WORD,WORD*);
+	BOOL  SQLSetConfigMode(UWORD);
+	BOOL  SQLWriteFileDSN(LPCSTR,LPCSTR,LPCSTR,LPCSTR);
+	BOOL  SQLWriteFileDSNW(LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR);
+}
+
+version (Unicode) {
+	alias SQLConfigDataSourceW SQLConfigDataSource;
+	alias SQLConfigDriverW SQLConfigDriver;
+	alias SQLCreateDataSourceW SQLCreateDataSource;
+	alias SQLGetAvailableDriversW SQLGetAvailableDrivers;
+	alias SQLGetInstalledDriversW SQLGetInstalledDrivers;
+	alias SQLGetPrivateProfileStringW SQLGetPrivateProfileString;
+	alias SQLGetTranslatorW SQLGetTranslator;
+	alias SQLInstallDriverW SQLInstallDriver;
+	alias SQLInstallDriverExW SQLInstallDriverEx;
+	alias SQLInstallDriverManagerW SQLInstallDriverManager;
+	alias SQLInstallerErrorW SQLInstallerError;
+	alias SQLInstallODBCW SQLInstallODBC;
+	deprecated alias SQLInstallTranslatorW SQLInstallTranslator;
+	alias SQLInstallTranslatorExW SQLInstallTranslatorEx;
+	alias SQLPostInstallerErrorW SQLPostInstallerError;
+	alias SQLReadFileDSNW SQLReadFileDSN;
+	alias SQLRemoveDriverW SQLRemoveDriver;
+	alias SQLRemoveDSNFromIniW SQLRemoveDSNFromIni;
+	alias SQLRemoveTranslatorW SQLRemoveTranslator;
+	alias SQLValidDSNW SQLValidDSN;
+	alias SQLWriteDSNToIniW SQLWriteDSNToIni;
+	alias SQLWriteFileDSNW SQLWriteFileDSN;
+	alias SQLWritePrivateProfileStringW SQLWritePrivateProfileString;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/ole.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,362 @@
+/***********************************************************************\
+*                                 ole.d                                 *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.ole;
+
+private import win32.windef, win32.wingdi, win32.uuid;
+
+alias LPCSTR OLE_LPCSTR;
+
+/+#define LRESULT LONG
+#define HGLOBAL HANDLE+/
+
+enum {
+	OT_LINK = 1,
+	OT_EMBEDDED,
+	OT_STATIC
+}
+
+const OLEVERB_PRIMARY = 0;
+const OF_SET          = 1;
+const OF_GET          = 2;
+const OF_HANDLER      = 4;
+
+struct OLETARGETDEVICE {
+	USHORT otdDeviceNameOffset;
+	USHORT otdDriverNameOffset;
+	USHORT otdPortNameOffset;
+	USHORT otdExtDevmodeOffset;
+	USHORT otdExtDevmodeSize;
+	USHORT otdEnvironmentOffset;
+	USHORT otdEnvironmentSize;
+	BYTE   _otdData;
+	BYTE*  otdData() { return &_otdData; }
+}
+alias OLETARGETDEVICE* LPOLETARGETDEVICE;
+
+enum OLESTATUS {
+	OLE_OK,
+	OLE_WAIT_FOR_RELEASE,
+	OLE_BUSY,
+	OLE_ERROR_PROTECT_ONLY,
+	OLE_ERROR_MEMORY,
+	OLE_ERROR_STREAM,
+	OLE_ERROR_STATIC,
+	OLE_ERROR_BLANK,
+	OLE_ERROR_DRAW,
+	OLE_ERROR_METAFILE,
+	OLE_ERROR_ABORT,
+	OLE_ERROR_CLIPBOARD,
+	OLE_ERROR_FORMAT,
+	OLE_ERROR_OBJECT,
+	OLE_ERROR_OPTION,
+	OLE_ERROR_PROTOCOL,
+	OLE_ERROR_ADDRESS,
+	OLE_ERROR_NOT_EQUAL,
+	OLE_ERROR_HANDLE,
+	OLE_ERROR_GENERIC,
+	OLE_ERROR_CLASS,
+	OLE_ERROR_SYNTAX,
+	OLE_ERROR_DATATYPE,
+	OLE_ERROR_PALETTE,
+	OLE_ERROR_NOT_LINK,
+	OLE_ERROR_NOT_EMPTY,
+	OLE_ERROR_SIZE,
+	OLE_ERROR_DRIVE,
+	OLE_ERROR_NETWORK,
+	OLE_ERROR_NAME,
+	OLE_ERROR_TEMPLATE,
+	OLE_ERROR_NEW,
+	OLE_ERROR_EDIT,
+	OLE_ERROR_OPEN,
+	OLE_ERROR_NOT_OPEN,
+	OLE_ERROR_LAUNCH,
+	OLE_ERROR_COMM,
+	OLE_ERROR_TERMINATE,
+	OLE_ERROR_COMMAND,
+	OLE_ERROR_SHOW,
+	OLE_ERROR_DOVERB,
+	OLE_ERROR_ADVISE_NATIVE,
+	OLE_ERROR_ADVISE_PICT,
+	OLE_ERROR_ADVISE_RENAME,
+	OLE_ERROR_POKE_NATIVE,
+	OLE_ERROR_REQUEST_NATIVE,
+	OLE_ERROR_REQUEST_PICT,
+	OLE_ERROR_SERVER_BLOCKED,
+	OLE_ERROR_REGISTRATION,
+	OLE_ERROR_ALREADY_REGISTERED,
+	OLE_ERROR_TASK,
+	OLE_ERROR_OUTOFDATE,
+	OLE_ERROR_CANT_UPDATE_CLIENT,
+	OLE_ERROR_UPDATE,
+	OLE_ERROR_SETDATA_FORMAT,
+	OLE_ERROR_STATIC_FROM_OTHER_OS,
+	OLE_ERROR_FILE_VER,
+	OLE_WARN_DELETE_DATA = 1000
+}
+
+enum OLE_NOTIFICATION {
+	OLE_CHANGED,
+	OLE_SAVED,
+	OLE_CLOSED,
+	OLE_RENAMED,
+	OLE_QUERY_PAINT,
+	OLE_RELEASE,
+	OLE_QUERY_RETRY
+}
+
+enum OLE_RELEASE_METHOD {
+	OLE_NONE,
+	OLE_DELETE,
+	OLE_LNKPASTE,
+	OLE_EMBPASTE,
+	OLE_SHOW,
+	OLE_RUN,
+	OLE_ACTIVATE,
+	OLE_UPDATE,
+	OLE_CLOSE,
+	OLE_RECONNECT,
+	OLE_SETUPDATEOPTIONS,
+	OLE_SERVERUNLAUNCH,
+	OLE_LOADFROMSTREAM,
+	OLE_SETDATA,
+	OLE_REQUESTDATA,
+	OLE_OTHER,
+	OLE_CREATE,
+	OLE_CREATEFROMTEMPLATE,
+	OLE_CREATELINKFROMFILE,
+	OLE_COPYFROMLNK,
+	OLE_CREATEFROMFILE,
+	OLE_CREATEINVISIBLE
+}
+
+enum OLEOPT_RENDER {
+	olerender_none,
+	olerender_draw,
+	olerender_format
+}
+
+alias WORD OLECLIPFORMAT;
+
+enum OLEOPT_UPDATE {
+	oleupdate_always,
+	oleupdate_onsave,
+	oleupdate_oncall,
+// #ifdef OLE_INTERNAL
+	oleupdate_onclose
+// #endif
+}
+
+alias HANDLE HOBJECT;
+alias LONG LHSERVER, LHCLIENTDOC, LHSERVERDOC;
+
+struct OLEOBJECTVTBL {
+	extern (Windows) {
+		void* function(LPOLEOBJECT, OLE_LPCSTR) QueryProtocol;
+		OLESTATUS function(LPOLEOBJECT) Release;
+		OLESTATUS function(LPOLEOBJECT, BOOL) Show;
+		OLESTATUS function(LPOLEOBJECT, UINT, BOOL, BOOL) DoVerb;
+		OLESTATUS function(LPOLEOBJECT, OLECLIPFORMAT, HANDLE*) GetData;
+		OLESTATUS function(LPOLEOBJECT, OLECLIPFORMAT, HANDLE) SetData;
+		OLESTATUS function(LPOLEOBJECT, HGLOBAL) SetTargetDevice;
+		OLESTATUS function(LPOLEOBJECT, RECT*) SetBounds;
+		OLECLIPFORMAT function(LPOLEOBJECT, OLECLIPFORMAT) EnumFormats;
+		OLESTATUS function(LPOLEOBJECT, LOGPALETTE*) SetColorScheme;
+//#ifndef SERVERONLY
+		OLESTATUS function(LPOLEOBJECT) Delete;
+		OLESTATUS function(LPOLEOBJECT, OLE_LPCSTR, OLE_LPCSTR) SetHostNames;
+		OLESTATUS function(LPOLEOBJECT, LPOLESTREAM) SaveToStream;
+		OLESTATUS function(LPOLEOBJECT, LPOLECLIENT, LHCLIENTDOC, OLE_LPCSTR,
+		  LPOLEOBJECT*) Clone;
+		OLESTATUS function(LPOLEOBJECT, LPOLECLIENT, LHCLIENTDOC, OLE_LPCSTR,
+		  LPOLEOBJECT*) CopyFromLink;
+		OLESTATUS function(LPOLEOBJECT, LPOLEOBJECT) Equal;
+		OLESTATUS function(LPOLEOBJECT) CopyToClipboard;
+		OLESTATUS function(LPOLEOBJECT, HDC, RECT*, RECT*, HDC) Draw;
+		OLESTATUS function(LPOLEOBJECT, UINT, BOOL, BOOL, HWND, RECT*)
+		  Activate;
+		OLESTATUS function(LPOLEOBJECT, HGLOBAL, UINT) Execute;
+		OLESTATUS function(LPOLEOBJECT) Close;
+		OLESTATUS function(LPOLEOBJECT) Update;
+		OLESTATUS function(LPOLEOBJECT) Reconnect;
+		OLESTATUS function(LPOLEOBJECT, OLE_LPCSTR, LPOLECLIENT, LHCLIENTDOC,
+		  OLE_LPCSTR, LPOLEOBJECT*) ObjectConvert;
+		OLESTATUS function(LPOLEOBJECT, OLEOPT_UPDATE*) GetLinkUpdateOptions;
+		OLESTATUS function(LPOLEOBJECT, OLEOPT_UPDATE) SetLinkUpdateOptions;
+		OLESTATUS function(LPOLEOBJECT, OLE_LPCSTR) Rename;
+		OLESTATUS function(LPOLEOBJECT, LPSTR, UINT*) QueryName;
+		OLESTATUS function(LPOLEOBJECT, LONG*) QueryType;
+		OLESTATUS function(LPOLEOBJECT, RECT*) QueryBounds;
+		OLESTATUS function(LPOLEOBJECT, DWORD*) QuerySize;
+		OLESTATUS function(LPOLEOBJECT) QueryOpen;
+		OLESTATUS function(LPOLEOBJECT) QueryOutOfDate;
+		OLESTATUS function(LPOLEOBJECT) QueryReleaseStatus;
+		OLESTATUS function(LPOLEOBJECT) QueryReleaseError;
+		OLE_RELEASE_METHOD function(LPOLEOBJECT) QueryReleaseMethod;
+		OLESTATUS function(LPOLEOBJECT, OLECLIPFORMAT) RequestData;
+		OLESTATUS function(LPOLEOBJECT, UINT, LONG*) ObjectLong;
+		OLESTATUS function(LPOLEOBJECT, HANDLE, LPOLECLIENT, BOOL) ChangeData;
+//#endif
+	}
+}
+alias OLEOBJECTVTBL* LPOLEOBJECTVTBL;
+
+//#ifndef OLE_INTERNAL
+struct OLEOBJECT {
+	LPOLEOBJECTVTBL lpvtbl;
+}
+alias OLEOBJECT* LPOLEOBJECT;
+//#endif
+
+struct OLECLIENTVTBL {
+	int function(LPOLECLIENT, OLE_NOTIFICATION, LPOLEOBJECT) CallBack;
+}
+alias OLECLIENTVTBL* LPOLECLIENTVTBL;
+
+struct OLECLIENT {
+	LPOLECLIENTVTBL lpvtbl;
+}
+alias OLECLIENT* LPOLECLIENT;
+
+struct OLESTREAMVTBL {
+	DWORD function(LPOLESTREAM, void*, DWORD) Get;
+	DWORD function(LPOLESTREAM, void*, DWORD) Put;
+}
+alias OLESTREAMVTBL* LPOLESTREAMVTBL;
+
+struct OLESTREAM {
+	LPOLESTREAMVTBL lpstbl;
+}
+alias OLESTREAM* LPOLESTREAM;
+
+enum OLE_SERVER_USE {
+	OLE_SERVER_MULTI,
+	OLE_SERVER_SINGLE
+}
+
+struct OLESERVERVTBL {
+	OLESTATUS function(LPOLESERVER, LHSERVERDOC, OLE_LPCSTR, LPOLESERVERDOC*)
+	  Open;
+	OLESTATUS function(LPOLESERVER, LHSERVERDOC, OLE_LPCSTR, OLE_LPCSTR,
+	  LPOLESERVERDOC*) Create;
+	OLESTATUS function(LPOLESERVER, LHSERVERDOC, OLE_LPCSTR, OLE_LPCSTR,
+	  OLE_LPCSTR, LPOLESERVERDOC*) CreateFromTemplate;
+	OLESTATUS function(LPOLESERVER, LHSERVERDOC, OLE_LPCSTR, OLE_LPCSTR,
+	  LPOLESERVERDOC*) Edit;
+	OLESTATUS function(LPOLESERVER) Exit;
+	OLESTATUS function(LPOLESERVER) Release;
+	OLESTATUS function(LPOLESERVER, HGLOBAL) Execute;
+}
+typedef OLESERVERVTBL* LPOLESERVERVTBL;
+
+struct OLESERVER {
+	LPOLESERVERVTBL lpvtbl;
+}
+alias OLESERVER* LPOLESERVER;
+
+struct OLESERVERDOCVTBL {
+	OLESTATUS function(LPOLESERVERDOC) Save;
+	OLESTATUS function(LPOLESERVERDOC) Close;
+	OLESTATUS function(LPOLESERVERDOC, OLE_LPCSTR, OLE_LPCSTR) SetHostNames;
+	OLESTATUS function(LPOLESERVERDOC, RECT*) SetDocDimensions;
+	OLESTATUS function(LPOLESERVERDOC, OLE_LPCSTR, LPOLEOBJECT*, LPOLECLIENT)
+	  GetObject;
+	OLESTATUS function(LPOLESERVERDOC) Release;
+	OLESTATUS function(LPOLESERVERDOC, LOGPALETTE*) SetColorScheme;
+	OLESTATUS function(LPOLESERVERDOC, HGLOBAL) Execute;
+}
+alias OLESERVERDOCVTBL* LPOLESERVERDOCVTBL;
+
+struct OLESERVERDOC {
+	LPOLESERVERDOCVTBL lpvtbl;
+}
+alias OLESERVERDOC* LPOLESERVERDOC;
+
+extern (Windows) {
+	OLESTATUS OleDelete(LPOLEOBJECT);
+	OLESTATUS OleRelease(LPOLEOBJECT);
+	OLESTATUS OleSaveToStream(LPOLEOBJECT, LPOLESTREAM);
+	OLESTATUS OleEqual(LPOLEOBJECT, LPOLEOBJECT);
+	OLESTATUS OleCopyToClipboard(LPOLEOBJECT);
+	OLESTATUS OleSetHostNames(LPOLEOBJECT, LPCSTR, LPCSTR);
+	OLESTATUS OleSetTargetDevice(LPOLEOBJECT, HGLOBAL);
+	OLESTATUS OleSetBounds(LPOLEOBJECT, LPCRECT);
+	OLESTATUS OleSetColorScheme(LPOLEOBJECT, LOGPALETTE*);
+	OLESTATUS OleQueryBounds(LPOLEOBJECT, RECT*);
+	OLESTATUS OleQuerySize(LPOLEOBJECT, DWORD*);
+	OLESTATUS OleDraw(LPOLEOBJECT, HDC, LPCRECT, LPCRECT, HDC);
+	OLESTATUS OleQueryOpen(LPOLEOBJECT);
+	OLESTATUS OleActivate(LPOLEOBJECT, UINT, BOOL, BOOL, HWND, LPCRECT);
+	OLESTATUS OleExecute(LPOLEOBJECT, HGLOBAL, UINT);
+	OLESTATUS OleClose(LPOLEOBJECT);
+	OLESTATUS OleUpdate(LPOLEOBJECT);
+	OLESTATUS OleReconnect(LPOLEOBJECT);
+	OLESTATUS OleGetLinkUpdateOptions(LPOLEOBJECT, OLEOPT_UPDATE*);
+	OLESTATUS OleSetLinkUpdateOptions(LPOLEOBJECT, OLEOPT_UPDATE);
+	void* OleQueryProtocol(LPOLEOBJECT, LPCSTR);
+	OLESTATUS OleQueryReleaseStatus(LPOLEOBJECT);
+	OLESTATUS OleQueryReleaseError(LPOLEOBJECT);
+	OLE_RELEASE_METHOD OleQueryReleaseMethod(LPOLEOBJECT);
+	OLESTATUS OleQueryType(LPOLEOBJECT, LONG*);
+	DWORD OleQueryClientVersion();
+	DWORD OleQueryServerVersion();
+	OLECLIPFORMAT OleEnumFormats(LPOLEOBJECT, OLECLIPFORMAT);
+	OLESTATUS OleGetData(LPOLEOBJECT, OLECLIPFORMAT, HANDLE*);
+	OLESTATUS OleSetData(LPOLEOBJECT, OLECLIPFORMAT, HANDLE);
+	OLESTATUS OleQueryOutOfDate(LPOLEOBJECT);
+	OLESTATUS OleRequestData(LPOLEOBJECT, OLECLIPFORMAT);
+	OLESTATUS OleQueryLinkFromClip(LPCSTR, OLEOPT_RENDER, OLECLIPFORMAT);
+	OLESTATUS OleQueryCreateFromClip(LPCSTR, OLEOPT_RENDER, OLECLIPFORMAT);
+	OLESTATUS OleCreateFromClip(LPCSTR, LPOLECLIENT, LHCLIENTDOC, LPCSTR,
+	  LPOLEOBJECT*, OLEOPT_RENDER, OLECLIPFORMAT);
+	OLESTATUS OleCreateLinkFromClip(LPCSTR, LPOLECLIENT, LHCLIENTDOC, LPCSTR,
+	  LPOLEOBJECT*, OLEOPT_RENDER, OLECLIPFORMAT);
+	OLESTATUS OleCreateFromFile(LPCSTR, LPOLECLIENT, LPCSTR, LPCSTR,
+	  LHCLIENTDOC, LPCSTR, LPOLEOBJECT*, OLEOPT_RENDER, OLECLIPFORMAT);
+	OLESTATUS OleCreateLinkFromFile(LPCSTR, LPOLECLIENT, LPCSTR, LPCSTR,
+	  LPCSTR, LHCLIENTDOC, LPCSTR, LPOLEOBJECT*, OLEOPT_RENDER, OLECLIPFORMAT);
+	OLESTATUS OleLoadFromStream(LPOLESTREAM, LPCSTR, LPOLECLIENT, LHCLIENTDOC,
+	  LPCSTR, LPOLEOBJECT*);
+	OLESTATUS OleCreate(LPCSTR, LPOLECLIENT, LPCSTR, LHCLIENTDOC, LPCSTR,
+	  LPOLEOBJECT*, OLEOPT_RENDER, OLECLIPFORMAT);
+	OLESTATUS OleCreateInvisible(LPCSTR, LPOLECLIENT, LPCSTR, LHCLIENTDOC,
+	  LPCSTR, LPOLEOBJECT*, OLEOPT_RENDER, OLECLIPFORMAT, BOOL);
+	OLESTATUS OleCreateFromTemplate(LPCSTR, LPOLECLIENT, LPCSTR, LHCLIENTDOC,
+	  LPCSTR, LPOLEOBJECT*, OLEOPT_RENDER, OLECLIPFORMAT);
+	OLESTATUS OleClone(LPOLEOBJECT, LPOLECLIENT, LHCLIENTDOC, LPCSTR,
+	  LPOLEOBJECT*);
+	OLESTATUS OleCopyFromLink(LPOLEOBJECT, LPCSTR, LPOLECLIENT, LHCLIENTDOC,
+	  LPCSTR, LPOLEOBJECT*);
+	OLESTATUS OleObjectConvert(LPOLEOBJECT, LPCSTR, LPOLECLIENT, LHCLIENTDOC,
+	  LPCSTR, LPOLEOBJECT*);
+	OLESTATUS OleRename(LPOLEOBJECT, LPCSTR);
+	OLESTATUS OleQueryName(LPOLEOBJECT, LPSTR, UINT*);
+	OLESTATUS OleRevokeObject(LPOLECLIENT);
+	BOOL OleIsDcMeta(HDC);
+	OLESTATUS OleRegisterClientDoc(LPCSTR, LPCSTR, LONG, LHCLIENTDOC*);
+	OLESTATUS OleRevokeClientDoc(LHCLIENTDOC);
+	OLESTATUS OleRenameClientDoc(LHCLIENTDOC, LPCSTR);
+	OLESTATUS OleRevertClientDoc(LHCLIENTDOC);
+	OLESTATUS OleSavedClientDoc(LHCLIENTDOC);
+	OLESTATUS OleEnumObjects(LHCLIENTDOC, LPOLEOBJECT*);
+	OLESTATUS OleRegisterServer(LPCSTR, LPOLESERVER, LHSERVER*, HINSTANCE,
+	  OLE_SERVER_USE);
+	OLESTATUS OleRevokeServer(LHSERVER);
+	OLESTATUS OleBlockServer(LHSERVER);
+	OLESTATUS OleUnblockServer(LHSERVER, BOOL*);
+	OLESTATUS OleLockServer(LPOLEOBJECT, LHSERVER*);
+	OLESTATUS OleUnlockServer(LHSERVER);
+	OLESTATUS OleRegisterServerDoc(LHSERVER, LPCSTR, LPOLESERVERDOC,
+	  LHSERVERDOC*);
+	OLESTATUS OleRevokeServerDoc(LHSERVERDOC);
+	OLESTATUS OleRenameServerDoc(LHSERVERDOC, LPCSTR);
+	OLESTATUS OleRevertServerDoc(LHSERVERDOC);
+	OLESTATUS OleSavedServerDoc(LHSERVERDOC);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/ole2.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,118 @@
+/***********************************************************************\
+*                                 ole2.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.ole2;
+pragma(lib, "ole32.lib");
+
+public import win32.basetyps, win32.objbase, win32.oleauto, win32.olectlid,
+  win32.oleidl, win32.unknwn, win32.winerror, win32.uuid;
+private import win32.objfwd, win32.objidl, win32.windef, win32.wtypes;
+private import win32.winuser; // for LPMSG
+
+const E_DRAW = VIEW_E_DRAW;
+
+const DATA_E_FORMATETC = DV_E_FORMATETC;
+
+enum {
+	OLEIVERB_PRIMARY = 0,
+	OLEIVERB_SHOW = -1,
+	OLEIVERB_OPEN = -2,
+	OLEIVERB_HIDE = -3,
+	OLEIVERB_UIACTIVATE = -4,
+	OLEIVERB_INPLACEACTIVATE = -5,
+	OLEIVERB_DISCARDUNDOSTATE = -6
+}
+
+const EMBDHLP_INPROC_HANDLER = 0x0000L;
+const EMBDHLP_INPROC_SERVER  = 0x0001L;
+const EMBDHLP_CREATENOW      = 0x00000000L;
+const EMBDHLP_DELAYCREATE    = 0x00010000L;
+
+align(8):
+struct OLESTREAM {
+	LPOLESTREAMVTBL lpstbl;
+}
+alias OLESTREAM* LPOLESTREAM;
+
+extern (Windows) {
+	struct OLESTREAMVTBL {
+		DWORD function (LPOLESTREAM, void*, DWORD) Get;
+		DWORD function (LPOLESTREAM, void*, DWORD) Put;
+	}
+}
+alias OLESTREAMVTBL* LPOLESTREAMVTBL;
+
+extern (Windows) {
+	HRESULT CreateDataAdviseHolder(LPDATAADVISEHOLDER*);
+	DWORD OleBuildVersion();
+	HRESULT ReadClassStg(LPSTORAGE, CLSID*);
+	HRESULT WriteClassStg(LPSTORAGE, REFCLSID);
+	HRESULT ReadClassStm(LPSTREAM, CLSID*);
+	HRESULT WriteClassStm(LPSTREAM, REFCLSID);
+	HRESULT WriteFmtUserTypeStg(LPSTORAGE, CLIPFORMAT, LPOLESTR);
+	HRESULT ReadFmtUserTypeStg(LPSTORAGE, CLIPFORMAT*, LPOLESTR*);
+	HRESULT OleInitialize(PVOID);
+	void OleUninitialize();
+	HRESULT OleQueryLinkFromData(LPDATAOBJECT);
+	HRESULT OleQueryCreateFromData(LPDATAOBJECT);
+	HRESULT OleCreate(REFCLSID, REFIID, DWORD, LPFORMATETC, LPOLECLIENTSITE, LPSTORAGE, PVOID*);
+	HRESULT OleCreateFromData(LPDATAOBJECT, REFIID, DWORD, LPFORMATETC, LPOLECLIENTSITE, LPSTORAGE, PVOID*);
+	HRESULT OleCreateLinkFromData(LPDATAOBJECT, REFIID, DWORD, LPFORMATETC, LPOLECLIENTSITE, LPSTORAGE, PVOID*);
+	HRESULT OleCreateStaticFromData(LPDATAOBJECT, REFIID, DWORD, LPFORMATETC, LPOLECLIENTSITE, LPSTORAGE, PVOID*);
+	HRESULT OleCreateLink(LPMONIKER, REFIID, DWORD, LPFORMATETC, LPOLECLIENTSITE, LPSTORAGE, PVOID*);
+	HRESULT OleCreateLinkToFile(LPCOLESTR, REFIID, DWORD, LPFORMATETC, LPOLECLIENTSITE, LPSTORAGE, PVOID*);
+	HRESULT OleCreateFromFile(REFCLSID, LPCOLESTR, REFIID, DWORD, LPFORMATETC, LPOLECLIENTSITE, LPSTORAGE, PVOID*);
+	HRESULT OleLoad(LPSTORAGE, REFIID, LPOLECLIENTSITE, PVOID*);
+	HRESULT OleSave(LPPERSISTSTORAGE, LPSTORAGE, BOOL);
+	HRESULT OleLoadFromStream(LPSTREAM, REFIID, PVOID*);
+	HRESULT OleSaveToStream(LPPERSISTSTREAM, LPSTREAM);
+	HRESULT OleSetContainedObject(LPUNKNOWN, BOOL);
+	HRESULT OleNoteObjectVisible(LPUNKNOWN, BOOL);
+	HRESULT RegisterDragDrop(HWND, LPDROPTARGET);
+	HRESULT RevokeDragDrop(HWND);
+	HRESULT DoDragDrop(LPDATAOBJECT, LPDROPSOURCE, DWORD, PDWORD);
+	HRESULT OleSetClipboard(LPDATAOBJECT);
+	HRESULT OleGetClipboard(LPDATAOBJECT*);
+	HRESULT OleFlushClipboard();
+	HRESULT OleIsCurrentClipboard(LPDATAOBJECT);
+	HOLEMENU OleCreateMenuDescriptor(HMENU, LPOLEMENUGROUPWIDTHS);
+	HRESULT OleSetMenuDescriptor(HOLEMENU, HWND, HWND, LPOLEINPLACEFRAME, LPOLEINPLACEACTIVEOBJECT);
+	HRESULT OleDestroyMenuDescriptor(HOLEMENU);
+	HRESULT OleTranslateAccelerator(LPOLEINPLACEFRAME, LPOLEINPLACEFRAMEINFO, LPMSG);
+	HANDLE OleDuplicateData(HANDLE, CLIPFORMAT, UINT);
+	HRESULT OleDraw(LPUNKNOWN, DWORD, HDC, LPCRECT);
+	HRESULT OleRun(LPUNKNOWN);
+	BOOL OleIsRunning(LPOLEOBJECT);
+	HRESULT OleLockRunning(LPUNKNOWN, BOOL, BOOL);
+	void ReleaseStgMedium(LPSTGMEDIUM);
+	HRESULT CreateOleAdviseHolder(LPOLEADVISEHOLDER*);
+	HRESULT OleCreateDefaultHandler(REFCLSID, LPUNKNOWN, REFIID, PVOID*);
+	HRESULT OleCreateEmbeddingHelper(REFCLSID, LPUNKNOWN, DWORD, LPCLASSFACTORY, REFIID, PVOID*);
+	BOOL IsAccelerator(HACCEL, int, LPMSG, WORD*);
+	HGLOBAL OleGetIconOfFile(LPOLESTR, BOOL);
+	HGLOBAL OleGetIconOfClass(REFCLSID, LPOLESTR, BOOL);
+	HGLOBAL OleMetafilePictFromIconAndLabel(HICON, LPOLESTR, LPOLESTR, UINT);
+	HRESULT OleRegGetUserType(REFCLSID, DWORD, LPOLESTR*);
+	HRESULT OleRegGetMiscStatus(REFCLSID, DWORD, DWORD*);
+	HRESULT OleRegEnumFormatEtc (REFCLSID, DWORD, LPENUMFORMATETC*);
+	HRESULT OleRegEnumVerbs (REFCLSID, LPENUMOLEVERB*);
+	HRESULT OleConvertOLESTREAMToIStorage(LPOLESTREAM, LPSTORAGE, DVTARGETDEVICE*);
+	HRESULT OleConvertIStorageToOLESTREAM(LPSTORAGE, LPOLESTREAM);
+	HRESULT GetHGlobalFromILockBytes(LPLOCKBYTES, HGLOBAL*);
+	HRESULT CreateILockBytesOnHGlobal(HGLOBAL, BOOL, LPLOCKBYTES*);
+	HRESULT GetHGlobalFromStream(LPSTREAM, HGLOBAL*);
+	HRESULT CreateStreamOnHGlobal(HGLOBAL, BOOL, LPSTREAM*);
+	HRESULT OleDoAutoConvert(LPSTORAGE, LPCLSID);
+	HRESULT OleGetAutoConvert(REFCLSID, LPCLSID);
+	HRESULT OleSetAutoConvert(REFCLSID, REFCLSID);
+	HRESULT GetConvertStg(LPSTORAGE);
+	HRESULT SetConvertStg(LPSTORAGE, BOOL);
+	HRESULT OleConvertIStorageToOLESTREAMEx(LPSTORAGE, CLIPFORMAT, LONG, LONG, DWORD, LPSTGMEDIUM, LPOLESTREAM);
+	HRESULT OleConvertOLESTREAMToIStorageEx(LPOLESTREAM, LPSTORAGE, CLIPFORMAT*, LONG*, LONG*, DWORD*, LPSTGMEDIUM);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/ole2ver.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,14 @@
+/***********************************************************************\
+*                               ole2ver.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*             Translated from MinGW API for MS-Windows 3.10             *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.ole2ver;
+
+// These are apparently not documented on the MSDN site
+const rmm = 23;
+const rup = 639;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/oleacc.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,214 @@
+/***********************************************************************\
+*                                oleacc.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.oleacc;
+pragma(lib, "oleacc.lib");
+
+private import win32.basetyps, win32.oaidl, win32.unknwn, win32.wtypes,
+  win32.windef;
+
+enum {
+	DISPID_ACC_PARENT           = -5000,
+	DISPID_ACC_CHILDCOUNT       = -5001,
+	DISPID_ACC_CHILD            = -5002,
+	DISPID_ACC_NAME             = -5003,
+	DISPID_ACC_VALUE            = -5004,
+	DISPID_ACC_DESCRIPTION      = -5005,
+	DISPID_ACC_ROLE             = -5006,
+	DISPID_ACC_STATE            = -5007,
+	DISPID_ACC_HELP             = -5008,
+	DISPID_ACC_HELPTOPIC        = -5009,
+	DISPID_ACC_KEYBOARDSHORTCUT = -5010,
+	DISPID_ACC_FOCUS            = -5011,
+	DISPID_ACC_SELECTION        = -5012,
+	DISPID_ACC_DEFAULTACTION    = -5013,
+	DISPID_ACC_SELECT           = -5014,
+	DISPID_ACC_LOCATION         = -5015,
+	DISPID_ACC_NAVIGATE         = -5016,
+	DISPID_ACC_HITTEST          = -5017,
+	DISPID_ACC_DODEFAULTACTION  = -5018
+}
+
+enum {
+	NAVDIR_UP = 1,
+	NAVDIR_DOWN,
+	NAVDIR_LEFT,
+	NAVDIR_RIGHT,
+	NAVDIR_NEXT,
+	NAVDIR_PREVIOUS,
+	NAVDIR_FIRSTCHILD,
+	NAVDIR_LASTCHILD // = 8
+}
+
+enum {
+	ROLE_SYSTEM_TITLEBAR = 1,
+	ROLE_SYSTEM_MENUBAR,
+	ROLE_SYSTEM_SCROLLBAR,
+	ROLE_SYSTEM_GRIP,
+	ROLE_SYSTEM_SOUND,
+	ROLE_SYSTEM_CURSOR,
+	ROLE_SYSTEM_CARET,
+	ROLE_SYSTEM_ALERT,
+	ROLE_SYSTEM_WINDOW,
+	ROLE_SYSTEM_CLIENT,
+	ROLE_SYSTEM_MENUPOPUP,
+	ROLE_SYSTEM_MENUITEM,
+	ROLE_SYSTEM_TOOLTIP,
+	ROLE_SYSTEM_APPLICATION,
+	ROLE_SYSTEM_DOCUMENT,
+	ROLE_SYSTEM_PANE,
+	ROLE_SYSTEM_CHART,
+	ROLE_SYSTEM_DIALOG,
+	ROLE_SYSTEM_BORDER,
+	ROLE_SYSTEM_GROUPING,
+	ROLE_SYSTEM_SEPARATOR,
+	ROLE_SYSTEM_TOOLBAR,
+	ROLE_SYSTEM_STATUSBAR,
+	ROLE_SYSTEM_TABLE,
+	ROLE_SYSTEM_COLUMNHEADER,
+	ROLE_SYSTEM_ROWHEADER,
+	ROLE_SYSTEM_COLUMN,
+	ROLE_SYSTEM_ROW,
+	ROLE_SYSTEM_CELL,
+	ROLE_SYSTEM_LINK,
+	ROLE_SYSTEM_HELPBALLOON,
+	ROLE_SYSTEM_CHARACTER,
+	ROLE_SYSTEM_LIST,
+	ROLE_SYSTEM_LISTITEM,
+	ROLE_SYSTEM_OUTLINE,
+	ROLE_SYSTEM_OUTLINEITEM,
+	ROLE_SYSTEM_PAGETAB,
+	ROLE_SYSTEM_PROPERTYPAGE,
+	ROLE_SYSTEM_INDICATOR,
+	ROLE_SYSTEM_GRAPHIC,
+	ROLE_SYSTEM_STATICTEXT,
+	ROLE_SYSTEM_TEXT,
+	ROLE_SYSTEM_PUSHBUTTON,
+	ROLE_SYSTEM_CHECKBUTTON,
+	ROLE_SYSTEM_RADIOBUTTON,
+	ROLE_SYSTEM_COMBOBOX,
+	ROLE_SYSTEM_DROPLIST,
+	ROLE_SYSTEM_PROGRESSBAR,
+	ROLE_SYSTEM_DIAL,
+	ROLE_SYSTEM_HOTKEYFIELD,
+	ROLE_SYSTEM_SLIDER,
+	ROLE_SYSTEM_SPINBUTTON,
+	ROLE_SYSTEM_DIAGRAM,
+	ROLE_SYSTEM_ANIMATION,
+	ROLE_SYSTEM_EQUATION,
+	ROLE_SYSTEM_BUTTONDROPDOWN,
+	ROLE_SYSTEM_BUTTONMENU,
+	ROLE_SYSTEM_BUTTONDROPDOWNGRID,
+	ROLE_SYSTEM_WHITESPACE,
+	ROLE_SYSTEM_PAGETABLIST,
+	ROLE_SYSTEM_CLOCK // = 61
+}
+
+enum {
+	STATE_SYSTEM_UNAVAILABLE     = 0x00000001,
+	STATE_SYSTEM_SELECTED        = 0x00000002,
+	STATE_SYSTEM_FOCUSED         = 0x00000004,
+	STATE_SYSTEM_PRESSED         = 0x00000008,
+	STATE_SYSTEM_CHECKED         = 0x00000010,
+	STATE_SYSTEM_MIXED           = 0x00000020,
+	STATE_SYSTEM_READONLY        = 0x00000040,
+	STATE_SYSTEM_HOTTRACKED      = 0x00000080,
+	STATE_SYSTEM_DEFAULT         = 0x00000100,
+	STATE_SYSTEM_EXPANDED        = 0x00000200,
+	STATE_SYSTEM_COLLAPSED       = 0x00000400,
+	STATE_SYSTEM_BUSY            = 0x00000800,
+	STATE_SYSTEM_FLOATING        = 0x00001000,
+	STATE_SYSTEM_MARQUEED        = 0x00002000,
+	STATE_SYSTEM_ANIMATED        = 0x00004000,
+	STATE_SYSTEM_INVISIBLE       = 0x00008000,
+	STATE_SYSTEM_OFFSCREEN       = 0x00010000,
+	STATE_SYSTEM_SIZEABLE        = 0x00020000,
+	STATE_SYSTEM_MOVEABLE        = 0x00040000,
+	STATE_SYSTEM_SELFVOICING     = 0x00080000,
+	STATE_SYSTEM_FOCUSABLE       = 0x00100000,
+	STATE_SYSTEM_SELECTABLE      = 0x00200000,
+	STATE_SYSTEM_LINKED          = 0x00400000,
+	STATE_SYSTEM_TRAVERSED       = 0x00800000,
+	STATE_SYSTEM_MULTISELECTABLE = 0x01000000,
+	STATE_SYSTEM_EXTSELECTABLE   = 0x02000000,
+	STATE_SYSTEM_ALERT_LOW       = 0x04000000,
+	STATE_SYSTEM_ALERT_MEDIUM    = 0x08000000,
+	STATE_SYSTEM_ALERT_HIGH      = 0x10000000,
+	STATE_SYSTEM_VALID           = 0x1fffffff
+}
+
+enum SELFLAG
+{
+	SELFLAG_NONE            = 0,
+	SELFLAG_TAKEFOCUS       = 1,
+	SELFLAG_TAKESELECTION   = 2,
+	SELFLAG_EXTENDSELECTION = 4,
+	SELFLAG_ADDSELECTION    = 8,
+	SELFLAG_REMOVESELECTION = 16
+}
+
+const SELFLAG_VALID = 0x0000001F;
+
+
+interface IAccessible : public IDispatch {
+	HRESULT get_accParent(IDispatch**);
+	HRESULT get_accChildCount(int*);
+	HRESULT get_accChild(VARIANT, IDispatch **);
+	HRESULT get_accName(VARIANT, BSTR*);
+	HRESULT get_accValue(VARIANT, BSTR*);
+	HRESULT get_accDescription(VARIANT, BSTR*);
+	HRESULT get_accRole(VARIANT, VARIANT*);
+	HRESULT get_accState(VARIANT, VARIANT*);
+	HRESULT get_accHelp(VARIANT, BSTR*);
+	HRESULT get_accHelpTopic(BSTR*, VARIANT, int*);
+	HRESULT get_accKeyboardShortcut(VARIANT, BSTR*);
+	HRESULT get_accFocus(VARIANT*);
+	HRESULT get_accSelection(VARIANT*);
+	HRESULT get_accDefaultAction(VARIANT, BSTR*);
+
+	HRESULT accSelect(int, VARIANT);
+	HRESULT accLocation(int*, int*, int*, int*, VARIANT);
+	HRESULT accNavigate(int, VARIANT, VARIANT*);
+	HRESULT accHitTest(int, int, VARIANT*);
+	HRESULT accDoDefaultAction(VARIANT);
+
+	HRESULT put_accName(VARIANT, BSTR);
+	HRESULT put_accValue(VARIANT, BSTR);
+}
+
+alias IAccessible* LPACCESSIBLE;
+
+extern (Windows) {
+	HRESULT AccessibleChildren(IAccessible*, LONG, LONG, VARIANT*, LONG*);
+	HRESULT AccessibleObjectFromEvent(HWND, DWORD, DWORD, IAccessible*, VARIANT*);
+	HRESULT AccessibleObjectFromPoint(POINT, IAccessible**, VARIANT*);
+	HRESULT AccessibleObjectFromWindow(HWND, DWORD, REFIID, void**);
+	HRESULT CreateStdAccessibleObject(HWND, LONG, REFIID, void**);
+	HRESULT CreateStdAccessibleProxyA(HWND, LPCSTR, LONG, REFIID, void**);
+	HRESULT CreateStdAccessibleProxyW(HWND, LPCWSTR, LONG, REFIID, void**);
+
+	void GetOleaccVersionInfo(DWORD*, DWORD*);
+	UINT GetRoleTextA(DWORD, LPSTR, UINT);
+	UINT GetRoleTextW(DWORD, LPWSTR, UINT);
+	UINT GetStateTextA(DWORD, LPSTR, UINT);
+	UINT GetStateTextW(DWORD, LPWSTR, UINT);
+	LRESULT LresultFromObject(REFIID, WPARAM, LPUNKNOWN);
+	HRESULT ObjectFromLresult(LRESULT, REFIID, WPARAM, void**);
+	HRESULT WindowFromAccessibleObject(IAccessible*, HWND*);
+}
+
+version(Unicode) {
+	alias CreateStdAccessibleProxyW CreateStdAccessibleProxy;
+	alias GetRoleTextW GetRoleText;
+	alias GetStateTextW GetStateText;
+} else {
+	alias CreateStdAccessibleProxyA CreateStdAccessibleProxy;
+	alias GetRoleTextA GetRoleText;
+	alias GetStateTextA GetStateText;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/oleauto.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,684 @@
+/***********************************************************************\
+*                               oleauto.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.oleauto;
+pragma(lib, "oleaut32.lib");
+
+import win32.oaidl;
+private import win32.basetyps, win32.unknwn, win32.windef, win32.wtypes;
+private import win32.winbase; // for SYSTEMTIME
+
+align(8):
+const STDOLE_MAJORVERNUM = 1;
+const STDOLE_MINORVERNUM = 0;
+const STDOLE_LCID = 0;
+
+const VARIANT_NOVALUEPROP = 0x01;
+const VARIANT_ALPHABOOL = 0x02;
+const VARIANT_NOUSEOVERRIDE = 0x04;
+const VARIANT_LOCALBOOL = 0x08;
+
+const VAR_TIMEVALUEONLY = 0x0001;
+const VAR_DATEVALUEONLY = 0x0002;
+const VAR_VALIDDATE = 0x0004;
+const VAR_CALENDAR_HIJRI = 0x0008;
+const VAR_LOCALBOOL = 0x0010;
+const VAR_FORMAT_NOSUBSTITUTE = 0x0020;
+const VAR_FOURDIGITYEARS = 0x0040;
+const VAR_CALENDAR_THAI = 0x0080;
+const VAR_CALENDAR_GREGORIAN = 0x0100;
+
+const MEMBERID_NIL = DISPID_UNKNOWN;
+const ID_DEFAULTINST =  -2;
+const DISPATCH_METHOD = 1;
+const DISPATCH_PROPERTYGET = 2;
+const DISPATCH_PROPERTYPUT = 4;
+const DISPATCH_PROPERTYPUTREF = 8;
+
+//ULONG LHashValOfName(LCID l, OLECHAR* n) { return LHashValOfNameSys(SYSKIND.SYS_WIN32, l, n); }
+
+// DAC: These aren't in the 2003 SDK.
+//MACRO #define WHashValOfLHashVal(h) ((unsigned short)(0x0000ffff&(h)))
+//MACRO #define IsHashValCompatible(h1, h2) ((BOOL)((0x00ff0000&(h1))==(0x00ff0000&(h2))))
+
+enum {
+	ACTIVEOBJECT_STRONG = 0,
+	ACTIVEOBJECT_WEAK   = 1
+}
+
+// DAC: These seem to be irrelevant for D.
+//#define V_UNION(X, Y) ((X)->Y)
+//#define V_VT(X) ((X)->vt)
+//#define V_BOOL(X) V_UNION(X, boolVal)
+//#define V_ISBYREF(X) (V_VT(X)&VT_BYREF)
+//#define V_ISARRAY(X) (V_VT(X)&VT_ARRAY)
+//#define V_ISVECTOR(X) (V_VT(X)&VT_VECTOR)
+//#define V_NONE(X) V_I2(X)
+//#define V_UI1(X) V_UNION(X, bVal)
+//#define V_UI1REF(X) V_UNION(X, pbVal)
+//#define V_I2(X) V_UNION(X, iVal)
+//#define V_UI2(X) V_UNION(X, uiVal)
+//#define V_I2REF(X) V_UNION(X, piVal)
+//#define V_I4(X) V_UNION(X, lVal)
+//#define V_UI4(X) V_UNION(X, ulVal)
+//#define V_I4REF(X) V_UNION(X, plVal)
+//#define V_UI4REF(X) V_UNION(X, pulVal)
+//#define V_I8(X) V_UNION(X, llVal)
+//#define V_UI8(X) V_UNION(X, ullVal)
+//#define V_I8REF(X) V_UNION(X, pllVal)
+//#define V_UI8REF(X) V_UNION(X, pullVal)
+//#define V_R4(X) V_UNION(X, fltVal)
+//#define V_R4REF(X) V_UNION(X, pfltVal)
+//#define V_R8(X) V_UNION(X, dblVal)
+//#define V_R8REF(X) V_UNION(X, pdblVal)
+//#define V_CY(X) V_UNION(X, cyVal)
+//#define V_CYREF(X) V_UNION(X, pcyVal)
+//#define V_DATE(X) V_UNION(X, date)
+//#define V_DATEREF(X) V_UNION(X, pdate)
+//#define V_BSTR(X) V_UNION(X, bstrVal)
+//#define V_BSTRREF(X) V_UNION(X, pbstrVal)
+//#define V_DISPATCH(X) V_UNION(X, pdispVal)
+//#define V_DISPATCHREF(X) V_UNION(X, ppdispVal)
+//#define V_ERROR(X) V_UNION(X, scode)
+//#define V_ERRORREF(X) V_UNION(X, pscode)
+//#define V_BOOLREF(X) V_UNION(X, pboolVal)
+//#define V_UNKNOWN(X) V_UNION(X, punkVal)
+//#define V_UNKNOWNREF(X) V_UNION(X, ppunkVal)
+//#define V_VARIANTREF(X) V_UNION(X, pvarVal)
+//#define V_LPSTR(X) V_UNION(X, pszVal)
+//#define V_LPSTRREF(X) V_UNION(X, ppszVal)
+//#define V_LPWSTR(X) V_UNION(X, pwszVal)
+//#define V_LPWSTRREF(X) V_UNION(X, ppwszVal)
+//#define V_FILETIME(X) V_UNION(X, filetime)
+//#define V_FILETIMEREF(X) V_UNION(X, pfiletime)
+//#define V_BLOB(X) V_UNION(X, blob)
+//#define V_UUID(X) V_UNION(X, puuid)
+//#define V_CLSID(X) V_UNION(X, puuid)
+//#define V_ARRAY(X) V_UNION(X, parray)
+//#define V_ARRAYREF(X) V_UNION(X, pparray)
+//#define V_BYREF(X) V_UNION(X, byref)
+//#define V_DECIMAL(X) ((X)->decVal)
+//#define V_DECIMALREF(X) V_UNION(X, pdecVal)
+//#define V_I1(X) V_UNION(X, cVal)
+
+//#ifdef _WIN64
+//#define V_INT_PTR(X) V_I8(X)
+//#define V_UINT_PTR(X) V_UI8(X)
+//#define V_INT_PTRREF(X) V_I8REF(X)
+//#define V_UINT_PTRREF(X) V_UI8REF(X)
+//#else
+//#define V_INT_PTR(X) V_I4(X)
+//#define V_UINT_PTR(X) V_UI4(X)
+//#define V_INT_PTRREF(X) V_I4REF(X)
+//#define V_UINT_PTRREF(X) V_UI4REF(X)
+//#endif
+
+enum {
+	VARCMP_LT = 0,
+	VARCMP_EQ,
+	VARCMP_GT,
+	VARCMP_NULL // = 3
+}
+
+const LOCALE_USE_NLS = 0x10000000;
+
+const VARIANT_NOUSEROVERRIDE     = 0x04;
+const VARIANT_CALENDAR_HIJRI     = 0x08;
+const VARIANT_CALENDAR_THAI      = 0x20;
+const VARIANT_CALENDAR_GREGORIAN = 0x40;
+const VARIANT_USE_NLS            = 0x80;
+
+const NUMPRS_LEADING_WHITE  = 0x00001;
+const NUMPRS_TRAILING_WHITE = 0x00002;
+const NUMPRS_LEADING_PLUS   = 0x00004;
+const NUMPRS_TRAILING_PLUS  = 0x00008;
+const NUMPRS_LEADING_MINUS  = 0x00010;
+const NUMPRS_TRAILING_MINUS = 0x00020;
+const NUMPRS_HEX_OCT        = 0x00040;
+const NUMPRS_PARENS         = 0x00080;
+const NUMPRS_DECIMAL        = 0x00100;
+const NUMPRS_THOUSANDS      = 0x00200;
+const NUMPRS_CURRENCY       = 0x00400;
+const NUMPRS_EXPONENT       = 0x00800;
+const NUMPRS_USE_ALL        = 0x01000;
+const NUMPRS_STD            = 0x01FFF;
+const NUMPRS_NEG            = 0x10000;
+const NUMPRS_INEXACT        = 0x20000;
+
+const VTBIT_I1 = 1 << VARENUM.VT_I1;
+const VTBIT_UI1 = 1 << VARENUM.VT_UI1;
+const VTBIT_I2 = 1 << VARENUM.VT_I2;
+const VTBIT_UI2 = 1 << VARENUM.VT_UI2;
+const VTBIT_I4 = 1 << VARENUM.VT_I4;
+const VTBIT_UI4 = 1 << VARENUM.VT_UI4;
+const VTBIT_I8 = 1 << VARENUM.VT_I8;
+const VTBIT_UI8 = 1 << VARENUM.VT_UI8;
+const VTBIT_R4 = 1 << VARENUM.VT_R4;
+const VTBIT_R8 = 1 << VARENUM.VT_R8;
+const VTBIT_CY = 1 << VARENUM.VT_CY;
+const VTBIT_DECIMAL = 1 << VARENUM.VT_DECIMAL;
+
+
+enum REGKIND{
+	REGKIND_DEFAULT,
+	REGKIND_REGISTER,
+	REGKIND_NONE
+}
+
+struct PARAMDATA{
+	OLECHAR* szName;
+	VARTYPE vt;
+}
+alias PARAMDATA* LPPARAMDATA;
+
+struct METHODDATA{
+	OLECHAR* szName;
+	PARAMDATA* ppdata;
+	DISPID dispid;
+	UINT iMeth;
+	CALLCONV cc;
+	UINT cArgs;
+	WORD wFlags;
+	VARTYPE vtReturn;
+}
+alias METHODDATA* LPMETHODDATA;
+
+struct INTERFACEDATA{
+	METHODDATA* pmethdata;
+	UINT cMembers;
+}
+alias INTERFACEDATA* LPINTERFACEDATA;
+
+struct UDATE {
+	SYSTEMTIME st;
+	USHORT wDayOfYear;
+}
+
+struct NUMPARSE {
+	int cDig;
+	uint dwInFlags;
+	uint dwOutFlags;
+	int cchUsed;
+	int nBaseShift;
+	int nPwr10;
+}
+
+
+// DAC: In MinGW, these were declared but not defined in oaidl.
+// The SDK docs suggest they belong in this file instead.
+
+deprecated {  // not actually deprecated, but they aren't converted yet.
+              // (will need to reinstate CreateTypeLib as well)
+	interface ICreateTypeInfo {};
+	interface ICreateTypeInfo2 {};
+	interface ICreateTypeLib {};
+	interface ICreateTypeLib2 {};
+
+	alias ICreateTypeInfo* LPCREATETYPEINFO;
+	alias ICreateTypeInfo2* LPCREATETYPEINFO2;
+	alias ICreateTypeLib* LPCREATETYPELIB;
+	alias ICreateTypeLib2* LPCREATETYPELIB2;
+}
+
+extern (Windows) {
+	BSTR SysAllocString(OLECHAR*);
+	int SysReAllocString(BSTR*, OLECHAR*);
+	BSTR SysAllocStringLen(OLECHAR*, uint);
+	int SysReAllocStringLen(BSTR*, OLECHAR*, uint);
+	void SysFreeString(BSTR);
+	uint SysStringLen(BSTR);
+	uint SysStringByteLen(BSTR);
+	BSTR SysAllocStringByteLen(char*, uint);
+	int DosDateTimeToVariantTime(ushort, ushort, double*);
+	int VariantTimeToDosDateTime(double, ushort*, ushort*);
+	int VariantTimeToSystemTime(double, LPSYSTEMTIME);
+	int SystemTimeToVariantTime(LPSYSTEMTIME, double*);
+	HRESULT VarDateFromUdate(UDATE*, ULONG, DATE*);
+	HRESULT VarDateFromUdateEx(UDATE*, LCID, ULONG, DATE*);
+	HRESULT VarUdateFromDate(DATE, ULONG, UDATE*);
+	HRESULT SafeArrayAllocDescriptor(uint, SAFEARRAY**);
+	HRESULT SafeArrayAllocData(SAFEARRAY*);
+	SAFEARRAY* SafeArrayCreate(VARTYPE, uint, SAFEARRAYBOUND*);
+	HRESULT SafeArrayDestroyDescriptor(SAFEARRAY*);
+	HRESULT SafeArrayDestroyData(SAFEARRAY*);
+	HRESULT SafeArrayDestroy(SAFEARRAY*);
+	HRESULT SafeArrayRedim(SAFEARRAY*, SAFEARRAYBOUND*);
+	uint SafeArrayGetDim(SAFEARRAY*);
+	uint SafeArrayGetElemsize(SAFEARRAY*);
+	HRESULT SafeArrayGetUBound(SAFEARRAY*, uint, int*);
+	HRESULT SafeArrayGetLBound(SAFEARRAY*, uint, int*);
+	HRESULT SafeArrayLock(SAFEARRAY*);
+	HRESULT SafeArrayUnlock(SAFEARRAY*);
+	HRESULT SafeArrayAccessData(SAFEARRAY*, void**);
+	HRESULT SafeArrayUnaccessData(SAFEARRAY*);
+	HRESULT SafeArrayGetElement(SAFEARRAY*, int*, void*);
+	HRESULT SafeArrayPutElement(SAFEARRAY*, int*, void*);
+	HRESULT SafeArrayCopy(SAFEARRAY*, SAFEARRAY**);
+	HRESULT SafeArrayPtrOfIndex(SAFEARRAY*, int*, void**);
+	SAFEARRAY* SafeArrayCreateVector(VARTYPE, LONG, ULONG);
+	SAFEARRAY* SafeArrayCreateVectorEx(VARTYPE, LONG, ULONG, LPVOID);
+	HRESULT SafeArrayAllocDescriptorEx(VARTYPE, UINT, SAFEARRAY**);
+	HRESULT SafeArrayGetVartype(SAFEARRAY*, VARTYPE*);
+	HRESULT SafeArraySetRecordInfo(SAFEARRAY*, IRecordInfo*);
+	HRESULT SafeArrayGetRecordInfo(SAFEARRAY*, IRecordInfo**);
+	HRESULT SafeArraySetIID(SAFEARRAY*, REFGUID);
+	HRESULT SafeArrayGetIID(SAFEARRAY*, GUID*);
+	void VariantInit(VARIANTARG*);
+	HRESULT VariantClear(VARIANTARG*);
+	HRESULT VariantCopy(VARIANTARG*, VARIANTARG*);
+	HRESULT VariantCopyInd(VARIANT*, VARIANTARG*);
+	HRESULT VariantChangeType(VARIANTARG*, VARIANTARG*, ushort, VARTYPE);
+	HRESULT VariantChangeTypeEx(VARIANTARG*, VARIANTARG*, LCID, ushort, VARTYPE);
+	HRESULT VarUI1FromI2(short, ubyte*);
+	HRESULT VarUI1FromI4(int, ubyte*);
+	HRESULT VarUI1FromR4(float, ubyte*);
+	HRESULT VarUI1FromR8(double, ubyte*);
+	HRESULT VarUI1FromCy(CY, ubyte*);
+	HRESULT VarUI1FromDate(DATE, ubyte*);
+	HRESULT VarUI1FromStr(OLECHAR*, LCID, uint, ubyte*);
+	HRESULT VarUI1FromDisp(LPDISPATCH, LCID, ubyte*);
+	HRESULT VarUI1FromBool(VARIANT_BOOL, ubyte*);
+	HRESULT VarI2FromUI1(ubyte, short*);
+	HRESULT VarI2FromI4(int, short*);
+	HRESULT VarI2FromR4(float, short*);
+	HRESULT VarI2FromR8(double, short*);
+	HRESULT VarI2FromCy(CY cyIn, short*);
+	HRESULT VarI2FromDate(DATE, short*);
+	HRESULT VarI2FromStr(OLECHAR*, LCID, uint, short*);
+	HRESULT VarI2FromDisp(LPDISPATCH, LCID, short*);
+	HRESULT VarI2FromBool(VARIANT_BOOL, short*);
+	HRESULT VarI4FromUI1(ubyte, int*);
+	HRESULT VarI4FromI2(short, int*);
+	HRESULT VarI4FromR4(float, int*);
+	HRESULT VarI4FromR8(double, int*);
+	HRESULT VarI4FromCy(CY, int*);
+	HRESULT VarI4FromDate(DATE, int*);
+	HRESULT VarI4FromStr(OLECHAR*, LCID, uint, int*);
+	HRESULT VarI4FromDisp(LPDISPATCH, LCID, int*);
+	HRESULT VarI4FromBool(VARIANT_BOOL, int*);
+	HRESULT VarR4FromUI1(ubyte, float*);
+	HRESULT VarR4FromI2(short, float*);
+	HRESULT VarR4FromI4(int, float*);
+	HRESULT VarR4FromR8(double, float*);
+	HRESULT VarR4FromCy(CY, float*);
+	HRESULT VarR4FromDate(DATE, float*);
+	HRESULT VarR4FromStr(OLECHAR*, LCID, uint, float*);
+	HRESULT VarR4FromDisp(LPDISPATCH, LCID, float*);
+	HRESULT VarR4FromBool(VARIANT_BOOL, float*);
+	HRESULT VarR8FromUI1(ubyte, double*);
+	HRESULT VarR8FromI2(short, double*);
+	HRESULT VarR8FromI4(int, double*);
+	HRESULT VarR8FromR4(float, double*);
+	HRESULT VarR8FromCy(CY, double*);
+	HRESULT VarR8FromDate(DATE, double*);
+	HRESULT VarR8FromStr(OLECHAR*, LCID, uint, double*);
+	HRESULT VarR8FromDisp(LPDISPATCH, LCID, double*);
+	HRESULT VarR8FromBool(VARIANT_BOOL, double*);
+	HRESULT VarR8FromDec(DECIMAL*, double*);
+	HRESULT VarDateFromUI1(ubyte, DATE*);
+	HRESULT VarDateFromI2(short, DATE*);
+	HRESULT VarDateFromI4(int, DATE*);
+	HRESULT VarDateFromR4(float, DATE*);
+	HRESULT VarDateFromR8(double, DATE*);
+	HRESULT VarDateFromCy(CY, DATE*);
+	HRESULT VarDateFromStr(OLECHAR*, LCID, uint, DATE*);
+	HRESULT VarDateFromDisp(LPDISPATCH, LCID, DATE*);
+	HRESULT VarDateFromBool(VARIANT_BOOL, DATE*);
+	HRESULT VarCyFromUI1(ubyte, CY*);
+	HRESULT VarCyFromI2(short, CY*);
+	HRESULT VarCyFromI4(int, CY*);
+	HRESULT VarCyFromR4(float, CY*);
+	HRESULT VarCyFromR8(double, CY*);
+	HRESULT VarCyFromDate(DATE, CY*);
+	HRESULT VarCyFromStr(OLECHAR*, LCID, uint, CY*);
+	HRESULT VarCyFromDisp(LPDISPATCH, LCID, CY*);
+	HRESULT VarCyFromBool(VARIANT_BOOL, CY*);
+	HRESULT VarBstrFromUI1(ubyte, LCID, uint, BSTR*);
+	HRESULT VarBstrFromI2(short, LCID, uint, BSTR*);
+	HRESULT VarBstrFromI4(int, LCID, uint, BSTR*);
+	HRESULT VarBstrFromR4(float, LCID, uint, BSTR*);
+	HRESULT VarBstrFromR8(double, LCID, uint, BSTR*);
+	HRESULT VarBstrFromCy(CY, LCID, uint, BSTR*);
+	HRESULT VarBstrFromDate(DATE, LCID, uint, BSTR*);
+	HRESULT VarBstrFromDisp(LPDISPATCH, LCID, uint, BSTR*);
+	HRESULT VarBstrFromBool(VARIANT_BOOL, LCID, uint, BSTR*);
+	HRESULT VarBoolFromUI1(ubyte, VARIANT_BOOL*);
+	HRESULT VarBoolFromI2(short, VARIANT_BOOL*);
+	HRESULT VarBoolFromI4(int, VARIANT_BOOL*);
+	HRESULT VarBoolFromR4(float, VARIANT_BOOL*);
+	HRESULT VarBoolFromR8(double, VARIANT_BOOL*);
+	HRESULT VarBoolFromDate(DATE, VARIANT_BOOL*);
+	HRESULT VarBoolFromCy(CY, VARIANT_BOOL*);
+	HRESULT VarBoolFromStr(OLECHAR*, LCID, uint, VARIANT_BOOL*);
+	HRESULT VarBoolFromDisp(LPDISPATCH, LCID, VARIANT_BOOL*);
+	HRESULT VarDecFromR8(double, DECIMAL*);
+	ULONG LHashValOfNameSysA(SYSKIND, LCID, char*);
+	ULONG LHashValOfNameSys(SYSKIND, LCID, OLECHAR*);
+	HRESULT LoadTypeLib(OLECHAR*, LPTYPELIB*);
+	HRESULT LoadTypeLibEx(LPCOLESTR, REGKIND, LPTYPELIB*);
+	HRESULT LoadRegTypeLib(REFGUID, WORD, WORD, LCID, LPTYPELIB*);
+	HRESULT QueryPathOfRegTypeLib(REFGUID, ushort, ushort, LCID, LPBSTR);
+	HRESULT RegisterTypeLib(LPTYPELIB, OLECHAR*, OLECHAR*);
+	HRESULT UnRegisterTypeLib(REFGUID, WORD, WORD, LCID, SYSKIND);
+	// not actually deprecated, but depends on unconverted ICreateTypeLib
+	deprecated HRESULT CreateTypeLib(SYSKIND, OLECHAR*, LPCREATETYPELIB*);
+	HRESULT DispGetParam(DISPPARAMS*, UINT, VARTYPE, VARIANT*, UINT*);
+	HRESULT DispGetIDsOfNames(LPTYPEINFO, OLECHAR**, UINT, DISPID*);
+	HRESULT DispInvoke(void*, LPTYPEINFO, DISPID, WORD, DISPPARAMS*, VARIANT*, EXCEPINFO*, UINT*);
+	HRESULT CreateDispTypeInfo(INTERFACEDATA*, LCID, LPTYPEINFO*);
+	HRESULT CreateStdDispatch(IUnknown*, void*, LPTYPEINFO, IUnknown**);
+	HRESULT RegisterActiveObject(IUnknown*, REFCLSID, DWORD, DWORD*);
+	HRESULT RevokeActiveObject(DWORD, void*);
+	HRESULT GetActiveObject(REFCLSID, void*, IUnknown**);
+	HRESULT SetErrorInfo(uint, LPERRORINFO);
+	HRESULT GetErrorInfo(uint, LPERRORINFO*);
+	HRESULT CreateErrorInfo(LPCREATEERRORINFO*);
+	uint OaBuildVersion();
+	HRESULT VectorFromBstr (BSTR, SAFEARRAY**);
+	HRESULT BstrFromVector (SAFEARRAY*, BSTR*);
+	HRESULT VarParseNumFromStr(OLECHAR*, LCID, ULONG, NUMPARSE*, BYTE*);
+	HRESULT VarNumFromParseNum(NUMPARSE*, BYTE*, ULONG, VARIANT*);
+
+	HRESULT VarAdd(LPVARIANT, LPVARIANT, LPVARIANT);
+	HRESULT VarSub(LPVARIANT, LPVARIANT, LPVARIANT);
+	HRESULT VarMul(LPVARIANT, LPVARIANT, LPVARIANT);
+	HRESULT VarDiv(LPVARIANT, LPVARIANT, LPVARIANT);
+
+	HRESULT VarUI1FromI2(SHORT, BYTE*);
+	HRESULT VarUI1FromI4(LONG, BYTE*);
+	HRESULT VarUI1FromI8(LONG64, BYTE*);
+	HRESULT VarUI1FromR4(FLOAT, BYTE*);
+	HRESULT VarUI1FromR8(DOUBLE, BYTE*);
+	HRESULT VarUI1FromDate(DATE, BYTE*);
+	HRESULT VarUI1FromBool(VARIANT_BOOL, BYTE*);
+	HRESULT VarUI1FromI1(byte, BYTE*);
+	HRESULT VarUI1FromUI2(USHORT, BYTE*);
+	HRESULT VarUI1FromUI4(ULONG, BYTE*);
+	HRESULT VarUI1FromUI8(ULONG64, BYTE*);
+	HRESULT VarUI1FromStr(OLECHAR*, LCID, ULONG, BYTE*);
+	HRESULT VarUI1FromCy(CY, BYTE*);
+	HRESULT VarUI1FromDec(DECIMAL*, BYTE*);
+	HRESULT VarUI1FromDisp(IDispatch*, LCID, BYTE*);
+
+	HRESULT VarI2FromUI1(BYTE, SHORT*);
+	HRESULT VarI2FromI4(LONG, SHORT*);
+	HRESULT VarI2FromI8(LONG64, SHORT*);
+	HRESULT VarI2FromR4(FLOAT, SHORT*);
+	HRESULT VarI2FromR8(DOUBLE, SHORT*);
+	HRESULT VarI2FromDate(DATE, SHORT*);
+	HRESULT VarI2FromBool(VARIANT_BOOL, SHORT*);
+	HRESULT VarI2FromI1(byte, SHORT*);
+	HRESULT VarI2FromUI2(USHORT, SHORT*);
+	HRESULT VarI2FromUI4(ULONG, SHORT*);
+	HRESULT VarI2FromUI8(ULONG64, SHORT*);
+	HRESULT VarI2FromStr(OLECHAR*, LCID, ULONG, SHORT*);
+	HRESULT VarI2FromCy(CY, SHORT*);
+	HRESULT VarI2FromDec(DECIMAL*, SHORT*);
+	HRESULT VarI2FromDisp(IDispatch*, LCID, SHORT*);
+
+	HRESULT VarI4FromUI1(BYTE, LONG*);
+	HRESULT VarI4FromI2(SHORT, LONG*);
+	HRESULT VarI4FromI8(LONG64, LONG*);
+	HRESULT VarI4FromR4(FLOAT, LONG*);
+	HRESULT VarI4FromR8(DOUBLE, LONG*);
+	HRESULT VarI4FromDate(DATE, LONG*);
+	HRESULT VarI4FromBool(VARIANT_BOOL, LONG*);
+	HRESULT VarI4FromI1(byte, LONG*);
+	HRESULT VarI4FromUI2(USHORT, LONG*);
+	HRESULT VarI4FromUI4(ULONG, LONG*);
+	HRESULT VarI4FromUI8(ULONG64, LONG*);
+	HRESULT VarI4FromStr(OLECHAR*, LCID, ULONG, LONG*);
+	HRESULT VarI4FromCy(CY, LONG*);
+	HRESULT VarI4FromDec(DECIMAL*, LONG*);
+	HRESULT VarI4FromDisp(IDispatch*, LCID, LONG*);
+
+	HRESULT VarI8FromUI1(BYTE, LONG64*);
+	HRESULT VarI8FromI2(SHORT, LONG64*);
+	HRESULT VarI8FromI4(LONG, LONG64*);
+	HRESULT VarI8FromR4(FLOAT, LONG64*);
+	HRESULT VarI8FromR8(DOUBLE, LONG64*);
+	HRESULT VarI8FromDate(DATE, LONG64*);
+	HRESULT VarI8FromStr(OLECHAR*, LCID, ULONG, LONG64*);
+	HRESULT VarI8FromBool(VARIANT_BOOL, LONG64*);
+	HRESULT VarI8FromI1(byte, LONG64*);
+	HRESULT VarI8FromUI2(USHORT, LONG64*);
+	HRESULT VarI8FromUI4(ULONG, LONG64*);
+	HRESULT VarI8FromUI8(ULONG64, LONG64*);
+	HRESULT VarI8FromDec(DECIMAL* pdecIn, LONG64*);
+	HRESULT VarI8FromInt(INT intIn, LONG64*);
+	HRESULT VarI8FromCy(CY, LONG64*);
+	HRESULT VarI8FromDisp(IDispatch*, LCID, LONG64*);
+
+	HRESULT VarR4FromUI1(BYTE, FLOAT*);
+	HRESULT VarR4FromI2(SHORT, FLOAT*);
+	HRESULT VarR4FromI4(LONG, FLOAT*);
+	HRESULT VarR4FromI8(LONG64, FLOAT*);
+	HRESULT VarR4FromR8(DOUBLE, FLOAT*);
+	HRESULT VarR4FromDate(DATE, FLOAT*);
+	HRESULT VarR4FromBool(VARIANT_BOOL, FLOAT*);
+	HRESULT VarR4FromI1(byte, FLOAT*);
+	HRESULT VarR4FromUI2(USHORT, FLOAT*);
+	HRESULT VarR4FromUI4(ULONG, FLOAT*);
+	HRESULT VarR4FromUI8(ULONG64, FLOAT*);
+	HRESULT VarR4FromStr(OLECHAR*, LCID, ULONG, FLOAT*);
+	HRESULT VarR4FromCy(CY, FLOAT*);
+	HRESULT VarR4FromDec(DECIMAL*, FLOAT*);
+	HRESULT VarR4FromDisp(IDispatch*, LCID, FLOAT*);
+
+	HRESULT VarR8FromUI1(BYTE, double*);
+	HRESULT VarR8FromI2(SHORT, double*);
+	HRESULT VarR8FromI4(LONG, double*);
+	HRESULT VarR8FromI8(LONG64, double*);
+	HRESULT VarR8FromR4(FLOAT, double*);
+	HRESULT VarR8FromDate(DATE, double*);
+	HRESULT VarR8FromBool(VARIANT_BOOL, double*);
+	HRESULT VarR8FromI1(byte, double*);
+	HRESULT VarR8FromUI2(USHORT, double*);
+	HRESULT VarR8FromUI4(ULONG, double*);
+	HRESULT VarR8FromUI8(ULONG64, double*);
+	HRESULT VarR8FromStr(OLECHAR*, LCID, ULONG, double*);
+	HRESULT VarR8FromCy(CY, double*);
+	HRESULT VarR8FromDec(DECIMAL*, double*);
+	HRESULT VarR8FromDisp(IDispatch*, LCID, double*);
+
+	HRESULT VarDateFromUI1(BYTE, DATE*);
+	HRESULT VarDateFromI2(SHORT, DATE*);
+	HRESULT VarDateFromI4(LONG, DATE*);
+	HRESULT VarDateFromI8(LONG64, DATE*);
+	HRESULT VarDateFromR4(FLOAT, DATE*);
+	HRESULT VarDateFromR8(DOUBLE, DATE*);
+	HRESULT VarDateFromStr(OLECHAR*, LCID, ULONG, DATE*);
+	HRESULT VarDateFromI1(byte, DATE*);
+	HRESULT VarDateFromUI2(USHORT, DATE*);
+	HRESULT VarDateFromUI4(ULONG, DATE*);
+	HRESULT VarDateFromUI8(ULONG64, DATE*);
+	HRESULT VarDateFromBool(VARIANT_BOOL, DATE*);
+	HRESULT VarDateFromCy(CY, DATE*);
+	HRESULT VarDateFromDec(DECIMAL*, DATE*);
+	HRESULT VarDateFromDisp(IDispatch*, LCID, DATE*);
+
+	HRESULT VarCyFromUI1(BYTE, CY*);
+	HRESULT VarCyFromI2(SHORT sIn, CY*);
+	HRESULT VarCyFromI4(LONG, CY*);
+	HRESULT VarCyFromI8(LONG64, CY*);
+	HRESULT VarCyFromR4(FLOAT, CY*);
+	HRESULT VarCyFromR8(DOUBLE, CY*);
+	HRESULT VarCyFromDate(DATE, CY*);
+	HRESULT VarCyFromStr(OLECHAR*, LCID, ULONG, CY*);
+	HRESULT VarCyFromBool(VARIANT_BOOL, CY*);
+	HRESULT VarCyFromI1(byte, CY*);
+	HRESULT VarCyFromUI2(USHORT, CY*);
+	HRESULT VarCyFromUI4(ULONG, CY*);
+	HRESULT VarCyFromUI8(ULONG64, CY*);
+	HRESULT VarCyFromDec(DECIMAL*, CY*);
+	HRESULT VarCyFromStr(OLECHAR*, LCID, ULONG, CY*);
+	HRESULT VarCyFromDisp(IDispatch*, LCID, CY*);
+
+	HRESULT VarBstrFromUI1(BYTE, LCID, ULONG, BSTR*);
+	HRESULT VarBstrFromI2(SHORT, LCID, ULONG, BSTR*);
+	HRESULT VarBstrFromI4(LONG, LCID, ULONG, BSTR*);
+	HRESULT VarBstrFromI8(LONG64, LCID, ULONG, BSTR*);
+	HRESULT VarBstrFromR4(FLOAT, LCID, ULONG, BSTR*);
+	HRESULT VarBstrFromR8(DOUBLE, LCID, ULONG, BSTR*);
+	HRESULT VarBstrFromDate(DATE, LCID, ULONG, BSTR*);
+	HRESULT VarBstrFromBool(VARIANT_BOOL, LCID, ULONG, BSTR*);
+	HRESULT VarBstrFromI1(byte, LCID, ULONG, BSTR*);
+	HRESULT VarBstrFromUI2(USHORT, LCID, ULONG, BSTR*);
+	HRESULT VarBstrFromUI8(ULONG64, LCID, ULONG, BSTR*);
+	HRESULT VarBstrFromUI4(ULONG, LCID, ULONG, BSTR*);
+	HRESULT VarBstrFromCy(CY, LCID, ULONG, BSTR*);
+	HRESULT VarBstrFromDec(DECIMAL*, LCID, ULONG, BSTR*);
+	HRESULT VarBstrFromDisp(IDispatch*, LCID, ULONG, BSTR*);
+
+	HRESULT VarBoolFromUI1(BYTE, VARIANT_BOOL*);
+	HRESULT VarBoolFromI2(SHORT, VARIANT_BOOL*);
+	HRESULT VarBoolFromI4(LONG, VARIANT_BOOL*);
+	HRESULT VarBoolFromI8(LONG64, VARIANT_BOOL*);
+	HRESULT VarBoolFromR4(FLOAT, VARIANT_BOOL*);
+	HRESULT VarBoolFromR8(DOUBLE, VARIANT_BOOL*);
+	HRESULT VarBoolFromDate(DATE, VARIANT_BOOL*);
+	HRESULT VarBoolFromStr(OLECHAR*, LCID, ULONG, VARIANT_BOOL*);
+	HRESULT VarBoolFromI1(byte, VARIANT_BOOL*);
+	HRESULT VarBoolFromUI2(USHORT, VARIANT_BOOL*);
+	HRESULT VarBoolFromUI4(ULONG, VARIANT_BOOL*);
+	HRESULT VarBoolFromUI8(ULONG64, VARIANT_BOOL*);
+	HRESULT VarBoolFromCy(CY, VARIANT_BOOL*);
+	HRESULT VarBoolFromDec(DECIMAL*, VARIANT_BOOL*);
+	HRESULT VarBoolFromDisp(IDispatch*, LCID, VARIANT_BOOL*);
+
+	HRESULT VarI1FromUI1(BYTE, byte*);
+	HRESULT VarI1FromI2(SHORT, byte*);
+	HRESULT VarI1FromI4(LONG, byte*);
+	HRESULT VarI1FromI8(LONG64, byte*);
+	HRESULT VarI1FromR4(FLOAT, byte*);
+	HRESULT VarI1FromR8(DOUBLE, byte*);
+	HRESULT VarI1FromDate(DATE, byte*);
+	HRESULT VarI1FromStr(OLECHAR*, LCID, ULONG, byte*);
+	HRESULT VarI1FromBool(VARIANT_BOOL, byte*);
+	HRESULT VarI1FromUI2(USHORT, byte*);
+	HRESULT VarI1FromUI4(ULONG, byte*);
+	HRESULT VarI1FromUI8(ULONG64, byte*);
+	HRESULT VarI1FromCy(CY, byte*);
+	HRESULT VarI1FromDec(DECIMAL*, byte*);
+	HRESULT VarI1FromDisp(IDispatch*, LCID, byte*);
+
+	HRESULT VarUI2FromUI1(BYTE, USHORT*);
+	HRESULT VarUI2FromI2(SHORT, USHORT*);
+	HRESULT VarUI2FromI4(LONG, USHORT*);
+	HRESULT VarUI2FromI8(LONG64, USHORT*);
+	HRESULT VarUI2FromR4(FLOAT, USHORT*);
+	HRESULT VarUI2FromR8(DOUBLE, USHORT*);
+	HRESULT VarUI2FromDate(DATE, USHORT*);
+	HRESULT VarUI2FromStr(OLECHAR*, LCID, ULONG, USHORT*);
+	HRESULT VarUI2FromBool(VARIANT_BOOL, USHORT*);
+	HRESULT VarUI2FromI1(byte, USHORT*);
+	HRESULT VarUI2FromUI4(ULONG, USHORT*);
+	HRESULT VarUI2FromUI8(ULONG64, USHORT*);
+	HRESULT VarUI2FromCy(CY, USHORT*);
+	HRESULT VarUI2FromDec(DECIMAL*, USHORT*);
+	HRESULT VarUI2FromDisp(IDispatch*, LCID, USHORT*);
+
+	HRESULT VarUI4FromStr(OLECHAR*, LCID, ULONG, ULONG*);
+	HRESULT VarUI4FromUI1(BYTE, ULONG*);
+	HRESULT VarUI4FromI2(SHORT, ULONG*);
+	HRESULT VarUI4FromI4(LONG, ULONG*);
+	HRESULT VarUI4FromI8(LONG64, ULONG*);
+	HRESULT VarUI4FromR4(FLOAT, ULONG*);
+	HRESULT VarUI4FromR8(DOUBLE, ULONG*);
+	HRESULT VarUI4FromDate(DATE, ULONG*);
+	HRESULT VarUI4FromBool(VARIANT_BOOL, ULONG*);
+	HRESULT VarUI4FromI1(byte, ULONG*);
+	HRESULT VarUI4FromUI2(USHORT, ULONG*);
+	HRESULT VarUI4FromUI8(ULONG64, ULONG*);
+	HRESULT VarUI4FromCy(CY, ULONG*);
+	HRESULT VarUI4FromDec(DECIMAL*, ULONG*);
+	HRESULT VarUI4FromDisp(IDispatch*, LCID, ULONG*);
+
+	HRESULT VarUI8FromUI1(BYTE, ULONG64*);
+	HRESULT VarUI8FromI2(SHORT, ULONG64*);
+	HRESULT VarUI8FromI4(LONG, ULONG64*);
+	HRESULT VarUI8FromI8(LONG64, ULONG64*);
+	HRESULT VarUI8FromR4(FLOAT, ULONG64*);
+	HRESULT VarUI8FromR8(DOUBLE, ULONG64*);
+	HRESULT VarUI8FromDate(DATE, ULONG64*);
+	HRESULT VarUI8FromStr(OLECHAR*, LCID, ULONG, ULONG64*);
+	HRESULT VarUI8FromBool(VARIANT_BOOL, ULONG64*);
+	HRESULT VarUI8FromI1(byte, ULONG64*);
+	HRESULT VarUI8FromUI2(USHORT, ULONG64*);
+	HRESULT VarUI8FromUI4(ULONG, ULONG64*);
+	HRESULT VarUI8FromDec(DECIMAL*, ULONG64*);
+	HRESULT VarUI8FromInt(INT, ULONG64*);
+	HRESULT VarUI8FromCy(CY, ULONG64*);
+	HRESULT VarUI8FromDisp(IDispatch*, LCID, ULONG64*);
+
+	HRESULT VarDecFromUI1(BYTE, DECIMAL*);
+	HRESULT VarDecFromI2(SHORT, DECIMAL*);
+	HRESULT VarDecFromI4(LONG, DECIMAL*);
+	HRESULT VarDecFromI8(LONG64, DECIMAL*);
+	HRESULT VarDecFromR4(FLOAT, DECIMAL*);
+	HRESULT VarDecFromR8(DOUBLE, DECIMAL*);
+	HRESULT VarDecFromDate(DATE, DECIMAL*);
+	HRESULT VarDecFromStr(OLECHAR*, LCID, ULONG, DECIMAL*);
+	HRESULT VarDecFromBool(VARIANT_BOOL, DECIMAL*);
+	HRESULT VarDecFromI1(byte, DECIMAL*);
+	HRESULT VarDecFromUI2(USHORT, DECIMAL*);
+	HRESULT VarDecFromUI4(ULONG, DECIMAL*);
+	HRESULT VarDecFromUI8(ULONG64, DECIMAL*);
+	HRESULT VarDecFromCy(CY, DECIMAL*);
+	HRESULT VarDecFromDisp(IDispatch*, LCID, DECIMAL*);
+
+	HRESULT VarDecNeg(DECIMAL*, DECIMAL*);
+	HRESULT VarR4CmpR8(float, double);
+	HRESULT VarR8Pow(double, double, double*);
+	HRESULT VarR8Round(double, int, double*);
+	HRESULT VarDecAbs(DECIMAL*, DECIMAL*);
+	HRESULT VarDecAdd(DECIMAL*, DECIMAL*, DECIMAL*);
+	HRESULT VarDecCmp(DECIMAL*, DECIMAL*);
+	HRESULT VarDecCmpR8(DECIMAL*, DOUBLE);
+	HRESULT VarDecDiv(DECIMAL*, DECIMAL*, DECIMAL*);
+	HRESULT VarDecFix(DECIMAL*, DECIMAL*);
+	HRESULT VarDecInt(DECIMAL*, DECIMAL*);
+	HRESULT VarDecMul(DECIMAL*, DECIMAL*, DECIMAL*);
+	HRESULT VarDecRound(DECIMAL*, int, DECIMAL*);
+	HRESULT VarDecSub(DECIMAL*, DECIMAL*, DECIMAL*);
+	HRESULT VarCyAbs(CY, CY*);
+	HRESULT VarCyAdd(CY, CY, CY*);
+	HRESULT VarCyCmp(CY, CY);
+	HRESULT VarCyCmpR8(CY, DOUBLE);
+	HRESULT VarCyFix(CY, CY*);
+	HRESULT VarCyInt(CY, CY*);
+	HRESULT VarCyMul(CY, CY, CY*);
+	HRESULT VarCyMulI4(CY, LONG, CY*);
+	HRESULT VarCyMulI8(CY, LONG64, CY*);
+	HRESULT VarCyNeg(CY, CY*);
+	HRESULT VarCyRound(CY, INT, CY*);
+	HRESULT VarCySub(CY, CY, CY*);
+	HRESULT VarAdd(LPVARIANT, LPVARIANT, LPVARIANT);
+	HRESULT VarAnd(LPVARIANT, LPVARIANT, LPVARIANT);
+	HRESULT VarCat(LPVARIANT, LPVARIANT, LPVARIANT);
+	HRESULT VarDiv(LPVARIANT, LPVARIANT, LPVARIANT);
+	HRESULT VarEqv(LPVARIANT, LPVARIANT, LPVARIANT);
+	HRESULT VarIdiv(LPVARIANT, LPVARIANT, LPVARIANT);
+	HRESULT VarImp(LPVARIANT, LPVARIANT, LPVARIANT);
+	HRESULT VarMod(LPVARIANT, LPVARIANT, LPVARIANT);
+	HRESULT VarMul(LPVARIANT, LPVARIANT, LPVARIANT);
+	HRESULT VarOr(LPVARIANT, LPVARIANT, LPVARIANT);
+	HRESULT VarPow(LPVARIANT, LPVARIANT, LPVARIANT);
+	HRESULT VarSub(LPVARIANT, LPVARIANT, LPVARIANT);
+	HRESULT VarXor(LPVARIANT, LPVARIANT, LPVARIANT);
+	HRESULT VarAbs(LPVARIANT, LPVARIANT);
+	HRESULT VarFix(LPVARIANT, LPVARIANT);
+	HRESULT VarInt(LPVARIANT, LPVARIANT);
+	HRESULT VarNeg(LPVARIANT, LPVARIANT);
+	HRESULT VarNot(LPVARIANT, LPVARIANT);
+	HRESULT VarRound(LPVARIANT, int, LPVARIANT);
+	HRESULT VarCmp(LPVARIANT, LPVARIANT, LCID, ULONG);
+	HRESULT VarBstrCmp(BSTR, BSTR, LCID, ULONG);
+	HRESULT VarBstrCat(BSTR, BSTR, BSTR*);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/olectl.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,398 @@
+/***********************************************************************\
+*                                olectl.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.olectl;
+
+// In conversion from MinGW, the following was deleted:
+//#define FONTSIZE(n) {n##0000, 0}
+
+import win32.ocidl, win32.olectlid;
+private import win32.basetyps, win32.oaidl, win32.oleauto, win32.unknwn,
+  win32.windef, win32.wingdi, win32.winuser, win32.wtypes;
+private import win32.ntdef;     // for NTSTATUS
+private import win32.objfwd;    // for LPSTREAM
+private import win32.winerror;  // for SCODE
+
+
+private {
+	// These replace C macros.
+	template ITF_ERROR_SCODE_FOR_D(int c)
+	{
+		const SCODE ITF_ERROR_SCODE_FOR_D
+		  = (SEVERITY_ERROR << 31) | (FACILITY_ITF << 16) | c;
+	}
+
+	template ITF_SUCCESS_SCODE_FOR_D(int c)
+	{
+		const SCODE ITF_SUCCESS_SCODE_FOR_D
+		  = (SEVERITY_SUCCESS << 31) | (FACILITY_ITF << 16) | c;
+	}
+
+	template STD_CTL_SCODE(int c)
+	{
+		const SCODE STD_CTL_SCODE
+		  = (SEVERITY_ERROR << 31) | (FACILITY_CONTROL << 16) | c;
+	}
+}
+
+enum : SCODE {
+	CTL_E_ILLEGALFUNCTIONCALL       = STD_CTL_SCODE!(5),
+	CTL_E_OVERFLOW                  = STD_CTL_SCODE!(6),
+	CTL_E_OUTOFMEMORY               = STD_CTL_SCODE!(7),
+	CTL_E_DIVISIONBYZERO            = STD_CTL_SCODE!(11),
+	CTL_E_OUTOFSTRINGSPACE          = STD_CTL_SCODE!(14),
+	CTL_E_OUTOFSTACKSPACE           = STD_CTL_SCODE!(28),
+	CTL_E_BADFILENAMEORNUMBER       = STD_CTL_SCODE!(52),
+	CTL_E_FILENOTFOUND              = STD_CTL_SCODE!(53),
+	CTL_E_BADFILEMODE               = STD_CTL_SCODE!(54),
+	CTL_E_FILEALREADYOPEN           = STD_CTL_SCODE!(55),
+	CTL_E_DEVICEIOERROR             = STD_CTL_SCODE!(57),
+	CTL_E_FILEALREADYEXISTS         = STD_CTL_SCODE!(58),
+	CTL_E_BADRECORDLENGTH           = STD_CTL_SCODE!(59),
+	CTL_E_DISKFULL                  = STD_CTL_SCODE!(61),
+	CTL_E_BADRECORDNUMBER           = STD_CTL_SCODE!(63),
+	CTL_E_BADFILENAME               = STD_CTL_SCODE!(64),
+	CTL_E_TOOMANYFILES              = STD_CTL_SCODE!(67),
+	CTL_E_DEVICEUNAVAILABLE         = STD_CTL_SCODE!(68),
+	CTL_E_PERMISSIONDENIED          = STD_CTL_SCODE!(70),
+	CTL_E_DISKNOTREADY              = STD_CTL_SCODE!(71),
+	CTL_E_PATHFILEACCESSERROR       = STD_CTL_SCODE!(75),
+	CTL_E_PATHNOTFOUND              = STD_CTL_SCODE!(76),
+	CTL_E_INVALIDPATTERNSTRING      = STD_CTL_SCODE!(93),
+	CTL_E_INVALIDUSEOFNULL          = STD_CTL_SCODE!(94),
+	CTL_E_INVALIDFILEFORMAT         = STD_CTL_SCODE!(321),
+	CTL_E_INVALIDPROPERTYVALUE      = STD_CTL_SCODE!(380),
+	CTL_E_INVALIDPROPERTYARRAYINDEX = STD_CTL_SCODE!(381),
+	CTL_E_SETNOTSUPPORTEDATRUNTIME  = STD_CTL_SCODE!(382),
+	CTL_E_SETNOTSUPPORTED           = STD_CTL_SCODE!(383),
+	CTL_E_NEEDPROPERTYARRAYINDEX    = STD_CTL_SCODE!(385),
+	CTL_E_SETNOTPERMITTED           = STD_CTL_SCODE!(387),
+	CTL_E_GETNOTSUPPORTEDATRUNTIME  = STD_CTL_SCODE!(393),
+	CTL_E_GETNOTSUPPORTED           = STD_CTL_SCODE!(394),
+	CTL_E_PROPERTYNOTFOUND          = STD_CTL_SCODE!(422),
+	CTL_E_INVALIDCLIPBOARDFORMAT    = STD_CTL_SCODE!(460),
+	CTL_E_INVALIDPICTURE            = STD_CTL_SCODE!(481),
+	CTL_E_PRINTERERROR              = STD_CTL_SCODE!(482),
+	CTL_E_CANTSAVEFILETOTEMP        = STD_CTL_SCODE!(735),
+	CTL_E_SEARCHTEXTNOTFOUND        = STD_CTL_SCODE!(744),
+	CTL_E_REPLACEMENTSTOOLONG       = STD_CTL_SCODE!(746),
+	CTL_E_CUSTOM_FIRST              = STD_CTL_SCODE!(600)
+}
+
+const SCODE CLASS_E_NOTLICENSED = CLASSFACTORY_E_FIRST+2;
+
+enum : SCODE {
+	CONNECT_E_FIRST           = ITF_ERROR_SCODE_FOR_D!(0x200),
+	CONNECT_E_LAST            = ITF_ERROR_SCODE_FOR_D!(0x20F),
+	CONNECT_S_FIRST           = ITF_SUCCESS_SCODE_FOR_D!(0x200),
+	CONNECT_S_LAST            = ITF_SUCCESS_SCODE_FOR_D!(0x20F),
+	CONNECT_E_NOCONNECTION    = CONNECT_E_FIRST + 0,
+	CONNECT_E_ADVISELIMIT     = CONNECT_E_FIRST + 1,
+	CONNECT_E_CANNOTCONNECT   = CONNECT_E_FIRST + 2,
+	CONNECT_E_OVERRIDDEN      = CONNECT_E_FIRST + 3,
+
+	SELFREG_E_FIRST           = ITF_ERROR_SCODE_FOR_D!(0x200),
+	SELFREG_E_LAST            = ITF_ERROR_SCODE_FOR_D!(0x20F),
+	SELFREG_S_FIRST           = ITF_SUCCESS_SCODE_FOR_D!(0x200),
+	SELFREG_S_LAST            = ITF_SUCCESS_SCODE_FOR_D!(0x20F),
+	SELFREG_E_TYPELIB         = SELFREG_E_FIRST + 0,
+	SELFREG_E_CLASS           = SELFREG_E_FIRST + 1,
+
+	PERPROP_E_FIRST           = ITF_ERROR_SCODE_FOR_D!(0x200),
+	PERPROP_E_LAST            = ITF_ERROR_SCODE_FOR_D!(0x20F),
+	PERPROP_S_FIRST           = ITF_SUCCESS_SCODE_FOR_D!(0x200),
+	PERPROP_S_LAST            = ITF_SUCCESS_SCODE_FOR_D!(0x20F),
+	PERPROP_E_NOPAGEAVAILABLE = PERPROP_E_FIRST
+}
+
+enum {
+	OLEMISC_RECOMPOSEONRESIZE            = 0x1,
+	OLEMISC_ONLYICONIC                   = 0x2,
+	OLEMISC_INSERTNOTREPLACE             = 0x4,
+	OLEMISC_STATIC                       = 0x8,
+	OLEMISC_CANTLINKINSIDE               = 0x10,
+	OLEMISC_CANLINKBYOLE1                = 0x20,
+	OLEMISC_ISLINKOBJECT                 = 0x40,
+	OLEMISC_INSIDEOUT                    = 0x80,
+	OLEMISC_ACTIVATEWHENVISIBLE          = 0x100,
+	OLEMISC_RENDERINGISDEVICEINDEPENDENT = 0x200,
+	OLEMISC_INVISIBLEATRUNTIME           = 0x400,
+	OLEMISC_ALWAYSRUN                    = 0x800,
+	OLEMISC_ACTSLIKEBUTTON               = 0x1000,
+	OLEMISC_ACTSLIKELABEL                = 0x2000,
+	OLEMISC_NOUIACTIVATE                 = 0x4000,
+	OLEMISC_ALIGNABLE                    = 0x8000,
+	OLEMISC_SIMPLEFRAME                  = 0x10000,
+	OLEMISC_SETCLIENTSITEFIRST           = 0x20000,
+	OLEMISC_IMEMODE                      = 0x40000,
+	OLEMISC_IGNOREACTIVATEWHENVISIBLE    = 0x80000,
+	OLEMISC_WANTSTOMENUMERGE             = 0x100000,
+	OLEMISC_SUPPORTSMULTILEVELUNDO       = 0x200000
+}
+const OLEIVERB_PROPERTIES = -7;
+
+const VT_STREAMED_PROPSET = 73;
+const VT_STORED_PROPSET = 74;
+const VT_BLOB_PROPSET = 75;
+const VT_VERBOSE_ENUM = 76;
+const VT_COLOR = VARENUM.VT_I4;
+const VT_XPOS_PIXELS = VARENUM.VT_I4;
+const VT_YPOS_PIXELS = VARENUM.VT_I4;
+const VT_XSIZE_PIXELS = VARENUM.VT_I4;
+const VT_YSIZE_PIXELS = VARENUM.VT_I4;
+const VT_XPOS_HIMETRIC = VARENUM.VT_I4;
+const VT_YPOS_HIMETRIC = VARENUM.VT_I4;
+const VT_XSIZE_HIMETRIC = VARENUM.VT_I4;
+const VT_YSIZE_HIMETRIC = VARENUM.VT_I4;
+const VT_TRISTATE = VARENUM.VT_I2;
+const VT_OPTEXCLUSIVE = VARENUM.VT_BOOL;
+const VT_FONT = VARENUM.VT_DISPATCH;
+const VT_PICTURE = VARENUM.VT_DISPATCH;
+const VT_HANDLE = VARENUM.VT_I4;
+
+enum {
+	OCM__BASE = WM_USER + 0x1c00,
+	OCM_COMMAND = OCM__BASE + WM_COMMAND,
+	OCM_CTLCOLORBTN = OCM__BASE + WM_CTLCOLORBTN,
+	OCM_CTLCOLOREDIT = OCM__BASE + WM_CTLCOLOREDIT,
+	OCM_CTLCOLORDLG = OCM__BASE + WM_CTLCOLORDLG,
+	OCM_CTLCOLORLISTBOX = OCM__BASE + WM_CTLCOLORLISTBOX,
+	OCM_CTLCOLORMSGBOX = OCM__BASE + WM_CTLCOLORMSGBOX,
+	OCM_CTLCOLORSCROLLBAR = OCM__BASE + WM_CTLCOLORSCROLLBAR,
+	OCM_CTLCOLORSTATIC = OCM__BASE + WM_CTLCOLORSTATIC,
+	OCM_DRAWITEM = OCM__BASE + WM_DRAWITEM,
+	OCM_MEASUREITEM = OCM__BASE + WM_MEASUREITEM,
+	OCM_DELETEITEM = OCM__BASE + WM_DELETEITEM,
+	OCM_VKEYTOITEM = OCM__BASE + WM_VKEYTOITEM,
+	OCM_CHARTOITEM = OCM__BASE + WM_CHARTOITEM,
+	OCM_COMPAREITEM = OCM__BASE + WM_COMPAREITEM,
+	OCM_HSCROLL = OCM__BASE + WM_HSCROLL,
+	OCM_VSCROLL = OCM__BASE + WM_VSCROLL,
+	OCM_PARENTNOTIFY = OCM__BASE + WM_PARENTNOTIFY,
+	OCM_NOTIFY = OCM__BASE + WM_NOTIFY
+}
+
+enum {
+	CTRLINFO_EATS_RETURN = 1,
+	CTRLINFO_EATS_ESCAPE
+}
+
+enum {
+	XFORMCOORDS_POSITION            = 1,
+	XFORMCOORDS_SIZE                = 2,
+	XFORMCOORDS_HIMETRICTOCONTAINER = 4,
+	XFORMCOORDS_CONTAINERTOHIMETRIC = 8
+}
+
+const GUIDKIND_DEFAULT_SOURCE_DISP_IID = 1;
+
+enum {
+	PROPPAGESTATUS_DIRTY = 1,
+	PROPPAGESTATUS_VALIDATE = 2
+}
+
+enum {
+	PICTURE_SCALABLE = 1,
+	PICTURE_TRANSPARENT = 2
+}
+
+enum {
+	PICTYPE_UNINITIALIZED  =  -1,
+	PICTYPE_NONE,       // = 0
+	PICTYPE_BITMAP,
+	PICTYPE_METAFILE,
+	PICTYPE_ICON,
+	PICTYPE_ENHMETAFILE // = 4
+}
+
+enum {
+	DISPID_AUTOSIZE = -500,
+	DISPID_BACKCOLOR = -501,
+	DISPID_BACKSTYLE = -502,
+	DISPID_BORDERCOLOR = -503,
+	DISPID_BORDERSTYLE = -504,
+	DISPID_BORDERWIDTH = -505,
+	DISPID_DRAWMODE = -507,
+	DISPID_DRAWSTYLE = -508,
+	DISPID_DRAWWIDTH = -509,
+	DISPID_FILLCOLOR = -510,
+	DISPID_FILLSTYLE = -511,
+	DISPID_FONT = -512,
+	DISPID_FORECOLOR = -513,
+	DISPID_ENABLED = -514,
+	DISPID_HWND = -515,
+	DISPID_TABSTOP = -516,
+	DISPID_TEXT = -517,
+	DISPID_CAPTION = -518,
+	DISPID_BORDERVISIBLE = -519,
+	DISPID_APPEARANCE = -520,
+	DISPID_MOUSEPOINTER = -521,
+	DISPID_MOUSEICON = -522,
+	DISPID_PICTURE = -523,
+	DISPID_VALID = -524,
+	DISPID_REFRESH = -550,
+	DISPID_DOCLICK = -551,
+	DISPID_ABOUTBOX = -552,
+	DISPID_CLICK = -600,
+	DISPID_DBLCLICK = -601,
+	DISPID_KEYDOWN = -602,
+	DISPID_KEYPRESS = -603,
+	DISPID_KEYUP = -604,
+	DISPID_MOUSEDOWN = -605,
+	DISPID_MOUSEMOVE = -606,
+	DISPID_MOUSEUP = -607,
+	DISPID_ERROREVENT = -608,
+	DISPID_AMBIENT_BACKCOLOR = -701,
+	DISPID_AMBIENT_DISPLAYNAME = -702,
+	DISPID_AMBIENT_FONT = -703,
+	DISPID_AMBIENT_FORECOLOR = -704,
+	DISPID_AMBIENT_LOCALEID = -705,
+	DISPID_AMBIENT_MESSAGEREFLECT = -706,
+	DISPID_AMBIENT_SCALEUNITS = -707,
+	DISPID_AMBIENT_TEXTALIGN = -708,
+	DISPID_AMBIENT_USERMODE = -709,
+	DISPID_AMBIENT_UIDEAD = -710,
+	DISPID_AMBIENT_SHOWGRABHANDLES = -711,
+	DISPID_AMBIENT_SHOWHATCHING = -712,
+	DISPID_AMBIENT_DISPLAYASDEFAULT = -713,
+	DISPID_AMBIENT_SUPPORTSMNEMONICS = -714,
+	DISPID_AMBIENT_AUTOCLIP = -715,
+	DISPID_AMBIENT_APPEARANCE = -716,
+	DISPID_AMBIENT_CODEPAGE = -725,
+	DISPID_AMBIENT_PALETTE = -726,
+	DISPID_AMBIENT_CHARSET = -727,
+	DISPID_AMBIENT_RIGHTTOLEFT = -732,
+	DISPID_AMBIENT_TOPTOBOTTOM = -733
+}
+
+enum {
+	DISPID_FONT_NAME = 0,
+	DISPID_FONT_SIZE = 2,
+	DISPID_FONT_BOLD,
+	DISPID_FONT_ITALIC,
+	DISPID_FONT_UNDER,
+	DISPID_FONT_STRIKE,
+	DISPID_FONT_WEIGHT,
+	DISPID_FONT_CHARSET // = 8
+}
+
+enum {
+	DISPID_PICT_HANDLE = 0,
+	DISPID_PICT_HPAL   = 2,
+	DISPID_PICT_TYPE,
+	DISPID_PICT_WIDTH,
+	DISPID_PICT_HEIGHT,
+	DISPID_PICT_RENDER // = 6
+}
+
+alias IOleControl *LPOLECONTROL;
+alias IOleControlSite *LPOLECONTROLSITE;
+alias ISimpleFrameSite *LPSIMPLEFRAMESITE;
+alias IPersistPropertyBag *LPPERSISTPROPERTYBAG;
+alias IPersistStreamInit *LPPERSISTSTREAMINIT;
+alias IPersistMemory *LPPERSISTMEMORY;
+alias IPropertyNotifySink* LPPROPERTYNOTIFYSINK;
+alias IProvideClassInfo *LPPROVIDECLASSINFO;
+alias IProvideClassInfo2 *LPPROVIDECLASSINFO2;
+alias IConnectionPointContainer *LPCONNECTIONPOINTCONTAINER;
+alias IClassFactory2 *LPCLASSFACTORY2;
+alias ISpecifyPropertyPages *LPSPECIFYPROPERTYPAGES;
+alias IPerPropertyBrowsing *LPPERPROPERTYBROWSING;
+alias IPropertyPage *LPPROPERTYPAGE;
+alias IPropertyPage2 *LPPROPERTYPAGE2;
+
+alias IPicture *LPPICTURE;
+alias IPictureDisp *LPPICTUREDISP;
+alias int OLE_XPOS_PIXELS;
+alias int OLE_YPOS_PIXELS;
+alias int OLE_XSIZE_PIXELS;
+alias int OLE_YSIZE_PIXELS;
+alias float OLE_XPOS_CONTAINER;
+alias float OLE_YPOS_CONTAINER;
+alias float OLE_XSIZE_CONTAINER;
+
+alias VARIANT_BOOL OLE_OPTEXCLUSIVE;
+alias VARIANT_BOOL OLE_CANCELBOOL;
+alias VARIANT_BOOL OLE_ENABLEDEFAULTBOOL;
+
+align(8):
+
+enum OLE_TRISTATE {
+	triUnchecked,
+	triChecked1,
+	triGray
+}
+
+struct OCPFIPARAMS {
+	ULONG cbStructSize;
+	HWND hWndOwner;
+	int x;
+	int y;
+	LPCOLESTR lpszCaption;
+	ULONG cObjects;
+	LPUNKNOWN *lplpUnk;
+	ULONG cPages;
+	CLSID *lpPages;
+	LCID lcid;
+	DISPID dispidInitialProperty;
+}
+alias OCPFIPARAMS* LPOCPFIPARAMS;
+
+struct FONTDESC {
+	UINT cbSizeofstruct;
+	LPOLESTR lpstrName;
+	CY cySize;
+	SHORT sWeight;
+	SHORT sCharset;
+	BOOL fItalic;
+	BOOL fUnderline;
+	BOOL fStrikethrough;
+}
+alias FONTDESC* LPFONTDESC;
+
+struct PICTDESC
+{
+	UINT cbSizeofstruct;
+	UINT picType;
+	union {
+		struct bmp {
+			HBITMAP hbitmap;
+			HPALETTE hpal;
+		}
+		struct wmf {
+			HMETAFILE hmeta;
+			int xExt;
+			int yExt;
+		}
+		struct icon {
+			HICON hicon;
+		}
+		struct emf {
+			HENHMETAFILE hemf;
+		}
+	}
+}
+alias PICTDESC* LPPICTDESC;
+
+extern(Windows) {
+	HRESULT DllRegisterServer();
+	HRESULT DllUnregisterServer();
+	HRESULT OleCreateFontIndirect(LPFONTDESC, REFIID, PVOID*);
+	HRESULT OleCreatePictureIndirect(LPPICTDESC, REFIID, BOOL, PVOID*);
+	HRESULT OleCreatePropertyFrame(HWND, UINT, UINT, LPCOLESTR, ULONG, LPUNKNOWN*, ULONG, LPCLSID, LCID, DWORD, PVOID);
+	HRESULT OleCreatePropertyFrameIndirect(LPOCPFIPARAMS);
+	HCURSOR OleIconToCursor(HINSTANCE, HICON);
+	HRESULT OleLoadPicture(LPSTREAM, LONG, BOOL, REFIID, PVOID*);
+	HRESULT OleLoadPictureEx(LPSTREAM, LONG, BOOL, REFIID, DWORD, DWORD, DWORD, LPVOID*);
+	HRESULT OleLoadPicturePath(LPOLESTR, LPUNKNOWN, DWORD, OLE_COLOR, REFIID, LPVOID*);
+	HRESULT OleLoadPictureFile(VARIANT, LPDISPATCH*);
+	HRESULT OleLoadPictureFileEx(VARIANT, DWORD, DWORD, DWORD, LPDISPATCH*);
+	HRESULT OleSavePictureFile(LPDISPATCH, BSTR);
+	HRESULT OleTranslateColor(OLE_COLOR, HPALETTE, COLORREF*);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/olectlid.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,13 @@
+/***********************************************************************\
+*                               olectlid.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.olectlid;
+
+private import win32.basetyps;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/oledlg.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,990 @@
+/***********************************************************************\
+*                                oledlg.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.oledlg;
+
+import win32.commdlg, win32.dlgs, win32.ole2, win32.prsht, win32.shellapi,
+  win32.windows;
+private import win32.winbase, win32.objidl, win32.objfwd, win32.winnt;
+
+// FIXME: remove inherited methods from interface definitions
+
+const PS_MAXLINKTYPES=8;
+
+const TCHAR[] OLESTDDELIM = "\\";
+const TCHAR[] SZOLEUI_MSG_HELP = "OLEUI_MSG_HELP";
+const TCHAR[] SZOLEUI_MSG_ENDDIALOG = "OLEUI_MSG_ENDDIALOG";
+const TCHAR[] SZOLEUI_MSG_BROWSE = "OLEUI_MSG_BROWSE";
+const TCHAR[] SZOLEUI_MSG_CHANGEICON = "OLEUI_MSG_CHANGEICON";
+const TCHAR[] SZOLEUI_MSG_CLOSEBUSYDIALOG = "OLEUI_MSG_CLOSEBUSYDIALOG";
+const TCHAR[] SZOLEUI_MSG_CONVERT = "OLEUI_MSG_CONVERT";
+const TCHAR[] SZOLEUI_MSG_CHANGESOURCE = "OLEUI_MSG_CHANGESOURCE";
+const TCHAR[] SZOLEUI_MSG_ADDCONTROL = "OLEUI_MSG_ADDCONTROL";
+const TCHAR[] SZOLEUI_MSG_BROWSE_OFN = "OLEUI_MSG_BROWSE_OFN";
+
+const TCHAR[] PROP_HWND_CHGICONDLG = "HWND_CIDLG";
+
+const IDC_OLEUIHELP=99;
+
+enum {
+	IDC_IO_CREATENEW = 2100,
+	IDC_IO_CREATEFROMFILE,
+	IDC_IO_LINKFILE,
+	IDC_IO_OBJECTTYPELIST,
+	IDC_IO_DISPLAYASICON,
+	IDC_IO_CHANGEICON,
+	IDC_IO_FILE,
+	IDC_IO_FILEDISPLAY,
+	IDC_IO_RESULTIMAGE,
+	IDC_IO_RESULTTEXT,
+	IDC_IO_ICONDISPLAY,
+	IDC_IO_OBJECTTYPETEXT,
+	IDC_IO_FILETEXT,
+	IDC_IO_FILETYPE,
+	IDC_IO_INSERTCONTROL,
+	IDC_IO_ADDCONTROL,
+	IDC_IO_CONTROLTYPELIST // = 2116
+}
+
+const IDC_PS_PASTE=500;
+const IDC_PS_PASTELINK=501;
+const IDC_PS_SOURCETEXT=502;
+const IDC_PS_PASTELIST=503;
+const IDC_PS_PASTELINKLIST=504;
+const IDC_PS_DISPLAYLIST=505;
+const IDC_PS_DISPLAYASICON=506;
+const IDC_PS_ICONDISPLAY=507;
+const IDC_PS_CHANGEICON=508;
+const IDC_PS_RESULTIMAGE=509;
+const IDC_PS_RESULTTEXT=510;
+
+const IDC_CI_GROUP=120;
+const IDC_CI_CURRENT=121;
+const IDC_CI_CURRENTICON=122;
+const IDC_CI_DEFAULT=123;
+const IDC_CI_DEFAULTICON=124;
+const IDC_CI_FROMFILE=125;
+const IDC_CI_FROMFILEEDIT=126;
+const IDC_CI_ICONLIST=127;
+const IDC_CI_LABEL=128;
+const IDC_CI_LABELEDIT=129;
+const IDC_CI_BROWSE=130;
+const IDC_CI_ICONDISPLAY=131;
+
+const IDC_CV_OBJECTTYPE=150;
+const IDC_CV_DISPLAYASICON=152;
+const IDC_CV_CHANGEICON=153;
+const IDC_CV_ACTIVATELIST=154;
+const IDC_CV_CONVERTTO=155;
+const IDC_CV_ACTIVATEAS=156;
+const IDC_CV_RESULTTEXT=157;
+const IDC_CV_CONVERTLIST=158;
+const IDC_CV_ICONDISPLAY=165;
+
+const IDC_EL_CHANGESOURCE=201;
+const IDC_EL_AUTOMATIC=202;
+const IDC_EL_CANCELLINK=209;
+const IDC_EL_UPDATENOW=210;
+const IDC_EL_OPENSOURCE=211;
+const IDC_EL_MANUAL=212;
+const IDC_EL_LINKSOURCE=216;
+const IDC_EL_LINKTYPE=217;
+const IDC_EL_LINKSLISTBOX=206;
+const IDC_EL_COL1=220;
+const IDC_EL_COL2=221;
+const IDC_EL_COL3=222;
+
+const IDC_BZ_RETRY=600;
+const IDC_BZ_ICON=601;
+const IDC_BZ_MESSAGE1=602;
+const IDC_BZ_SWITCHTO=604;
+
+const IDC_UL_METER=1029;
+const IDC_UL_STOP=1030;
+const IDC_UL_PERCENT=1031;
+const IDC_UL_PROGRESS=1032;
+
+const IDC_PU_LINKS=900;
+const IDC_PU_TEXT=901;
+const IDC_PU_CONVERT=902;
+const IDC_PU_ICON=908;
+
+const IDC_GP_OBJECTNAME=1009;
+const IDC_GP_OBJECTTYPE=1010;
+const IDC_GP_OBJECTSIZE=1011;
+const IDC_GP_CONVERT=1013;
+const IDC_GP_OBJECTICON=1014;
+const IDC_GP_OBJECTLOCATION=1022;
+
+const IDC_VP_PERCENT=1000;
+const IDC_VP_CHANGEICON=1001;
+const IDC_VP_EDITABLE=1002;
+const IDC_VP_ASICON=1003;
+const IDC_VP_RELATIVE=1005;
+const IDC_VP_SPIN=1006;
+const IDC_VP_SCALETXT=1034;
+const IDC_VP_ICONDISPLAY=1021;
+const IDC_VP_RESULTIMAGE=1033;
+
+const IDC_LP_OPENSOURCE=1006;
+const IDC_LP_UPDATENOW=1007;
+const IDC_LP_BREAKLINK=1008;
+const IDC_LP_LINKSOURCE=1012;
+const IDC_LP_CHANGESOURCE=1015;
+const IDC_LP_AUTOMATIC=1016;
+const IDC_LP_MANUAL=1017;
+const IDC_LP_DATE=1018;
+const IDC_LP_TIME=1019;
+
+const IDD_INSERTOBJECT=1000;
+const IDD_CHANGEICON=1001;
+const IDD_CONVERT=1002;
+const IDD_PASTESPECIAL=1003;
+const IDD_EDITLINKS=1004;
+const IDD_BUSY=1006;
+const IDD_UPDATELINKS=1007;
+const IDD_CHANGESOURCE=1009;
+const IDD_INSERTFILEBROWSE=1010;
+const IDD_CHANGEICONBROWSE=1011;
+const IDD_CONVERTONLY=1012;
+const IDD_CHANGESOURCE4=1013;
+const IDD_GNRLPROPS=1100;
+const IDD_VIEWPROPS=1101;
+const IDD_LINKPROPS=1102;
+const IDD_CANNOTUPDATELINK=1008;
+const IDD_LINKSOURCEUNAVAILABLE=1020;
+const IDD_SERVERNOTFOUND=1023;
+const IDD_OUTOFMEMORY=1024;
+const IDD_SERVERNOTREGW=1021;
+const IDD_LINKTYPECHANGEDW=1022;
+const IDD_SERVERNOTREGA=1025;
+const IDD_LINKTYPECHANGEDA=1026;
+
+const ID_BROWSE_CHANGEICON=1;
+const ID_BROWSE_INSERTFILE=2;
+const ID_BROWSE_ADDCONTROL=3;
+const ID_BROWSE_CHANGESOURCE=4;
+
+const OLEUI_FALSE=0;
+const OLEUI_SUCCESS=1;
+const OLEUI_OK=1;
+const OLEUI_CANCEL=2;
+
+const OLEUI_ERR_STANDARDMIN=100;
+const OLEUI_ERR_STRUCTURENULL=101;
+const OLEUI_ERR_STRUCTUREINVALID=102;
+const OLEUI_ERR_CBSTRUCTINCORRECT=103;
+const OLEUI_ERR_HWNDOWNERINVALID=104;
+const OLEUI_ERR_LPSZCAPTIONINVALID=105;
+const OLEUI_ERR_LPFNHOOKINVALID=106;
+const OLEUI_ERR_HINSTANCEINVALID=107;
+const OLEUI_ERR_LPSZTEMPLATEINVALID=108;
+const OLEUI_ERR_HRESOURCEINVALID=109;
+const OLEUI_ERR_FINDTEMPLATEFAILURE=110;
+const OLEUI_ERR_LOADTEMPLATEFAILURE=111;
+const OLEUI_ERR_DIALOGFAILURE=112;
+const OLEUI_ERR_LOCALMEMALLOC=113;
+const OLEUI_ERR_GLOBALMEMALLOC=114;
+const OLEUI_ERR_LOADSTRING=115;
+const OLEUI_ERR_OLEMEMALLOC=116;
+const OLEUI_ERR_STANDARDMAX=116;
+
+const OPF_OBJECTISLINK=1;
+const OPF_NOFILLDEFAULT=2;
+const OPF_SHOWHELP=4;
+const OPF_DISABLECONVERT=8;
+
+const OLEUI_OPERR_SUBPROPNULL=OLEUI_ERR_STANDARDMAX;
+const OLEUI_OPERR_SUBPROPINVALID=(OLEUI_ERR_STANDARDMAX+1);
+const OLEUI_OPERR_PROPSHEETNULL=(OLEUI_ERR_STANDARDMAX+2);
+const OLEUI_OPERR_PROPSHEETINVALID=(OLEUI_ERR_STANDARDMAX+3);
+const OLEUI_OPERR_SUPPROP=(OLEUI_ERR_STANDARDMAX+4);
+const OLEUI_OPERR_PROPSINVALID=(OLEUI_ERR_STANDARDMAX+5);
+const OLEUI_OPERR_PAGESINCORRECT=(OLEUI_ERR_STANDARDMAX+6);
+const OLEUI_OPERR_INVALIDPAGES=(OLEUI_ERR_STANDARDMAX+7);
+const OLEUI_OPERR_NOTSUPPORTED=(OLEUI_ERR_STANDARDMAX+8);
+const OLEUI_OPERR_DLGPROCNOTNULL=(OLEUI_ERR_STANDARDMAX+9);
+const OLEUI_OPERR_LPARAMNOTZERO=(OLEUI_ERR_STANDARDMAX+10);
+const OLEUI_GPERR_STRINGINVALID=(OLEUI_ERR_STANDARDMAX+11);
+const OLEUI_GPERR_CLASSIDINVALID=(OLEUI_ERR_STANDARDMAX+12);
+const OLEUI_GPERR_LPCLSIDEXCLUDEINVALID=(OLEUI_ERR_STANDARDMAX+13);
+const OLEUI_GPERR_CBFORMATINVALID=(OLEUI_ERR_STANDARDMAX+14);
+const OLEUI_VPERR_METAPICTINVALID=(OLEUI_ERR_STANDARDMAX+15);
+const OLEUI_VPERR_DVASPECTINVALID=(OLEUI_ERR_STANDARDMAX+16);
+const OLEUI_LPERR_LINKCNTRNULL=(OLEUI_ERR_STANDARDMAX+17);
+const OLEUI_LPERR_LINKCNTRINVALID=(OLEUI_ERR_STANDARDMAX+18);
+const OLEUI_OPERR_PROPERTYSHEET=(OLEUI_ERR_STANDARDMAX+19);
+const OLEUI_OPERR_OBJINFOINVALID=(OLEUI_ERR_STANDARDMAX+20);
+const OLEUI_OPERR_LINKINFOINVALID=(OLEUI_ERR_STANDARDMAX+21);
+
+const OLEUI_QUERY_GETCLASSID=65280;
+const OLEUI_QUERY_LINKBROKEN=65281;
+
+const IOF_SHOWHELP=1;
+const IOF_SELECTCREATENEW=2;
+const IOF_SELECTCREATEFROMFILE=4;
+const IOF_CHECKLINK=8;
+const IOF_CHECKDISPLAYASICON=16;
+const IOF_CREATENEWOBJECT=32;
+const IOF_CREATEFILEOBJECT=64;
+const IOF_CREATELINKOBJECT=128;
+const IOF_DISABLELINK=256;
+const IOF_VERIFYSERVERSEXIST=512;
+const IOF_DISABLEDISPLAYASICON=1024;
+const IOF_HIDECHANGEICON=2048;
+const IOF_SHOWINSERTCONTROL=4096;
+const IOF_SELECTCREATECONTROL=8192;
+
+const OLEUI_IOERR_LPSZFILEINVALID=OLEUI_ERR_STANDARDMAX;
+const OLEUI_IOERR_LPSZLABELINVALID=(OLEUI_ERR_STANDARDMAX+1);
+const OLEUI_IOERR_HICONINVALID=(OLEUI_ERR_STANDARDMAX+2);
+const OLEUI_IOERR_LPFORMATETCINVALID=(OLEUI_ERR_STANDARDMAX+3);
+const OLEUI_IOERR_PPVOBJINVALID=(OLEUI_ERR_STANDARDMAX+4);
+const OLEUI_IOERR_LPIOLECLIENTSITEINVALID=(OLEUI_ERR_STANDARDMAX+5);
+const OLEUI_IOERR_LPISTORAGEINVALID=(OLEUI_ERR_STANDARDMAX+6);
+const OLEUI_IOERR_SCODEHASERROR=(OLEUI_ERR_STANDARDMAX+7);
+const OLEUI_IOERR_LPCLSIDEXCLUDEINVALID=(OLEUI_ERR_STANDARDMAX+8);
+const OLEUI_IOERR_CCHFILEINVALID=(OLEUI_ERR_STANDARDMAX+9);
+
+const PSF_SHOWHELP=1;
+const PSF_SELECTPASTE=2;
+const PSF_SELECTPASTELINK=4;
+const PSF_CHECKDISPLAYASICON=8;
+const PSF_DISABLEDISPLAYASICON=16;
+const PSF_HIDECHANGEICON=32;
+const PSF_STAYONCLIPBOARDCHANGE=64;
+const PSF_NOREFRESHDATAOBJECT=128;
+
+const OLEUI_IOERR_SRCDATAOBJECTINVALID=OLEUI_ERR_STANDARDMAX;
+const OLEUI_IOERR_ARRPASTEENTRIESINVALID=(OLEUI_ERR_STANDARDMAX+1);
+const OLEUI_IOERR_ARRLINKTYPESINVALID=(OLEUI_ERR_STANDARDMAX+2);
+const OLEUI_PSERR_CLIPBOARDCHANGED=(OLEUI_ERR_STANDARDMAX+3);
+const OLEUI_PSERR_GETCLIPBOARDFAILED=(OLEUI_ERR_STANDARDMAX+4);
+const OLEUI_ELERR_LINKCNTRNULL=OLEUI_ERR_STANDARDMAX;
+const OLEUI_ELERR_LINKCNTRINVALID=(OLEUI_ERR_STANDARDMAX+1);
+
+const ELF_SHOWHELP=1;
+const ELF_DISABLEUPDATENOW=2;
+const ELF_DISABLEOPENSOURCE=4;
+const ELF_DISABLECHANGESOURCE=8;
+const ELF_DISABLECANCELLINK=16;
+
+const CIF_SHOWHELP=1;
+const CIF_SELECTCURRENT=2;
+const CIF_SELECTDEFAULT=4;
+const CIF_SELECTFROMFILE=8;
+const CIF_USEICONEXE=16;
+
+const OLEUI_CIERR_MUSTHAVECLSID=OLEUI_ERR_STANDARDMAX;
+const OLEUI_CIERR_MUSTHAVECURRENTMETAFILE=OLEUI_ERR_STANDARDMAX+1;
+const OLEUI_CIERR_SZICONEXEINVALID=OLEUI_ERR_STANDARDMAX+2;
+
+const CF_SHOWHELPBUTTON=1;
+const CF_SETCONVERTDEFAULT=2;
+const CF_SETACTIVATEDEFAULT=4;
+const CF_SELECTCONVERTTO=8;
+const CF_SELECTACTIVATEAS=16;
+const CF_DISABLEDISPLAYASICON=32;
+const CF_DISABLEACTIVATEAS=64;
+const CF_HIDECHANGEICON=128;
+const CF_CONVERTONLY=256;
+
+const OLEUI_CTERR_CLASSIDINVALID = OLEUI_ERR_STANDARDMAX+1;
+const OLEUI_CTERR_DVASPECTINVALID = OLEUI_ERR_STANDARDMAX+2;
+const OLEUI_CTERR_CBFORMATINVALID = OLEUI_ERR_STANDARDMAX+3;
+const OLEUI_CTERR_HMETAPICTINVALID = OLEUI_ERR_STANDARDMAX+4;
+const OLEUI_CTERR_STRINGINVALID = OLEUI_ERR_STANDARDMAX+5;
+
+const BZ_DISABLECANCELBUTTON = 1;
+const BZ_DISABLESWITCHTOBUTTON = 2;
+const BZ_DISABLERETRYBUTTON = 4;
+const BZ_NOTRESPONDINGDIALOG = 8;
+
+const OLEUI_BZERR_HTASKINVALID = OLEUI_ERR_STANDARDMAX;
+const OLEUI_BZ_SWITCHTOSELECTED = OLEUI_ERR_STANDARDMAX+1;
+const OLEUI_BZ_RETRYSELECTED = OLEUI_ERR_STANDARDMAX+2;
+const OLEUI_BZ_CALLUNBLOCKED = OLEUI_ERR_STANDARDMAX+3;
+
+const CSF_SHOWHELP = 1;
+const CSF_VALIDSOURCE = 2;
+const CSF_ONLYGETSOURCE = 4;
+const CSF_EXPLORER = 8;
+
+const OLEUI_CSERR_LINKCNTRNULL = OLEUI_ERR_STANDARDMAX;
+const OLEUI_CSERR_LINKCNTRINVALID = OLEUI_ERR_STANDARDMAX+1;
+const OLEUI_CSERR_FROMNOTNULL = OLEUI_ERR_STANDARDMAX+2;
+const OLEUI_CSERR_TONOTNULL = OLEUI_ERR_STANDARDMAX+3;
+const OLEUI_CSERR_SOURCENULL = OLEUI_ERR_STANDARDMAX+4;
+const OLEUI_CSERR_SOURCEINVALID = OLEUI_ERR_STANDARDMAX+5;
+const OLEUI_CSERR_SOURCEPARSERROR = OLEUI_ERR_STANDARDMAX+6;
+const OLEUI_CSERR_SOURCEPARSEERROR = OLEUI_ERR_STANDARDMAX+7;
+
+const VPF_SELECTRELATIVE=1;
+const VPF_DISABLERELATIVE=2;
+const VPF_DISABLESCALE=4;
+
+align(8):
+extern (Windows) {
+	alias UINT function(HWND, UINT, WPARAM, LPARAM) LPFNOLEUIHOOK;
+}
+
+struct OLEUIINSERTOBJECTW {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	HWND hWndOwner;
+	LPCWSTR lpszCaption;
+	LPFNOLEUIHOOK lpfnHook;
+	LPARAM lCustData;
+	HINSTANCE hInstance;
+	LPCWSTR lpszTemplate;
+	HRSRC hResource;
+	CLSID clsid;
+	LPWSTR lpszFile;
+	UINT cchFile;
+	UINT cClsidExclude;
+	LPCLSID lpClsidExclude;
+	IID iid;
+	DWORD oleRender;
+	LPFORMATETC lpFormatEtc;
+	LPOLECLIENTSITE lpIOleClientSite;
+	LPSTORAGE lpIStorage;
+	PVOID *ppvObj;
+	SCODE sc;
+	HGLOBAL hMetaPict;
+}
+alias OLEUIINSERTOBJECTW* POLEUIINSERTOBJECTW, LPOLEUIINSERTOBJECTW;
+
+struct OLEUIINSERTOBJECTA {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	HWND hWndOwner;
+	LPCSTR lpszCaption;
+	LPFNOLEUIHOOK lpfnHook;
+	LPARAM lCustData;
+	HINSTANCE hInstance;
+	LPCSTR lpszTemplate;
+	HRSRC hResource;
+	CLSID clsid;
+	LPSTR lpszFile;
+	UINT cchFile;
+	UINT cClsidExclude;
+	LPCLSID lpClsidExclude;
+	IID iid;
+	DWORD oleRender;
+	LPFORMATETC lpFormatEtc;
+	LPOLECLIENTSITE lpIOleClientSite;
+	LPSTORAGE lpIStorage;
+	PVOID *ppvObj;
+	SCODE sc;
+	HGLOBAL hMetaPict;
+}
+alias OLEUIINSERTOBJECTA* POLEUIINSERTOBJECTA, LPOLEUIINSERTOBJECTA;
+
+UINT OleUIInsertObjectW(LPOLEUIINSERTOBJECTW);
+UINT OleUIInsertObjectA(LPOLEUIINSERTOBJECTA);
+
+enum OLEUIPASTEFLAG {
+	OLEUIPASTE_PASTEONLY,
+	OLEUIPASTE_LINKTYPE1,
+	OLEUIPASTE_LINKTYPE2,
+	OLEUIPASTE_LINKTYPE3 = 4,
+	OLEUIPASTE_LINKTYPE4 = 8,
+	OLEUIPASTE_LINKTYPE5 = 16,
+	OLEUIPASTE_LINKTYPE6 = 32,
+	OLEUIPASTE_LINKTYPE7 = 64,
+	OLEUIPASTE_LINKTYPE8 = 128,
+	OLEUIPASTE_PASTE = 512,
+	OLEUIPASTE_LINKANYTYPE = 1024,
+	OLEUIPASTE_ENABLEICON = 2048
+}
+
+struct OLEUIPASTEENTRYW {
+	FORMATETC fmtetc;
+	LPCWSTR lpstrFormatName;
+	LPCWSTR lpstrResultText;
+	DWORD dwFlags;
+	DWORD dwScratchSpace;
+}
+alias OLEUIPASTEENTRYW* POLEUIPASTEENTRYW, LPOLEUIPASTEENTRYW;
+
+struct OLEUIPASTEENTRYA {
+	FORMATETC fmtetc;
+	LPCSTR lpstrFormatName;
+	LPCSTR lpstrResultText;
+	DWORD dwFlags;
+	DWORD dwScratchSpace;
+}
+alias OLEUIPASTEENTRYA* POLEUIPASTEENTRYA, LPOLEUIPASTEENTRYA;
+
+struct OLEUIPASTESPECIALW {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	HWND hWndOwner;
+	LPCWSTR lpszCaption;
+	LPFNOLEUIHOOK lpfnHook;
+	LPARAM lCustData;
+	HINSTANCE hInstance;
+	LPCWSTR lpszTemplate;
+	HRSRC hResource;
+	LPDATAOBJECT lpSrcDataObj;
+	LPOLEUIPASTEENTRYW arrPasteEntries;
+	int cPasteEntries;
+	UINT *arrLinkTypes;
+	int cLinkTypes;
+	UINT cClsidExclude;
+	LPCLSID lpClsidExclude;
+	int nSelectedIndex;
+	BOOL fLink;
+	HGLOBAL hMetaPict;
+	SIZEL sizel;
+}
+alias OLEUIPASTESPECIALW* POLEUIPASTESPECIALW, LPOLEUIPASTESPECIALW;
+
+struct OLEUIPASTESPECIALA {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	HWND hWndOwner;
+	LPCSTR lpszCaption;
+	LPFNOLEUIHOOK lpfnHook;
+	LPARAM lCustData;
+	HINSTANCE hInstance;
+	LPCSTR lpszTemplate;
+	HRSRC hResource;
+	LPDATAOBJECT lpSrcDataObj;
+	LPOLEUIPASTEENTRYA arrPasteEntries;
+	int cPasteEntries;
+	UINT* arrLinkTypes;
+	int cLinkTypes;
+	UINT cClsidExclude;
+	LPCLSID lpClsidExclude;
+	int nSelectedIndex;
+	BOOL fLink;
+	HGLOBAL hMetaPict;
+	SIZEL sizel;
+}
+alias OLEUIPASTESPECIALA* POLEUIPASTESPECIALA, LPOLEUIPASTESPECIALA;
+
+interface IOleUILinkContainerW : public IUnknown
+{
+	HRESULT QueryInterface(REFIID, PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	DWORD GetNextLink(DWORD dwLink);
+	HRESULT SetLinkUpdateOptions(DWORD, DWORD);
+	HRESULT GetLinkUpdateOptions(DWORD, PDWORD);
+	HRESULT SetLinkSource(DWORD, LPWSTR, ULONG, PULONG, BOOL);
+	HRESULT GetLinkSource(DWORD, LPWSTR*, PULONG, LPWSTR*, LPWSTR*, BOOL*, BOOL*);
+	HRESULT OpenLinkSource(DWORD);
+	HRESULT UpdateLink(DWORD, BOOL, BOOL);
+	HRESULT CancelLink(DWORD);
+}
+alias IOleUILinkContainerW* LPOLEUILINKCONTAINERW;
+
+interface IOleUILinkContainerA : public IUnknown
+{
+	HRESULT QueryInterface(REFIID, PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	DWORD GetNextLink(DWORD);
+	HRESULT SetLinkUpdateOptions(DWORD, DWORD);
+	HRESULT GetLinkUpdateOptions(DWORD, PDWORD);
+	HRESULT SetLinkSource(DWORD, LPSTR, ULONG, PULONG, BOOL);
+	HRESULT GetLinkSource(DWORD, LPSTR*, PULONG, LPSTR*, LPSTR*, BOOL*, BOOL*);
+	HRESULT OpenLinkSource(DWORD);
+	HRESULT UpdateLink(DWORD, BOOL, BOOL);
+	HRESULT CancelLink(DWORD);
+}
+alias IOleUILinkContainerA* LPOLEUILINKCONTAINERA;
+
+struct OLEUIEDITLINKSW {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	HWND hWndOwner;
+	LPCWSTR lpszCaption;
+	LPFNOLEUIHOOK lpfnHook;
+	LPARAM lCustData;
+	HINSTANCE hInstance;
+	LPCWSTR lpszTemplate;
+	HRSRC hResource;
+	LPOLEUILINKCONTAINERW lpOleUILinkContainer;
+}
+alias OLEUIEDITLINKSW* POLEUIEDITLINKSW, LPOLEUIEDITLINKSW;
+
+struct OLEUIEDITLINKSA {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	HWND hWndOwner;
+	LPCSTR lpszCaption;
+	LPFNOLEUIHOOK lpfnHook;
+	LPARAM lCustData;
+	HINSTANCE hInstance;
+	LPCSTR lpszTemplate;
+	HRSRC hResource;
+	LPOLEUILINKCONTAINERA lpOleUILinkContainer;
+}
+alias OLEUIEDITLINKSA* POLEUIEDITLINKSA, LPOLEUIEDITLINKSA;
+
+struct OLEUICHANGEICONW {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	HWND hWndOwner;
+	LPCWSTR lpszCaption;
+	LPFNOLEUIHOOK lpfnHook;
+	LPARAM lCustData;
+	HINSTANCE hInstance;
+	LPCWSTR lpszTemplate;
+	HRSRC hResource;
+	HGLOBAL hMetaPict;
+	CLSID clsid;
+	WCHAR szIconExe[MAX_PATH];
+	int cchIconExe;
+}
+alias OLEUICHANGEICONW* POLEUICHANGEICONW, LPOLEUICHANGEICONW;
+
+struct OLEUICHANGEICONA {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	HWND hWndOwner;
+	LPCSTR lpszCaption;
+	LPFNOLEUIHOOK lpfnHook;
+	LPARAM lCustData;
+	HINSTANCE hInstance;
+	LPCSTR lpszTemplate;
+	HRSRC hResource;
+	HGLOBAL hMetaPict;
+	CLSID clsid;
+	CHAR szIconExe[MAX_PATH];
+	int cchIconExe;
+}
+alias OLEUICHANGEICONA* POLEUICHANGEICONA, LPOLEUICHANGEICONA;
+
+struct OLEUICONVERTW {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	HWND hWndOwner;
+	LPCWSTR lpszCaption;
+	LPFNOLEUIHOOK lpfnHook;
+	LPARAM lCustData;
+	HINSTANCE hInstance;
+	LPCWSTR lpszTemplate;
+	HRSRC hResource;
+	CLSID clsid;
+	CLSID clsidConvertDefault;
+	CLSID clsidActivateDefault;
+	CLSID clsidNew;
+	DWORD dvAspect;
+	WORD wFormat;
+	BOOL fIsLinkedObject;
+	HGLOBAL hMetaPict;
+	LPWSTR lpszUserType;
+	BOOL fObjectsIconChanged;
+	LPWSTR lpszDefLabel;
+	UINT cClsidExclude;
+	LPCLSID lpClsidExclude;
+}
+alias OLEUICONVERTW* POLEUICONVERTW, LPOLEUICONVERTW;
+
+struct OLEUICONVERTA {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	HWND hWndOwner;
+	LPCSTR lpszCaption;
+	LPFNOLEUIHOOK lpfnHook;
+	LPARAM lCustData;
+	HINSTANCE hInstance;
+	LPCSTR lpszTemplate;
+	HRSRC hResource;
+	CLSID clsid;
+	CLSID clsidConvertDefault;
+	CLSID clsidActivateDefault;
+	CLSID clsidNew;
+	DWORD dvAspect;
+	WORD wFormat;
+	BOOL fIsLinkedObject;
+	HGLOBAL hMetaPict;
+	LPSTR lpszUserType;
+	BOOL fObjectsIconChanged;
+	LPSTR lpszDefLabel;
+	UINT cClsidExclude;
+	LPCLSID lpClsidExclude;
+}
+alias OLEUICONVERTA* POLEUICONVERTA, LPOLEUICONVERTA;
+
+struct OLEUIBUSYW {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	HWND hWndOwner;
+	LPCWSTR lpszCaption;
+	LPFNOLEUIHOOK lpfnHook;
+	LPARAM lCustData;
+	HINSTANCE hInstance;
+	LPCWSTR lpszTemplate;
+	HRSRC hResource;
+	HTASK hTask;
+	HWND *lphWndDialog;
+}
+alias OLEUIBUSYW* POLEUIBUSYW, LPOLEUIBUSYW;
+
+struct OLEUIBUSYA {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	HWND hWndOwner;
+	LPCSTR lpszCaption;
+	LPFNOLEUIHOOK lpfnHook;
+	LPARAM lCustData;
+	HINSTANCE hInstance;
+	LPCSTR lpszTemplate;
+	HRSRC hResource;
+	HTASK hTask;
+	HWND *lphWndDialog;
+}
+alias OLEUIBUSYA* POLEUIBUSYA, LPOLEUIBUSYA;
+
+struct OLEUICHANGESOURCEW {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	HWND hWndOwner;
+	LPCWSTR lpszCaption;
+	LPFNOLEUIHOOK lpfnHook;
+	LPARAM lCustData;
+	HINSTANCE hInstance;
+	LPCWSTR lpszTemplate;
+	HRSRC hResource;
+	OPENFILENAMEW* lpOFN;
+	DWORD dwReserved1[4];
+	LPOLEUILINKCONTAINERW lpOleUILinkContainer;
+	DWORD dwLink;
+	LPWSTR lpszDisplayName;
+	ULONG nFileLength;
+	LPWSTR lpszFrom;
+	LPWSTR lpszTo;
+}
+alias OLEUICHANGESOURCEW* POLEUICHANGESOURCEW, LPOLEUICHANGESOURCEW;
+
+struct OLEUICHANGESOURCEA {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	HWND hWndOwner;
+	LPCSTR lpszCaption;
+	LPFNOLEUIHOOK lpfnHook;
+	LPARAM lCustData;
+	HINSTANCE hInstance;
+	LPCSTR lpszTemplate;
+	HRSRC hResource;
+	OPENFILENAMEA *lpOFN;
+	DWORD dwReserved1[4];
+	LPOLEUILINKCONTAINERA lpOleUILinkContainer;
+	DWORD dwLink;
+	LPSTR lpszDisplayName;
+	ULONG nFileLength;
+	LPSTR lpszFrom;
+	LPSTR lpszTo;
+}
+alias OLEUICHANGESOURCEA* POLEUICHANGESOURCEA, LPOLEUICHANGESOURCEA;
+
+interface IOleUIObjInfoW : public IUnknown
+{
+	HRESULT QueryInterface(REFIID, PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT GetObjectInfo(DWORD, PDWORD, LPWSTR*, LPWSTR*, LPWSTR*, LPWSTR*);
+	HRESULT GetConvertInfo(DWORD, CLSID*, PWORD, CLSID*, LPCLSID*, UINT*);
+	HRESULT ConvertObject(DWORD, REFCLSID);
+	HRESULT GetViewInfo(DWORD, HGLOBAL*, PDWORD, int*);
+	HRESULT SetViewInfo(DWORD, HGLOBAL, DWORD, int, BOOL);
+}
+alias IOleUIObjInfoW *LPOLEUIOBJINFOW;
+
+interface IOleUIObjInfoA : public IUnknown
+{
+	HRESULT QueryInterface(REFIID, PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT GetObjectInfo(DWORD, PDWORD, LPSTR*, LPSTR*, LPSTR*, LPSTR*);
+	HRESULT GetConvertInfo(DWORD, CLSID*, PWORD, CLSID*, LPCLSID*, UINT*);
+	HRESULT ConvertObject(DWORD, REFCLSID);
+	HRESULT GetViewInfo(DWORD, HGLOBAL*, PDWORD, int*);
+	HRESULT SetViewInfo(DWORD, HGLOBAL, DWORD, int, BOOL);
+}
+alias IOleUIObjInfoA *LPOLEUIOBJINFOA;
+
+interface IOleUILinkInfoW : public IOleUILinkContainerW
+{
+	HRESULT QueryInterface(REFIID, PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	DWORD GetNextLink(DWORD);
+	HRESULT SetLinkUpdateOptions(DWORD, DWORD);
+	HRESULT GetLinkUpdateOptions(DWORD, DWORD*);
+	HRESULT SetLinkSource(DWORD, LPWSTR, ULONG, PULONG, BOOL);
+	HRESULT GetLinkSource(DWORD, LPWSTR*, PULONG, LPWSTR*, LPWSTR*, BOOL*, BOOL*);
+	HRESULT OpenLinkSource(DWORD);
+	HRESULT UpdateLink(DWORD, BOOL, BOOL);
+	HRESULT CancelLink(DWORD);
+	HRESULT GetLastUpdate(DWORD, FILETIME*);
+}
+alias IOleUILinkInfoW *LPOLEUILINKINFOW;
+
+interface IOleUILinkInfoA : public IOleUILinkContainerA
+{
+	HRESULT QueryInterface(REFIID, PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	DWORD GetNextLink(DWORD);
+	HRESULT SetLinkUpdateOptions(DWORD, DWORD);
+	HRESULT GetLinkUpdateOptions(DWORD, DWORD*);
+	HRESULT SetLinkSource(DWORD, LPSTR, ULONG, PULONG, BOOL);
+	HRESULT GetLinkSource(DWORD, LPSTR*, PULONG, LPSTR*, LPSTR*, BOOL*, BOOL*);
+	HRESULT OpenLinkSource(DWORD);
+	HRESULT UpdateLink(DWORD, BOOL, BOOL);
+	HRESULT CancelLink(DWORD);
+	HRESULT GetLastUpdate(DWORD, FILETIME*);
+}
+alias IOleUILinkInfoA* LPOLEUILINKINFOA;
+
+struct OLEUIGNRLPROPSW {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	DWORD dwReserved1[2];
+	LPFNOLEUIHOOK lpfnHook;
+	LPARAM lCustData;
+	DWORD dwReserved2[3];
+	OLEUIOBJECTPROPSW* lpOP;
+}
+alias OLEUIGNRLPROPSW* POLEUIGNRLPROPSW, LPOLEUIGNRLPROPSW;
+
+struct OLEUIGNRLPROPSA {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	DWORD dwReserved1[2];
+	LPFNOLEUIHOOK lpfnHook;
+	LPARAM lCustData;
+	DWORD dwReserved2[3];
+	OLEUIOBJECTPROPSA* lpOP;
+}
+alias OLEUIGNRLPROPSA* POLEUIGNRLPROPSA, LPOLEUIGNRLPROPSA;
+
+struct OLEUIVIEWPROPSW {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	DWORD dwReserved1[2];
+	LPFNOLEUIHOOK lpfnHook;
+	LPARAM lCustData;
+	DWORD dwReserved2[3];
+	OLEUIOBJECTPROPSW* lpOP;
+	int nScaleMin;
+	int nScaleMax;
+}
+alias OLEUIVIEWPROPSW* POLEUIVIEWPROPSW, LPOLEUIVIEWPROPSW;
+
+struct OLEUIVIEWPROPSA {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	DWORD dwReserved1[2];
+	LPFNOLEUIHOOK lpfnHook;
+	LPARAM lCustData;
+	DWORD dwReserved2[3];
+	OLEUIOBJECTPROPSA *lpOP;
+	int nScaleMin;
+	int nScaleMax;
+}
+alias OLEUIVIEWPROPSA* POLEUIVIEWPROPSA, LPOLEUIVIEWPROPSA;
+
+struct OLEUILINKPROPSW {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	DWORD dwReserved1[2];
+	LPFNOLEUIHOOK lpfnHook;
+	LPARAM lCustData;
+	DWORD dwReserved2[3];
+	OLEUIOBJECTPROPSW *lpOP;
+}
+alias OLEUILINKPROPSW* POLEUILINKPROPSW, LPOLEUILINKPROPSW;
+
+struct OLEUILINKPROPSA {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	DWORD dwReserved1[2];
+	LPFNOLEUIHOOK lpfnHook;
+	LPARAM lCustData;
+	DWORD dwReserved2[3];
+	OLEUIOBJECTPROPSA* lpOP;
+}
+alias OLEUILINKPROPSA*  POLEUILINKPROPSA, LPOLEUILINKPROPSA;
+
+struct OLEUIOBJECTPROPSW {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	LPPROPSHEETHEADERW lpPS;
+	DWORD dwObject;
+	LPOLEUIOBJINFOW lpObjInfo;
+	DWORD dwLink;
+	LPOLEUILINKINFOW lpLinkInfo;
+	LPOLEUIGNRLPROPSW lpGP;
+	LPOLEUIVIEWPROPSW lpVP;
+	LPOLEUILINKPROPSW lpLP;
+}
+alias OLEUIOBJECTPROPSW* POLEUIOBJECTPROPSW, LPOLEUIOBJECTPROPSW;
+
+struct OLEUIOBJECTPROPSA {
+	DWORD cbStruct;
+	DWORD dwFlags;
+	LPPROPSHEETHEADERA lpPS;
+	DWORD dwObject;
+	LPOLEUIOBJINFOA lpObjInfo;
+	DWORD dwLink;
+	LPOLEUILINKINFOA lpLinkInfo;
+	LPOLEUIGNRLPROPSA lpGP;
+	LPOLEUIVIEWPROPSA lpVP;
+	LPOLEUILINKPROPSA lpLP;
+}
+alias OLEUIOBJECTPROPSA* POLEUIOBJECTPROPSA, LPOLEUIOBJECTPROPSA;
+
+extern (Windows) {
+	BOOL OleUIAddVerbMenuW(LPOLEOBJECT, LPCWSTR, HMENU, UINT, UINT, UINT, BOOL, UINT, HMENU*);
+	BOOL OleUIAddVerbMenuA(LPOLEOBJECT, LPCSTR, HMENU, UINT, UINT, UINT, BOOL, UINT, HMENU*);
+	UINT OleUIBusyW(LPOLEUIBUSYW);
+	UINT OleUIBusyA(LPOLEUIBUSYA);
+	BOOL OleUICanConvertOrActivateAs(REFCLSID, BOOL, WORD);
+	UINT OleUIChangeIconW(LPOLEUICHANGEICONW);
+	UINT OleUIChangeIconA(LPOLEUICHANGEICONA);
+	UINT OleUIChangeSourceW(LPOLEUICHANGESOURCEW);
+	UINT OleUIChangeSourceA(LPOLEUICHANGESOURCEA);
+	UINT OleUIConvertW(LPOLEUICONVERTW);
+	UINT OleUIConvertA(LPOLEUICONVERTA);
+	UINT OleUIEditLinksW(LPOLEUIEDITLINKSW);
+	UINT OleUIEditLinksA(LPOLEUIEDITLINKSA);
+	UINT OleUIObjectPropertiesW(LPOLEUIOBJECTPROPSW);
+	UINT OleUIObjectPropertiesA(LPOLEUIOBJECTPROPSA);
+	UINT OleUIPasteSpecialW(LPOLEUIPASTESPECIALW);
+	UINT OleUIPasteSpecialA(LPOLEUIPASTESPECIALA);
+	BOOL OleUIUpdateLinksW(LPOLEUILINKCONTAINERW, HWND, LPWSTR, int);
+	BOOL OleUIUpdateLinksA(LPOLEUILINKCONTAINERA, HWND, LPSTR, int);
+}
+
+extern (C) {
+	int OleUIPromptUserW(int, HWND, ...);
+	int OleUIPromptUserA(int, HWND, ...);
+}
+
+version(Unicode) {
+	alias IDD_SERVERNOTREGW IDD_SERVERNOTREG;
+	alias IDD_LINKTYPECHANGEDW IDD_LINKTYPECHANGED;
+	alias OleUIUpdateLinksW OleUIUpdateLinks;
+	alias OleUIAddVerbMenuW OleUIAddVerbMenu;
+	alias OLEUIOBJECTPROPSW OLEUIOBJECTPROPS;
+	alias POLEUIOBJECTPROPSW POLEUIOBJECTPROPS;
+	alias LPOLEUIOBJECTPROPSW LPOLEUIOBJECTPROPS;
+	alias OleUIObjectPropertiesW OleUIObjectProperties;
+	alias OLEUIINSERTOBJECTW OLEUIINSERTOBJECT;
+	alias POLEUIINSERTOBJECTW POLEUIINSERTOBJECT;
+	alias LPOLEUIINSERTOBJECTW LPOLEUIINSERTOBJECT;
+	alias OleUIInsertObjectW OleUIInsertObject;
+	alias OleUIPromptUserW OleUIPromptUser;
+	alias OLEUIPASTEENTRYW OLEUIPASTEENTRY;
+	alias POLEUIPASTEENTRYW POLEUIPASTEENTRY;
+	alias LPOLEUIPASTEENTRYW LPOLEUIPASTEENTRY;
+	alias OLEUIPASTESPECIALW OLEUIPASTESPECIAL;
+	alias POLEUIPASTESPECIALW POLEUIPASTESPECIAL;
+	alias LPOLEUIPASTESPECIALW LPOLEUIPASTESPECIAL;
+	alias OleUIPasteSpecialW OleUIPasteSpecial;
+	alias IOleUILinkContainerW IOleUILinkContainer;
+	alias LPOLEUILINKCONTAINERW LPOLEUILINKCONTAINER;
+	alias OLEUIEDITLINKSW OLEUIEDITLINKS;
+	alias POLEUIEDITLINKSW POLEUIEDITLINKS;
+	alias LPOLEUIEDITLINKSW LPOLEUIEDITLINKS;
+	alias OleUIEditLinksW OleUIEditLinks;
+	alias OLEUICHANGEICONW OLEUICHANGEICON;
+	alias POLEUICHANGEICONW POLEUICHANGEICON;
+	alias LPOLEUICHANGEICONW LPOLEUICHANGEICON;
+	alias OleUIChangeIconW OleUIChangeIcon;
+	alias OLEUICONVERTW OLEUICONVERT;
+	alias POLEUICONVERTW POLEUICONVERT;
+	alias LPOLEUICONVERTW LPOLEUICONVERT;
+	alias OleUIConvertW OleUIConvert;
+	alias OLEUIBUSYW OLEUIBUSY;
+	alias POLEUIBUSYW POLEUIBUSY;
+	alias LPOLEUIBUSYW LPOLEUIBUSY;
+	alias OleUIBusyW OleUIBusy;
+	alias OLEUICHANGESOURCEW OLEUICHANGESOURCE;
+	alias POLEUICHANGESOURCEW POLEUICHANGESOURCE;
+	alias LPOLEUICHANGESOURCEW LPOLEUICHANGESOURCE;
+	alias OleUIChangeSourceW OleUIChangeSource;
+	alias IOleUIObjInfoW IOleUIObjInfo;
+	alias LPOLEUIOBJINFOW LPOLEUIOBJINFO;
+	alias IOleUILinkInfoW IOleUILinkInfo;
+	//alias IOleUILinkInfoWVtbl IOleUILinkInfoVtbl;
+	alias LPOLEUILINKINFOW LPOLEUILINKINFO;
+	alias OLEUIGNRLPROPSW OLEUIGNRLPROPS;
+	alias POLEUIGNRLPROPSW POLEUIGNRLPROPS;
+	alias LPOLEUIGNRLPROPSW LPOLEUIGNRLPROPS;
+	alias OLEUIVIEWPROPSW OLEUIVIEWPROPS;
+	alias POLEUIVIEWPROPSW POLEUIVIEWPROPS;
+	alias LPOLEUIVIEWPROPSW LPOLEUIVIEWPROPS;
+	alias OLEUILINKPROPSW OLEUILINKPROPS;
+	alias POLEUILINKPROPSW POLEUILINKPROPS;
+	alias LPOLEUILINKPROPSW LPOLEUILINKPROPS;
+} else {
+	alias IDD_SERVERNOTREGA IDD_SERVERNOTREG;
+	alias IDD_LINKTYPECHANGEDA IDD_LINKTYPECHANGED;
+	alias OleUIUpdateLinksA OleUIUpdateLinks;
+	alias OleUIAddVerbMenuA OleUIAddVerbMenu;
+	alias OLEUIOBJECTPROPSA OLEUIOBJECTPROPS;
+	alias POLEUIOBJECTPROPSA POLEUIOBJECTPROPS;
+	alias LPOLEUIOBJECTPROPSA LPOLEUIOBJECTPROPS;
+	alias OleUIObjectPropertiesA OleUIObjectProperties;
+	alias OLEUIINSERTOBJECTA OLEUIINSERTOBJECT;
+	alias POLEUIINSERTOBJECTA POLEUIINSERTOBJECT;
+	alias LPOLEUIINSERTOBJECTA LPOLEUIINSERTOBJECT;
+	alias OleUIInsertObjectA OleUIInsertObject;
+	alias OleUIPromptUserA OleUIPromptUser;
+	alias OLEUIPASTEENTRYA OLEUIPASTEENTRY;
+	alias POLEUIPASTEENTRYA POLEUIPASTEENTRY;
+	alias LPOLEUIPASTEENTRYA LPOLEUIPASTEENTRY;
+	alias OLEUIPASTESPECIALA OLEUIPASTESPECIAL;
+	alias POLEUIPASTESPECIALA POLEUIPASTESPECIAL;
+	alias LPOLEUIPASTESPECIALA LPOLEUIPASTESPECIAL;
+	alias OleUIPasteSpecialA OleUIPasteSpecial;
+	alias IOleUILinkContainerA IOleUILinkContainer;
+	alias LPOLEUILINKCONTAINERA LPOLEUILINKCONTAINER;
+	alias OLEUIEDITLINKSA OLEUIEDITLINKS;
+	alias POLEUIEDITLINKSA POLEUIEDITLINKS;
+	alias LPOLEUIEDITLINKSA LPOLEUIEDITLINKS;
+	alias OleUIEditLinksA OleUIEditLinks;
+	alias OLEUICHANGEICONA OLEUICHANGEICON;
+	alias POLEUICHANGEICONA POLEUICHANGEICON;
+	alias LPOLEUICHANGEICONA LPOLEUICHANGEICON;
+	alias OleUIChangeIconA OleUIChangeIcon;
+	alias OLEUICONVERTA OLEUICONVERT;
+	alias POLEUICONVERTA POLEUICONVERT;
+	alias LPOLEUICONVERTA LPOLEUICONVERT;
+	alias OleUIConvertA OleUIConvert;
+	alias OLEUIBUSYA OLEUIBUSY;
+	alias POLEUIBUSYA POLEUIBUSY;
+	alias LPOLEUIBUSYA LPOLEUIBUSY;
+	alias OleUIBusyA OleUIBusy;
+	alias OLEUICHANGESOURCEA OLEUICHANGESOURCE;
+	alias POLEUICHANGESOURCEA POLEUICHANGESOURCE;
+	alias LPOLEUICHANGESOURCEA LPOLEUICHANGESOURCE;
+	alias OleUIChangeSourceA OleUIChangeSource;
+	alias IOleUIObjInfoA IOleUIObjInfo;
+	alias LPOLEUIOBJINFOA LPOLEUIOBJINFO;
+	alias IOleUILinkInfoA IOleUILinkInfo;
+	//alias IOleUILinkInfoAVtbl IOleUILinkInfoVtbl;
+	alias LPOLEUILINKINFOA LPOLEUILINKINFO;
+	alias OLEUIGNRLPROPSA OLEUIGNRLPROPS;
+	alias POLEUIGNRLPROPSA POLEUIGNRLPROPS;
+	alias LPOLEUIGNRLPROPSA LPOLEUIGNRLPROPS;
+	alias OLEUIVIEWPROPSA OLEUIVIEWPROPS;
+	alias POLEUIVIEWPROPSA POLEUIVIEWPROPS;
+	alias LPOLEUIVIEWPROPSA LPOLEUIVIEWPROPS;
+	alias OLEUILINKPROPSA OLEUILINKPROPS;
+	alias POLEUILINKPROPSA POLEUILINKPROPS;
+	alias LPOLEUILINKPROPSA LPOLEUILINKPROPS;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/oleidl.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,270 @@
+/***********************************************************************\
+*                                oleidl.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.oleidl;
+
+// DAC: This is defined in ocidl !!
+// what is it doing in here?
+//alias IEnumOleUndoUnits* LPENUMOLEUNDOUNITS;
+
+private import win32.basetyps, win32.objidl, win32.unknwn, win32.windef,
+  win32.winuser, win32.wtypes;
+private import win32.objfwd; // for LPMONIKER
+private import win32.wingdi; // for LPLOGPALETTE
+
+const MK_ALT = 32;
+
+enum BINDSPEED {
+	BINDSPEED_INDEFINITE = 1,
+	BINDSPEED_MODERATE,
+	BINDSPEED_IMMEDIATE
+}
+
+enum OLEWHICHMK {
+	OLEWHICHMK_CONTAINER = 1,
+	OLEWHICHMK_OBJREL,
+	OLEWHICHMK_OBJFULL
+}
+
+enum OLEGETMONIKER {
+	OLEGETMONIKER_ONLYIFTHERE = 1,
+	OLEGETMONIKER_FORCEASSIGN,
+	OLEGETMONIKER_UNASSIGN,
+	OLEGETMONIKER_TEMPFORUSER
+}
+
+enum USERCLASSTYPE {
+	USERCLASSTYPE_FULL = 1,
+	USERCLASSTYPE_SHORT,
+	USERCLASSTYPE_APPNAME
+}
+
+enum DROPEFFECT {
+	DROPEFFECT_NONE   = 0,
+	DROPEFFECT_COPY   = 1,
+	DROPEFFECT_MOVE   = 2,
+	DROPEFFECT_LINK   = 4,
+	DROPEFFECT_SCROLL = 0x80000000
+}
+
+struct OLEMENUGROUPWIDTHS {
+	LONG width[6];
+}
+alias OLEMENUGROUPWIDTHS* LPOLEMENUGROUPWIDTHS;
+
+alias HGLOBAL HOLEMENU;
+
+enum OLECLOSE {
+	OLECLOSE_SAVEIFDIRTY,
+	OLECLOSE_NOSAVE,
+	OLECLOSE_PROMPTSAVE
+}
+
+struct OLEVERB {
+	LONG lVerb;
+	LPWSTR lpszVerbName;
+	DWORD fuFlags;
+	DWORD grfAttribs;
+}
+alias OLEVERB* LPOLEVERB;
+
+alias RECT BORDERWIDTHS;
+alias LPRECT LPBORDERWIDTHS;
+alias LPCRECT LPCBORDERWIDTHS;
+
+struct OLEINPLACEFRAMEINFO {
+	UINT cb;
+	BOOL fMDIApp;
+	HWND hwndFrame;
+	HACCEL haccel;
+	UINT cAccelEntries;
+}
+alias OLEINPLACEFRAMEINFO* LPOLEINPLACEFRAMEINFO;
+
+interface IEnumOLEVERB : public IUnknown
+{
+	  HRESULT Next(ULONG,OLEVERB*,ULONG*);
+	  HRESULT Skip(ULONG);
+	  HRESULT Reset();
+	  HRESULT Clone(IEnumOLEVERB**);
+}
+//alias IEnumOLEVERB IEnumOleVerb;
+alias IEnumOLEVERB LPENUMOLEVERB;
+
+
+interface IParseDisplayName : public IUnknown {
+	HRESULT ParseDisplayName(IBindCtx*,LPOLESTR,ULONG*,IMoniker**);
+}
+alias IParseDisplayName LPPARSEDISPLAYNAME;
+
+interface IOleContainer : public IParseDisplayName {
+	HRESULT EnumObjects(DWORD,IEnumUnknown**);
+	HRESULT LockContainer(BOOL);
+}
+alias IOleContainer LPOLECONTAINER;
+
+interface IOleItemContainer : public IOleContainer {
+	HRESULT GetObject(LPOLESTR,DWORD,IBindCtx*,REFIID,void**);
+	HRESULT GetObjectStorage(LPOLESTR,IBindCtx*,REFIID,void**);
+	HRESULT IsRunning(LPOLESTR);
+}
+
+
+interface IOleClientSite : public IUnknown {
+	HRESULT SaveObject();
+	HRESULT GetMoniker(DWORD,DWORD,LPMONIKER*);
+	HRESULT GetContainer(LPOLECONTAINER*);
+	HRESULT ShowObject();
+	HRESULT OnShowWindow(BOOL);
+	HRESULT RequestNewObjectLayout();
+}
+alias IOleClientSite LPOLECLIENTSITE;
+
+interface IOleObject : public IUnknown {
+	HRESULT SetClientSite(LPOLECLIENTSITE);
+	HRESULT GetClientSite(LPOLECLIENTSITE*);
+	HRESULT SetHostNames(LPCOLESTR,LPCOLESTR);
+	HRESULT Close(DWORD);
+	HRESULT SetMoniker(DWORD,LPMONIKER);
+	HRESULT GetMoniker(DWORD,DWORD,LPMONIKER*);
+	HRESULT InitFromData(LPDATAOBJECT,BOOL,DWORD);
+	HRESULT GetClipboardData(DWORD,LPDATAOBJECT*);
+	HRESULT DoVerb(LONG,LPMSG,LPOLECLIENTSITE,LONG,HWND,LPCRECT);
+	HRESULT EnumVerbs(LPENUMOLEVERB*);
+	HRESULT Update();
+	HRESULT IsUpToDate();
+	HRESULT GetUserClassID(LPCLSID);
+	HRESULT GetUserType(DWORD,LPOLESTR*);
+	HRESULT SetExtent(DWORD,SIZEL*);
+	HRESULT GetExtent(DWORD,SIZEL*);
+	HRESULT Advise(LPADVISESINK,PDWORD);
+	HRESULT Unadvise(DWORD);
+	HRESULT EnumAdvise(LPENUMSTATDATA*);
+	HRESULT GetMiscStatus(DWORD,PDWORD);
+	HRESULT SetColorScheme(LPLOGPALETTE);
+}
+alias IOleObject LPOLEOBJECT;
+
+interface IOleWindow : public IUnknown {
+	HRESULT GetWindow(HWND*);
+	HRESULT ContextSensitiveHelp(BOOL);
+}
+alias IOleWindow LPOLEWINDOW;
+
+interface IOleInPlaceUIWindow : public IOleWindow {
+	HRESULT GetBorder(LPRECT);
+	HRESULT RequestBorderSpace(LPCBORDERWIDTHS);
+	HRESULT SetBorderSpace(LPCBORDERWIDTHS);
+	HRESULT SetActiveObject(LPOLEINPLACEACTIVEOBJECT,LPCOLESTR);
+}
+alias IOleInPlaceUIWindow LPOLEINPLACEUIWINDOW;
+
+interface IOleInPlaceObject : public IOleWindow {
+	HRESULT InPlaceDeactivate();
+	HRESULT UIDeactivate();
+	HRESULT SetObjectRects(LPCRECT,LPCRECT);
+	HRESULT ReactivateAndUndo();
+}
+
+
+interface IOleInPlaceActiveObject : public IOleWindow {
+	HRESULT TranslateAccelerator(LPMSG);
+	HRESULT OnFrameWindowActivate(BOOL);
+	HRESULT OnDocWindowActivate(BOOL);
+	HRESULT ResizeBorder(LPCRECT,LPOLEINPLACEUIWINDOW,BOOL);
+	HRESULT EnableModeless(BOOL);
+}
+alias IOleInPlaceActiveObject LPOLEINPLACEACTIVEOBJECT;
+
+interface IOleInPlaceFrame : public IOleInPlaceUIWindow {
+	HRESULT InsertMenus(HMENU,LPOLEMENUGROUPWIDTHS);
+	HRESULT SetMenu(HMENU,HOLEMENU,HWND);
+	HRESULT RemoveMenus(HMENU);
+	HRESULT SetStatusText(LPCOLESTR);
+	HRESULT EnableModeless(BOOL);
+	HRESULT TranslateAccelerator(LPMSG,WORD);
+}
+alias IOleInPlaceFrame LPOLEINPLACEFRAME;
+
+interface IOleInPlaceSite  : public IOleWindow {
+	HRESULT CanInPlaceActivate();
+	HRESULT OnInPlaceActivate();
+	HRESULT OnUIActivate();
+	HRESULT GetWindowContext(IOleInPlaceFrame*,IOleInPlaceUIWindow*,LPRECT,LPRECT,LPOLEINPLACEFRAMEINFO);
+	HRESULT Scroll(SIZE);
+	HRESULT OnUIDeactivate(BOOL);
+	HRESULT OnInPlaceDeactivate();
+	HRESULT DiscardUndoState();
+	HRESULT DeactivateAndUndo();
+	HRESULT OnPosRectChange(LPCRECT);
+}
+
+interface IOleAdviseHolder : public IUnknown {
+	HRESULT Advise(LPADVISESINK,PDWORD);
+	HRESULT Unadvise(DWORD);
+	HRESULT EnumAdvise(LPENUMSTATDATA*);
+	HRESULT SendOnRename(LPMONIKER);
+	HRESULT SendOnSave();
+	HRESULT SendOnClose();
+}
+alias IOleAdviseHolder LPOLEADVISEHOLDER;
+
+interface IDropSource : public IUnknown {
+	HRESULT QueryContinueDrag(BOOL,DWORD);
+	HRESULT GiveFeedback(DWORD);
+}
+alias IDropSource LPDROPSOURCE;
+
+interface IDropTarget : public IUnknown {
+	HRESULT DragEnter(LPDATAOBJECT,DWORD,POINTL,PDWORD);
+	HRESULT DragOver(DWORD,POINTL,PDWORD);
+	HRESULT DragLeave();
+	HRESULT Drop(LPDATAOBJECT,DWORD,POINTL,PDWORD);
+}
+alias IDropTarget LPDROPTARGET;
+
+extern (Windows) {
+	alias BOOL function(DWORD) __IView_pfncont;
+}
+
+interface IViewObject : public IUnknown {
+	HRESULT Draw(DWORD,LONG,PVOID,DVTARGETDEVICE*,HDC,HDC,LPCRECTL,LPCRECTL,__IView_pfncont pfnContinue,DWORD);
+	HRESULT GetColorSet(DWORD,LONG,PVOID,DVTARGETDEVICE*,HDC,LPLOGPALETTE*);
+	HRESULT Freeze(DWORD,LONG,PVOID,PDWORD);
+	HRESULT Unfreeze(DWORD);
+	HRESULT SetAdvise(DWORD,DWORD,IAdviseSink*);
+	HRESULT GetAdvise(PDWORD,PDWORD,IAdviseSink**);
+}
+alias IViewObject LPVIEWOBJECT;
+
+interface IViewObject2 : public IViewObject {
+	HRESULT GetExtent(DWORD,LONG,DVTARGETDEVICE*,LPSIZEL);
+}
+alias IViewObject2 LPVIEWOBJECT2;
+
+interface IOleCache : public IUnknown {
+	HRESULT Cache(FORMATETC*,DWORD,DWORD*);
+	HRESULT Uncache(DWORD);
+	HRESULT EnumCache(IEnumSTATDATA**);
+	HRESULT InitCache(LPDATAOBJECT);
+	HRESULT SetData(FORMATETC*,STGMEDIUM*,BOOL);
+}
+alias IOleCache LPOLECACHE;
+
+interface IOleCache2 : public IOleCache {
+	HRESULT UpdateCache(LPDATAOBJECT,DWORD,LPVOID);
+	HRESULT DiscardCache(DWORD);
+}
+alias IOleCache2 LPOLECACHE2;
+
+interface IOleCacheControl : public IUnknown {
+	HRESULT OnRun(LPDATAOBJECT);
+	HRESULT OnStop();
+}
+alias IOleCacheControl LPOLECACHECONTROL;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/pbt.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,30 @@
+/***********************************************************************\
+*                                  pbt.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.pbt;
+
+private import win32.windef;
+
+enum : WPARAM {
+	PBT_APMQUERYSUSPEND,
+	PBT_APMQUERYSTANDBY,
+	PBT_APMQUERYSUSPENDFAILED,
+	PBT_APMQUERYSTANDBYFAILED,
+	PBT_APMSUSPEND,
+	PBT_APMSTANDBY,
+	PBT_APMRESUMECRITICAL,
+	PBT_APMRESUMESUSPEND,
+	PBT_APMRESUMESTANDBY,
+	PBT_APMBATTERYLOW,
+	PBT_APMPOWERSTATUSCHANGE,
+	PBT_APMOEMEVENT // = 11
+}
+
+const LPARAM PBTF_APMRESUMEFROMFAILURE = 1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/powrprof.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,140 @@
+/***********************************************************************\
+*                               powrprof.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.powrprof;
+pragma(lib, "powrprof.lib");
+
+private import win32.windef;
+private import win32.ntdef;
+
+// FIXME: look up Windows version support
+
+const ULONG
+	EnableSysTrayBatteryMeter =  1,
+	EnableMultiBatteryDisplay =  2,
+	EnablePasswordLogon       =  4,
+	EnableWakeOnRing          =  8,
+	EnableVideoDimDisplay     = 16;
+
+const UINT NEWSCHEME = -1;
+
+struct GLOBAL_MACHINE_POWER_POLICY {
+	ULONG              Revision;
+	SYSTEM_POWER_STATE LidOpenWakeAc;
+	SYSTEM_POWER_STATE LidOpenWakeDc;
+	ULONG              BroadcastCapacityResolution;
+}
+alias GLOBAL_MACHINE_POWER_POLICY* PGLOBAL_MACHINE_POWER_POLICY;
+
+struct GLOBAL_USER_POWER_POLICY {
+	ULONG               Revision;
+	POWER_ACTION_POLICY PowerButtonAc;
+	POWER_ACTION_POLICY PowerButtonDc;
+	POWER_ACTION_POLICY SleepButtonAc;
+	POWER_ACTION_POLICY SleepButtonDc;
+	POWER_ACTION_POLICY LidCloseAc;
+	POWER_ACTION_POLICY LidCloseDc;
+	SYSTEM_POWER_LEVEL[NUM_DISCHARGE_POLICIES] DischargePolicy;
+	ULONG GlobalFlags;
+}
+alias GLOBAL_USER_POWER_POLICY* PGLOBAL_USER_POWER_POLICY;
+
+struct GLOBAL_POWER_POLICY {
+	GLOBAL_USER_POWER_POLICY    user;
+	GLOBAL_MACHINE_POWER_POLICY mach;
+}
+alias GLOBAL_POWER_POLICY* PGLOBAL_POWER_POLICY;
+
+struct MACHINE_POWER_POLICY {
+	ULONG               Revision;
+	SYSTEM_POWER_STATE  MinSleepAc;
+	SYSTEM_POWER_STATE  MinSleepDc;
+	SYSTEM_POWER_STATE  ReducedLatencySleepAc;
+	SYSTEM_POWER_STATE  ReducedLatencySleepDc;
+	ULONG               DozeTimeoutAc;
+	ULONG               DozeTimeoutDc;
+	ULONG               DozeS4TimeoutAc;
+	ULONG               DozeS4TimeoutDc;
+	UCHAR               MinThrottleAc;
+	UCHAR               MinThrottleDc;
+	UCHAR[2]            pad1;
+	POWER_ACTION_POLICY OverThrottledAc;
+	POWER_ACTION_POLICY OverThrottledDc;
+}
+alias MACHINE_POWER_POLICY* PMACHINE_POWER_POLICY;
+
+struct MACHINE_PROCESSOR_POWER_POLICY {
+	ULONG Revision;
+	PROCESSOR_POWER_POLICY ProcessorPolicyAc;
+	PROCESSOR_POWER_POLICY ProcessorPolicyDc;
+}
+alias MACHINE_PROCESSOR_POWER_POLICY* PMACHINE_PROCESSOR_POWER_POLICY;
+
+struct USER_POWER_POLICY {
+   ULONG               Revision;
+   POWER_ACTION_POLICY IdleAc;
+   POWER_ACTION_POLICY IdleDc;
+   ULONG               IdleTimeoutAc;
+   ULONG               IdleTimeoutDc;
+   UCHAR               IdleSensitivityAc;
+   UCHAR               IdleSensitivityDc;
+   UCHAR               ThrottlePolicyAc;
+   UCHAR               ThrottlePolicyDc;
+   SYSTEM_POWER_STATE  MaxSleepAc;
+   SYSTEM_POWER_STATE  MaxSleepDc;
+   ULONG[2]            Reserved;
+   ULONG               VideoTimeoutAc;
+   ULONG               VideoTimeoutDc;
+   ULONG               SpindownTimeoutAc;
+   ULONG               SpindownTimeoutDc;
+   BOOLEAN             OptimizeForPowerAc;
+   BOOLEAN             OptimizeForPowerDc;
+   UCHAR               FanThrottleToleranceAc;
+   UCHAR               FanThrottleToleranceDc;
+   UCHAR               ForcedThrottleAc;
+   UCHAR               ForcedThrottleDc;
+}
+alias USER_POWER_POLICY* PUSER_POWER_POLICY;
+
+struct POWER_POLICY {
+	USER_POWER_POLICY    user;
+	MACHINE_POWER_POLICY mach;
+}
+alias POWER_POLICY* PPOWER_POLICY;
+
+extern (Windows) {
+	alias BOOLEAN function(UINT, DWORD, LPTSTR, DWORD, LPTSTR, PPOWER_POLICY,
+	  LPARAM) PWRSCHEMESENUMPROC;
+	alias BOOLEAN function(POWER_ACTION, SYSTEM_POWER_STATE, ULONG, BOOLEAN)
+	  PFNNTINITIATEPWRACTION;
+
+	NTSTATUS CallNtPowerInformation(POWER_INFORMATION_LEVEL, PVOID, ULONG,
+	  PVOID, ULONG);
+	BOOLEAN CanUserWritePwrScheme();
+	BOOLEAN DeletePwrScheme(UINT);
+	BOOLEAN EnumPwrSchemes(PWRSCHEMESENUMPROC, LPARAM);
+	BOOLEAN GetActivePwrScheme(PUINT);
+	BOOLEAN GetCurrentPowerPolicies(PGLOBAL_POWER_POLICY, PPOWER_POLICY);
+	BOOLEAN GetPwrCapabilities(PSYSTEM_POWER_CAPABILITIES);
+	BOOLEAN GetPwrDiskSpindownRange(PUINT, PUINT);
+	BOOLEAN IsAdminOverrideActive(PADMINISTRATOR_POWER_POLICY);
+	BOOLEAN IsPwrHibernateAllowed();
+	BOOLEAN IsPwrShutdownAllowed();
+	BOOLEAN IsPwrSuspendAllowed();
+	BOOLEAN ReadGlobalPwrPolicy(PGLOBAL_POWER_POLICY);
+	BOOLEAN ReadProcessorPwrScheme(UINT, PMACHINE_PROCESSOR_POWER_POLICY);
+	BOOLEAN ReadPwrScheme(UINT, PPOWER_POLICY);
+	BOOLEAN SetActivePwrScheme(UINT, PGLOBAL_POWER_POLICY, PPOWER_POLICY);
+	BOOLEAN SetSuspendState(BOOLEAN, BOOLEAN, BOOLEAN);
+	BOOLEAN WriteGlobalPwrPolicy(PGLOBAL_POWER_POLICY);
+	BOOLEAN WriteProcessorPwrScheme(UINT, PMACHINE_PROCESSOR_POWER_POLICY);
+	BOOLEAN ValidatePowerPolicies(PGLOBAL_POWER_POLICY, PPOWER_POLICY);
+	BOOLEAN WritePwrScheme(PUINT, LPTSTR, LPTSTR, PPOWER_POLICY);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/prsht.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,438 @@
+/***********************************************************************\
+*                                prsht.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Vladimir Vlasov                          *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.prsht;
+pragma(lib, "comctl32.lib");
+
+private import win32.w32api, win32.windef, win32.winuser;
+
+const MAXPROPPAGES = 100;
+
+enum {
+	PSP_DEFAULT      = 0x00000000,
+	PSP_DLGINDIRECT  = 0x00000001,
+	PSP_USEHICON     = 0x00000002,
+	PSP_USEICONID    = 0x00000004,
+	PSP_USETITLE     = 0x00000008,
+	PSP_RTLREADING   = 0x00000010,
+	PSP_HASHELP      = 0x00000020,
+	PSP_USEREFPARENT = 0x00000040,
+	PSP_USECALLBACK  = 0x00000080,
+	PSP_PREMATURE    = 0x00000400
+}
+
+static if (_WIN32_IE >= 0x0400) {
+	enum {
+		PSP_HIDEHEADER        = 0x00000800,
+		PSP_USEHEADERTITLE    = 0x00001000,
+		PSP_USEHEADERSUBTITLE = 0x00002000
+	}
+}
+
+enum {
+	PSPCB_RELEASE = 1,
+	PSPCB_CREATE
+}
+
+enum {
+	PSH_DEFAULT           = 0x00000000,
+	PSH_PROPTITLE         = 0x00000001,
+	PSH_USEHICON          = 0x00000002,
+	PSH_USEICONID         = 0x00000004,
+	PSH_PROPSHEETPAGE     = 0x00000008,
+	PSH_WIZARDHASFINISH   = 0x00000010,
+	PSH_WIZARD            = 0x00000020,
+	PSH_USEPSTARTPAGE     = 0x00000040,
+	PSH_NOAPPLYNOW        = 0x00000080,
+	PSH_USECALLBACK       = 0x00000100,
+	PSH_HASHELP           = 0x00000200,
+	PSH_MODELESS          = 0x00000400,
+	PSH_RTLREADING        = 0x00000800,
+	PSH_WIZARDCONTEXTHELP = 0x00001000
+}
+
+static if (_WIN32_IE >= 0x0400) {
+	enum {
+		PSH_WATERMARK        = 0x00008000,
+		PSH_USEHBMWATERMARK  = 0x00010000,
+		PSH_USEHPLWATERMARK  = 0x00020000,
+		PSH_STRETCHWATERMARK = 0x00040000,
+		PSH_HEADER           = 0x00080000,
+		PSH_USEHBMHEADER     = 0x00100000,
+		PSH_USEPAGELANG      = 0x00200000
+	}
+	static if (_WIN32_IE < 0x0500) {
+		enum {
+			PSH_WIZARD97 = 0x00002000
+		}
+	} else {
+		enum {
+			PSH_WIZARD97 = 0x01000000
+		}
+	}
+}
+
+static if (_WIN32_IE >= 0x0500) {
+	enum {
+		PSH_WIZARD_LITE   = 0x00400000,
+		PSH_NOCONTEXTHELP = 0x02000000
+	}
+}
+
+enum {
+	PSCB_INITIALIZED = 1,
+	PSCB_PRECREATE
+}
+
+enum {
+	PSN_FIRST       = (-200),
+	PSN_LAST        = (-299),
+	PSN_SETACTIVE   = (-200),
+	PSN_KILLACTIVE  = (-201),
+	PSN_APPLY       = (-202),
+	PSN_RESET       = (-203),
+	PSN_HELP        = (-205),
+	PSN_WIZBACK     = (-206),
+	PSN_WIZNEXT     = (-207),
+	PSN_WIZFINISH   = (-208),
+	PSN_QUERYCANCEL = (-209)
+}
+static if (_WIN32_IE >= 0x0400) {
+	enum {
+		PSN_GETOBJECT = (-210)
+	}
+}
+static if (_WIN32_IE >= 0x0500) {
+	enum {
+		PSN_TRANSLATEACCELERATOR = (-212),
+		PSN_QUERYINITIALFOCUS    = (-213)
+	}
+}
+
+enum {
+	PSNRET_NOERROR,
+	PSNRET_INVALID,
+	PSNRET_INVALID_NOCHANGEPAGE,
+	PSNRET_MESSAGEHANDLED
+}
+
+enum {
+	ID_PSRESTARTWINDOWS = 0x2,
+	ID_PSREBOOTSYSTEM   = ID_PSRESTARTWINDOWS | 0x1
+}
+
+enum {
+	WIZ_CXDLG  = 276,
+	WIZ_CYDLG  = 140,
+	WIZ_CXBMP  = 80,
+	WIZ_BODYX  = 92,
+	WIZ_BODYCX = 184
+}
+
+enum {
+	PROP_SM_CXDLG  = 212,
+	PROP_SM_CYDLG  = 188,
+	PROP_MED_CXDLG = 227,
+	PROP_MED_CYDLG = 215,
+	PROP_LG_CXDLG  = 252,
+	PROP_LG_CYDLG  = 218
+}
+
+enum {
+	PSBTN_BACK,
+	PSBTN_NEXT,
+	PSBTN_FINISH,
+	PSBTN_OK,
+	PSBTN_APPLYNOW,
+	PSBTN_CANCEL,
+	PSBTN_HELP,
+	PSBTN_MAX = 6
+}
+
+enum {
+	PSWIZB_BACK           = 1,
+	PSWIZB_NEXT           = 2,
+	PSWIZB_FINISH         = 4,
+	PSWIZB_DISABLEDFINISH = 8
+}
+
+enum {
+	PSM_SETCURSEL = WM_USER + 101,
+	PSM_REMOVEPAGE,
+	PSM_ADDPAGE,
+	PSM_CHANGED,
+	PSM_RESTARTWINDOWS,
+	PSM_REBOOTSYSTEM,
+	PSM_CANCELTOCLOSE,
+	PSM_QUERYSIBLINGS,
+	PSM_UNCHANGED,
+	PSM_APPLY,
+	PSM_SETTITLEA,
+	PSM_SETWIZBUTTONS,
+	PSM_PRESSBUTTON,
+	PSM_SETCURSELID,
+	PSM_SETFINISHTEXTA,
+	PSM_GETTABCONTROL,
+	PSM_ISDIALOGMESSAGE,
+	PSM_GETCURRENTPAGEHWND,
+	PSM_INSERTPAGE,
+	PSM_SETTITLEW,
+	PSM_SETFINISHTEXTW // = WM_USER + 121,
+}
+
+alias UINT function(HWND, UINT, LPPROPSHEETPAGEA) LPFNPSPCALLBACKA;
+alias UINT function(HWND, UINT, LPPROPSHEETPAGEW) LPFNPSPCALLBACKW;
+alias int function(HWND, UINT, LPARAM) PFNPROPSHEETCALLBACK;
+
+align(4):
+
+struct PROPSHEETPAGEA {
+	DWORD dwSize = PROPSHEETPAGEA.sizeof;
+	DWORD dwFlags;
+	HINSTANCE hInstance;
+	union {
+		LPCSTR         pszTemplate;
+		LPCDLGTEMPLATE pResource;
+	}
+	union {
+		HICON  hIcon;
+		LPCSTR pszIcon;
+	}
+	LPCSTR  pszTitle;
+	DLGPROC pfnDlgProc;
+	LPARAM  lParam;
+	LPFNPSPCALLBACKA pfnCallback;
+	UINT*     pcRefParent;
+	static if (_WIN32_IE >= 0x0400) {
+		LPCSTR pszHeaderTitle;
+		LPCSTR pszHeaderSubTitle;
+	}
+}
+alias PROPSHEETPAGEA* LPPROPSHEETPAGEA, LPCPROPSHEETPAGEA;
+
+struct PROPSHEETPAGEW {
+	DWORD     dwSize = PROPSHEETPAGEW.sizeof;
+	DWORD     dwFlags;
+	HINSTANCE hInstance;
+	union {
+		LPCWSTR        pszTemplate;
+		LPCDLGTEMPLATE pResource;
+	}
+	union {
+		HICON   hIcon;
+		LPCWSTR pszIcon;
+	}
+	LPCWSTR   pszTitle;
+	DLGPROC   pfnDlgProc;
+	LPARAM    lParam;
+	LPFNPSPCALLBACKW pfnCallback;
+	UINT*     pcRefParent;
+	static if (_WIN32_IE >= 0x0400) {
+		LPCWSTR pszHeaderTitle;
+		LPCWSTR pszHeaderSubTitle;
+	}
+}
+alias PROPSHEETPAGEW* LPPROPSHEETPAGEW, LPCPROPSHEETPAGEW;
+
+alias HANDLE HPROPSHEETPAGE;
+
+struct PROPSHEETHEADERA {
+	DWORD dwSize = PROPSHEETHEADERA.sizeof;
+	DWORD dwFlags;
+	HWND  hwndParent;
+	HINSTANCE hInstance;
+	union {
+		HICON   hIcon;
+		LPCSTR  pszIcon;
+	}
+	LPCSTR pszCaption;
+	UINT   nPages;
+	union {
+		UINT   nStartPage;
+		LPCSTR pStartPage;
+	}
+	union {
+		LPCPROPSHEETPAGEA ppsp;
+		HPROPSHEETPAGE*   phpage;
+	}
+	PFNPROPSHEETCALLBACK pfnCallback;
+	static if (_WIN32_IE >= 0x0400) {
+		union {
+			HBITMAP hbmWatermark;
+			LPCSTR  pszbmWatermark;
+		}
+		HPALETTE hplWatermark;
+		union {
+			HBITMAP hbmHeader;
+			LPCSTR  pszbmHeader;
+		}
+	}
+}
+alias PROPSHEETHEADERA* LPPROPSHEETHEADERA, LPCPROPSHEETHEADERA;
+
+struct PROPSHEETHEADERW {
+	DWORD     dwSize = PROPSHEETHEADERW.sizeof;
+	DWORD     dwFlags;
+	HWND      hwndParent;
+	HINSTANCE hInstance;
+	union {
+		HICON   hIcon;
+		LPCWSTR pszIcon;
+	}
+	LPCWSTR   pszCaption;
+	UINT      nPages;
+	union {
+		UINT    nStartPage;
+		LPCWSTR pStartPage;
+	}
+	union {
+		LPCPROPSHEETPAGEW ppsp;
+		HPROPSHEETPAGE*   phpage;
+	}
+	PFNPROPSHEETCALLBACK pfnCallback;
+	static if (_WIN32_IE >= 0x0400) {
+		union {
+			HBITMAP hbmWatermark;
+			LPCWSTR pszbmWatermark;
+		}
+		HPALETTE hplWatermark;
+		union {
+			HBITMAP hbmHeader;
+			LPCWSTR pszbmHeader;
+		}
+	}
+}
+alias PROPSHEETHEADERW* LPPROPSHEETHEADERW, LPCPROPSHEETHEADERW;
+
+alias BOOL function(HPROPSHEETPAGE, LPARAM) LPFNADDPROPSHEETPAGE;
+alias BOOL function(LPVOID, LPFNADDPROPSHEETPAGE, LPARAM)
+  LPFNADDPROPSHEETPAGES;
+
+struct PSHNOTIFY {
+	NMHDR  hdr;
+	LPARAM lParam;
+}
+alias PSHNOTIFY* LPPSHNOTIFY;
+
+extern (Windows) {
+	HPROPSHEETPAGE CreatePropertySheetPageA(LPCPROPSHEETPAGEA);
+	HPROPSHEETPAGE CreatePropertySheetPageW(LPCPROPSHEETPAGEW);
+	BOOL DestroyPropertySheetPage(HPROPSHEETPAGE);
+	int PropertySheetA(LPCPROPSHEETHEADERA);
+	int PropertySheetW(LPCPROPSHEETHEADERW);
+}
+
+version (Unicode) {
+	alias LPFNPSPCALLBACKW         LPFNPSPCALLBACK;
+	alias PROPSHEETPAGEW           PROPSHEETPAGE;
+	alias LPPROPSHEETPAGEW         LPPROPSHEETPAGE;
+	alias LPCPROPSHEETPAGEW        LPCPROPSHEETPAGE;
+	alias PROPSHEETHEADERW         PROPSHEETHEADER;
+	alias LPPROPSHEETHEADERW       LPPROPSHEETHEADER;
+	alias LPCPROPSHEETHEADERW      LPCPROPSHEETHEADER;
+	alias PSM_SETTITLEW            PSM_SETTITLE;
+	alias PSM_SETFINISHTEXTW       PSM_SETFINISHTEXT;
+	alias CreatePropertySheetPageW CreatePropertySheetPage;
+	alias PropertySheetW           PropertySheet;
+} else {
+	alias LPFNPSPCALLBACKA         LPFNPSPCALLBACK;
+	alias PROPSHEETPAGEA           PROPSHEETPAGE;
+	alias LPPROPSHEETPAGEA         LPPROPSHEETPAGE;
+	alias LPCPROPSHEETPAGEA        LPCPROPSHEETPAGE;
+	alias PROPSHEETHEADERA         PROPSHEETHEADER;
+	alias LPPROPSHEETHEADERA       LPPROPSHEETHEADER;
+	alias LPCPROPSHEETHEADERA      LPCPROPSHEETHEADER;
+	alias PSM_SETTITLEA            PSM_SETTITLE;
+	alias PSM_SETFINISHTEXTA       PSM_SETFINISHTEXT;
+	alias CreatePropertySheetPageA CreatePropertySheetPage;
+	alias PropertySheetA           PropertySheet;
+}
+
+BOOL PropSheet_SetCurSel(HWND hPropSheetDlg, HPROPSHEETPAGE hpage,
+	  HPROPSHEETPAGE index) {
+	return cast(BOOL) SendMessage(hPropSheetDlg, PSM_SETCURSEL,
+	  cast(WPARAM) index, cast(LPARAM) hpage);
+}
+
+VOID PropSheet_RemovePage(HWND hPropSheetDlg, int index, HPROPSHEETPAGE hpage) {
+	SendMessage(hPropSheetDlg, PSM_REMOVEPAGE, index, cast(LPARAM) hpage);
+}
+
+BOOL PropSheet_AddPage(HWND hPropSheetDlg, HPROPSHEETPAGE hpage) {
+		return cast(BOOL) SendMessage(hPropSheetDlg, PSM_ADDPAGE,
+		  0, cast(LPARAM) hpage);
+}
+
+VOID PropSheet_Changed(HWND hPropSheetDlg, HWND hwndPage) {
+	SendMessage(hPropSheetDlg, PSM_CHANGED, cast(WPARAM) hwndPage, 0);
+}
+
+VOID PropSheet_RestartWindows(HWND hPropSheetDlg) {
+	SendMessage(hPropSheetDlg, PSM_RESTARTWINDOWS, 0, 0);
+}
+
+VOID PropSheet_RebootSystem(HWND hPropSheetDlg) {
+	SendMessage(hPropSheetDlg, PSM_REBOOTSYSTEM, 0, 0);
+}
+
+VOID PropSheet_CancelToClose(HWND hPropSheetDlg) {
+	SendMessage(hPropSheetDlg, PSM_CANCELTOCLOSE, 0, 0);
+}
+
+int PropSheet_QuerySiblings(HWND hPropSheetDlg, WPARAM param1, LPARAM param2) {
+	return SendMessage(hPropSheetDlg, PSM_QUERYSIBLINGS, param1, param2);
+}
+
+VOID PropSheet_UnChanged(HWND hPropSheetDlg, HWND hwndPage) {
+	SendMessage(hPropSheetDlg, PSM_UNCHANGED, cast(WPARAM) hwndPage, 0);
+}
+
+BOOL PropSheet_Apply(HWND hPropSheetDlg) {
+	return cast(BOOL) SendMessage(hPropSheetDlg, PSM_APPLY, 0, 0);
+}
+
+VOID PropSheet_SetTitle(HWND hPropSheetDlg, DWORD wStyle, LPTSTR lpszText) {
+	SendMessage(hPropSheetDlg, PSM_SETTITLE, wStyle, cast(LPARAM) lpszText);
+}
+
+VOID PropSheet_SetWizButtons(HWND hPropSheetDlg, DWORD dwFlags) {
+	PostMessage(hPropSheetDlg, PSM_SETWIZBUTTONS, 0, cast(LPARAM) dwFlags);
+}
+
+BOOL PropSheet_PressButton(HWND hPropSheetDlg, int iButton) {
+	return cast(BOOL) SendMessage(hPropSheetDlg, PSM_PRESSBUTTON, iButton, 0);
+}
+
+BOOL PropSheet_SetCurSelByID(HWND hPropSheetDlg, int id) {
+	return cast(BOOL) SendMessage(hPropSheetDlg, PSM_SETCURSELID, 0, id);
+}
+
+VOID PropSheet_SetFinishText(HWND hPropSheetDlg, LPTSTR lpszText) {
+	SendMessage(hPropSheetDlg, PSM_SETFINISHTEXT, 0, cast(LPARAM) lpszText);
+}
+
+HWND PropSheet_GetTabControl(HWND hPropSheetDlg) {
+	return cast(HWND) SendMessage(hPropSheetDlg, PSM_GETTABCONTROL, 0, 0);
+}
+
+BOOL PropSheet_IsDialogMessage(HWND hDlg, LPMSG pMsg) {
+	return cast(BOOL) SendMessage(hDlg, PSM_ISDIALOGMESSAGE,
+	  0, cast(LPARAM) pMsg);
+}
+
+HWND PropSheet_GetCurrentPageHwnd(HWND hDlg) {
+	return cast(HWND) SendMessage(hDlg, PSM_GETCURRENTPAGEHWND, 0, 0);
+}
+
+BOOL PropSheet_InsertPage(HWND hPropSheetDlg, WPARAM wInsertAfter,
+	  HPROPSHEETPAGE hpage) {
+	return cast(BOOL) SendMessage(hPropSheetDlg, PSM_INSERTPAGE,
+	  wInsertAfter, cast(LPARAM) hpage);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/psapi.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,158 @@
+/***********************************************************************\
+*                                psapi.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+/* Comment from MinGW
+ *   Process status API (PSAPI)
+ *   http://windowssdk.msdn.microsoft.com/library/ms684884.aspx
+ */
+
+module win32.psapi;
+
+private import win32.w32api;
+private import win32.winbase;
+private import win32.windef;
+
+struct MODULEINFO {
+	LPVOID lpBaseOfDll;
+	DWORD SizeOfImage;
+	LPVOID EntryPoint;
+}
+alias MODULEINFO* LPMODULEINFO;
+
+struct PSAPI_WS_WATCH_INFORMATION {
+	LPVOID FaultingPc;
+	LPVOID FaultingVa;
+}
+alias PSAPI_WS_WATCH_INFORMATION* PPSAPI_WS_WATCH_INFORMATION;
+
+struct PSAPI_WS_WATCH_INFORMATION_EX {
+	PSAPI_WS_WATCH_INFORMATION BasicInfo;
+	ULONG_PTR FaultingThreadId;
+	ULONG_PTR Flags;
+}
+alias PSAPI_WS_WATCH_INFORMATION_EX* PPSAPI_WS_WATCH_INFORMATION_EX;
+
+struct PROCESS_MEMORY_COUNTERS {
+	DWORD cb;
+	DWORD PageFaultCount;
+	DWORD PeakWorkingSetSize;
+	DWORD WorkingSetSize;
+	DWORD QuotaPeakPagedPoolUsage;
+	DWORD QuotaPagedPoolUsage;
+	DWORD QuotaPeakNonPagedPoolUsage;
+	DWORD QuotaNonPagedPoolUsage;
+	DWORD PagefileUsage;
+	DWORD PeakPagefileUsage;
+}
+alias PROCESS_MEMORY_COUNTERS* PPROCESS_MEMORY_COUNTERS;
+
+struct PERFORMANCE_INFORMATION {
+	DWORD cb;
+	SIZE_T CommitTotal;
+	SIZE_T CommitLimit;
+	SIZE_T CommitPeak;
+	SIZE_T PhysicalTotal;
+	SIZE_T PhysicalAvailable;
+	SIZE_T SystemCache;
+	SIZE_T KernelTotal;
+	SIZE_T KernelPaged;
+	SIZE_T KernelNonpaged;
+	SIZE_T PageSize;
+	DWORD HandleCount;
+	DWORD ProcessCount;
+	DWORD ThreadCount;
+}
+alias PERFORMANCE_INFORMATION* PPERFORMANCE_INFORMATION;
+
+struct ENUM_PAGE_FILE_INFORMATION {
+	DWORD cb;
+	DWORD Reserved;
+	SIZE_T TotalSize;
+	SIZE_T TotalInUse;
+	SIZE_T PeakUsage;
+}
+alias ENUM_PAGE_FILE_INFORMATION* PENUM_PAGE_FILE_INFORMATION;
+
+/* application-defined callback function used with the EnumPageFiles()
+ * http://windowssdk.msdn.microsoft.com/library/ms682627.aspx */
+version (Unicode) {
+	alias BOOL function(LPVOID, PENUM_PAGE_FILE_INFORMATION, LPCWSTR)
+	  PENUM_PAGE_FILE_CALLBACK;
+} else {
+	alias BOOL function(LPVOID, PENUM_PAGE_FILE_INFORMATION, LPCSTR)
+	  PENUM_PAGE_FILE_CALLBACK;
+}
+
+// Grouped by application, not in alphabetical order.
+extern (Windows) {
+	/* Process Information
+	 * http://windowssdk.msdn.microsoft.com/library/ms684870.aspx */
+	BOOL EnumProcesses(DWORD*, DWORD, DWORD*); /* NT/2000/XP/Server2003/Vista/Longhorn */
+	DWORD GetProcessImageFileNameA(HANDLE, LPSTR, DWORD); /* XP/Server2003/Vista/Longhorn */
+	DWORD GetProcessImageFileNameW(HANDLE, LPWSTR, DWORD); /* XP/Server2003/Vista/Longhorn */
+
+	/* Module Information
+	 * http://windowssdk.msdn.microsoft.com/library/ms684232.aspx */
+	BOOL EnumProcessModules(HANDLE, HMODULE*, DWORD, LPDWORD);
+	BOOL EnumProcessModulesEx(HANDLE, HMODULE*, DWORD, LPDWORD, DWORD); /* Vista/Longhorn */
+	DWORD GetModuleBaseNameA(HANDLE, HMODULE, LPSTR, DWORD);
+	DWORD GetModuleBaseNameW(HANDLE, HMODULE, LPWSTR, DWORD);
+	DWORD GetModuleFileNameExA(HANDLE, HMODULE, LPSTR, DWORD);
+	DWORD GetModuleFileNameExW(HANDLE, HMODULE, LPWSTR, DWORD);
+	BOOL GetModuleInformation(HANDLE, HMODULE, LPMODULEINFO, DWORD);
+
+	/* Device Driver Information
+	 * http://windowssdk.msdn.microsoft.com/library/ms682578.aspx */
+	BOOL EnumDeviceDrivers(LPVOID*, DWORD, LPDWORD);
+	DWORD GetDeviceDriverBaseNameA(LPVOID, LPSTR, DWORD);
+	DWORD GetDeviceDriverBaseNameW(LPVOID, LPWSTR, DWORD);
+	DWORD GetDeviceDriverFileNameA(LPVOID, LPSTR, DWORD);
+	DWORD GetDeviceDriverFileNameW(LPVOID, LPWSTR, DWORD);
+
+	/* Process Memory Usage Information
+	 * http://windowssdk.msdn.microsoft.com/library/ms684879.aspx */
+	BOOL GetProcessMemoryInfo(HANDLE, PPROCESS_MEMORY_COUNTERS, DWORD);
+
+	/* Working Set Information
+	 * http://windowssdk.msdn.microsoft.com/library/ms687398.aspx */
+	BOOL EmptyWorkingSet(HANDLE);
+	BOOL GetWsChanges(HANDLE, PPSAPI_WS_WATCH_INFORMATION, DWORD);
+	BOOL GetWsChangesEx(HANDLE, PPSAPI_WS_WATCH_INFORMATION_EX, DWORD); /* Vista/Longhorn */
+	BOOL InitializeProcessForWsWatch(HANDLE);
+	BOOL QueryWorkingSet(HANDLE, PVOID, DWORD);
+	BOOL QueryWorkingSetEx(HANDLE, PVOID, DWORD);
+
+	/* Memory-Mapped File Information
+	 * http://windowssdk.msdn.microsoft.com/library/ms684212.aspx */
+	DWORD GetMappedFileNameW(HANDLE, LPVOID, LPWSTR, DWORD);
+	DWORD GetMappedFileNameA(HANDLE, LPVOID, LPSTR, DWORD);
+
+	/* Resources Information */
+	BOOL GetPerformanceInfo(PPERFORMANCE_INFORMATION, DWORD); /* XP/Server2003/Vista/Longhorn */
+	BOOL EnumPageFilesW(PENUM_PAGE_FILE_CALLBACK, LPVOID); /* 2000/XP/Server2003/Vista/Longhorn */
+	BOOL EnumPageFilesA(PENUM_PAGE_FILE_CALLBACK, LPVOID); /* 2000/XP/Server2003/Vista/Longhorn */
+}
+
+version (Unicode) {
+	alias GetModuleBaseNameW GetModuleBaseName;
+	alias GetModuleFileNameExW GetModuleFileNameEx;
+	alias GetMappedFileNameW GetMappedFileName;
+	alias GetDeviceDriverBaseNameW GetDeviceDriverBaseName;
+	alias GetDeviceDriverFileNameW GetDeviceDriverFileName;
+	alias EnumPageFilesW EnumPageFiles;
+	alias GetProcessImageFileNameW GetProcessImageFileName;
+} else {
+	alias GetModuleBaseNameA GetModuleBaseName;
+	alias GetModuleFileNameExA GetModuleFileNameEx;
+	alias GetMappedFileNameA GetMappedFileName;
+	alias GetDeviceDriverBaseNameA GetDeviceDriverBaseName;
+	alias GetDeviceDriverFileNameA GetDeviceDriverFileName;
+	alias EnumPageFilesA EnumPageFiles;
+	alias GetProcessImageFileNameA GetProcessImageFileName;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/rapi.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,61 @@
+/***********************************************************************\
+*                                 rapi.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.rapi;
+
+/* Comment from MinGW
+	NOTE: This strictly does not belong in the Win32 API since it's
+	really part of Platform SDK.
+ */
+
+private import win32.winbase, win32.windef;
+
+struct IRAPIStream {
+	IRAPIStreamVtbl* lpVtbl;
+}
+
+enum RAPISTREAMFLAG {
+	STREAM_TIMEOUT_READ
+}
+
+extern (Windows) {
+	alias HRESULT function(IRAPIStream*, RAPISTREAMFLAG, DWORD)  _SetRapiStat;
+	alias HRESULT function(IRAPIStream*, RAPISTREAMFLAG, DWORD*) _GetRapiStat;
+}
+
+struct IRAPIStreamVtbl {
+	_SetRapiStat SetRapiStat;
+	_GetRapiStat GetRapiStat;
+}
+
+// FIXME: what's this?
+//typedef HRESULT(STDAPICALLTYPE RAPIEXT)(DWORD, BYTE, DWORD, BYTE, IRAPIStream*);
+
+struct RAPIINIT {
+	DWORD   cbSize = this.sizeof;
+	HANDLE  heRapiInit;
+	HRESULT hrRapiInit;
+}
+
+extern (Windows) {
+	HRESULT CeRapiInit();
+	HRESULT CeRapiInitEx(RAPIINIT*);
+	BOOL CeCreateProcess(LPCWSTR, LPCWSTR, LPSECURITY_ATTRIBUTES,
+	  LPSECURITY_ATTRIBUTES, BOOL, DWORD, LPVOID, LPWSTR, LPSTARTUPINFO,
+	  LPPROCESS_INFORMATION);
+	HRESULT CeRapiUninit();
+	BOOL CeWriteFile(HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED);
+	HANDLE CeCreateFile(LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD,
+	  DWORD, HANDLE);
+	BOOL CeCreateDirectory(LPCWSTR, LPSECURITY_ATTRIBUTES);
+	DWORD CeGetLastError();
+	BOOL CeGetFileTime(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME);
+	BOOL CeCloseHandle(HANDLE);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/ras.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,1029 @@
+/***********************************************************************\
+*                                 ras.d                                 *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.ras;
+pragma(lib, "rasapi32.lib");
+
+private import win32.basetyps, win32.lmcons, win32.w32api, win32.windef;
+
+align(4):
+
+const RAS_MaxDeviceType = 16;
+const RAS_MaxPhoneNumber = 128;
+const RAS_MaxIpAddress = 15;
+const RAS_MaxIpxAddress = 21;
+const RAS_MaxEntryName = 256;
+const RAS_MaxDeviceName = 128;
+const RAS_MaxCallbackNumber = RAS_MaxPhoneNumber;
+const RAS_MaxAreaCode = 10;
+const RAS_MaxPadType = 32;
+const RAS_MaxX25Address = 200;
+const RAS_MaxFacilities = 200;
+const RAS_MaxUserData = 200;
+const RAS_MaxReplyMessage = 1024;
+
+const RDEOPT_UsePrefixSuffix           = 0x00000001;
+const RDEOPT_PausedStates              = 0x00000002;
+const RDEOPT_IgnoreModemSpeaker        = 0x00000004;
+const RDEOPT_SetModemSpeaker           = 0x00000008;
+const RDEOPT_IgnoreSoftwareCompression = 0x00000010;
+const RDEOPT_SetSoftwareCompression    = 0x00000020;
+const RDEOPT_DisableConnectedUI        = 0x00000040;
+const RDEOPT_DisableReconnectUI        = 0x00000080;
+const RDEOPT_DisableReconnect          = 0x00000100;
+const RDEOPT_NoUser                    = 0x00000200;
+const RDEOPT_PauseOnScript             = 0x00000400;
+const RDEOPT_Router                    = 0x00000800;
+
+const REN_User = 0x00000000;
+const REN_AllUsers = 0x00000001;
+const VS_Default = 0;
+const VS_PptpOnly = 1;
+const VS_PptpFirst = 2;
+const VS_L2tpOnly = 3;
+const VS_L2tpFirst = 4;
+
+const RASDIALEVENT = "RasDialEvent";
+const WM_RASDIALEVENT = 0xCCCD;
+
+const RASEO_UseCountryAndAreaCodes = 0x00000001;
+const RASEO_SpecificIpAddr = 0x00000002;
+const RASEO_SpecificNameServers = 0x00000004;
+const RASEO_IpHeaderCompression = 0x00000008;
+const RASEO_RemoteDefaultGateway = 0x00000010;
+const RASEO_DisableLcpExtensions = 0x00000020;
+const RASEO_TerminalBeforeDial = 0x00000040;
+const RASEO_TerminalAfterDial = 0x00000080;
+const RASEO_ModemLights = 0x00000100;
+const RASEO_SwCompression = 0x00000200;
+const RASEO_RequireEncryptedPw = 0x00000400;
+const RASEO_RequireMsEncryptedPw = 0x00000800;
+const RASEO_RequireDataEncryption = 0x00001000;
+const RASEO_NetworkLogon = 0x00002000;
+const RASEO_UseLogonCredentials = 0x00004000;
+const RASEO_PromoteAlternates = 0x00008000;
+const RASNP_NetBEUI = 0x00000001;
+const RASNP_Ipx = 0x00000002;
+const RASNP_Ip = 0x00000004;
+const RASFP_Ppp = 0x00000001;
+const RASFP_Slip = 0x00000002;
+const RASFP_Ras = 0x00000004;
+
+const TCHAR[]
+	RASDT_Modem = "modem",
+	RASDT_Isdn = "isdn",
+	RASDT_X25 = "x25",
+	RASDT_Vpn = "vpn",
+	RASDT_Pad = "pad",
+	RASDT_Generic = "GENERIC",
+	RASDT_Serial = "SERIAL",
+	RASDT_FrameRelay = "FRAMERELAY",
+	RASDT_Atm = "ATM",
+	RASDT_Sonet = "SONET",
+	RASDT_SW56 = "SW56",
+	RASDT_Irda = "IRDA",
+	RASDT_Parallel = "PARALLEL";
+
+const RASET_Phone = 1;
+const RASET_Vpn = 2;
+const RASET_Direct = 3;
+const RASET_Internet = 4;
+
+static if (WINVER >= 0x0401) {
+	const RASEO_SecureLocalFiles = 0x00010000;
+	const RASCN_Connection = 0x00000001;
+	const RASCN_Disconnection = 0x00000002;
+	const RASCN_BandwidthAdded = 0x00000004;
+	const RASCN_BandwidthRemoved = 0x00000008;
+	const RASEDM_DialAll = 1;
+	const RASEDM_DialAsNeeded = 2;
+	const RASIDS_Disabled = 0xffffffff;
+	const RASIDS_UseGlobalValue = 0;
+	const RASADFLG_PositionDlg = 0x00000001;
+	const RASCM_UserName = 0x00000001;
+	const RASCM_Password = 0x00000002;
+	const RASCM_Domain = 0x00000004;
+	const RASADP_DisableConnectionQuery = 0;
+	const RASADP_LoginSessionDisable = 1;
+	const RASADP_SavedAddressesLimit = 2;
+	const RASADP_FailedConnectionTimeout = 3;
+	const RASADP_ConnectionQueryTimeout = 4;
+}
+static if (WINVER >= 0x0500) {
+	const RDEOPT_CustomDial = 0x00001000;
+	const RASLCPAP_PAP = 0xC023;
+	const RASLCPAP_SPAP = 0xC027;
+	const RASLCPAP_CHAP = 0xC223;
+	const RASLCPAP_EAP = 0xC227;
+	const RASLCPAD_CHAP_MD5 = 0x05;
+	const RASLCPAD_CHAP_MS = 0x80;
+	const RASLCPAD_CHAP_MSV2 = 0x81;
+	const RASLCPO_PFC    = 0x00000001;
+	const RASLCPO_ACFC   = 0x00000002;
+	const RASLCPO_SSHF   = 0x00000004;
+	const RASLCPO_DES_56 = 0x00000008;
+	const RASLCPO_3_DES  = 0x00000010;
+
+	const RASCCPCA_MPPC = 0x00000006;
+	const RASCCPCA_STAC = 0x00000005;
+
+	const RASCCPO_Compression      = 0x00000001;
+	const RASCCPO_HistoryLess      = 0x00000002;
+	const RASCCPO_Encryption56bit  = 0x00000010;
+	const RASCCPO_Encryption40bit  = 0x00000020;
+	const RASCCPO_Encryption128bit = 0x00000040;
+
+	const RASEO_RequireEAP          = 0x00020000;
+	const RASEO_RequirePAP          = 0x00040000;
+	const RASEO_RequireSPAP         = 0x00080000;
+	const RASEO_Custom              = 0x00100000;
+	const RASEO_PreviewPhoneNumber  = 0x00200000;
+	const RASEO_SharedPhoneNumbers  = 0x00800000;
+	const RASEO_PreviewUserPw       = 0x01000000;
+	const RASEO_PreviewDomain       = 0x02000000;
+	const RASEO_ShowDialingProgress = 0x04000000;
+	const RASEO_RequireCHAP         = 0x08000000;
+	const RASEO_RequireMsCHAP       = 0x10000000;
+	const RASEO_RequireMsCHAP2      = 0x20000000;
+	const RASEO_RequireW95MSCHAP    = 0x40000000;
+	const RASEO_CustomScript        = 0x80000000;
+
+	const RASIPO_VJ = 0x00000001;
+	const RCD_SingleUser = 0;
+	const RCD_AllUsers = 0x00000001;
+	const RCD_Eap = 0x00000002;
+	const RASEAPF_NonInteractive = 0x00000002;
+	const RASEAPF_Logon = 0x00000004;
+	const RASEAPF_Preview = 0x00000008;
+	const ET_40Bit = 1;
+	const ET_128Bit = 2;
+	const ET_None = 0;
+	const ET_Require = 1;
+	const ET_RequireMax = 2;
+	const ET_Optional = 3;
+}
+
+const RASCS_PAUSED = 0x1000;
+const RASCS_DONE = 0x2000;
+enum RASCONNSTATE {
+	RASCS_OpenPort = 0,
+	RASCS_PortOpened,
+	RASCS_ConnectDevice,
+	RASCS_DeviceConnected,
+	RASCS_AllDevicesConnected,
+	RASCS_Authenticate,
+	RASCS_AuthNotify,
+	RASCS_AuthRetry,
+	RASCS_AuthCallback,
+	RASCS_AuthChangePassword,
+	RASCS_AuthProject,
+	RASCS_AuthLinkSpeed,
+	RASCS_AuthAck,
+	RASCS_ReAuthenticate,
+	RASCS_Authenticated,
+	RASCS_PrepareForCallback,
+	RASCS_WaitForModemReset,
+	RASCS_WaitForCallback,
+	RASCS_Projected,
+	RASCS_StartAuthentication,
+	RASCS_CallbackComplete,
+	RASCS_LogonNetwork,
+	RASCS_SubEntryConnected,
+	RASCS_SubEntryDisconnected,
+	RASCS_Interactive = RASCS_PAUSED,
+	RASCS_RetryAuthentication,
+	RASCS_CallbackSetByCaller,
+	RASCS_PasswordExpired,
+//	static if (WINVER >= 0x0500) {
+		RASCS_InvokeEapUI,
+//	}
+	RASCS_Connected = RASCS_DONE,
+	RASCS_Disconnected
+}
+alias RASCONNSTATE* LPRASCONNSTATE;
+
+enum RASPROJECTION {
+	RASP_Amb =      0x10000,
+	RASP_PppNbf =   0x803F,
+	RASP_PppIpx =   0x802B,
+	RASP_PppIp =    0x8021,
+//	static if (WINVER >= 0x0500) {
+		RASP_PppCcp =   0x80FD,
+//	}
+	RASP_PppLcp =   0xC021,
+	RASP_Slip =     0x20000
+}
+alias RASPROJECTION* LPRASPROJECTION;
+
+typedef HANDLE HRASCONN;
+alias HRASCONN* LPHRASCONN;
+
+struct RASCONNW {
+	DWORD dwSize;
+	HRASCONN hrasconn;
+	WCHAR szEntryName[RAS_MaxEntryName + 1];
+	static if (WINVER >= 0x0400) {
+		WCHAR szDeviceType[RAS_MaxDeviceType + 1];
+		WCHAR szDeviceName[RAS_MaxDeviceName + 1];
+	}
+	static if (WINVER >= 0x0401) {
+		WCHAR szPhonebook[MAX_PATH];
+		DWORD dwSubEntry;
+	}
+	static if (WINVER >= 0x0500) {
+		GUID guidEntry;
+	}
+	static if (WINVER >= 0x0501) {
+		DWORD dwFlags;
+		LUID luid;
+	}
+}
+alias RASCONNW* LPRASCONNW;
+
+struct RASCONNA {
+	DWORD dwSize;
+	HRASCONN hrasconn;
+	CHAR szEntryName[RAS_MaxEntryName + 1];
+	static if (WINVER >= 0x0400) {
+		CHAR szDeviceType[RAS_MaxDeviceType + 1];
+		CHAR szDeviceName[RAS_MaxDeviceName + 1];
+	}
+	static if (WINVER >= 0x0401) {
+		CHAR szPhonebook[MAX_PATH];
+		DWORD dwSubEntry;
+	}
+	static if (WINVER >= 0x0500) {
+		GUID guidEntry;
+	}
+	static if (WINVER >= 0x0501) {
+		DWORD dwFlags;
+		LUID luid;
+	}
+}
+alias RASCONNA* LPRASCONNA;
+
+struct RASCONNSTATUSW {
+	DWORD dwSize;
+	RASCONNSTATE rasconnstate;
+	DWORD dwError;
+	WCHAR szDeviceType[RAS_MaxDeviceType + 1];
+	WCHAR szDeviceName[RAS_MaxDeviceName + 1];
+	static if (WINVER >= 0x0401) {
+		WCHAR szPhoneNumber[RAS_MaxPhoneNumber + 1];
+	}
+}
+alias RASCONNSTATUSW* LPRASCONNSTATUSW;
+
+struct RASCONNSTATUSA {
+	DWORD dwSize;
+	RASCONNSTATE rasconnstate;
+	DWORD dwError;
+	CHAR szDeviceType[RAS_MaxDeviceType + 1];
+	CHAR szDeviceName[RAS_MaxDeviceName + 1];
+	static if (WINVER >= 0x0401) {
+		CHAR szPhoneNumber[RAS_MaxPhoneNumber + 1];
+	}
+}
+alias RASCONNSTATUSA* LPRASCONNSTATUSA;
+
+struct RASDIALPARAMSW {
+	DWORD dwSize;
+	WCHAR szEntryName[RAS_MaxEntryName + 1];
+	WCHAR szPhoneNumber[RAS_MaxPhoneNumber + 1];
+	WCHAR szCallbackNumber[RAS_MaxCallbackNumber + 1];
+	WCHAR szUserName[UNLEN + 1];
+	WCHAR szPassword[PWLEN + 1];
+	WCHAR szDomain[DNLEN + 1];
+	static if (WINVER >= 0x0401) {
+		DWORD dwSubEntry;
+		ULONG_PTR dwCallbackId;
+	}
+}
+alias RASDIALPARAMSW* LPRASDIALPARAMSW;
+
+struct RASDIALPARAMSA{
+	DWORD dwSize;
+	CHAR szEntryName[RAS_MaxEntryName + 1];
+	CHAR szPhoneNumber[RAS_MaxPhoneNumber + 1];
+	CHAR szCallbackNumber[RAS_MaxCallbackNumber + 1];
+	CHAR szUserName[UNLEN + 1];
+	CHAR szPassword[PWLEN + 1];
+	CHAR szDomain[DNLEN + 1];
+	static if (WINVER >= 0x0401) {
+		DWORD dwSubEntry;
+		ULONG_PTR dwCallbackId;
+	}
+}
+alias RASDIALPARAMSA* LPRASDIALPARAMSA;
+
+static if (WINVER >= 0x0500) {
+	struct RASEAPINFO {
+		DWORD dwSizeofEapInfo;
+		BYTE *pbEapInfo;
+	}
+}
+
+struct RASDIALEXTENSIONS {
+	DWORD dwSize;
+	DWORD dwfOptions;
+	HWND hwndParent;
+	ULONG_PTR reserved;
+	static if (WINVER >= 0x0500) {
+		ULONG_PTR reserved1;
+		RASEAPINFO RasEapInfo;
+	}
+}
+alias RASDIALEXTENSIONS* LPRASDIALEXTENSIONS;
+
+struct RASENTRYNAMEW {
+	DWORD dwSize;
+	WCHAR szEntryName[RAS_MaxEntryName + 1];
+	static if (WINVER >= 0x0500) {
+		DWORD dwFlags;
+		WCHAR szPhonebookPath[MAX_PATH + 1];
+	}
+}
+alias RASENTRYNAMEW* LPRASENTRYNAMEW;
+
+struct RASENTRYNAMEA{
+	DWORD dwSize;
+	CHAR szEntryName[RAS_MaxEntryName + 1];
+	static if (WINVER >= 0x0500) {
+		DWORD dwFlags;
+		CHAR szPhonebookPath[MAX_PATH + 1];
+	}
+}
+alias RASENTRYNAMEA* LPRASENTRYNAMEA;
+
+struct RASAMBW{
+	DWORD dwSize;
+	DWORD dwError;
+	WCHAR szNetBiosError[NETBIOS_NAME_LEN + 1];
+	BYTE bLana;
+}
+alias RASAMBW* LPRASAMBW;
+
+struct RASAMBA{
+	DWORD dwSize;
+	DWORD dwError;
+	CHAR szNetBiosError[NETBIOS_NAME_LEN + 1];
+	BYTE bLana;
+}
+alias RASAMBA* LPRASAMBA;
+
+struct RASPPPNBFW{
+	DWORD dwSize;
+	DWORD dwError;
+	DWORD dwNetBiosError;
+	WCHAR szNetBiosError[NETBIOS_NAME_LEN + 1];
+	WCHAR szWorkstationName[NETBIOS_NAME_LEN + 1];
+	BYTE bLana;
+}
+alias RASPPPNBFW* LPRASPPPNBFW;
+
+struct RASPPPNBFA{
+	DWORD dwSize;
+	DWORD dwError;
+	DWORD dwNetBiosError;
+	CHAR szNetBiosError[NETBIOS_NAME_LEN + 1];
+	CHAR szWorkstationName[NETBIOS_NAME_LEN + 1];
+	BYTE bLana;
+}
+alias RASPPPNBFA* LPRASPPPNBFA;
+
+struct RASPPPIPXW {
+	DWORD dwSize;
+	DWORD dwError;
+	WCHAR szIpxAddress[RAS_MaxIpxAddress + 1];
+}
+alias RASPPPIPXW* LPRASPPPIPXW;
+
+struct RASPPPIPXA {
+	DWORD dwSize;
+	DWORD dwError;
+	CHAR szIpxAddress[RAS_MaxIpxAddress + 1];
+}
+alias RASPPPIPXA* LPRASPPPIPXA;
+
+struct RASPPPIPW{
+	DWORD dwSize;
+	DWORD dwError;
+	WCHAR szIpAddress[RAS_MaxIpAddress + 1];
+	//#ifndef WINNT35COMPATIBLE
+	WCHAR szServerIpAddress[RAS_MaxIpAddress + 1];
+	//#endif
+	static if (WINVER >= 0x0500) {
+		DWORD dwOptions;
+		DWORD dwServerOptions;
+	}
+}
+alias RASPPPIPW* LPRASPPPIPW;
+
+struct RASPPPIPA{
+	DWORD dwSize;
+	DWORD dwError;
+	CHAR szIpAddress[RAS_MaxIpAddress + 1];
+	//#ifndef WINNT35COMPATIBLE
+	CHAR szServerIpAddress[RAS_MaxIpAddress + 1];
+	//#endif
+	static if (WINVER >= 0x0500) {
+		DWORD dwOptions;
+		DWORD dwServerOptions;
+	}
+}
+alias RASPPPIPA* LPRASPPPIPA;
+
+struct RASPPPLCPW{
+	DWORD dwSize;
+	BOOL fBundled;
+	static if (WINVER >= 0x0500) {
+		DWORD dwError;
+		DWORD dwAuthenticationProtocol;
+		DWORD dwAuthenticationData;
+		DWORD dwEapTypeId;
+		DWORD dwServerAuthenticationProtocol;
+		DWORD dwServerAuthenticationData;
+		DWORD dwServerEapTypeId;
+		BOOL fMultilink;
+		DWORD dwTerminateReason;
+		DWORD dwServerTerminateReason;
+		WCHAR szReplyMessage[RAS_MaxReplyMessage];
+		DWORD dwOptions;
+		DWORD dwServerOptions;
+	}
+}
+alias RASPPPLCPW* LPRASPPPLCPW;
+
+struct RASPPPLCPA{
+	DWORD dwSize;
+	BOOL fBundled;
+	static if (WINVER >= 0x0500) {
+		DWORD dwError;
+		DWORD dwAuthenticationProtocol;
+		DWORD dwAuthenticationData;
+		DWORD dwEapTypeId;
+		DWORD dwServerAuthenticationProtocol;
+		DWORD dwServerAuthenticationData;
+		DWORD dwServerEapTypeId;
+		BOOL fMultilink;
+		DWORD dwTerminateReason;
+		DWORD dwServerTerminateReason;
+		CHAR szReplyMessage[RAS_MaxReplyMessage];
+		DWORD dwOptions;
+		DWORD dwServerOptions;
+	}
+}
+alias RASPPPLCPA* LPRASPPPLCPA;
+
+struct RASSLIPW{
+	DWORD dwSize;
+	DWORD dwError;
+	WCHAR szIpAddress[RAS_MaxIpAddress + 1];
+}
+alias RASSLIPW* LPRASSLIPW;
+
+struct RASSLIPA{
+	DWORD dwSize;
+	DWORD dwError;
+	CHAR szIpAddress[RAS_MaxIpAddress + 1];
+}
+alias RASSLIPA* LPRASSLIPA;
+
+struct RASDEVINFOW{
+	DWORD dwSize;
+	WCHAR szDeviceType[RAS_MaxDeviceType + 1];
+	WCHAR szDeviceName[RAS_MaxDeviceName + 1];
+}
+alias RASDEVINFOW* LPRASDEVINFOW;
+
+struct RASDEVINFOA{
+	DWORD dwSize;
+	CHAR szDeviceType[RAS_MaxDeviceType + 1];
+	CHAR szDeviceName[RAS_MaxDeviceName + 1];
+}
+alias RASDEVINFOA* LPRASDEVINFOA;
+
+struct RASCTRYINFO {
+	DWORD dwSize;
+	DWORD dwCountryID;
+	DWORD dwNextCountryID;
+	DWORD dwCountryCode;
+	DWORD dwCountryNameOffset;
+}
+alias RASCTRYINFO* LPRASCTRYINFO;
+alias RASCTRYINFO  RASCTRYINFOW, RASCTRYINFOA;
+alias RASCTRYINFOW* LPRASCTRYINFOW;
+alias RASCTRYINFOA* LPRASCTRYINFOA;
+
+struct RASIPADDR {
+	BYTE a;
+	BYTE b;
+	BYTE c;
+	BYTE d;
+}
+
+struct RASENTRYW {
+	DWORD dwSize;
+	DWORD dwfOptions;
+	DWORD dwCountryID;
+	DWORD dwCountryCode;
+	WCHAR szAreaCode[RAS_MaxAreaCode + 1];
+	WCHAR szLocalPhoneNumber[RAS_MaxPhoneNumber + 1];
+	DWORD dwAlternateOffset;
+	RASIPADDR ipaddr;
+	RASIPADDR ipaddrDns;
+	RASIPADDR ipaddrDnsAlt;
+	RASIPADDR ipaddrWins;
+	RASIPADDR ipaddrWinsAlt;
+	DWORD dwFrameSize;
+	DWORD dwfNetProtocols;
+	DWORD dwFramingProtocol;
+	WCHAR szScript[MAX_PATH];
+	WCHAR szAutodialDll[MAX_PATH];
+	WCHAR szAutodialFunc[MAX_PATH];
+	WCHAR szDeviceType[RAS_MaxDeviceType + 1];
+	WCHAR szDeviceName[RAS_MaxDeviceName + 1];
+	WCHAR szX25PadType[RAS_MaxPadType + 1];
+	WCHAR szX25Address[RAS_MaxX25Address + 1];
+	WCHAR szX25Facilities[RAS_MaxFacilities + 1];
+	WCHAR szX25UserData[RAS_MaxUserData + 1];
+	DWORD dwChannels;
+	DWORD dwReserved1;
+	DWORD dwReserved2;
+	static if (WINVER >= 0x0401) {
+		DWORD dwSubEntries;
+		DWORD dwDialMode;
+		DWORD dwDialExtraPercent;
+		DWORD dwDialExtraSampleSeconds;
+		DWORD dwHangUpExtraPercent;
+		DWORD dwHangUpExtraSampleSeconds;
+		DWORD dwIdleDisconnectSeconds;
+	}
+	static if (WINVER >= 0x0500) {
+		DWORD dwType;
+		DWORD dwEncryptionType;
+		DWORD dwCustomAuthKey;
+		GUID guidId;
+		WCHAR szCustomDialDll[MAX_PATH];
+		DWORD dwVpnStrategy;
+	}
+}
+alias RASENTRYW* LPRASENTRYW;
+
+struct RASENTRYA {
+	DWORD dwSize;
+	DWORD dwfOptions;
+	DWORD dwCountryID;
+	DWORD dwCountryCode;
+	CHAR szAreaCode[RAS_MaxAreaCode + 1];
+	CHAR szLocalPhoneNumber[RAS_MaxPhoneNumber + 1];
+	DWORD dwAlternateOffset;
+	RASIPADDR ipaddr;
+	RASIPADDR ipaddrDns;
+	RASIPADDR ipaddrDnsAlt;
+	RASIPADDR ipaddrWins;
+	RASIPADDR ipaddrWinsAlt;
+	DWORD dwFrameSize;
+	DWORD dwfNetProtocols;
+	DWORD dwFramingProtocol;
+	CHAR szScript[MAX_PATH];
+	CHAR szAutodialDll[MAX_PATH];
+	CHAR szAutodialFunc[MAX_PATH];
+	CHAR szDeviceType[RAS_MaxDeviceType + 1];
+	CHAR szDeviceName[RAS_MaxDeviceName + 1];
+	CHAR szX25PadType[RAS_MaxPadType + 1];
+	CHAR szX25Address[RAS_MaxX25Address + 1];
+	CHAR szX25Facilities[RAS_MaxFacilities + 1];
+	CHAR szX25UserData[RAS_MaxUserData + 1];
+	DWORD dwChannels;
+	DWORD dwReserved1;
+	DWORD dwReserved2;
+	static if (WINVER >= 0x0401) {
+		DWORD dwSubEntries;
+		DWORD dwDialMode;
+		DWORD dwDialExtraPercent;
+		DWORD dwDialExtraSampleSeconds;
+		DWORD dwHangUpExtraPercent;
+		DWORD dwHangUpExtraSampleSeconds;
+		DWORD dwIdleDisconnectSeconds;
+	}
+	static if (WINVER >= 0x0500) {
+		DWORD dwType;
+		DWORD dwEncryptionType;
+		DWORD dwCustomAuthKey;
+		GUID guidId;
+		CHAR szCustomDialDll[MAX_PATH];
+		DWORD dwVpnStrategy;
+	}
+}
+alias RASENTRYA* LPRASENTRYA;
+
+
+static if (WINVER >= 0x0401) {
+	struct RASADPARAMS {
+		DWORD dwSize;
+		HWND hwndOwner;
+		DWORD dwFlags;
+		LONG xDlg;
+		LONG yDlg;
+	}
+	alias RASADPARAMS* LPRASADPARAMS;
+
+	struct RASSUBENTRYW{
+		DWORD dwSize;
+		DWORD dwfFlags;
+		WCHAR szDeviceType[RAS_MaxDeviceType + 1];
+		WCHAR szDeviceName[RAS_MaxDeviceName + 1];
+		WCHAR szLocalPhoneNumber[RAS_MaxPhoneNumber + 1];
+		DWORD dwAlternateOffset;
+	}
+	alias RASSUBENTRYW* LPRASSUBENTRYW;
+
+	struct RASSUBENTRYA{
+		DWORD dwSize;
+		DWORD dwfFlags;
+		CHAR szDeviceType[RAS_MaxDeviceType + 1];
+		CHAR szDeviceName[RAS_MaxDeviceName + 1];
+		CHAR szLocalPhoneNumber[RAS_MaxPhoneNumber + 1];
+		DWORD dwAlternateOffset;
+	}
+	alias RASSUBENTRYA* LPRASSUBENTRYA;
+
+	struct RASCREDENTIALSW{
+		DWORD dwSize;
+		DWORD dwMask;
+		WCHAR szUserName[UNLEN + 1];
+		WCHAR szPassword[PWLEN + 1];
+		WCHAR szDomain[DNLEN + 1];
+	}
+	alias RASCREDENTIALSW* LPRASCREDENTIALSW;
+
+	struct RASCREDENTIALSA{
+		DWORD dwSize;
+		DWORD dwMask;
+		CHAR szUserName[UNLEN + 1];
+		CHAR szPassword[PWLEN + 1];
+		CHAR szDomain[DNLEN + 1];
+	}
+	alias RASCREDENTIALSA* LPRASCREDENTIALSA;
+
+	struct RASAUTODIALENTRYW{
+		DWORD dwSize;
+		DWORD dwFlags;
+		DWORD dwDialingLocation;
+		WCHAR szEntry[RAS_MaxEntryName + 1];
+	}
+	alias RASAUTODIALENTRYW* LPRASAUTODIALENTRYW;
+
+	struct RASAUTODIALENTRYA{
+		DWORD dwSize;
+		DWORD dwFlags;
+		DWORD dwDialingLocation;
+		CHAR szEntry[RAS_MaxEntryName + 1];
+	}
+	alias RASAUTODIALENTRYA* LPRASAUTODIALENTRYA;
+}
+
+static if (WINVER >= 0x0500) {
+	struct RASPPPCCP{
+		DWORD dwSize;
+		DWORD dwError;
+		DWORD dwCompressionAlgorithm;
+		DWORD dwOptions;
+		DWORD dwServerCompressionAlgorithm;
+		DWORD dwServerOptions;
+	}
+	alias RASPPPCCP* LPRASPPPCCP;
+
+	struct RASEAPUSERIDENTITYW{
+		WCHAR szUserName[UNLEN + 1];
+		DWORD dwSizeofEapInfo;
+		BYTE pbEapInfo[1];
+	}
+	alias RASEAPUSERIDENTITYW* LPRASEAPUSERIDENTITYW;
+
+	struct RASEAPUSERIDENTITYA{
+		CHAR szUserName[UNLEN + 1];
+		DWORD dwSizeofEapInfo;
+		BYTE pbEapInfo[1];
+	}
+	alias RASEAPUSERIDENTITYA* LPRASEAPUSERIDENTITYA;
+
+	struct RAS_STATS{
+		DWORD dwSize;
+		DWORD dwBytesXmited;
+		DWORD dwBytesRcved;
+		DWORD dwFramesXmited;
+		DWORD dwFramesRcved;
+		DWORD dwCrcErr;
+		DWORD dwTimeoutErr;
+		DWORD dwAlignmentErr;
+		DWORD dwHardwareOverrunErr;
+		DWORD dwFramingErr;
+		DWORD dwBufferOverrunErr;
+		DWORD dwCompressionRatioIn;
+		DWORD dwCompressionRatioOut;
+		DWORD dwBps;
+		DWORD dwConnectDuration;
+	}
+	alias RAS_STATS* PRAS_STATS;
+}
+
+
+/* UNICODE typedefs for structures*/
+version (Unicode) {
+	alias RASCONNW RASCONN;
+	alias RASENTRYW RASENTRY;
+	alias RASCONNSTATUSW RASCONNSTATUS;
+	alias RASDIALPARAMSW RASDIALPARAMS;
+	alias RASAMBW RASAMB;
+	alias RASPPPNBFW RASPPPNBF;
+	alias RASPPPIPXW RASPPPIPX;
+	alias RASPPPIPW RASPPPIP;
+	alias RASPPPLCPW RASPPPLCP;
+	alias RASSLIPW RASSLIP;
+	alias RASDEVINFOW RASDEVINFO;
+	alias RASENTRYNAMEW RASENTRYNAME;
+
+	static if (WINVER >= 0x0401) {
+		alias RASSUBENTRYW RASSUBENTRY;
+		alias RASCREDENTIALSW RASCREDENTIALS;
+		alias RASAUTODIALENTRYW RASAUTODIALENTRY;
+	}
+
+	static if (WINVER >= 0x0500) {
+		alias RASEAPUSERIDENTITYW RASEAPUSERIDENTITY;
+	}
+
+} else { // ! defined UNICODE
+
+	alias RASCONNA RASCONN;
+	alias RASENTRYA  RASENTRY;
+	alias RASCONNSTATUSA RASCONNSTATUS;
+	alias RASDIALPARAMSA RASDIALPARAMS;
+	alias RASAMBA RASAMB;
+	alias RASPPPNBFA RASPPPNBF;
+	alias RASPPPIPXA RASPPPIPX;
+	alias RASPPPIPA RASPPPIP;
+	alias RASPPPLCPA RASPPPLCP;
+	alias RASSLIPA RASSLIP;
+	alias RASDEVINFOA  RASDEVINFO;
+	alias RASENTRYNAMEA RASENTRYNAME;
+
+	static if (WINVER >= 0x0401) {
+		alias RASSUBENTRYA RASSUBENTRY;
+		alias RASCREDENTIALSA RASCREDENTIALS;
+		alias RASAUTODIALENTRYA RASAUTODIALENTRY;
+	}
+	static if (WINVER >= 0x0500) {
+		alias RASEAPUSERIDENTITYA RASEAPUSERIDENTITY;
+	}
+}// ! UNICODE
+
+
+alias RASCONN* LPRASCONN;
+alias RASENTRY* LPRASENTRY;
+alias RASCONNSTATUS* LPRASCONNSTATUS;
+alias RASDIALPARAMS* LPRASDIALPARAMS;
+alias RASAMB* LPRASAM;
+alias RASPPPNBF* LPRASPPPNBF;
+alias RASPPPIPX* LPRASPPPIPX;
+alias RASPPPIP* LPRASPPPIP;
+alias RASPPPLCP* LPRASPPPLCP;
+alias RASSLIP* LPRASSLIP;
+alias RASDEVINFO* LPRASDEVINFO;
+alias RASENTRYNAME* LPRASENTRYNAME;
+
+static if (WINVER >= 0x0401) {
+	alias RASSUBENTRY* LPRASSUBENTRY;
+	alias RASCREDENTIALS* LPRASCREDENTIALS;
+	alias RASAUTODIALENTRY* LPRASAUTODIALENTRY;
+}
+static if (WINVER >= 0x0500) {
+	alias RASEAPUSERIDENTITY* LPRASEAPUSERIDENTITY;
+}
+
+/* Callback prototypes */
+deprecated {
+	alias BOOL function (HWND, LPSTR, DWORD, LPDWORD) ORASADFUNC;
+}
+
+alias void function (UINT, RASCONNSTATE, DWORD) RASDIALFUNC;
+alias void function(HRASCONN, UINT, RASCONNSTATE, DWORD,
+DWORD) RASDIALFUNC1;
+alias DWORD function (ULONG_PTR, DWORD, HRASCONN, UINT,
+RASCONNSTATE, DWORD, DWORD) RASDIALFUNC2;
+
+/* External functions */
+DWORD RasDialA (LPRASDIALEXTENSIONS, LPCSTR, LPRASDIALPARAMSA,
+DWORD, LPVOID, LPHRASCONN);
+DWORD RasDialW (LPRASDIALEXTENSIONS, LPCWSTR, LPRASDIALPARAMSW,
+DWORD, LPVOID, LPHRASCONN);
+DWORD RasEnumConnectionsA (LPRASCONNA, LPDWORD, LPDWORD);
+DWORD RasEnumConnectionsW (LPRASCONNW, LPDWORD, LPDWORD);
+DWORD RasEnumEntriesA (LPCSTR, LPCSTR, LPRASENTRYNAMEA, LPDWORD,
+LPDWORD);
+DWORD RasEnumEntriesW (LPCWSTR, LPCWSTR, LPRASENTRYNAMEW, LPDWORD,
+LPDWORD);
+DWORD RasGetConnectStatusA (HRASCONN, LPRASCONNSTATUSA);
+DWORD RasGetConnectStatusW (HRASCONN, LPRASCONNSTATUSW);
+DWORD RasGetErrorStringA (UINT, LPSTR, DWORD);
+DWORD RasGetErrorStringW (UINT, LPWSTR, DWORD);
+DWORD RasHangUpA (HRASCONN);
+DWORD RasHangUpW (HRASCONN);
+DWORD RasGetProjectionInfoA (HRASCONN, RASPROJECTION, LPVOID,
+LPDWORD);
+DWORD RasGetProjectionInfoW (HRASCONN, RASPROJECTION, LPVOID,
+LPDWORD);
+DWORD RasCreatePhonebookEntryA (HWND, LPCSTR);
+DWORD RasCreatePhonebookEntryW (HWND, LPCWSTR);
+DWORD RasEditPhonebookEntryA (HWND, LPCSTR, LPCSTR);
+DWORD RasEditPhonebookEntryW (HWND, LPCWSTR, LPCWSTR);
+DWORD RasSetEntryDialParamsA (LPCSTR, LPRASDIALPARAMSA, BOOL);
+DWORD RasSetEntryDialParamsW (LPCWSTR, LPRASDIALPARAMSW, BOOL);
+DWORD RasGetEntryDialParamsA (LPCSTR, LPRASDIALPARAMSA, LPBOOL);
+DWORD RasGetEntryDialParamsW (LPCWSTR, LPRASDIALPARAMSW, LPBOOL);
+DWORD RasEnumDevicesA (LPRASDEVINFOA, LPDWORD, LPDWORD);
+DWORD RasEnumDevicesW (LPRASDEVINFOW, LPDWORD, LPDWORD);
+DWORD RasGetCountryInfoA (LPRASCTRYINFOA, LPDWORD);
+DWORD RasGetCountryInfoW (LPRASCTRYINFOW, LPDWORD);
+DWORD RasGetEntryPropertiesA (LPCSTR, LPCSTR, LPRASENTRYA, LPDWORD,
+LPBYTE, LPDWORD);
+DWORD RasGetEntryPropertiesW (LPCWSTR, LPCWSTR, LPRASENTRYW,
+LPDWORD, LPBYTE, LPDWORD);
+DWORD RasSetEntryPropertiesA (LPCSTR, LPCSTR, LPRASENTRYA, DWORD,
+LPBYTE, DWORD);
+DWORD RasSetEntryPropertiesW (LPCWSTR, LPCWSTR, LPRASENTRYW, DWORD,
+LPBYTE, DWORD);
+DWORD RasRenameEntryA (LPCSTR, LPCSTR, LPCSTR);
+DWORD RasRenameEntryW (LPCWSTR, LPCWSTR, LPCWSTR);
+DWORD RasDeleteEntryA (LPCSTR, LPCSTR);
+DWORD RasDeleteEntryW (LPCWSTR, LPCWSTR);
+DWORD RasValidateEntryNameA (LPCSTR, LPCSTR);
+DWORD RasValidateEntryNameW (LPCWSTR, LPCWSTR);
+
+static if (WINVER >= 0x0401) {
+	alias BOOL function (LPSTR, LPSTR, LPRASADPARAMS, LPDWORD) RASADFUNCA;
+	alias BOOL function (LPWSTR, LPWSTR, LPRASADPARAMS, LPDWORD) RASADFUNCW;
+
+	DWORD RasGetSubEntryHandleA (HRASCONN, DWORD, LPHRASCONN);
+	DWORD RasGetSubEntryHandleW (HRASCONN, DWORD, LPHRASCONN);
+	DWORD RasGetCredentialsA (LPCSTR, LPCSTR, LPRASCREDENTIALSA);
+	DWORD RasGetCredentialsW (LPCWSTR, LPCWSTR, LPRASCREDENTIALSW);
+	DWORD RasSetCredentialsA (LPCSTR, LPCSTR, LPRASCREDENTIALSA, BOOL);
+	DWORD RasSetCredentialsW (LPCWSTR, LPCWSTR, LPRASCREDENTIALSW, BOOL);
+	DWORD RasConnectionNotificationA (HRASCONN, HANDLE, DWORD);
+	DWORD RasConnectionNotificationW (HRASCONN, HANDLE, DWORD);
+	DWORD RasGetSubEntryPropertiesA (LPCSTR, LPCSTR, DWORD,
+	LPRASSUBENTRYA, LPDWORD, LPBYTE, LPDWORD);
+	DWORD RasGetSubEntryPropertiesW (LPCWSTR, LPCWSTR, DWORD,
+	LPRASSUBENTRYW, LPDWORD, LPBYTE, LPDWORD);
+	DWORD RasSetSubEntryPropertiesA (LPCSTR, LPCSTR, DWORD,
+	LPRASSUBENTRYA, DWORD, LPBYTE, DWORD);
+	DWORD RasSetSubEntryPropertiesW (LPCWSTR, LPCWSTR, DWORD,
+	LPRASSUBENTRYW, DWORD, LPBYTE, DWORD);
+	DWORD RasGetAutodialAddressA (LPCSTR, LPDWORD, LPRASAUTODIALENTRYA,
+	LPDWORD, LPDWORD);
+	DWORD RasGetAutodialAddressW (LPCWSTR, LPDWORD,
+	LPRASAUTODIALENTRYW, LPDWORD, LPDWORD);
+	DWORD RasSetAutodialAddressA (LPCSTR, DWORD, LPRASAUTODIALENTRYA,
+	DWORD, DWORD);
+	DWORD RasSetAutodialAddressW (LPCWSTR, DWORD, LPRASAUTODIALENTRYW,
+	DWORD, DWORD);
+	DWORD RasEnumAutodialAddressesA (LPSTR *, LPDWORD, LPDWORD);
+	DWORD RasEnumAutodialAddressesW (LPWSTR *, LPDWORD, LPDWORD);
+	DWORD RasGetAutodialEnableA (DWORD, LPBOOL);
+	DWORD RasGetAutodialEnableW (DWORD, LPBOOL);
+	DWORD RasSetAutodialEnableA (DWORD, BOOL);
+	DWORD RasSetAutodialEnableW (DWORD, BOOL);
+	DWORD RasGetAutodialParamA (DWORD, LPVOID, LPDWORD);
+	DWORD RasGetAutodialParamW (DWORD, LPVOID, LPDWORD);
+	DWORD RasSetAutodialParamA (DWORD, LPVOID, DWORD);
+	DWORD RasSetAutodialParamW (DWORD, LPVOID, DWORD);
+}
+
+static if (WINVER >= 0x0500) {
+	alias DWORD function (HRASCONN) RasCustomHangUpFn;
+	alias DWORD function (LPCTSTR,	LPCTSTR, DWORD) RasCustomDeleteEntryNotifyFn;
+	alias DWORD function (HINSTANCE, LPRASDIALEXTENSIONS,
+	LPCTSTR, LPRASDIALPARAMS, DWORD, LPVOID, LPHRASCONN, DWORD) RasCustomDialFn;
+
+	DWORD RasInvokeEapUI (HRASCONN, DWORD, LPRASDIALEXTENSIONS, HWND);
+	DWORD RasGetLinkStatistics (HRASCONN, DWORD, RAS_STATS*);
+	DWORD RasGetConnectionStatistics (HRASCONN, RAS_STATS*);
+	DWORD RasClearLinkStatistics (HRASCONN, DWORD);
+	DWORD RasClearConnectionStatistics (HRASCONN);
+	DWORD RasGetEapUserDataA (HANDLE, LPCSTR, LPCSTR, BYTE*, DWORD*);
+	DWORD RasGetEapUserDataW (HANDLE, LPCWSTR, LPCWSTR, BYTE*, DWORD*);
+	DWORD RasSetEapUserDataA (HANDLE, LPCSTR, LPCSTR, BYTE*, DWORD);
+	DWORD RasSetEapUserDataW (HANDLE, LPCWSTR, LPCWSTR, BYTE*, DWORD);
+	DWORD RasGetCustomAuthDataA (LPCSTR,	LPCSTR,	BYTE*,	DWORD*);
+	DWORD RasGetCustomAuthDataW (LPCWSTR, LPCWSTR, BYTE*, DWORD*);
+	DWORD RasSetCustomAuthDataA (LPCSTR,	LPCSTR,	BYTE*,	DWORD);
+	DWORD RasSetCustomAuthDataW (LPCWSTR, LPCWSTR, BYTE*, DWORD);
+	DWORD RasGetEapUserIdentityW (LPCWSTR, LPCWSTR, DWORD, HWND, LPRASEAPUSERIDENTITYW*);
+	DWORD RasGetEapUserIdentityA (LPCSTR, LPCSTR, DWORD, HWND, LPRASEAPUSERIDENTITYA*);
+	void RasFreeEapUserIdentityW (LPRASEAPUSERIDENTITYW);
+	void RasFreeEapUserIdentityA (LPRASEAPUSERIDENTITYA);
+}
+
+
+/* UNICODE defines for functions */
+version(Unicode) {
+	alias RasDialW RasDial;
+	alias RasEnumConnectionsW RasEnumConnections;
+	alias RasEnumEntriesW RasEnumEntries;
+	alias RasGetConnectStatusW RasGetConnectStatus;
+	alias RasGetErrorStringW RasGetErrorString;
+	alias RasHangUpW RasHangUp;
+	alias RasGetProjectionInfoW RasGetProjectionInfo;
+	alias RasCreatePhonebookEntryW RasCreatePhonebookEntry;
+	alias RasEditPhonebookEntryW RasEditPhonebookEntry;
+	alias RasSetEntryDialParamsW RasSetEntryDialParams;
+	alias RasGetEntryDialParamsW RasGetEntryDialParams;
+	alias RasEnumDevicesW RasEnumDevices;
+	alias RasGetCountryInfoW RasGetCountryInfo;
+	alias RasGetEntryPropertiesW RasGetEntryProperties;
+	alias RasSetEntryPropertiesW RasSetEntryProperties;
+	alias RasRenameEntryW RasRenameEntry;
+	alias RasDeleteEntryW RasDeleteEntry;
+	alias RasValidateEntryNameW RasValidateEntryName;
+
+	static if (WINVER >= 0x0401) {
+		alias RASADFUNCW RASADFUNC;
+		alias RasGetSubEntryHandleW RasGetSubEntryHandle;
+		alias RasConnectionNotificationW RasConnectionNotification;
+		alias RasGetSubEntryPropertiesW RasGetSubEntryProperties;
+		alias RasSetSubEntryPropertiesW RasSetSubEntryProperties;
+		alias RasGetCredentialsW RasGetCredentials;
+		alias RasSetCredentialsW RasSetCredentials;
+		alias RasGetAutodialAddressW RasGetAutodialAddress;
+		alias RasSetAutodialAddressW RasSetAutodialAddress;
+		alias RasEnumAutodialAddressesW RasEnumAutodialAddresses;
+		alias RasGetAutodialEnableW RasGetAutodialEnable;
+		alias RasSetAutodialEnableW RasSetAutodialEnable;
+		alias RasGetAutodialParamW RasGetAutodialParam;
+		alias RasSetAutodialParamW RasSetAutodialParam;
+	}
+
+	static if (WINVER >= 0x0500) {
+		alias RasGetEapUserDataW RasGetEapUserData;
+		alias RasSetEapUserDataW RasSetEapUserData;
+		alias RasGetCustomAuthDataW RasGetCustomAuthData;
+		alias RasSetCustomAuthDataW RasSetCustomAuthData;
+		alias RasGetEapUserIdentityW RasGetEapUserIdentity;
+		alias RasFreeEapUserIdentityW RasFreeEapUserIdentity;
+	}
+
+} else { // ! defined UNICODE
+	alias RasDialA RasDial;
+	alias RasEnumConnectionsA RasEnumConnections;
+	alias RasEnumEntriesA RasEnumEntries;
+	alias RasGetConnectStatusA RasGetConnectStatus;
+	alias RasGetErrorStringA RasGetErrorString;
+	alias RasHangUpA RasHangUp;
+	alias RasGetProjectionInfoA RasGetProjectionInfo;
+	alias RasCreatePhonebookEntryA RasCreatePhonebookEntry;
+	alias RasEditPhonebookEntryA RasEditPhonebookEntry;
+	alias RasSetEntryDialParamsA RasSetEntryDialParams;
+	alias RasGetEntryDialParamsA RasGetEntryDialParams;
+	alias RasEnumDevicesA RasEnumDevices;
+	alias RasGetCountryInfoA RasGetCountryInfo;
+	alias RasGetEntryPropertiesA RasGetEntryProperties;
+	alias RasSetEntryPropertiesA RasSetEntryProperties;
+	alias RasRenameEntryA RasRenameEntry;
+	alias RasDeleteEntryA RasDeleteEntry;
+	alias RasValidateEntryNameA RasValidateEntryName;
+
+	static if (WINVER >= 0x0401) {
+		alias RASADFUNCA RASADFUNC;
+		alias RasGetSubEntryHandleA RasGetSubEntryHandle;
+		alias RasConnectionNotificationA RasConnectionNotification;
+		alias RasGetSubEntryPropertiesA RasGetSubEntryProperties;
+		alias RasSetSubEntryPropertiesA RasSetSubEntryProperties;
+		alias RasGetCredentialsA RasGetCredentials;
+		alias RasSetCredentialsA RasSetCredentials;
+		alias RasGetAutodialAddressA RasGetAutodialAddress;
+		alias RasSetAutodialAddressA RasSetAutodialAddress;
+		alias RasEnumAutodialAddressesA RasEnumAutodialAddresses;
+		alias RasGetAutodialEnableA RasGetAutodialEnable;
+		alias RasSetAutodialEnableA RasSetAutodialEnable;
+		alias RasGetAutodialParamA RasGetAutodialParam;
+		alias RasSetAutodialParamA RasSetAutodialParam;
+	}
+
+	static if (WINVER >= 0x0500) {
+		alias RasGetEapUserDataA RasGetEapUserData;
+		alias RasSetEapUserDataA RasSetEapUserData;
+		alias RasGetCustomAuthDataA RasGetCustomAuthData;
+		alias RasSetCustomAuthDataA RasSetCustomAuthData;
+		alias RasGetEapUserIdentityA RasGetEapUserIdentity;
+		alias RasFreeEapUserIdentityA RasFreeEapUserIdentity;
+	}
+} //#endif // ! UNICODE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/rasdlg.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,159 @@
+/***********************************************************************\
+*                                rasdlg.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.rasdlg;
+
+import win32.ras;
+private import win32.lmcons, win32.windef;
+
+enum {
+	RASPBDEVENT_AddEntry = 1,
+	RASPBDEVENT_EditEntry,
+	RASPBDEVENT_RemoveEntry,
+	RASPBDEVENT_DialEntry,
+	RASPBDEVENT_EditGlobals,
+	RASPBDEVENT_NoUser,
+	RASPBDEVENT_NoUserEdit
+}
+
+const RASPBDFLAG_PositionDlg      =  1;
+const RASPBDFLAG_ForceCloseOnDial =  2;
+const RASPBDFLAG_NoUser           = 16;
+
+const RASEDFLAG_PositionDlg = 1;
+const RASEDFLAG_NewEntry    = 2;
+const RASEDFLAG_CloneEntry  = 4;
+
+const RASDDFLAG_PositionDlg = 1;
+
+align(4):
+
+struct RASENTRYDLGA {
+	DWORD     dwSize = RASENTRYDLGA.sizeof;
+	HWND      hwndOwner;
+	DWORD     dwFlags;
+	LONG      xDlg;
+	LONG      yDlg;
+	CHAR[RAS_MaxEntryName + 1] szEntry;
+	DWORD     dwError;
+	ULONG_PTR reserved;
+	ULONG_PTR reserved2;
+}
+alias RASENTRYDLGA* LPRASENTRYDLGA;
+
+struct RASENTRYDLGW {
+	DWORD     dwSize = RASENTRYDLGW.sizeof;
+	HWND      hwndOwner;
+	DWORD     dwFlags;
+	LONG      xDlg;
+	LONG      yDlg;
+	WCHAR[RAS_MaxEntryName + 1] szEntry;
+	DWORD     dwError;
+	ULONG_PTR reserved;
+	ULONG_PTR reserved2;
+}
+alias RASENTRYDLGW* LPRASENTRYDLGW;
+
+struct RASDIALDLG {
+	DWORD     dwSize;
+	HWND      hwndOwner;
+	DWORD     dwFlags;
+	LONG      xDlg;
+	LONG      yDlg;
+	DWORD     dwSubEntry;
+	DWORD     dwError;
+	ULONG_PTR reserved;
+	ULONG_PTR reserved2;
+}
+alias RASDIALDLG* LPRASDIALDLG;
+
+// Application-defined callback functions
+extern (Windows) {
+	alias VOID function(DWORD, DWORD, LPWSTR, LPVOID) RASPBDLGFUNCW;
+	alias VOID function(DWORD, DWORD, LPSTR, LPVOID) RASPBDLGFUNCA;
+}
+
+struct RASPBDLGA {
+	DWORD         dwSize = RASPBDLGA.sizeof;
+	HWND          hwndOwner;
+	DWORD         dwFlags;
+	LONG          xDlg;
+	LONG          yDlg;
+	ULONG_PTR     dwCallbackId;
+	RASPBDLGFUNCA pCallback;
+	DWORD         dwError;
+	ULONG_PTR     reserved;
+	ULONG_PTR     reserved2;
+}
+alias RASPBDLGA* LPRASPBDLGA;
+
+struct RASPBDLGW {
+	DWORD         dwSize = RASPBDLGW.sizeof;
+	HWND          hwndOwner;
+	DWORD         dwFlags;
+	LONG          xDlg;
+	LONG          yDlg;
+	ULONG_PTR     dwCallbackId;
+	RASPBDLGFUNCW pCallback;
+	DWORD         dwError;
+	ULONG_PTR     reserved;
+	ULONG_PTR     reserved2;
+}
+alias RASPBDLGW* LPRASPBDLGW;
+
+struct RASNOUSERA
+{
+	DWORD           dwSize = RASNOUSERA.sizeof;
+	DWORD           dwFlags;
+	DWORD           dwTimeoutMs;
+	CHAR[UNLEN + 1] szUserName;
+	CHAR[PWLEN + 1] szPassword;
+	CHAR[DNLEN + 1] szDomain;
+}
+alias RASNOUSERA* LPRASNOUSERA;
+
+struct RASNOUSERW {
+	DWORD            dwSize = RASNOUSERW.sizeof;
+	DWORD            dwFlags;
+	DWORD            dwTimeoutMs;
+	WCHAR[UNLEN + 1] szUserName;
+	WCHAR[PWLEN + 1] szPassword;
+	WCHAR[DNLEN + 1] szDomain;
+}
+alias RASNOUSERW* LPRASNOUSERW;
+
+extern (Windows) {
+	BOOL RasDialDlgA(LPSTR, LPSTR, LPSTR, LPRASDIALDLG);
+	BOOL RasDialDlgW(LPWSTR, LPWSTR, LPWSTR, LPRASDIALDLG);
+	BOOL RasEntryDlgA(LPSTR, LPSTR, LPRASENTRYDLGA);
+	BOOL RasEntryDlgW(LPWSTR, LPWSTR, LPRASENTRYDLGW);
+	BOOL RasPhonebookDlgA(LPSTR, LPSTR, LPRASPBDLGA);
+	BOOL RasPhonebookDlgW(LPWSTR, LPWSTR, LPRASPBDLGW);
+}
+
+version (Unicode) {
+	alias RASENTRYDLGW RASENTRYDLG;
+	alias RASPBDLGW RASPBDLG;
+	alias RASNOUSERW RASNOUSER;
+	alias RasDialDlgW RasDialDlg;
+	alias RasEntryDlgW RasEntryDlg;
+	alias RasPhonebookDlgW RasPhonebookDlg;
+} else {
+	alias RASENTRYDLGA RASENTRYDLG;
+	alias RASPBDLGA RASPBDLG;
+	alias RASNOUSERA RASNOUSER;
+	alias RasDialDlgA RasDialDlg;
+	alias RasEntryDlgA RasEntryDlg;
+	alias RasPhonebookDlgA RasPhonebookDlg;
+}
+
+alias RASENTRYDLG* LPRASENTRYDLG;
+alias RASPBDLG* LPRASPBDLG;
+alias RASNOUSER* LPRASNOUSER;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/raserror.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,215 @@
+/***********************************************************************\
+*                               raserror.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.raserror;
+
+enum {
+	SUCCESS = 0,
+	RASBASE = 600,
+	PENDING = RASBASE,
+	ERROR_INVALID_PORT_HANDLE,
+	ERROR_PORT_ALREADY_OPEN,
+	ERROR_BUFFER_TOO_SMALL,
+	ERROR_WRONG_INFO_SPECIFIED,
+	ERROR_CANNOT_SET_PORT_INFO,
+	ERROR_PORT_NOT_CONNECTED,
+	ERROR_EVENT_INVALID,
+	ERROR_DEVICE_DOES_NOT_EXIST,
+	ERROR_DEVICETYPE_DOES_NOT_EXIST,
+	ERROR_BUFFER_INVALID,
+	ERROR_ROUTE_NOT_AVAILABLE,
+	ERROR_ROUTE_NOT_ALLOCATED,
+	ERROR_INVALID_COMPRESSION_SPECIFIED,
+	ERROR_OUT_OF_BUFFERS,
+	ERROR_PORT_NOT_FOUND,
+	ERROR_ASYNC_REQUEST_PENDING,
+	ERROR_ALREADY_DISCONNECTING,
+	ERROR_PORT_NOT_OPEN,
+	ERROR_PORT_DISCONNECTED,
+	ERROR_NO_ENDPOINTS,
+	ERROR_CANNOT_OPEN_PHONEBOOK,
+	ERROR_CANNOT_LOAD_PHONEBOOK,
+	ERROR_CANNOT_FIND_PHONEBOOK_ENTRY,
+	ERROR_CANNOT_WRITE_PHONEBOOK,
+	ERROR_CORRUPT_PHONEBOOK,
+	ERROR_CANNOT_LOAD_STRING,
+	ERROR_KEY_NOT_FOUND,
+	ERROR_DISCONNECTION,
+	ERROR_REMOTE_DISCONNECTION,
+	ERROR_HARDWARE_FAILURE,
+	ERROR_USER_DISCONNECTION,
+	ERROR_INVALID_SIZE,
+	ERROR_PORT_NOT_AVAILABLE,
+	ERROR_CANNOT_PROJECT_CLIENT,
+	ERROR_UNKNOWN,
+	ERROR_WRONG_DEVICE_ATTACHED,
+	ERROR_BAD_STRING,
+	ERROR_REQUEST_TIMEOUT,
+	ERROR_CANNOT_GET_LANA,
+	ERROR_NETBIOS_ERROR,
+	ERROR_SERVER_OUT_OF_RESOURCES,
+	ERROR_NAME_EXISTS_ON_NET,
+	ERROR_SERVER_GENERAL_NET_FAILURE,
+	WARNING_MSG_ALIAS_NOT_ADDED,
+	ERROR_AUTH_INTERNAL,
+	ERROR_RESTRICTED_LOGON_HOURS,
+	ERROR_ACCT_DISABLED,
+	ERROR_PASSWD_EXPIRED,
+	ERROR_NO_DIALIN_PERMISSION,
+	ERROR_SERVER_NOT_RESPONDING,
+	ERROR_FROM_DEVICE,
+	ERROR_UNRECOGNIZED_RESPONSE,
+	ERROR_MACRO_NOT_FOUND,
+	ERROR_MACRO_NOT_DEFINED,
+	ERROR_MESSAGE_MACRO_NOT_FOUND,
+	ERROR_DEFAULTOFF_MACRO_NOT_FOUND,
+	ERROR_FILE_COULD_NOT_BE_OPENED,
+	ERROR_DEVICENAME_TOO_LONG,
+	ERROR_DEVICENAME_NOT_FOUND,
+	ERROR_NO_RESPONSES,
+	ERROR_NO_COMMAND_FOUND,
+	ERROR_WRONG_KEY_SPECIFIED,
+	ERROR_UNKNOWN_DEVICE_TYPE,
+	ERROR_ALLOCATING_MEMORY,
+	ERROR_PORT_NOT_CONFIGURED,
+	ERROR_DEVICE_NOT_READY,
+	ERROR_READING_INI_FILE,
+	ERROR_NO_CONNECTION,
+	ERROR_BAD_USAGE_IN_INI_FILE,
+	ERROR_READING_SECTIONNAME,
+	ERROR_READING_DEVICETYPE,
+	ERROR_READING_DEVICENAME,
+	ERROR_READING_USAGE,
+	ERROR_READING_MAXCONNECTBPS,
+	ERROR_READING_MAXCARRIERBPS,
+	ERROR_LINE_BUSY,
+	ERROR_VOICE_ANSWER,
+	ERROR_NO_ANSWER,
+	ERROR_NO_CARRIER,
+	ERROR_NO_DIALTONE,
+	ERROR_IN_COMMAND,
+	ERROR_WRITING_SECTIONNAME,
+	ERROR_WRITING_DEVICETYPE,
+	ERROR_WRITING_DEVICENAME,
+	ERROR_WRITING_MAXCONNECTBPS,
+	ERROR_WRITING_MAXCARRIERBPS,
+	ERROR_WRITING_USAGE,
+	ERROR_WRITING_DEFAULTOFF,
+	ERROR_READING_DEFAULTOFF,
+	ERROR_EMPTY_INI_FILE,
+	ERROR_AUTHENTICATION_FAILURE,
+	ERROR_PORT_OR_DEVICE,
+	ERROR_NOT_BINARY_MACRO,
+	ERROR_DCB_NOT_FOUND,
+	ERROR_STATE_MACHINES_NOT_STARTED,
+	ERROR_STATE_MACHINES_ALREADY_STARTED,
+	ERROR_PARTIAL_RESPONSE_LOOPING,
+	ERROR_UNKNOWN_RESPONSE_KEY,
+	ERROR_RECV_BUF_FULL,
+	ERROR_CMD_TOO_LONG,
+	ERROR_UNSUPPORTED_BPS,
+	ERROR_UNEXPECTED_RESPONSE,
+	ERROR_INTERACTIVE_MODE,
+	ERROR_BAD_CALLBACK_NUMBER,
+	ERROR_INVALID_AUTH_STATE,
+	ERROR_WRITING_INITBPS,
+	ERROR_X25_DIAGNOSTIC,
+	ERROR_ACCT_EXPIRED,
+	ERROR_CHANGING_PASSWORD,
+	ERROR_OVERRUN,
+	ERROR_RASMAN_CANNOT_INITIALIZE,
+	ERROR_BIPLEX_PORT_NOT_AVAILABLE,
+	ERROR_NO_ACTIVE_ISDN_LINES,
+	ERROR_NO_ISDN_CHANNELS_AVAILABLE,
+	ERROR_TOO_MANY_LINE_ERRORS,
+	ERROR_IP_CONFIGURATION,
+	ERROR_NO_IP_ADDRESSES,
+	ERROR_PPP_TIMEOUT,
+	ERROR_PPP_REMOTE_TERMINATED,
+	ERROR_PPP_NO_PROTOCOLS_CONFIGURED,
+	ERROR_PPP_NO_RESPONSE,
+	ERROR_PPP_INVALID_PACKET,
+	ERROR_PHONE_NUMBER_TOO_LONG,
+	ERROR_IPXCP_NO_DIALOUT_CONFIGURED,
+	ERROR_IPXCP_NO_DIALIN_CONFIGURED,
+	ERROR_IPXCP_DIALOUT_ALREADY_ACTIVE,
+	ERROR_ACCESSING_TCPCFGDLL,
+	ERROR_NO_IP_RAS_ADAPTER,
+	ERROR_SLIP_REQUIRES_IP,
+	ERROR_PROJECTION_NOT_COMPLETE,
+	ERROR_PROTOCOL_NOT_CONFIGURED,
+	ERROR_PPP_NOT_CONVERGING,
+	ERROR_PPP_CP_REJECTED,
+	ERROR_PPP_LCP_TERMINATED,
+	ERROR_PPP_REQUIRED_ADDRESS_REJECTED,
+	ERROR_PPP_NCP_TERMINATED,
+	ERROR_PPP_LOOPBACK_DETECTED,
+	ERROR_PPP_NO_ADDRESS_ASSIGNED,
+	ERROR_CANNOT_USE_LOGON_CREDENTIALS,
+	ERROR_TAPI_CONFIGURATION,
+	ERROR_NO_LOCAL_ENCRYPTION,
+	ERROR_NO_REMOTE_ENCRYPTION,
+	ERROR_REMOTE_REQUIRES_ENCRYPTION,
+	ERROR_IPXCP_NET_NUMBER_CONFLICT,
+	ERROR_INVALID_SMM,
+	ERROR_SMM_UNINITIALIZED,
+	ERROR_NO_MAC_FOR_PORT,
+	ERROR_SMM_TIMEOUT,
+	ERROR_BAD_PHONE_NUMBER,
+	ERROR_WRONG_MODULE,
+	ERROR_INVALID_CALLBACK_NUMBER,
+	ERROR_SCRIPT_SYNTAX,
+	ERROR_HANGUP_FAILED,
+	ERROR_BUNDLE_NOT_FOUND,
+	ERROR_CANNOT_DO_CUSTOMDIAL,
+	ERROR_DIAL_ALREADY_IN_PROGRESS,
+	ERROR_RASAUTO_CANNOT_INITIALIZE,
+	ERROR_CONNECTION_ALREADY_SHARED,
+	ERROR_SHARING_CHANGE_FAILED,
+	ERROR_SHARING_ROUTER_INSTALL,
+	ERROR_SHARE_CONNECTION_FAILED,
+	ERROR_SHARING_PRIVATE_INSTALL,
+	ERROR_CANNOT_SHARE_CONNECTION,
+	ERROR_NO_SMART_CARD_READER,
+	ERROR_SHARING_ADDRESS_EXISTS,
+	ERROR_NO_CERTIFICATE,
+	ERROR_SHARING_MULTIPLE_ADDRESSES,
+	ERROR_FAILED_TO_ENCRYPT,
+	ERROR_BAD_ADDRESS_SPECIFIED,
+	ERROR_CONNECTION_REJECT,
+	ERROR_CONGESTION,
+	ERROR_INCOMPATIBLE,
+	ERROR_NUMBERCHANGED,
+	ERROR_TEMPFAILURE,
+	ERROR_BLOCKED,
+	ERROR_DONOTDISTURB,
+	ERROR_OUTOFORDER,
+	ERROR_UNABLE_TO_AUTHENTICATE_SERVER,
+	ERROR_SMART_CARD_REQUIRED,
+	ERROR_INVALID_FUNCTION_FOR_ENTRY,
+	ERROR_CERT_FOR_ENCRYPTION_NOT_FOUND,
+	ERROR_SHARING_RRAS_CONFLICT,
+	ERROR_SHARING_NO_PRIVATE_LAN,
+	ERROR_NO_DIFF_USER_AT_LOGON,
+	ERROR_NO_REG_CERT_AT_LOGON,
+	ERROR_OAKLEY_NO_CERT,
+	ERROR_OAKLEY_AUTH_FAIL,
+	ERROR_OAKLEY_ATTRIB_FAIL,
+	ERROR_OAKLEY_GENERAL_PROCESSING,
+	ERROR_OAKLEY_NO_PEER_CERT,
+	ERROR_OAKLEY_NO_POLICY,
+	ERROR_OAKLEY_TIMED_OUT,
+	ERROR_OAKLEY_ERROR,
+	ERROR_UNKNOWN_FRAMED_PROTOCOL,
+	ERROR_WRONG_TUNNEL_TYPE,
+	ERROR_UNKNOWN_SERVICE_TYPE,
+	ERROR_CONNECTING_DEVICE_NOT_FOUND,
+	ERROR_NO_EAPTLS_CERTIFICATE, // = RASBASE+198
+	RASBASEEND = ERROR_NO_EAPTLS_CERTIFICATE
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/rassapi.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,220 @@
+/***********************************************************************\
+*                               rassapi.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.rassapi;
+
+private import win32.lmcons, win32.windef;
+
+// FIXME: check types of constants
+
+const size_t
+	RASSAPI_MAX_PHONENUMBER_SIZE = 128,
+	RASSAPI_MAX_MEDIA_NAME	     =  16,
+	RASSAPI_MAX_PORT_NAME	     =  16,
+	RASSAPI_MAX_DEVICE_NAME      = 128,
+	RASSAPI_MAX_DEVICETYPE_NAME  =  16,
+	RASSAPI_MAX_PARAM_KEY_SIZE   =  32;
+
+const RASPRIV_NoCallback        = 0x01;
+const RASPRIV_AdminSetCallback  = 0x02;
+const RASPRIV_CallerSetCallback = 0x04;
+const RASPRIV_DialinPrivilege   = 0x08;
+const RASPRIV_CallbackType      = 0x07;
+
+enum {
+	RAS_MODEM_OPERATIONAL = 1,
+	RAS_MODEM_NOT_RESPONDING,
+	RAS_MODEM_HARDWARE_FAILURE,
+	RAS_MODEM_INCORRECT_RESPONSE,
+	RAS_MODEM_UNKNOWN  // = 5
+}
+
+enum {
+	RAS_PORT_NON_OPERATIONAL = 1,
+	RAS_PORT_DISCONNECTED,
+	RAS_PORT_CALLING_BACK,
+	RAS_PORT_LISTENING,
+	RAS_PORT_AUTHENTICATING,
+	RAS_PORT_AUTHENTICATED,
+	RAS_PORT_INITIALIZING // = 7
+}
+
+enum {
+	MEDIA_UNKNOWN,
+	MEDIA_SERIAL,
+	MEDIA_RAS10_SERIAL,
+	MEDIA_X25,
+	MEDIA_ISDN
+}
+
+const USER_AUTHENTICATED = 0x0001;
+const MESSENGER_PRESENT  = 0x0002;
+const PPP_CLIENT         = 0x0004;
+const GATEWAY_ACTIVE     = 0x0008;
+const REMOTE_LISTEN      = 0x0010;
+const PORT_MULTILINKED   = 0x0020;
+
+const size_t
+	RAS_IPADDRESSLEN  = 15,
+	RAS_IPXADDRESSLEN = 22,
+	RAS_ATADDRESSLEN  = 32;
+
+// FIXME: should these be grouped together?
+enum {
+	RASDOWNLEVEL     = 10,
+	RASADMIN_35      = 35,
+	RASADMIN_CURRENT = 40
+}
+
+alias ULONG IPADDR;
+
+enum RAS_PARAMS_FORMAT {
+    ParamNumber = 0,
+    ParamString
+}
+
+union RAS_PARAMS_VALUE {
+	DWORD Number;
+	struct _String {
+		DWORD Length;
+		PCHAR Data;
+	}
+	_String String;
+}
+
+struct RAS_PARAMETERS {
+	CHAR[RASSAPI_MAX_PARAM_KEY_SIZE] P_Key;
+	RAS_PARAMS_FORMAT                P_Type;
+	BYTE                             P_Attributes;
+	RAS_PARAMS_VALUE                 P_Value;
+}
+
+struct RAS_USER_0 {
+	BYTE                                    bfPrivilege;
+	WCHAR[RASSAPI_MAX_PHONENUMBER_SIZE + 1] szPhoneNumber;
+}
+alias RAS_USER_0* PRAS_USER_0;
+
+struct RAS_PORT_0 {
+	WCHAR[RASSAPI_MAX_PORT_NAME]       wszPortName;
+	WCHAR[RASSAPI_MAX_DEVICETYPE_NAME] wszDeviceType;
+	WCHAR[RASSAPI_MAX_DEVICE_NAME]     wszDeviceName;
+	WCHAR[RASSAPI_MAX_MEDIA_NAME]      wszMediaName;
+	DWORD                              reserved;
+	DWORD                              Flags;
+	WCHAR[UNLEN + 1]                   wszUserName;
+	WCHAR[NETBIOS_NAME_LEN]            wszComputer;
+	DWORD                              dwStartSessionTime; // seconds from 1/1/1970
+	WCHAR[DNLEN + 1]                   wszLogonDomain;
+	BOOL                               fAdvancedServer;
+}
+alias RAS_PORT_0* PRAS_PORT_0;
+
+struct RAS_PPP_NBFCP_RESULT {
+	DWORD dwError;
+	DWORD dwNetBiosError;
+	CHAR[NETBIOS_NAME_LEN + 1]  szName;
+	WCHAR[NETBIOS_NAME_LEN + 1] wszWksta;
+}
+
+struct RAS_PPP_IPCP_RESULT {
+	DWORD dwError;
+	WCHAR[RAS_IPADDRESSLEN + 1] wszAddress;
+}
+
+struct RAS_PPP_IPXCP_RESULT {
+	DWORD dwError;
+	WCHAR[RAS_IPXADDRESSLEN + 1] wszAddress;
+}
+
+struct RAS_PPP_ATCP_RESULT {
+	DWORD dwError;
+	WCHAR[RAS_ATADDRESSLEN + 1] wszAddress;
+}
+
+struct RAS_PPP_PROJECTION_RESULT {
+	RAS_PPP_NBFCP_RESULT nbf;
+	RAS_PPP_IPCP_RESULT  ip;
+	RAS_PPP_IPXCP_RESULT ipx;
+	RAS_PPP_ATCP_RESULT  at;
+}
+
+struct RAS_PORT_1 {
+	RAS_PORT_0 rasport0;
+	DWORD      LineCondition;
+	DWORD      HardwareCondition;
+	DWORD      LineSpeed;
+	WORD       NumStatistics;
+	WORD       NumMediaParms;
+	DWORD      SizeMediaParms;
+	RAS_PPP_PROJECTION_RESULT ProjResult;
+}
+alias RAS_PORT_1* PRAS_PORT_1;
+
+struct RAS_PORT_STATISTICS {
+	DWORD dwBytesXmited;
+	DWORD dwBytesRcved;
+	DWORD dwFramesXmited;
+	DWORD dwFramesRcved;
+	DWORD dwCrcErr;
+	DWORD dwTimeoutErr;
+	DWORD dwAlignmentErr;
+	DWORD dwHardwareOverrunErr;
+	DWORD dwFramingErr;
+	DWORD dwBufferOverrunErr;
+	DWORD dwBytesXmitedUncompressed;
+	DWORD dwBytesRcvedUncompressed;
+	DWORD dwBytesXmitedCompressed;
+	DWORD dwBytesRcvedCompressed;
+	DWORD dwPortBytesXmited;
+	DWORD dwPortBytesRcved;
+	DWORD dwPortFramesXmited;
+	DWORD dwPortFramesRcved;
+	DWORD dwPortCrcErr;
+	DWORD dwPortTimeoutErr;
+	DWORD dwPortAlignmentErr;
+	DWORD dwPortHardwareOverrunErr;
+	DWORD dwPortFramingErr;
+	DWORD dwPortBufferOverrunErr;
+	DWORD dwPortBytesXmitedUncompressed;
+	DWORD dwPortBytesRcvedUncompressed;
+	DWORD dwPortBytesXmitedCompressed;
+	DWORD dwPortBytesRcvedCompressed;
+}
+alias RAS_PORT_STATISTICS* PRAS_PORT_STATISTICS;
+
+struct RAS_SERVER_0 {
+	WORD TotalPorts;
+	WORD PortsInUse;
+	DWORD RasVersion;
+}
+alias RAS_SERVER_0* PRAS_SERVER_0;
+
+extern (Windows) {
+	DWORD RasAdminServerGetInfo(WCHAR*, PRAS_SERVER_0);
+	DWORD RasAdminGetUserAccountServer(WCHAR*, WCHAR*, LPWSTR);
+	DWORD RasAdminUserGetInfo(WCHAR*, WCHAR*, PRAS_USER_0);
+	DWORD RasAdminUserSetInfo(WCHAR*, WCHAR*, PRAS_USER_0);
+	DWORD RasAdminPortEnum(WCHAR*, PRAS_PORT_0*, WORD*);
+	DWORD RasAdminPortGetInfo(WCHAR*, WCHAR*, RAS_PORT_1*,
+	 RAS_PORT_STATISTICS*, RAS_PARAMETERS**);
+	DWORD RasAdminPortClearStatistics(WCHAR*, WCHAR*);
+	DWORD RasAdminPortDisconnect(WCHAR*, WCHAR*);
+	DWORD RasAdminFreeBuffer(PVOID);
+	DWORD RasAdminGetErrorString(UINT, WCHAR*, DWORD);
+	BOOL RasAdminAcceptNewConnection(RAS_PORT_1*, RAS_PORT_STATISTICS*,
+	 RAS_PARAMETERS*);
+	VOID RasAdminConnectionHangupNotification(RAS_PORT_1*,
+	  RAS_PORT_STATISTICS*, RAS_PARAMETERS*);
+	DWORD RasAdminGetIpAddressForUser (WCHAR*, WCHAR*, IPADDR*, BOOL*);
+	VOID RasAdminReleaseIpAddress (WCHAR*, WCHAR*,IPADDR*);
+	DWORD RasAdminGetUserParms(WCHAR*, PRAS_USER_0);
+	DWORD RasAdminSetUserParms(WCHAR*, DWORD, PRAS_USER_0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/readme.txt	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,15 @@
++--------------------------------------+
+| Translation of the Win32 API headers |
++--------------------------------------+
+
+This is a project to create a well-crafted translation of the Windows 32-bit API headers in the D programming language.
+
+The project started off as an improvement of Y. Tomino's translation, but is now a derivative of the public domain MinGW Windows headers.
+
+The official project page is at
+
+http://www.dsource.org/projects/bindings/wiki/WindowsApi
+
+If you wish to contribute to this project, please assign modules to yourself at that site, and refer to the translation instructions.
+
+Email me with comments/suggestions/bug reports: smjg@iname.com
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/reason.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,63 @@
+/***********************************************************************\
+*                                reason.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.reason;
+
+private import win32.w32api, win32.windef;
+
+static assert (_WIN32_WINNT >= 0x501,
+  "win32.reason is only available on WindowsXP and later");
+
+
+enum : DWORD {
+	SHTDN_REASON_MAJOR_OTHER           = 0x00000000,
+	SHTDN_REASON_MAJOR_HARDWARE        = 0x00010000,
+	SHTDN_REASON_MAJOR_OPERATINGSYSTEM = 0x00020000,
+	SHTDN_REASON_MAJOR_SOFTWARE        = 0x00030000,
+	SHTDN_REASON_MAJOR_APPLICATION     = 0x00040000,
+	SHTDN_REASON_MAJOR_SYSTEM          = 0x00050000,
+	SHTDN_REASON_MAJOR_POWER           = 0x00060000,
+	SHTDN_REASON_MAJOR_LEGACY_API      = 0x00070000
+}
+
+enum : DWORD {
+	SHTDN_REASON_MINOR_OTHER,
+	SHTDN_REASON_MINOR_MAINTENANCE,
+	SHTDN_REASON_MINOR_INSTALLATION,
+	SHTDN_REASON_MINOR_UPGRADE,
+	SHTDN_REASON_MINOR_RECONFIG,
+	SHTDN_REASON_MINOR_HUNG,
+	SHTDN_REASON_MINOR_UNSTABLE,
+	SHTDN_REASON_MINOR_DISK,
+	SHTDN_REASON_MINOR_PROCESSOR,
+	SHTDN_REASON_MINOR_NETWORKCARD,
+	SHTDN_REASON_MINOR_POWER_SUPPLY,
+	SHTDN_REASON_MINOR_CORDUNPLUGGED,
+	SHTDN_REASON_MINOR_ENVIRONMENT,
+	SHTDN_REASON_MINOR_HARDWARE_DRIVER,
+	SHTDN_REASON_MINOR_OTHERDRIVER,
+	SHTDN_REASON_MINOR_BLUESCREEN,
+	SHTDN_REASON_MINOR_SERVICEPACK,
+	SHTDN_REASON_MINOR_HOTFIX,
+	SHTDN_REASON_MINOR_SECURITYFIX,
+	SHTDN_REASON_MINOR_SECURITY,
+	SHTDN_REASON_MINOR_NETWORK_CONNECTIVITY,
+	SHTDN_REASON_MINOR_WMI,
+	SHTDN_REASON_MINOR_SERVICEPACK_UNINSTALL,
+	SHTDN_REASON_MINOR_HOTFIX_UNINSTALL,
+	SHTDN_REASON_MINOR_SECURITYFIX_UNINSTALL,
+	SHTDN_REASON_MINOR_MMC,         // = 0x00000019
+	SHTDN_REASON_MINOR_TERMSRV         = 0x00000020
+}
+
+enum : DWORD {
+	SHTDN_REASON_FLAG_USER_DEFINED     = 0x40000000,
+	SHTDN_REASON_FLAG_PLANNED          = 0x80000000
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/regstr.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,816 @@
+/***********************************************************************\
+*                                regstr.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.regstr;
+
+// TODO: fix possible conflict with shloj. Sort out NEC_98 issue.
+
+private import win32.windef;
+
+const REGSTR_MAX_VALUE_LENGTH = 256;
+
+enum {
+	IT_COMPACT = 0,
+	IT_TYPICAL,
+	IT_PORTABLE,
+	IT_CUSTOM // = 3
+}
+
+const DOSOPTGF_DEFCLEAN = 1;
+
+const DOSOPTF_DEFAULT     = 0x01;
+const DOSOPTF_SUPPORTED   = 0x02;
+const DOSOPTF_ALWAYSUSE   = 0x04;
+const DOSOPTF_USESPMODE   = 0x08;
+const DOSOPTF_PROVIDESUMB = 0x10;
+const DOSOPTF_NEEDSETUP   = 0x20;
+const DOSOPTF_INDOSSTART  = 0x40;
+const DOSOPTF_MULTIPLE    = 0x80;
+
+const SUF_FIRSTTIME  = 0x0001;
+const SUF_EXPRESS    = 0x0002;
+const SUF_BATCHINF   = 0x0004;
+const SUF_CLEAN      = 0x0008;
+const SUF_INSETUP    = 0x0010;
+const SUF_NETSETUP   = 0x0020;
+const SUF_NETHDBOOT  = 0x0040;
+const SUF_NETRPLBOOT = 0x0080;
+const SUF_SBSCOPYOK  = 0x0100;
+
+const VPDF_DISABLEPWRMGMT       = 1;
+const VPDF_FORCEAPM10MODE       = 2;
+const VPDF_SKIPINTELSLCHECK     = 4;
+const VPDF_DISABLEPWRSTATUSPOLL = 8;
+
+const PCMCIA_OPT_HAVE_SOCKET  = 0x01;
+const PCMCIA_OPT_AUTOMEM      = 0x04;
+const PCMCIA_OPT_NO_SOUND     = 0x08;
+const PCMCIA_OPT_NO_AUDIO     = 0x10;
+const PCMCIA_OPT_NO_APMREMOVE = 0x20;
+
+const PCMCIA_DEF_MEMBEGIN   = 0x0C0000;
+const PCMCIA_DEF_MEMEND     = 0xFFFFFF;
+const PCMCIA_DEF_MEMLEN     = 0x001000;
+const PCMCIA_DEF_MIN_REGION = 0x010000;
+
+enum {
+	PCI_OPTIONS_USE_BIOS         = 1,
+	PCI_OPTIONS_USE_IRQ_STEERING = 2
+}
+
+const PCI_FLAG_NO_VIDEO_IRQ      = 0x0001;
+const PCI_FLAG_PCMCIA_WANT_IRQ   = 0x0002;
+const PCI_FLAG_DUAL_IDE          = 0x0004;
+const PCI_FLAG_NO_ENUM_AT_ALL    = 0x0008;
+const PCI_FLAG_ENUM_NO_RESOURCE  = 0x0010;
+const PCI_FLAG_NEED_DWORD_ACCESS = 0x0020;
+const PCI_FLAG_SINGLE_FUNCTION   = 0x0040;
+const PCI_FLAG_ALWAYS_ENABLED    = 0x0080;
+const PCI_FLAG_IS_IDE            = 0x0100;
+const PCI_FLAG_IS_VIDEO          = 0x0200;
+const PCI_FLAG_FAIL_START        = 0x0400;
+
+const size_t REGSTR_VAL_MAX_HCID_LEN = 1024;
+
+const REGDF_NOTDETIO        = 0x00000001;
+const REGDF_NOTDETMEM       = 0x00000002;
+const REGDF_NOTDETIRQ       = 0x00000004;
+const REGDF_NOTDETDMA       = 0x00000008;
+const REGDF_NOTDETALL       = REGDF_NOTDETIO | REGDF_NOTDETMEM | REGDF_NOTDETIRQ | REGDF_NOTDETDMA;
+const REGDF_NEEDFULLCONFIG  = 0x00000010;
+const REGDF_GENFORCEDCONFIG = 0x00000020;
+const REGDF_NODETCONFIG     = 0x00008000;
+const REGDF_CONFLICTIO      = 0x00010000;
+const REGDF_CONFLICTMEM     = 0x00020000;
+const REGDF_CONFLICTIRQ     = 0x00040000;
+const REGDF_CONFLICTDMA     = 0x00080000;
+const REGDF_CONFLICTALL     = REGDF_CONFLICTIO | REGDF_CONFLICTMEM | REGDF_CONFLICTIRQ | REGDF_CONFLICTDMA;
+const REGDF_MAPIRQ2TO9      = 0x00100000;
+const REGDF_NOTVERIFIED     = 0x80000000;
+
+const CONFIGFLAG_DISABLED       = 0x0001;
+const CONFIGFLAG_REMOVED        = 0x0002;
+const CONFIGFLAG_MANUAL_INSTALL = 0x0004;
+const CONFIGFLAG_IGNORE_BOOT_LC = 0x0008;
+const CONFIGFLAG_NET_BOOT       = 0x0010;
+const CONFIGFLAG_REINSTALL      = 0x0020;
+const CONFIGFLAG_FAILEDINSTALL  = 0x0040;
+const CONFIGFLAG_CANTSTOPACHILD = 0x0080;
+const CONFIGFLAG_OKREMOVEROM    = 0x0100;
+const CONFIGFLAG_NOREMOVEEXIT   = 0x0200;
+
+const CSCONFIGFLAG_DISABLED      = 1;
+const CSCONFIGFLAG_DO_NOT_CREATE = 2;
+const CSCONFIGFLAG_DO_NOT_START  = 4;
+const CSCONFIGFLAG_BITS          = 7;
+
+const DMSTATEFLAG_APPLYTOALL = 1;
+
+const NUM_RESOURCE_MAP = 256;
+
+const MF_FLAGS_EVEN_IF_NO_RESOURCE         = 1;
+const MF_FLAGS_NO_CREATE_IF_NO_RESOURCE    = 2;
+const MF_FLAGS_FILL_IN_UNKNOWN_RESOURCE    = 4;
+const MF_FLAGS_CREATE_BUT_NO_SHOW_DISABLED = 8;
+
+const EISAFLAG_NO_IO_MERGE   = 1;
+const EISAFLAG_SLOT_IO_FIRST = 2;
+
+const EISA_NO_MAX_FUNCTION   = 0xFF;
+
+const NUM_EISA_RANGES = 4;
+
+const APMMENUSUSPEND_DISABLED = 0;
+const APMMENUSUSPEND_ENABLED  = 1;
+const APMMENUSUSPEND_UNDOCKED = 2;
+const APMMENUSUSPEND_NOCHANGE = 128;
+
+//#ifndef NEC_98
+const TCHAR[]
+	REGSTR_KEY_ISAENUM             = "ISAPnP",
+	REGSTR_KEY_EISAENUM            = "EISA",
+	REGSTR_VAL_EISA_RANGES         = "EISARanges",
+	REGSTR_VAL_EISA_FUNCTIONS      = "EISAFunctions",
+	REGSTR_VAL_EISA_FUNCTIONS_MASK = "EISAFunctionsMask",
+	REGSTR_VAL_EISA_FLAGS          = "EISAFlags",
+	REGSTR_VAL_EISA_SIMULATE_INT15 = "EISASimulateInt15";
+// #else
+// #define REGSTR_KEY_ISAENUM	TEXT("C98PnP")
+// #define REGSTR_KEY_EISAENUM	TEXT("NESA")
+// #define	REGSTR_VAL_EISA_RANGES	TEXT("NESARanges")
+// #define	REGSTR_VAL_EISA_FUNCTIONS	TEXT("NESAFunctions")
+// #define	REGSTR_VAL_EISA_FUNCTIONS_MASK	TEXT("NESAFunctionsMask")
+// #define	REGSTR_VAL_EISA_FLAGS	TEXT("NESAFlags")
+// #define	REGSTR_VAL_EISA_SIMULATE_INT15	TEXT("NESASimulateInt15")
+// #endif
+
+const TCHAR[]
+	REGSTR_KEY_CLASS                     = `Class`,
+	REGSTR_KEY_CONFIG                    = `Config`,
+	REGSTR_KEY_ENUM                      = `Enum`,
+	REGSTR_KEY_ROOTENUM                  = `Root`,
+	REGSTR_KEY_BIOSENUM                  = `BIOS`,
+	REGSTR_KEY_PCMCIAENUM                = `PCMCIA`,
+	REGSTR_KEY_PCIENUM                   = `PCI`,
+	REGSTR_KEY_LOGCONFIG                 = `LogConfig`,
+	REGSTR_KEY_SYSTEMBOARD               = `*PNP0C01`,
+	REGSTR_KEY_APM                       = `*PNP0C05`,
+	REGSTR_KEY_INIUPDATE                 = `IniUpdate`,
+	REG_KEY_INSTDEV                      = `Installed`,
+	REGSTR_KEY_DOSOPTCDROM               = `CD-ROM`,
+	REGSTR_KEY_DOSOPTMOUSE               = `MOUSE`,
+	REGSTR_DEFAULT_INSTANCE              = `0000`,
+	REGSTR_PATH_MOTHERBOARD              = REGSTR_KEY_SYSTEMBOARD ~ `\` ~ REGSTR_DEFAULT_INSTANCE,
+	REGSTR_PATH_SETUP                    = `Software\Microsoft\Windows\CurrentVersion`,
+	REGSTR_PATH_PIFCONVERT               = `Software\Microsoft\Windows\CurrentVersion\PIFConvert`,
+	REGSTR_PATH_MSDOSOPTS                = `Software\Microsoft\Windows\CurrentVersion\MS-DOSOptions`,
+	REGSTR_PATH_MSDOSEMU                 = `Software\Microsoft\Windows\CurrentVersion\MS-DOS Emulation`,
+	REGSTR_PATH_NEWDOSBOX                = `Software\Microsoft\Windows\CurrentVersion\MS-DOS Emulation\AppCompat`,
+	REGSTR_PATH_RUNONCE                  = `Software\Microsoft\Windows\CurrentVersion\RunOnce`,
+	REGSTR_PATH_RUN                      = `Software\Microsoft\Windows\CurrentVersion\Run`,
+	REGSTR_PATH_RUNSERVICESONCE          = `Software\Microsoft\Windows\CurrentVersion\RunServicesOnce`,
+	REGSTR_PATH_RUNSERVICES              = `Software\Microsoft\Windows\CurrentVersion\RunServices`,
+
+//#ifndef REGSTR_PATH_EXPLORER /* also in shlobj.h */
+	REGSTR_PATH_EXPLORER                 = `Software\Microsoft\Windows\CurrentVersion\Explorer`,
+//#endif
+
+	REGSTR_PATH_DETECT                   = `Software\Microsoft\Windows\CurrentVersion\Detect`,
+	REGSTR_PATH_APPPATHS                 = `Software\Microsoft\Windows\CurrentVersion\App Paths`,
+	REGSTR_PATH_UNINSTALL                = `Software\Microsoft\Windows\CurrentVersion\Uninstall`,
+	REGSTR_PATH_REALMODENET              = `Software\Microsoft\Windows\CurrentVersion\Network\Real Mode Net`,
+	REGSTR_PATH_NETEQUIV                 = `Software\Microsoft\Windows\CurrentVersion\Network\Equivalent`,
+	REGSTR_PATH_CVNETWORK                = `Software\Microsoft\Windows\CurrentVersion\Network`,
+	REGSTR_PATH_IDCONFIGDB               = `System\CurrentControlSet\Control\IDConfigDB`,
+	REGSTR_PATH_CLASS                    = `System\CurrentControlSet\Services\Class`,
+	REGSTR_PATH_DISPLAYSETTINGS          = `Display\Settings`,
+	REGSTR_PATH_FONTS                    = `Display\Fonts`,
+	REGSTR_PATH_ENUM                     = `Enum`,
+	REGSTR_PATH_ROOT                     = `Enum\Root`,
+	REGSTR_PATH_SERVICES                 = `System\CurrentControlSet\Services`,
+	REGSTR_PATH_VXD                      = `System\CurrentControlSet\Services\VxD`,
+	REGSTR_PATH_IOS                      = `System\CurrentControlSet\Services\VxD\IOS`,
+	REGSTR_PATH_VMM                      = `System\CurrentControlSet\Services\VxD\VMM`,
+	REGSTR_PATH_VPOWERD                  = `System\CurrentControlSet\Services\VxD\VPOWERD`,
+	REGSTR_PATH_VNETSUP                  = `System\CurrentControlSet\Services\VxD\VNETSUP`,
+	REGSTR_PATH_NWREDIR                  = `System\CurrentControlSet\Services\VxD\NWREDIR`,
+	REGSTR_PATH_NCPSERVER                = `System\CurrentControlSet\Services\NcpServer\Parameters`,
+	REGSTR_PATH_IOARB                    = `System\CurrentControlSet\Services\Arbitrators\IOArb`,
+	REGSTR_PATH_ADDRARB                  = `System\CurrentControlSet\Services\Arbitrators\AddrArb`,
+	REGSTR_PATH_DMAARB                   = `System\CurrentControlSet\Services\Arbitrators\DMAArb`,
+	REGSTR_PATH_IRQARB                   = `System\CurrentControlSet\Services\Arbitrators\IRQArb`,
+	REGSTR_PATH_CODEPAGE                 = `System\CurrentControlSet\Control\Nls\Codepage`,
+	REGSTR_PATH_FILESYSTEM               = `System\CurrentControlSet\Control\FileSystem`,
+	REGSTR_PATH_FILESYSTEM_NOVOLTRACK    = `System\CurrentControlSet\Control\FileSystem\NoVolTrack`,
+	REGSTR_PATH_CDFS                     = `System\CurrentControlSet\Control\FileSystem\CDFS`,
+	REGSTR_PATH_WINBOOT                  = `System\CurrentControlSet\Control\WinBoot`,
+	REGSTR_PATH_INSTALLEDFILES           = `System\CurrentControlSet\Control\InstalledFiles`,
+	REGSTR_PATH_VMM32FILES               = `System\CurrentControlSet\Control\VMM32Files`,
+
+	REGSTR_VAL_BITSPERPIXEL              = `BitsPerPixel`,
+	REGSTR_VAL_RESOLUTION                = `Resolution`,
+	REGSTR_VAL_DPILOGICALX               = `DPILogicalX`,
+	REGSTR_VAL_DPILOGICALY               = `DPILogicalY`,
+	REGSTR_VAL_DPIPHYSICALX              = `DPIPhysicalX`,
+	REGSTR_VAL_DPIPHYSICALY              = `DPIPhysicalY`,
+	REGSTR_VAL_REFRESHRATE               = `RefreshRate`,
+	REGSTR_VAL_DISPLAYFLAGS              = `DisplayFlags`,
+	REGSTR_PATH_CONTROLPANEL             = `Control Panel`,
+	REGSTR_PATH_CONTROLSFOLDER           = `Software\Microsoft\Windows\CurrentVersion\Controls Folder`,
+	REGSTR_VAL_DOSCP                     = `OEMCP`,
+	REGSTR_VAL_WINCP                     = `ACP`,
+	REGSTR_PATH_DYNA_ENUM                = `Config Manager\Enum`,
+	REGSTR_VAL_HARDWARE_KEY              = `HardWareKey`,
+	REGSTR_VAL_ALLOCATION                = `Allocation`,
+	REGSTR_VAL_PROBLEM                   = `Problem`,
+	REGSTR_VAL_STATUS                    = `Status`,
+	REGSTR_VAL_DONTUSEMEM                = `DontAllocLastMem`,
+	REGSTR_VAL_SYSTEMROOT                = `SystemRoot`,
+	REGSTR_VAL_BOOTCOUNT                 = `BootCount`,
+	REGSTR_VAL_REALNETSTART              = `RealNetStart`,
+	REGSTR_VAL_MEDIA                     = `MediaPath`,
+	REGSTR_VAL_CONFIG                    = `ConfigPath`,
+	REGSTR_VAL_DEVICEPATH                = `DevicePath`,
+	REGSTR_VAL_SRCPATH                   = `SourcePath`,
+	REGSTR_VAL_OLDWINDIR                 = `OldWinDir`,
+	REGSTR_VAL_SETUPFLAGS                = `SetupFlags`,
+	REGSTR_VAL_REGOWNER                  = `RegisteredOwner`,
+	REGSTR_VAL_REGORGANIZATION           = `RegisteredOrganization`,
+	REGSTR_VAL_LICENSINGINFO             = `LicensingInfo`,
+	REGSTR_VAL_OLDMSDOSVER               = `OldMSDOSVer`,
+	REGSTR_VAL_FIRSTINSTALLDATETIME      = `FirstInstallDateTime`,
+	REGSTR_VAL_INSTALLTYPE               = `InstallType`,
+	REGSTR_VAL_WRAPPER                   = `Wrapper`,
+
+	REGSTR_KEY_SETUP                     = `\Setup`,
+	REGSTR_VAL_BOOTDIR                   = `BootDir`,
+	REGSTR_VAL_WINBOOTDIR                = `WinbootDir`,
+	REGSTR_VAL_WINDIR                    = `WinDir`,
+	REGSTR_VAL_APPINSTPATH               = `AppInstallPath`,
+	REGSTR_PATH_EBD                      = REGSTR_PATH_SETUP ~ REGSTR_KEY_SETUP ~ `\EBD`,
+	REGSTR_KEY_EBDFILESLOCAL             = `EBDFilesLocale`,
+	REGSTR_KEY_EBDFILESKEYBOARD          = `EBDFilesKeyboard`,
+	REGSTR_KEY_EBDAUTOEXECBATLOCAL       = `EBDAutoexecBatLocale`,
+	REGSTR_KEY_EBDAUTOEXECBATKEYBOARD    = `EBDAutoexecBatKeyboard`,
+	REGSTR_KEY_EBDCONFIGSYSLOCAL         = `EBDConfigSysLocale`,
+	REGSTR_KEY_EBDCONFIGSYSKEYBOARD      = `EBDConfigSysKeyboard`,
+	REGSTR_VAL_MSDOSMODE                 = `MSDOSMode`,
+	REGSTR_VAL_MSDOSMODEDISCARD          = `Discard`,
+	REGSTR_VAL_DOSOPTGLOBALFLAGS         = `GlobalFlags`,
+	REGSTR_VAL_DOSOPTFLAGS               = `Flags`,
+	REGSTR_VAL_OPTORDER                  = `Order`,
+	REGSTR_VAL_CONFIGSYS                 = `Config.Sys`,
+	REGSTR_VAL_AUTOEXEC                  = `Autoexec.Bat`,
+	REGSTR_VAL_STDDOSOPTION              = `StdOption`,
+	REGSTR_VAL_DOSOPTTIP                 = `TipText`,
+
+	REGSTR_VAL_DOSPAGER                  = `DOSPager`,
+	REGSTR_VAL_VXDGROUPS                 = `VXDGroups`,
+	REGSTR_VAL_VPOWERDFLAGS              = `Flags`,
+
+	REGSTR_VAL_WORKGROUP                 = `Workgroup`,
+	REGSTR_VAL_DIRECTHOST                = `DirectHost`,
+	REGSTR_VAL_FILESHARING               = `FileSharing`,
+	REGSTR_VAL_PRINTSHARING              = `PrintSharing`,
+	REGSTR_VAL_FIRSTNETDRIVE             = `FirstNetworkDrive`,
+	REGSTR_VAL_MAXCONNECTIONS            = `MaxConnections`,
+	REGSTR_VAL_APISUPPORT                = `APISupport`,
+	REGSTR_VAL_MAXRETRY                  = `MaxRetry`,
+	REGSTR_VAL_MINRETRY                  = `MinRetry`,
+	REGSTR_VAL_SUPPORTLFN                = `SupportLFN`,
+	REGSTR_VAL_SUPPORTBURST              = `SupportBurst`,
+	REGSTR_VAL_SUPPORTTUNNELLING         = `SupportTunnelling`,
+	REGSTR_VAL_FULLTRACE                 = `FullTrace`,
+	REGSTR_VAL_READCACHING               = `ReadCaching`,
+	REGSTR_VAL_SHOWDOTS                  = `ShowDots`,
+	REGSTR_VAL_GAPTIME                   = `GapTime`,
+	REGSTR_VAL_SEARCHMODE                = `SearchMode`,
+	REGSTR_VAL_SHELLVERSION              = `ShellVersion`,
+	REGSTR_VAL_MAXLIP                    = `MaxLIP`,
+	REGSTR_VAL_PRESERVECASE              = `PreserveCase`,
+	REGSTR_VAL_OPTIMIZESFN               = `OptimizeSFN`,
+	REGSTR_VAL_NCP_BROWSEMASTER          = `BrowseMaster`,
+	REGSTR_VAL_NCP_USEPEERBROWSING       = `Use_PeerBrowsing`,
+	REGSTR_VAL_NCP_USESAP                = `Use_Sap`,
+	REGSTR_VAL_WIN31FILESYSTEM           = `Win31FileSystem`,
+	REGSTR_VAL_PRESERVELONGNAMES         = `PreserveLongNames`,
+	REGSTR_VAL_DRIVEWRITEBEHIND          = `DriveWriteBehind`,
+	REGSTR_VAL_ASYNCFILECOMMIT           = `AsyncFileCommit`,
+	REGSTR_VAL_PATHCACHECOUNT            = `PathCache`,
+	REGSTR_VAL_NAMECACHECOUNT            = `NameCache`,
+	REGSTR_VAL_CONTIGFILEALLOC           = `ContigFileAllocSize`,
+	REGSTR_VAL_VOLIDLETIMEOUT            = `VolumeIdleTimeout`,
+	REGSTR_VAL_BUFFIDLETIMEOUT           = `BufferIdleTimeout`,
+	REGSTR_VAL_BUFFAGETIMEOUT            = `BufferAgeTimeout`,
+	REGSTR_VAL_NAMENUMERICTAIL           = `NameNumericTail`,
+	REGSTR_VAL_READAHEADTHRESHOLD        = `ReadAheadThreshold`,
+	REGSTR_VAL_DOUBLEBUFFER              = `DoubleBuffer`,
+	REGSTR_VAL_SOFTCOMPATMODE            = `SoftCompatMode`,
+	REGSTR_VAL_DRIVESPINDOWN             = `DriveSpinDown`,
+	REGSTR_VAL_FORCEPMIO                 = `ForcePMIO`,
+	REGSTR_VAL_FORCERMIO                 = `ForceRMIO`,
+	REGSTR_VAL_LASTBOOTPMDRVS            = `LastBootPMDrvs`,
+	REGSTR_VAL_VIRTUALHDIRQ              = `VirtualHDIRQ`,
+	REGSTR_VAL_SRVNAMECACHECOUNT         = `ServerNameCacheMax`,
+	REGSTR_VAL_SRVNAMECACHE              = `ServerNameCache`,
+	REGSTR_VAL_SRVNAMECACHENETPROV       = `ServerNameCacheNumNets`,
+	REGSTR_VAL_AUTOMOUNT                 = `AutoMountDrives`,
+	REGSTR_VAL_COMPRESSIONMETHOD         = `CompressionAlgorithm`,
+	REGSTR_VAL_COMPRESSIONTHRESHOLD      = `CompressionThreshold`,
+	REGSTR_VAL_CDCACHESIZE               = `CacheSize`,
+	REGSTR_VAL_CDPREFETCH                = `Prefetch`,
+	REGSTR_VAL_CDPREFETCHTAIL            = `PrefetchTail`,
+	REGSTR_VAL_CDRAWCACHE                = `RawCache`,
+	REGSTR_VAL_CDEXTERRORS               = `ExtendedErrors`,
+	REGSTR_VAL_CDSVDSENSE                = `SVDSense`,
+	REGSTR_VAL_CDSHOWVERSIONS            = `ShowVersions`,
+	REGSTR_VAL_CDCOMPATNAMES             = `MSCDEXCompatNames`,
+	REGSTR_VAL_CDNOREADAHEAD             = `NoReadAhead`,
+	REGSTR_VAL_SCSI                      = `SCSI\`,
+	REGSTR_VAL_ESDI                      = `ESDI\`,
+	REGSTR_VAL_FLOP                      = `FLOP\`,
+	REGSTR_VAL_DISK                      = `GenDisk`,
+	REGSTR_VAL_CDROM                     = `GenCD`,
+	REGSTR_VAL_TAPE                      = `TAPE`,
+	REGSTR_VAL_SCANNER                   = `SCANNER`,
+	REGSTR_VAL_FLOPPY                    = `FLOPPY`,
+	REGSTR_VAL_SCSITID                   = `SCSITargetID`,
+	REGSTR_VAL_SCSILUN                   = `SCSILUN`,
+	REGSTR_VAL_REVLEVEL                  = `RevisionLevel`,
+	REGSTR_VAL_PRODUCTID                 = `ProductId`,
+	REGSTR_VAL_PRODUCTTYPE               = `ProductType`,
+	REGSTR_VAL_DEVTYPE                   = `DeviceType`,
+	REGSTR_VAL_REMOVABLE                 = `Removable`,
+	REGSTR_VAL_CURDRVLET                 = `CurrentDriveLetterAssignment`,
+	REGSTR_VAL_USRDRVLET                 = `UserDriveLetterAssignment`,
+	REGSTR_VAL_SYNCDATAXFER              = `SyncDataXfer`,
+	REGSTR_VAL_AUTOINSNOTE               = `AutoInsertNotification`,
+	REGSTR_VAL_DISCONNECT                = `Disconnect`,
+	REGSTR_VAL_INT13                     = `Int13`,
+	REGSTR_VAL_PMODE_INT13               = `PModeInt13`,
+	REGSTR_VAL_USERSETTINGS              = `AdapterSettings`,
+	REGSTR_VAL_NOIDE                     = `NoIDE`,
+	REGSTR_VAL_DISKCLASSNAME             = `DiskDrive`,
+	REGSTR_VAL_CDROMCLASSNAME            = `CDROM`,
+	REGSTR_VAL_FORCELOAD                 = `ForceLoadPD`,
+	REGSTR_VAL_FORCEFIFO                 = `ForceFIFO`,
+	REGSTR_VAL_FORCECL                   = `ForceChangeLine`,
+	REGSTR_VAL_NOUSECLASS                = `NoUseClass`,
+	REGSTR_VAL_NOINSTALLCLASS            = `NoInstallClass`,
+	REGSTR_VAL_NODISPLAYCLASS            = `NoDisplayClass`,
+	REGSTR_VAL_SILENTINSTALL             = `SilentInstall`,
+	REGSTR_KEY_PCMCIA_CLASS              = `PCMCIA`,
+	REGSTR_KEY_SCSI_CLASS                = `SCSIAdapter`,
+	REGSTR_KEY_PORTS_CLASS               = `ports`,
+	REGSTR_KEY_MEDIA_CLASS               = `MEDIA`,
+	REGSTR_KEY_DISPLAY_CLASS             = `Display`,
+	REGSTR_KEY_KEYBOARD_CLASS            = `Keyboard`,
+	REGSTR_KEY_MOUSE_CLASS               = `Mouse`,
+	REGSTR_KEY_MONITOR_CLASS             = `Monitor`,
+	REGSTR_VAL_PCMCIA_OPT                = `Options`,
+	REGSTR_VAL_PCMCIA_MEM                = `Memory`,
+	REGSTR_VAL_PCMCIA_ALLOC              = `AllocMemWin`,
+	REGSTR_VAL_PCMCIA_ATAD               = `ATADelay`,
+	REGSTR_VAL_PCMCIA_SIZ                = `MinRegionSize`,
+	REGSTR_VAL_P1284MDL                  = `Model`,
+	REGSTR_VAL_P1284MFG                  = `Manufacturer`,
+	REGSTR_VAL_ISAPNP                    = `ISAPNP`,
+	REGSTR_VAL_ISAPNP_RDP_OVERRIDE       = `RDPOverRide`,
+	REGSTR_VAL_PCI                       = `PCI`,
+	REGSTR_PCI_OPTIONS                   = `Options`,
+	REGSTR_PCI_DUAL_IDE                  = `PCIDualIDE`,
+
+	REGSTR_KEY_CRASHES                   = `Crashes`,
+	REGSTR_KEY_DANGERS                   = `Dangers`,
+	REGSTR_KEY_DETMODVARS                = `DetModVars`,
+	REGSTR_KEY_NDISINFO                  = `NDISInfo`,
+	REGSTR_VAL_PROTINIPATH               = `ProtIniPath`,
+	REGSTR_VAL_RESOURCES                 = `Resources`,
+	REGSTR_VAL_CRASHFUNCS                = `CrashFuncs`,
+	REGSTR_VAL_CLASS                     = `Class`,
+	REGSTR_VAL_DEVDESC                   = `DeviceDesc`,
+	REGSTR_VAL_BOOTCONFIG                = `BootConfig`,
+	REGSTR_VAL_DETFUNC                   = `DetFunc`,
+	REGSTR_VAL_DETFLAGS                  = `DetFlags`,
+	REGSTR_VAL_COMPATIBLEIDS             = `CompatibleIDs`,
+	REGSTR_VAL_DETCONFIG                 = `DetConfig`,
+	REGSTR_VAL_VERIFYKEY                 = `VerifyKey`,
+	REGSTR_VAL_COMINFO                   = `ComInfo`,
+	REGSTR_VAL_INFNAME                   = `InfName`,
+	REGSTR_VAL_CARDSPECIFIC              = `CardSpecific`,
+	REGSTR_VAL_NETOSTYPE                 = `NetOSType`,
+	REGSTR_DATA_NETOS_NDIS               = `NDIS`,
+	REGSTR_DATA_NETOS_ODI                = `ODI`,
+	REGSTR_DATA_NETOS_IPX                = `IPX`,
+	REGSTR_VAL_MFG                       = `Mfg`,
+	REGSTR_VAL_SCAN_ONLY_FIRST           = `ScanOnlyFirstDrive`,
+	REGSTR_VAL_SHARE_IRQ                 = `ForceIRQSharing`,
+	REGSTR_VAL_NONSTANDARD_ATAPI         = `NonStandardATAPI`,
+	REGSTR_VAL_IDE_FORCE_SERIALIZE       = `ForceSerialization`,
+	REGSTR_VAL_HWREV                     = `HWRevision`,
+	REGSTR_VAL_ENABLEINTS                = `EnableInts`,
+
+	REGSTR_VAL_APMBIOSVER                = `APMBiosVer`,
+	REGSTR_VAL_APMFLAGS                  = `APMFlags`,
+	REGSTR_VAL_SLSUPPORT                 = `SLSupport`,
+	REGSTR_VAL_MACHINETYPE               = `MachineType`,
+	REGSTR_VAL_SETUPMACHINETYPE          = `SetupMachineType`,
+	REGSTR_MACHTYPE_UNKNOWN              = `Unknown`,
+	REGSTR_MACHTYPE_IBMPC                = `IBM PC`,
+	REGSTR_MACHTYPE_IBMPCJR              = `IBM PCjr`,
+	REGSTR_MACHTYPE_IBMPCCONV            = `IBM PC Convertible`,
+	REGSTR_MACHTYPE_IBMPCXT              = `IBM PC/XT`,
+	REGSTR_MACHTYPE_IBMPCXT_286          = `IBM PC/XT 286`,
+	REGSTR_MACHTYPE_IBMPCAT              = `IBM PC/AT`,
+	REGSTR_MACHTYPE_IBMPS2_25            = `IBM PS/2-25`,
+	REGSTR_MACHTYPE_IBMPS2_30_286        = `IBM PS/2-30 286`,
+	REGSTR_MACHTYPE_IBMPS2_30            = `IBM PS/2-30`,
+	REGSTR_MACHTYPE_IBMPS2_50            = `IBM PS/2-50`,
+	REGSTR_MACHTYPE_IBMPS2_50Z           = `IBM PS/2-50Z`,
+	REGSTR_MACHTYPE_IBMPS2_55SX          = `IBM PS/2-55SX`,
+	REGSTR_MACHTYPE_IBMPS2_60            = `IBM PS/2-60`,
+	REGSTR_MACHTYPE_IBMPS2_65SX          = `IBM PS/2-65SX`,
+	REGSTR_MACHTYPE_IBMPS2_70            = `IBM PS/2-70`,
+	REGSTR_MACHTYPE_IBMPS2_P70           = `IBM PS/2-P70`,
+	REGSTR_MACHTYPE_IBMPS2_70_80         = `IBM PS/2-70/80`,
+	REGSTR_MACHTYPE_IBMPS2_80            = `IBM PS/2-80`,
+	REGSTR_MACHTYPE_IBMPS2_90            = `IBM PS/2-90`,
+	REGSTR_MACHTYPE_IBMPS1               = `IBM PS/1`,
+	REGSTR_MACHTYPE_PHOENIX_PCAT         = `Phoenix PC/AT Compatible`,
+	REGSTR_MACHTYPE_HP_VECTRA            = `HP Vectra`,
+	REGSTR_MACHTYPE_ATT_PC               = `AT&T PC`,
+	REGSTR_MACHTYPE_ZENITH_PC            = `Zenith PC`,
+	REGSTR_VAL_APMMENUSUSPEND            = `APMMenuSuspend`,
+
+	REGSTR_VAL_BUSTYPE                   = `BusType`,
+	REGSTR_VAL_CPU                       = `CPU`,
+	REGSTR_VAL_NDP                       = `NDP`,
+	REGSTR_VAL_PNPBIOSVER                = `PnPBIOSVer`,
+	REGSTR_VAL_PNPSTRUCOFFSET            = `PnPStrucOffset`,
+	REGSTR_VAL_PCIBIOSVER                = `PCIBIOSVer`,
+	REGSTR_VAL_HWMECHANISM               = `HWMechanism`,
+	REGSTR_VAL_LASTPCIBUSNUM             = `LastPCIBusNum`,
+	REGSTR_VAL_CONVMEM                   = `ConvMem`,
+	REGSTR_VAL_EXTMEM                    = `ExtMem`,
+	REGSTR_VAL_COMPUTERNAME              = `ComputerName`,
+	REGSTR_VAL_BIOSNAME                  = `BIOSName`,
+	REGSTR_VAL_BIOSVERSION               = `BIOSVersion`,
+	REGSTR_VAL_BIOSDATE                  = `BIOSDate`,
+	REGSTR_VAL_MODEL                     = `Model`,
+	REGSTR_VAL_SUBMODEL                  = `Submodel`,
+	REGSTR_VAL_REVISION                  = `Revision`,
+	REGSTR_VAL_FIFODEPTH                 = `FIFODepth`,
+	REGSTR_VAL_RDINTTHRESHOLD            = `RDIntThreshold`,
+	REGSTR_VAL_WRINTTHRESHOLD            = `WRIntThreshold`,
+	REGSTR_VAL_PRIORITY                  = `Priority`,
+	REGSTR_VAL_DRIVER                    = `Driver`,
+	REGSTR_VAL_FUNCDESC                  = `FunctionDesc`,
+	REGSTR_VAL_FORCEDCONFIG              = `ForcedConfig`,
+	REGSTR_VAL_CONFIGFLAGS               = `ConfigFlags`,
+	REGSTR_VAL_CSCONFIGFLAGS             = `CSConfigFlags`,
+
+	REGSTR_VAL_ROOT_DEVNODE              = `HTREE\ROOT\0`,
+	REGSTR_VAL_RESERVED_DEVNODE          = `HTREE\RESERVED\0`,
+	REGSTR_PATH_READDATAPORT             = REGSTR_KEY_ISAENUM ~ `\ReadDataPort\0`,
+	REGSTR_PATH_MULTI_FUNCTION           = `MF`,
+	REGSTR_VAL_RESOURCE_MAP              = `ResourceMap`,
+	REGSTR_PATH_CHILD_PREFIX             = `Child`,
+	REGSTR_VAL_MF_FLAGS                  = `MFFlags`,
+	REGSTR_VAL_DRVDESC                   = `DriverDesc`,
+	REGSTR_VAL_DEVLOADER                 = `DevLoader`,
+	REGSTR_VAL_STATICVXD                 = `StaticVxD`,
+	REGSTR_VAL_PROPERTIES                = `Properties`,
+	REGSTR_VAL_MANUFACTURER              = `Manufacturer`,
+	REGSTR_VAL_EXISTS                    = `Exists`,
+	REGSTR_VAL_CMENUMFLAGS               = `CMEnumFlags`,
+	REGSTR_VAL_CMDRIVFLAGS               = `CMDrivFlags`,
+	REGSTR_VAL_ENUMERATOR                = `Enumerator`,
+	REGSTR_VAL_DEVICEDRIVER              = `DeviceDriver`,
+	REGSTR_VAL_PORTNAME                  = `PortName`,
+	REGSTR_VAL_INFPATH                   = `InfPath`,
+	REGSTR_VAL_INFSECTION                = `InfSection`,
+	REGSTR_VAL_POLLING                   = `Polling`,
+	REGSTR_VAL_DONTLOADIFCONFLICT        = `DontLoadIfConflict`,
+	REGSTR_VAL_PORTSUBCLASS              = `PortSubClass`,
+	REGSTR_VAL_NETCLEAN                  = `NetClean`,
+	REGSTR_VAL_IDE_NO_SERIALIZE          = `IDENoSerialize`,
+	REGSTR_VAL_NOCMOSORFDPT              = `NoCMOSorFDPT`,
+	REGSTR_VAL_COMVERIFYBASE             = `COMVerifyBase`,
+	REGSTR_KEY_OVERRIDE                  = `Override`,
+	REGSTR_VAL_CONFIGMG                  = `CONFIGMG`,
+	REGSTR_VAL_SYSDM                     = `SysDM`,
+	REGSTR_VAL_SYSDMFUNC                 = `SysDMFunc`,
+	REGSTR_VAL_PRIVATE                   = `Private`,
+	REGSTR_VAL_PRIVATEFUNC               = `PrivateFunc`,
+	REGSTR_VAL_DETECT                    = `Detect`,
+	REGSTR_VAL_DETECTFUNC                = `DetectFunc`,
+	REGSTR_VAL_ASKFORCONFIG              = `AskForConfig`,
+	REGSTR_VAL_ASKFORCONFIGFUNC          = `AskForConfigFunc`,
+	REGSTR_VAL_WAITFORUNDOCK             = `WaitForUndock`,
+	REGSTR_VAL_WAITFORUNDOCKFUNC         = `WaitForUndockFunc`,
+	REGSTR_VAL_REMOVEROMOKAY             = `RemoveRomOkay`,
+	REGSTR_VAL_REMOVEROMOKAYFUNC         = `RemoveRomOkayFunc`,
+	REGSTR_VAL_CURCONFIG                 = `CurrentConfig`,
+	REGSTR_VAL_FRIENDLYNAME              = `FriendlyName`,
+	REGSTR_VAL_CURRENTCONFIG             = `CurrentConfig`,
+	REGSTR_VAL_MAP                       = `Map`,
+	REGSTR_VAL_ID                        = `CurrentID`,
+	REGSTR_VAL_DOCKED                    = `CurrentDockedState`,
+	REGSTR_VAL_CHECKSUM                  = `CurrentChecksum`,
+	REGSTR_VAL_HWDETECT                  = `HardwareDetect`,
+	REGSTR_VAL_INHIBITRESULTS            = `InhibitResults`,
+	REGSTR_VAL_PROFILEFLAGS              = `ProfileFlags`,
+	REGSTR_KEY_PCMCIA                    = `PCMCIA\`,
+	REGSTR_KEY_PCUNKNOWN                 = `UNKNOWN_MANUFACTURER`,
+	REGSTR_VAL_PCSSDRIVER                = `Driver`,
+	REGSTR_KEY_PCMTD                     = `MTD-`,
+	REGSTR_VAL_PCMTDRIVER                = `MTD`,
+	REGSTR_VAL_HARDWAREID                = `HardwareID`,
+	REGSTR_VAL_INSTALLER                 = `Installer`,
+	REGSTR_VAL_INSICON                   = `Icon`,
+	REGSTR_VAL_ENUMPROPPAGES             = `EnumPropPages`,
+	REGSTR_VAL_BASICPROPERTIES           = `BasicProperties`,
+	REGSTR_VAL_PRIVATEPROBLEM            = `PrivateProblem`,
+	REGSTR_KEY_CURRENT                   = `Current`,
+	REGSTR_KEY_DEFAULT                   = `Default`,
+	REGSTR_KEY_MODES                     = `Modes`,
+	REGSTR_VAL_MODE                      = `Mode`,
+	REGSTR_VAL_BPP                       = `BPP`,
+	REGSTR_VAL_HRES                      = `HRes`,
+	REGSTR_VAL_VRES                      = `VRes`,
+	REGSTR_VAL_FONTSIZE                  = `FontSize`,
+	REGSTR_VAL_DRV                       = `drv`,
+	REGSTR_VAL_GRB                       = `grb`,
+	REGSTR_VAL_VDD                       = `vdd`,
+	REGSTR_VAL_VER                       = `Ver`,
+	REGSTR_VAL_MAXRES                    = `MaxResolution`,
+	REGSTR_VAL_DPMS                      = `DPMS`,
+	REGSTR_VAL_RESUMERESET               = `ResumeReset`,
+	REGSTR_VAL_DESCRIPTION               = `Description`,
+	REGSTR_KEY_SYSTEM                    = `System`,
+	REGSTR_KEY_USER                      = `User`,
+	REGSTR_VAL_DPI                       = `dpi`,
+	REGSTR_VAL_PCICOPTIONS               = `PCICOptions`,
+
+	REGSTR_VAL_PCICIRQMAP                = `PCICIRQMap`,
+	REGSTR_PATH_APPEARANCE               = `Control Panel\Appearance`,
+	REGSTR_PATH_LOOKSCHEMES              = `Control Panel\Appearance\Schemes`,
+	REGSTR_VAL_CUSTOMCOLORS              = `CustomColors`,
+	REGSTR_PATH_SCREENSAVE               = `Control Panel\Desktop`,
+	REGSTR_VALUE_USESCRPASSWORD          = `ScreenSaveUsePassword`,
+	REGSTR_VALUE_SCRPASSWORD             = `ScreenSave_Data`,
+	REGSTR_VALUE_LOWPOWERTIMEOUT         = `ScreenSaveLowPowerTimeout`,
+	REGSTR_VALUE_POWEROFFTIMEOUT         = `ScreenSavePowerOffTimeout`,
+	REGSTR_VALUE_LOWPOWERACTIVE          = `ScreenSaveLowPowerActive`,
+	REGSTR_VALUE_POWEROFFACTIVE          = `ScreenSavePowerOffActive`,
+	REGSTR_PATH_WINDOWSAPPLETS           = `Software\Microsoft\Windows\CurrentVersion\Applets`,
+	REGSTR_PATH_SYSTRAY                  = `Software\Microsoft\Windows\CurrentVersion\Applets\SysTray`,
+	REGSTR_VAL_SYSTRAYSVCS               = `Services`,
+	REGSTR_VAL_SYSTRAYBATFLAGS           = `PowerFlags`,
+	REGSTR_VAL_SYSTRAYPCCARDFLAGS        = `PCMCIAFlags`,
+	REGSTR_PATH_NETWORK_USERSETTINGS     = `Network`,
+	REGSTR_KEY_NETWORK_PERSISTENT        = `\Persistent`,
+	REGSTR_KEY_NETWORK_RECENT            = `\Recent`,
+	REGSTR_VAL_REMOTE_PATH               = `RemotePath`,
+	REGSTR_VAL_USER_NAME                 = `UserName`,
+	REGSTR_VAL_PROVIDER_NAME             = `ProviderName`,
+	REGSTR_VAL_CONNECTION_TYPE           = `ConnectionType`,
+	REGSTR_VAL_UPGRADE                   = `Upgrade`,
+	REGSTR_KEY_LOGON                     = `\Logon`,
+	REGSTR_VAL_MUSTBEVALIDATED           = `MustBeValidated`,
+	REGSTR_VAL_RUNLOGINSCRIPT            = `ProcessLoginScript`,
+	REGSTR_KEY_NETWORKPROVIDER           = `\NetworkProvider`,
+	REGSTR_PATH_NW32NETPROVIDER          =REGSTR_PATH_SERVICES ~ `\NWNP32` ~ REGSTR_KEY_NETWORKPROVIDER,
+	REGSTR_PATH_MS32NETPROVIDER          =REGSTR_PATH_SERVICES ~ `\MSNP32` ~ REGSTR_KEY_NETWORKPROVIDER,
+	REGSTR_VAL_AUTHENT_AGENT             = `AuthenticatingAgent`,
+	REGSTR_VAL_PREFREDIR                 = `PreferredRedir`,
+	REGSTR_VAL_AUTOSTART                 = `AutoStart`,
+	REGSTR_VAL_AUTOLOGON                 = `AutoLogon`,
+	REGSTR_VAL_NETCARD                   = `Netcard`,
+	REGSTR_VAL_TRANSPORT                 = `Transport`,
+	REGSTR_VAL_DYNAMIC                   = `Dynamic`,
+	REGSTR_VAL_TRANSITION                = `Transition`,
+	REGSTR_VAL_STATICDRIVE               = `StaticDrive`,
+	REGSTR_VAL_LOADHI                    = `LoadHi`,
+	REGSTR_VAL_LOADRMDRIVERS             = `LoadRMDrivers`,
+	REGSTR_VAL_SETUPN                    = `SetupN`,
+	REGSTR_VAL_SETUPNPATH                = `SetupNPath`,
+	REGSTR_VAL_WRKGRP_FORCEMAPPING       = `WrkgrpForceMapping`,
+	REGSTR_VAL_WRKGRP_REQUIRED           = `WrkgrpRequired`,
+	REGSTR_PATH_CURRENT_CONTROL_SET      = `System\CurrentControlSet\Control`,
+	REGSTR_VAL_CURRENT_USER              = `Current User`,
+	REGSTR_PATH_PWDPROVIDER              = `System\CurrentControlSet\Control\PwdProvider`,
+	REGSTR_VAL_PWDPROVIDER_PATH          = `ProviderPath`,
+	REGSTR_VAL_PWDPROVIDER_DESC          = `Description`,
+	REGSTR_VAL_PWDPROVIDER_CHANGEPWD     = `ChangePassword`,
+	REGSTR_VAL_PWDPROVIDER_CHANGEPWDHWND = `ChangePasswordHwnd`,
+	REGSTR_VAL_PWDPROVIDER_GETPWDSTATUS  = `GetPasswordStatus`,
+	REGSTR_VAL_PWDPROVIDER_ISNP          = `NetworkProvider`,
+	REGSTR_VAL_PWDPROVIDER_CHANGEORDER   = `ChangeOrder`,
+	REGSTR_PATH_POLICIES                 = `Software\Microsoft\Windows\CurrentVersion\Policies`,
+	REGSTR_PATH_UPDATE                   = `System\CurrentControlSet\Control\Update`,
+	REGSTR_VALUE_ENABLE                  = `Enable`,
+	REGSTR_VALUE_VERBOSE                 = `Verbose`,
+	REGSTR_VALUE_NETPATH                 = `NetworkPath`,
+	REGSTR_VALUE_DEFAULTLOC              = `UseDefaultNetLocation`,
+	REGSTR_KEY_NETWORK                   = `Network`,
+// [Redefined] REGSTR_KEY_SYSTEM         = `System`)
+	REGSTR_KEY_PRINTERS                  = `Printers`,
+	REGSTR_KEY_WINOLDAPP                 = `WinOldApp`,
+	REGSTR_VAL_NOFILESHARING             = `NoFileSharing`,
+	REGSTR_VAL_NOPRINTSHARING            = `NoPrintSharing`,
+	REGSTR_VAL_NOFILESHARINGCTRL         = `NoFileSharingControl`,
+	REGSTR_VAL_NOPRINTSHARINGCTRL        = `NoPrintSharingControl`,
+	REGSTR_VAL_HIDESHAREPWDS             = `HideSharePwds`,
+	REGSTR_VAL_DISABLEPWDCACHING         = `DisablePwdCaching`,
+	REGSTR_VAL_ALPHANUMPWDS              = `AlphanumPwds`,
+	REGSTR_VAL_NETSETUP_DISABLE          = `NoNetSetup`,
+	REGSTR_VAL_NETSETUP_NOCONFIGPAGE     = `NoNetSetupConfigPage`,
+	REGSTR_VAL_NETSETUP_NOIDPAGE         = `NoNetSetupIDPage`,
+	REGSTR_VAL_NETSETUP_NOSECURITYPAGE   = `NoNetSetupSecurityPage`,
+	REGSTR_VAL_SYSTEMCPL_NOVIRTMEMPAGE   = `NoVirtMemPage`,
+	REGSTR_VAL_SYSTEMCPL_NODEVMGRPAGE    = `NoDevMgrPage`,
+	REGSTR_VAL_SYSTEMCPL_NOCONFIGPAGE    = `NoConfigPage`,
+	REGSTR_VAL_SYSTEMCPL_NOFILESYSPAGE   = `NoFileSysPage`,
+	REGSTR_VAL_DISPCPL_NODISPCPL         = `NoDispCPL`,
+	REGSTR_VAL_DISPCPL_NOBACKGROUNDPAGE  = `NoDispBackgroundPage`,
+	REGSTR_VAL_DISPCPL_NOSCRSAVPAGE      = `NoDispScrSavPage`,
+	REGSTR_VAL_DISPCPL_NOAPPEARANCEPAGE  = `NoDispAppearancePage`,
+	REGSTR_VAL_DISPCPL_NOSETTINGSPAGE    = `NoDispSettingsPage`,
+	REGSTR_VAL_SECCPL_NOSECCPL           = `NoSecCPL`,
+	REGSTR_VAL_SECCPL_NOPWDPAGE          = `NoPwdPage`,
+	REGSTR_VAL_SECCPL_NOADMINPAGE        = `NoAdminPage`,
+	REGSTR_VAL_SECCPL_NOPROFILEPAGE      = `NoProfilePage`,
+	REGSTR_VAL_PRINTERS_HIDETABS         = `NoPrinterTabs`,
+	REGSTR_VAL_PRINTERS_NODELETE         = `NoDeletePrinter`,
+	REGSTR_VAL_PRINTERS_NOADD            = `NoAddPrinter`,
+	REGSTR_VAL_WINOLDAPP_DISABLED        = `Disabled`,
+	REGSTR_VAL_WINOLDAPP_NOREALMODE      = `NoRealMode`,
+	REGSTR_VAL_NOENTIRENETWORK           = `NoEntireNetwork`,
+	REGSTR_VAL_NOWORKGROUPCONTENTS       = `NoWorkgroupContents`,
+	REGSTR_VAL_MINPWDLEN                 = `MinPwdLen`,
+	REGSTR_VAL_PWDEXPIRATION             = `PwdExpiration`,
+	REGSTR_VAL_WIN31PROVIDER             = `Win31Provider`,
+	REGSTR_VAL_DISABLEREGTOOLS           = `DisableRegistryTools`,
+	REGSTR_PATH_WINLOGON                 = `Software\Microsoft\Windows\CurrentVersion\Winlogon`,
+	REGSTR_VAL_LEGALNOTICECAPTION        = `LegalNoticeCaption`,
+	REGSTR_VAL_LEGALNOTICETEXT           = `LegalNoticeText`,
+	REGSTR_VAL_RESTRICTRUN               = `RestrictRun`,
+	REGSTR_KEY_POL_USERS                 = `Users`,
+	REGSTR_KEY_POL_COMPUTERS             = `Computers`,
+	REGSTR_KEY_POL_USERGROUPS            = `UserGroups`,
+	REGSTR_KEY_POL_DEFAULT               = `.default`,
+	REGSTR_KEY_POL_USERGROUPDATA         = `GroupData\UserGroups\Priority`,
+	REGSTR_PATH_TIMEZONE                 = `System\CurrentControlSet\Control\TimeZoneInformation`,
+	REGSTR_VAL_TZBIAS                    = `Bias`,
+	REGSTR_VAL_TZDLTBIAS                 = `DaylightBias`,
+	REGSTR_VAL_TZSTDBIAS                 = `StandardBias`,
+	REGSTR_VAL_TZACTBIAS                 = `ActiveTimeBias`,
+	REGSTR_VAL_TZDLTFLAG                 = `DaylightFlag`,
+	REGSTR_VAL_TZSTDSTART                = `StandardStart`,
+	REGSTR_VAL_TZDLTSTART                = `DaylightStart`,
+	REGSTR_VAL_TZDLTNAME                 = `DaylightName`,
+	REGSTR_VAL_TZSTDNAME                 = `StandardName`,
+	REGSTR_VAL_TZNOCHANGESTART           = `NoChangeStart`,
+	REGSTR_VAL_TZNOCHANGEEND             = `NoChangeEnd`,
+	REGSTR_VAL_TZNOAUTOTIME              = `DisableAutoDaylightTimeSet`,
+	REGSTR_PATH_FLOATINGPOINTPROCESSOR   = `HARDWARE\DESCRIPTION\System\FloatingPointProcessor`,
+	REGSTR_PATH_FLOATINGPOINTPROCESSOR0  = `HARDWARE\DESCRIPTION\System\FloatingPointProcessor\0`,
+	REGSTR_PATH_COMPUTRNAME              = `System\CurrentControlSet\Control\ComputerName\ComputerName`,
+	REGSTR_VAL_COMPUTRNAME               = `ComputerName`,
+	REGSTR_PATH_SHUTDOWN                 = `System\CurrentControlSet\Control\Shutdown`,
+	REGSTR_VAL_FORCEREBOOT               = `ForceReboot`,
+	REGSTR_VAL_SETUPPROGRAMRAN           = `SetupProgramRan`,
+	REGSTR_VAL_DOES_POLLING              = `PollingSupportNeeded`,
+	REGSTR_PATH_KNOWNDLLS                = `System\CurrentControlSet\Control\SessionManager\KnownDLLs`,
+	REGSTR_PATH_KNOWN16DLLS              = `System\CurrentControlSet\Control\SessionManager\Known16DLLs`,
+	REGSTR_PATH_CHECKVERDLLS             = `System\CurrentControlSet\Control\SessionManager\CheckVerDLLs`,
+	REGSTR_PATH_WARNVERDLLS              = `System\CurrentControlSet\Control\SessionManager\WarnVerDLLs`,
+	REGSTR_PATH_HACKINIFILE              = `System\CurrentControlSet\Control\SessionManager\HackIniFiles`,
+	REGSTR_PATH_CHECKBADAPPS             = `System\CurrentControlSet\Control\SessionManager\CheckBadApps`,
+	REGSTR_PATH_APPPATCH                 = `System\CurrentControlSet\Control\SessionManager\AppPatches`,
+	REGSTR_PATH_KNOWNVXDS                = `System\CurrentControlSet\Control\SessionManager\KnownVxDs`,
+	REGSTR_VAL_UNINSTALLER_DISPLAYNAME   = `DisplayName`,
+	REGSTR_VAL_UNINSTALLER_COMMANDLINE   = `UninstallString`,
+	REGSTR_PATH_DESKTOP                  = REGSTR_PATH_SCREENSAVE,
+	REGSTR_PATH_MOUSE                    = `Control Panel\Mouse`,
+	REGSTR_PATH_KEYBOARD                 = `Control Panel\Keyboard`,
+	REGSTR_PATH_COLORS                   = `Control Panel\Colors`,
+	REGSTR_PATH_SOUND                    = `Control Panel\Sound`,
+	REGSTR_PATH_METRICS                  = `Control Panel\Desktop\WindowMetrics`,
+	REGSTR_PATH_ICONS                    = `Control Panel\Icons`,
+	REGSTR_PATH_CURSORS                  = `Control Panel\Cursors`,
+	REGSTR_PATH_CHECKDISK                = `Software\Microsoft\Windows\CurrentVersion\Applets\Check Drive`,
+	REGSTR_PATH_CHECKDISKSET             = `Settings`,
+	REGSTR_PATH_CHECKDISKUDRVS           = `NoUnknownDDErrDrvs`,
+	REGSTR_PATH_FAULT                    = `Software\Microsoft\Windows\CurrentVersion\Fault`,
+	REGSTR_VAL_FAULT_LOGFILE             = `LogFile`,
+	REGSTR_PATH_AEDEBUG                  = `Software\Microsoft\Windows NT\CurrentVersion\AeDebug`,
+	REGSTR_VAL_AEDEBUG_DEBUGGER          = `Debugger`,
+	REGSTR_VAL_AEDEBUG_AUTO              = `Auto`,
+	REGSTR_PATH_GRPCONV                  = `Software\Microsoft\Windows\CurrentVersion\GrpConv`,
+	REGSTR_VAL_REGITEMDELETEMESSAGE      = `Removal Message`,
+	REGSTR_PATH_LASTCHECK                = `Software\Microsoft\Windows\CurrentVersion\Explorer\LastCheck`,
+	REGSTR_PATH_LASTOPTIMIZE             = `Software\Microsoft\Windows\CurrentVersion\Explorer\LastOptimize`,
+	REGSTR_PATH_LASTBACKUP               = `Software\Microsoft\Windows\CurrentVersion\Explorer\LastBackup`,
+	REGSTR_PATH_CHKLASTCHECK             = `Software\Microsoft\Windows\CurrentVersion\Applets\Check Drive\LastCheck`,
+	REGSTR_PATH_CHKLASTSURFAN            = `Software\Microsoft\Windows\CurrentVersion\Applets\Check Drive\LastSurfaceAnalysis`,
+	REGSTR_KEY_SHARES                    = `Software\Microsoft\Windows\CurrentVersion\Network\LanMan`,
+	REGSTR_VAL_SHARES_FLAGS              = `Flags`,
+	REGSTR_VAL_SHARES_TYPE               = `Type`,
+	REGSTR_VAL_SHARES_PATH               = `Path`,
+	REGSTR_VAL_SHARES_REMARK             = `Remark`,
+	REGSTR_VAL_SHARES_RW_PASS            = `Parm1`,
+	REGSTR_VAL_SHARES_RO_PASS            = `Parm2`,
+	REGSTR_PATH_PRINT                    = `System\CurrentControlSet\Control\Print`,
+	REGSTR_PATH_PRINTERS                 = `System\CurrentControlSet\Control\Print\Printers`,
+	REGSTR_PATH_PROVIDERS                = `System\CurrentControlSet\Control\Print\Providers`,
+	REGSTR_PATH_MONITORS                 = `System\CurrentControlSet\Control\Print\Monitors`,
+	REGSTR_PATH_ENVIRONMENTS             = `System\CurrentControlSet\Control\Print\Environments`,
+	REGSTR_VAL_START_ON_BOOT             = `StartOnBoot`,
+	REGSTR_VAL_PRINTERS_MASK             = `PrintersMask`,
+	REGSTR_VAL_DOS_SPOOL_MASK            = `DOSSpoolMask`,
+	REGSTR_KEY_CURRENT_ENV               = `\Windows 4.0`,
+	REGSTR_KEY_DRIVERS                   = `\Drivers`,
+	REGSTR_KEY_PRINT_PROC                = `\Print Processors`,
+	REGSTR_PATH_EVENTLABELS              = `AppEvents\EventLabels`,
+	REGSTR_PATH_SCHEMES                  = `AppEvents\Schemes`,
+	REGSTR_PATH_APPS                     = REGSTR_PATH_SCHEMES ~ `\Apps`,
+	REGSTR_PATH_APPS_DEFAULT             = REGSTR_PATH_SCHEMES ~ `\Apps\.Default`,
+	REGSTR_PATH_NAMES                    = REGSTR_PATH_SCHEMES ~ `\Names`,
+	REGSTR_PATH_MULTIMEDIA               = REGSTR_PATH_SETUP ~ `\Multimedia`,
+	REGSTR_PATH_MULTIMEDIA_AUDIO         = `Software\Microsoft\Multimedia\Audio`,
+	REGSTR_PATH_MEDIARESOURCES           = REGSTR_PATH_CURRENT_CONTROL_SET ~ `\MediaResources`,
+	REGSTR_PATH_MEDIAPROPERTIES          = REGSTR_PATH_CURRENT_CONTROL_SET ~ `\MediaProperties`,
+	REGSTR_PATH_PRIVATEPROPERTIES        = REGSTR_PATH_MEDIAPROPERTIES ~ `\PrivateProperties`,
+	REGSTR_PATH_PUBLICPROPERTIES         = REGSTR_PATH_MEDIAPROPERTIES ~ `\PublicProperties`,
+	REGSTR_PATH_JOYOEM                   = REGSTR_PATH_PRIVATEPROPERTIES ~ `\Joystick\OEM`,
+	REGSTR_PATH_JOYCONFIG                = REGSTR_PATH_MEDIARESOURCES ~ `\Joystick`,
+	REGSTR_KEY_JOYCURR                   = `CurrentJoystickSettings`,
+	REGSTR_KEY_JOYSETTINGS               = `JoystickSettings`,
+	REGSTR_VAL_JOYUSERVALUES             = `JoystickUserValues`,
+	REGSTR_VAL_JOYCALLOUT                = `JoystickCallout`,
+	REGSTR_VAL_JOYNCONFIG                = `Joystick%dConfiguration`,
+	REGSTR_VAL_JOYNOEMNAME               = `Joystick%dOEMName`,
+	REGSTR_VAL_JOYNOEMCALLOUT            = `Joystick%dOEMCallout`,
+	REGSTR_VAL_JOYOEMCALLOUT             = `OEMCallout`,
+	REGSTR_VAL_JOYOEMNAME                = `OEMName`,
+	REGSTR_VAL_JOYOEMDATA                = `OEMData`,
+	REGSTR_VAL_JOYOEMXYLABEL             = `OEMXYLabel`,
+	REGSTR_VAL_JOYOEMZLABEL              = `OEMZLabel`,
+	REGSTR_VAL_JOYOEMRLABEL              = `OEMRLabel`,
+	REGSTR_VAL_JOYOEMPOVLABEL            = `OEMPOVLabel`,
+	REGSTR_VAL_JOYOEMULABEL              = `OEMULabel`,
+	REGSTR_VAL_JOYOEMVLABEL              = `OEMVLabel`,
+	REGSTR_VAL_JOYOEMTESTMOVEDESC        = `OEMTestMoveDesc`,
+	REGSTR_VAL_JOYOEMTESTBUTTONDESC      = `OEMTestButtonDesc`,
+	REGSTR_VAL_JOYOEMTESTMOVECAP         = `OEMTestMoveCap`,
+	REGSTR_VAL_JOYOEMTESTBUTTONCAP       = `OEMTestButtonCap`,
+	REGSTR_VAL_JOYOEMTESTWINCAP          = `OEMTestWinCap`,
+	REGSTR_VAL_JOYOEMCALCAP              = `OEMCalCap`,
+	REGSTR_VAL_JOYOEMCALWINCAP           = `OEMCalWinCap`,
+	REGSTR_VAL_JOYOEMCAL1                = `OEMCal1`,
+	REGSTR_VAL_JOYOEMCAL2                = `OEMCal2`,
+	REGSTR_VAL_JOYOEMCAL3                = `OEMCal3`,
+	REGSTR_VAL_JOYOEMCAL4                = `OEMCal4`,
+	REGSTR_VAL_JOYOEMCAL5                = `OEMCal5`,
+	REGSTR_VAL_JOYOEMCAL6                = `OEMCal6`,
+	REGSTR_VAL_JOYOEMCAL7                = `OEMCal7`,
+	REGSTR_VAL_JOYOEMCAL8                = `OEMCal8`,
+	REGSTR_VAL_JOYOEMCAL9                = `OEMCal9`,
+	REGSTR_VAL_JOYOEMCAL10               = `OEMCal10`,
+	REGSTR_VAL_JOYOEMCAL11               = `OEMCal11`,
+	REGSTR_VAL_JOYOEMCAL12               = `OEMCal12`;
+
+enum {
+	DTRESULTOK,
+	DTRESULTFIX,
+	DTRESULTPROB,
+	DTRESULTPART
+}
+
+//#ifndef NEC_98
+const PCIC_DEFAULT_IRQMASK = 0x4EB8;
+//#else
+//#define PCIC_DEFAULT_IRQMASK	0x1468
+//#endif
+const PCIC_DEFAULT_NUMSOCKETS = 0;
+
+struct DSKTLSYSTEMTIME {
+	WORD wYear;
+	WORD wMonth;
+	WORD wDayOfWeek;
+	WORD wDay;
+	WORD wHour;
+	WORD wMinute;
+	WORD wSecond;
+	WORD wMilliseconds;
+	WORD wResult;
+}
+alias DSKTLSYSTEMTIME* PDSKTLSYSTEMTIME, LPDSKTLSYSTEMTIME;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/richedit.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,581 @@
+/***********************************************************************\
+*                               richedit.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.richedit;
+
+private import win32.windef, win32.winuser;
+private import win32.wingdi; // for LF_FACESIZE
+
+align(4):
+
+version(Unicode) {
+	const wchar[] RICHEDIT_CLASS = "RichEdit20W";
+} else {
+	const char[] RICHEDIT_CLASS  = "RichEdit20A";
+}
+
+const RICHEDIT_CLASS10A = "RICHEDIT";
+
+const TCHAR[]
+	CF_RTF       = "Rich Text Format",
+	CF_RTFNOOBJS = "Rich Text Format Without Objects",
+	CF_RETEXTOBJ = "RichEdit Text and Objects";
+
+const DWORD
+	CFM_BOLD        = 1,
+	CFM_ITALIC      = 2,
+	CFM_UNDERLINE   = 4,
+	CFM_STRIKEOUT   = 8,
+	CFM_PROTECTED   = 16,
+	CFM_LINK        = 32,
+	CFM_SIZE        = 0x80000000,
+	CFM_COLOR       = 0x40000000,
+	CFM_FACE        = 0x20000000,
+	CFM_OFFSET      = 0x10000000,
+	CFM_CHARSET     = 0x08000000,
+	CFM_SUBSCRIPT   = 0x00030000,
+	CFM_SUPERSCRIPT = 0x00030000;
+
+const DWORD
+	CFE_BOLD        = 1,
+	CFE_ITALIC      = 2,
+	CFE_UNDERLINE   = 4,
+	CFE_STRIKEOUT   = 8,
+	CFE_PROTECTED   = 16,
+	CFE_SUBSCRIPT   = 0x00010000,
+	CFE_SUPERSCRIPT = 0x00020000,
+	CFE_AUTOCOLOR   = 0x40000000;
+
+const CFM_EFFECTS = CFM_BOLD | CFM_ITALIC | CFM_UNDERLINE | CFM_COLOR
+  | CFM_STRIKEOUT | CFE_PROTECTED | CFM_LINK;
+
+// flags for EM_SETIMEOPTIONS
+const LPARAM
+	IMF_FORCENONE         = 1,
+	IMF_FORCEENABLE       = 2,
+	IMF_FORCEDISABLE      = 4,
+	IMF_CLOSESTATUSWINDOW = 8,
+	IMF_VERTICAL          = 32,
+	IMF_FORCEACTIVE       = 64,
+	IMF_FORCEINACTIVE     = 128,
+	IMF_FORCEREMEMBER     = 256;
+
+const SEL_EMPTY=0;
+const SEL_TEXT=1;
+const SEL_OBJECT=2;
+const SEL_MULTICHAR=4;
+const SEL_MULTIOBJECT=8;
+
+const MAX_TAB_STOPS=32;
+
+const PFM_ALIGNMENT=8;
+const PFM_NUMBERING=32;
+const PFM_OFFSET=4;
+const PFM_OFFSETINDENT=0x80000000;
+const PFM_RIGHTINDENT=2;
+const PFM_STARTINDENT=1;
+const PFM_TABSTOPS=16;
+const PFM_BORDER=2048;
+const PFM_LINESPACING=256;
+const PFM_NUMBERINGSTART=32768;
+const PFM_NUMBERINGSTYLE=8192;
+const PFM_NUMBERINGTAB=16384;
+const PFM_SHADING=4096;
+const PFM_SPACEAFTER=128;
+const PFM_SPACEBEFORE=64;
+const PFM_STYLE=1024;
+const PFM_DONOTHYPHEN=4194304;
+const PFM_KEEP=131072;
+const PFM_KEEPNEXT=262144;
+const PFM_NOLINENUMBER=1048576;
+const PFM_NOWIDOWCONTROL=2097152;
+const PFM_PAGEBREAKBEFORE=524288;
+const PFM_RTLPARA=65536;
+const PFM_SIDEBYSIDE=8388608;
+const PFM_TABLE=1073741824;
+const PFN_BULLET=1;
+
+const PFE_DONOTHYPHEN=64;
+const PFE_KEEP=2;
+const PFE_KEEPNEXT=4;
+const PFE_NOLINENUMBER=16;
+const PFE_NOWIDOWCONTROL=32;
+const PFE_PAGEBREAKBEFORE=8;
+const PFE_RTLPARA=1;
+const PFE_SIDEBYSIDE=128;
+const PFE_TABLE=16384;
+const PFA_LEFT=1;
+const PFA_RIGHT=2;
+const PFA_CENTER=3;
+const PFA_JUSTIFY=4;
+const PFA_FULL_INTERWORD=4;
+
+const SF_TEXT=1;
+const SF_RTF=2;
+const SF_RTFNOOBJS=3;
+const SF_TEXTIZED=4;
+const SF_UNICODE=16;
+const SF_USECODEPAGE=32;
+const SF_NCRFORNONASCII=64;
+const SF_RTFVAL=0x0700;
+
+const SFF_PWD=0x0800;
+const SFF_KEEPDOCINFO=0x1000;
+const SFF_PERSISTVIEWSCALE=0x2000;
+const SFF_PLAINRTF=0x4000;
+const SFF_SELECTION=0x8000;
+
+const WB_CLASSIFY      = 3;
+const WB_MOVEWORDLEFT  = 4;
+const WB_MOVEWORDRIGHT = 5;
+const WB_LEFTBREAK     = 6;
+const WB_RIGHTBREAK    = 7;
+const WB_MOVEWORDPREV  = 4;
+const WB_MOVEWORDNEXT  = 5;
+const WB_PREVBREAK     = 6;
+const WB_NEXTBREAK     = 7;
+
+const WBF_WORDWRAP  = 16;
+const WBF_WORDBREAK = 32;
+const WBF_OVERFLOW  = 64;
+const WBF_LEVEL1    = 128;
+const WBF_LEVEL2    = 256;
+const WBF_CUSTOM    = 512;
+
+const ES_DISABLENOSCROLL  = 8192;
+const ES_SUNKEN           = 16384;
+const ES_SAVESEL          = 32768;
+const ES_EX_NOCALLOLEINIT = 16777216;
+const ES_NOIME            = 524288;
+const ES_NOOLEDRAGDROP    = 8;
+const ES_SELECTIONBAR     = 16777216;
+const ES_SELFIME          = 262144;
+const ES_VERTICAL         = 4194304;
+
+const EM_CANPASTE = WM_USER+50;
+const EM_DISPLAYBAND = WM_USER+51;
+const EM_EXGETSEL = WM_USER+52;
+const EM_EXLIMITTEXT = WM_USER+53;
+const EM_EXLINEFROMCHAR = WM_USER+54;
+const EM_EXSETSEL = WM_USER+55;
+const EM_FINDTEXT = WM_USER+56;
+const EM_FORMATRANGE = WM_USER+57;
+const EM_GETCHARFORMAT = WM_USER+58;
+const EM_GETEVENTMASK = WM_USER+59;
+const EM_GETOLEINTERFACE = WM_USER+60;
+const EM_GETPARAFORMAT = WM_USER+61;
+const EM_GETSELTEXT = WM_USER+62;
+const EM_HIDESELECTION = WM_USER+63;
+const EM_PASTESPECIAL = WM_USER+64;
+const EM_REQUESTRESIZE = WM_USER+65;
+const EM_SELECTIONTYPE = WM_USER+66;
+const EM_SETBKGNDCOLOR = WM_USER+67;
+const EM_SETCHARFORMAT = WM_USER+68;
+const EM_SETEVENTMASK = WM_USER+69;
+const EM_SETOLECALLBACK = WM_USER+70;
+const EM_SETPARAFORMAT = WM_USER+71;
+const EM_SETTARGETDEVICE = WM_USER+72;
+const EM_STREAMIN = WM_USER+73;
+const EM_STREAMOUT = WM_USER+74;
+const EM_GETTEXTRANGE = WM_USER+75;
+const EM_FINDWORDBREAK = WM_USER+76;
+const EM_SETOPTIONS = WM_USER+77;
+const EM_GETOPTIONS = WM_USER+78;
+const EM_FINDTEXTEX = WM_USER+79;
+const EM_GETWORDBREAKPROCEX = WM_USER+80;
+const EM_SETWORDBREAKPROCEX = WM_USER+81;
+/* RichEdit 2.0 messages */
+const EM_SETUNDOLIMIT = WM_USER+82;
+const EM_REDO = WM_USER+84;
+const EM_CANREDO = WM_USER+85;
+const EM_GETUNDONAME = WM_USER+86;
+const EM_GETREDONAME = WM_USER+87;
+const EM_STOPGROUPTYPING = WM_USER+88;
+const EM_SETTEXTMODE = WM_USER+89;
+const EM_GETTEXTMODE = WM_USER+90;
+const EM_AUTOURLDETECT = WM_USER+91;
+const EM_GETAUTOURLDETECT = WM_USER + 92;
+const EM_SETPALETTE = WM_USER + 93;
+const EM_GETTEXTEX = WM_USER+94;
+const EM_GETTEXTLENGTHEX = WM_USER+95;
+const EM_SHOWSCROLLBAR = WM_USER+96;
+const EM_SETTEXTEX = WM_USER + 97;
+const EM_SETPUNCTUATION = WM_USER + 100;
+const EM_GETPUNCTUATION = WM_USER + 101;
+const EM_SETWORDWRAPMODE = WM_USER + 102;
+const EM_GETWORDWRAPMODE = WM_USER + 103;
+const EM_SETIMECOLOR = WM_USER + 104;
+const EM_GETIMECOLOR = WM_USER + 105;
+const EM_SETIMEOPTIONS = WM_USER + 106;
+const EM_GETIMEOPTIONS = WM_USER + 107;
+const EM_SETLANGOPTIONS = WM_USER+120;
+const EM_GETLANGOPTIONS = WM_USER+121;
+const EM_GETIMECOMPMODE = WM_USER+122;
+const EM_FINDTEXTW = WM_USER + 123;
+const EM_FINDTEXTEXW = WM_USER + 124;
+const EM_RECONVERSION = WM_USER + 125;
+const EM_SETBIDIOPTIONS = WM_USER + 200;
+const EM_GETBIDIOPTIONS = WM_USER + 201;
+const EM_SETTYPOGRAPHYOPTIONS = WM_USER+202;
+const EM_GETTYPOGRAPHYOPTIONS = WM_USER+203;
+const EM_SETEDITSTYLE = WM_USER + 204;
+const EM_GETEDITSTYLE = WM_USER + 205;
+const EM_GETSCROLLPOS = WM_USER+221;
+const EM_SETSCROLLPOS = WM_USER+222;
+const EM_SETFONTSIZE = WM_USER+223;
+const EM_GETZOOM = WM_USER+224;
+const EM_SETZOOM = WM_USER+225;
+
+const EN_MSGFILTER     = 1792;
+const EN_REQUESTRESIZE = 1793;
+const EN_SELCHANGE     = 1794;
+const EN_DROPFILES     = 1795;
+const EN_PROTECTED     = 1796;
+const EN_CORRECTTEXT   = 1797;
+const EN_STOPNOUNDO    = 1798;
+const EN_IMECHANGE     = 1799;
+const EN_SAVECLIPBOARD = 1800;
+const EN_OLEOPFAILED   = 1801;
+const EN_LINK          = 1803;
+
+const ENM_NONE            = 0;
+const ENM_CHANGE          = 1;
+const ENM_UPDATE          = 2;
+const ENM_SCROLL          = 4;
+const ENM_SCROLLEVENTS    = 8;
+const ENM_DRAGDROPDONE    = 16;
+const ENM_KEYEVENTS       = 65536;
+const ENM_MOUSEEVENTS     = 131072;
+const ENM_REQUESTRESIZE   = 262144;
+const ENM_SELCHANGE       = 524288;
+const ENM_DROPFILES       = 1048576;
+const ENM_PROTECTED       = 2097152;
+const ENM_CORRECTTEXT     = 4194304;
+const ENM_IMECHANGE       = 8388608;
+const ENM_LANGCHANGE      = 16777216;
+const ENM_OBJECTPOSITIONS = 33554432;
+const ENM_LINK            = 67108864;
+
+const ECO_AUTOWORDSELECTION=1;
+const ECO_AUTOVSCROLL=64;
+const ECO_AUTOHSCROLL=128;
+const ECO_NOHIDESEL=256;
+const ECO_READONLY=2048;
+const ECO_WANTRETURN=4096;
+const ECO_SAVESEL=0x8000;
+const ECO_SELECTIONBAR=0x1000000;
+const ECO_VERTICAL=0x400000;
+
+enum {
+	ECOOP_SET = 1,
+	ECOOP_OR,
+	ECOOP_AND,
+	ECOOP_XOR
+}
+
+const SCF_DEFAULT    = 0;
+const SCF_SELECTION  = 1;
+const SCF_WORD       = 2;
+const SCF_ALL        = 4;
+const SCF_USEUIRULES = 8;
+
+const TM_PLAINTEXT=1;
+const TM_RICHTEXT=2;
+const TM_SINGLELEVELUNDO=4;
+const TM_MULTILEVELUNDO=8;
+const TM_SINGLECODEPAGE=16;
+const TM_MULTICODEPAGE=32;
+
+const GT_DEFAULT=0;
+const GT_USECRLF=1;
+
+const yHeightCharPtsMost=1638;
+const lDefaultTab=720;
+
+struct CHARFORMATA {
+	UINT cbSize = this.sizeof;
+	DWORD dwMask;
+	DWORD dwEffects;
+	LONG yHeight;
+	LONG yOffset;
+	COLORREF crTextColor;
+	BYTE bCharSet;
+	BYTE bPitchAndFamily;
+	char szFaceName[LF_FACESIZE];
+}
+struct CHARFORMATW {
+	UINT cbSize = this.sizeof;
+	DWORD dwMask;
+	DWORD dwEffects;
+	LONG yHeight;
+	LONG yOffset;
+	COLORREF crTextColor;
+	BYTE bCharSet;
+	BYTE bPitchAndFamily;
+	WCHAR szFaceName[LF_FACESIZE];
+}
+
+struct CHARFORMAT2A {
+	UINT cbSize = this.sizeof;
+	DWORD dwMask;
+	DWORD dwEffects;
+	LONG yHeight;
+	LONG yOffset;
+	COLORREF crTextColor;
+	BYTE bCharSet;
+	BYTE bPitchAndFamily;
+	char szFaceName[LF_FACESIZE];
+	WORD wWeight;
+	SHORT sSpacing;
+	COLORREF crBackColor;
+	LCID lcid;
+	DWORD dwReserved;
+	SHORT sStyle;
+	WORD wKerning;
+	BYTE bUnderlineType;
+	BYTE bAnimation;
+	BYTE bRevAuthor;
+}
+
+struct CHARFORMAT2W {
+	UINT cbSize = this.sizeof;
+	DWORD dwMask;
+	DWORD dwEffects;
+	LONG yHeight;
+	LONG yOffset;
+	COLORREF crTextColor;
+	BYTE bCharSet;
+	BYTE bPitchAndFamily;
+	WCHAR szFaceName[LF_FACESIZE];
+	WORD wWeight;
+	SHORT sSpacing;
+	COLORREF crBackColor;
+	LCID lcid;
+	DWORD dwReserved;
+	SHORT sStyle;
+	WORD wKerning;
+	BYTE bUnderlineType;
+	BYTE bAnimation;
+	BYTE bRevAuthor;
+}
+
+struct CHARRANGE {
+	LONG cpMin;
+	LONG cpMax;
+}
+
+struct COMPCOLOR {
+	COLORREF crText;
+	COLORREF crBackground;
+	DWORD dwEffects;
+}
+
+extern (Windows) {
+	alias DWORD function(DWORD,PBYTE,LONG,LONG*) EDITSTREAMCALLBACK;
+}
+
+struct EDITSTREAM {
+	DWORD dwCookie;
+	DWORD dwError;
+	EDITSTREAMCALLBACK pfnCallback;
+}
+
+struct ENCORRECTTEXT {
+	NMHDR nmhdr;
+	CHARRANGE chrg;
+	WORD seltyp;
+}
+
+struct ENDROPFILES {
+	NMHDR nmhdr;
+	HANDLE hDrop;
+	LONG cp;
+	BOOL fProtected;
+}
+
+struct ENLINK {
+	NMHDR nmhdr;
+	UINT msg;
+	WPARAM wParam;
+	LPARAM lParam;
+	CHARRANGE chrg;
+}
+
+struct ENOLEOPFAILED {
+	NMHDR nmhdr;
+	LONG iob;
+	LONG lOper;
+	HRESULT hr;
+}
+
+struct ENPROTECTED {
+	NMHDR nmhdr;
+	UINT msg;
+	WPARAM wParam;
+	LPARAM lParam;
+	CHARRANGE chrg;
+}
+alias ENPROTECTED* LPENPROTECTED;
+
+struct ENSAVECLIPBOARD {
+	NMHDR nmhdr;
+	LONG cObjectCount;
+	LONG cch;
+}
+
+struct FINDTEXTA {
+	CHARRANGE chrg;
+	LPSTR lpstrText;
+}
+
+struct FINDTEXTW {
+	CHARRANGE chrg;
+	LPWSTR lpstrText;
+}
+
+struct FINDTEXTEXA {
+	CHARRANGE chrg;
+	LPSTR lpstrText;
+	CHARRANGE chrgText;
+}
+
+struct FINDTEXTEXW {
+	CHARRANGE chrg;
+	LPWSTR lpstrText;
+	CHARRANGE chrgText;
+}
+
+struct FORMATRANGE {
+	HDC hdc;
+	HDC hdcTarget;
+	RECT rc;
+	RECT rcPage;
+	CHARRANGE chrg;
+}
+
+struct MSGFILTER {
+	NMHDR nmhdr;
+	UINT msg;
+	WPARAM wParam;
+	LPARAM lParam;
+}
+
+struct PARAFORMAT {
+	UINT cbSize = this.sizeof;
+	DWORD dwMask;
+	WORD wNumbering;
+	WORD wReserved;
+	LONG dxStartIndent;
+	LONG dxRightIndent;
+	LONG dxOffset;
+	WORD wAlignment;
+	SHORT cTabCount;
+	LONG rgxTabs[MAX_TAB_STOPS];
+}
+
+struct PARAFORMAT2 {
+	UINT cbSize = this.sizeof;
+	DWORD dwMask;
+	WORD wNumbering;
+	WORD wEffects;
+	LONG dxStartIndent;
+	LONG dxRightIndent;
+	LONG dxOffset;
+	WORD wAlignment;
+	SHORT cTabCount;
+	LONG rgxTabs[MAX_TAB_STOPS];
+	LONG dySpaceBefore;
+	LONG dySpaceAfter;
+	LONG dyLineSpacing;
+	SHORT sStype;
+	BYTE bLineSpacingRule;
+	BYTE bOutlineLevel;
+	WORD wShadingWeight;
+	WORD wShadingStyle;
+	WORD wNumberingStart;
+	WORD wNumberingStyle;
+	WORD wNumberingTab;
+	WORD wBorderSpace;
+	WORD wBorderWidth;
+	WORD wBorders;
+}
+
+struct SELCHANGE {
+	NMHDR nmhdr;
+	CHARRANGE chrg;
+	WORD seltyp;
+}
+
+struct TEXTRANGEA {
+	CHARRANGE chrg;
+	LPSTR lpstrText;
+}
+
+struct TEXTRANGEW {
+	CHARRANGE chrg;
+	LPWSTR lpstrText;
+}
+
+struct REQRESIZE {
+	NMHDR nmhdr;
+	RECT rc;
+}
+
+struct REPASTESPECIAL {
+	DWORD dwAspect;
+	DWORD dwParam;
+}
+
+struct PUNCTUATION {
+	UINT iSize;
+	LPSTR szPunctuation;
+}
+
+struct GETTEXTEX {
+	DWORD cb;
+	DWORD flags;
+	UINT codepage;
+	LPCSTR lpDefaultChar;
+	LPBOOL lpUsedDefaultChar;
+}
+
+extern (Windows) {
+alias LONG function(char*,LONG,BYTE,INT) EDITWORDBREAKPROCEX;
+}
+
+/* Defines for EM_SETTYPOGRAPHYOPTIONS */
+const TO_ADVANCEDTYPOGRAPHY = 1;
+const TO_SIMPLELINEBREAK    = 2;
+
+/* Defines for GETTEXTLENGTHEX */
+const GTL_DEFAULT  = 0;
+const GTL_USECRLF  = 1;
+const GTL_PRECISE  = 2;
+const GTL_CLOSE    = 4;
+const GTL_NUMCHARS = 8;
+const GTL_NUMBYTES = 16;
+
+struct GETTEXTLENGTHEX {
+	DWORD flags;
+	UINT codepage;
+}
+
+version(Unicode) {
+	alias CHARFORMATW CHARFORMAT;
+	alias CHARFORMAT2W CHARFORMAT2;
+	alias FINDTEXTW FINDTEXT;
+	alias FINDTEXTEXW FINDTEXTEX;
+	alias TEXTRANGEW TEXTRANGE;
+} else {
+	alias CHARFORMATA CHARFORMAT;
+	alias CHARFORMAT2A CHARFORMAT2;
+	alias FINDTEXTA FINDTEXT;
+	alias FINDTEXTEXA FINDTEXTEX;
+	alias TEXTRANGEA TEXTRANGE;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/richole.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,101 @@
+/***********************************************************************\
+*                               richole.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.richole;
+
+private import win32.objfwd, win32.objidl, win32.ole2, win32.unknwn,
+  win32.windef;
+private import win32.richedit; // for CHARRANGE
+
+align(4):
+
+const ULONG
+	REO_GETOBJ_NO_INTERFACES = 0,
+	REO_GETOBJ_POLEOBJ = 1,
+	REO_GETOBJ_PSTG = 2,
+	REO_GETOBJ_POLESITE = 4,
+	REO_GETOBJ_ALL_INTERFACES = 7,
+	REO_CP_SELECTION = -1,
+	REO_IOB_SELECTION = -1,
+	REO_IOB_USE_CP = -2,
+	REO_NULL = 0,
+	REO_READWRITEMASK = 0x3F,
+	REO_DONTNEEDPALETTE = 32,
+	REO_BLANK = 16,
+	REO_DYNAMICSIZE = 8,
+	REO_INVERTEDSELECT = 4,
+	REO_BELOWBASELINE = 2,
+	REO_RESIZABLE = 1,
+	REO_LINK = 0x80000000,
+	REO_STATIC = 0x40000000,
+	REO_SELECTED = 0x08000000,
+	REO_OPEN = 0x4000000,
+	REO_INPLACEACTIVE = 0x2000000,
+	REO_HILITED = 0x1000000,
+	REO_LINKAVAILABLE = 0x800000,
+	REO_GETMETAFILE = 0x400000;
+
+enum {
+	RECO_PASTE = 0,
+	RECO_DROP,
+	RECO_COPY,
+	RECO_CUT,
+	RECO_DRAG // = 4
+}
+
+extern (C) extern const GUID
+	IID_IRichEditOle,
+	IID_IRichEditOleCallback;
+
+struct REOBJECT {
+	DWORD           cbStruct = REOBJECT.sizeof;
+	LONG            cp;
+	CLSID           clsid;
+	LPOLEOBJECT     poleobj;
+	LPSTORAGE       pstg;
+	LPOLECLIENTSITE polesite;
+	SIZEL           sizel;
+	DWORD           dvaspect;
+	DWORD           dwFlags;
+	DWORD           dwUser;
+}
+
+interface IRichEditOle : public IUnknown {
+	HRESULT GetClientSite(LPOLECLIENTSITE*);
+	LONG GetObjectCount();
+	LONG GetLinkCount();
+	HRESULT GetObject(LONG, REOBJECT*, DWORD);
+	HRESULT InsertObject(REOBJECT*);
+	HRESULT ConvertObject(LONG, REFCLSID, LPCSTR);
+	HRESULT ActivateAs(REFCLSID, REFCLSID);
+	HRESULT SetHostNames(LPCSTR, LPCSTR);
+	HRESULT SetLinkAvailable(LONG, BOOL);
+	HRESULT SetDvaspect(LONG, DWORD);
+	HRESULT HandsOffStorage(LONG);
+	HRESULT SaveCompleted(LONG, LPSTORAGE);
+	HRESULT InPlaceDeactivate();
+	HRESULT ContextSensitiveHelp(BOOL);
+	HRESULT GetClipboardData(CHARRANGE*, DWORD, LPDATAOBJECT*);
+	HRESULT ImportDataObject(LPDATAOBJECT, CLIPFORMAT, HGLOBAL);
+};
+alias IRichEditOle* LPRICHEDITOLE;
+
+interface IRichEditOleCallback : public IUnknown {
+	HRESULT GetNewStorage(LPSTORAGE*);
+	HRESULT GetInPlaceContext(LPOLEINPLACEFRAME*, LPOLEINPLACEUIWINDOW*, LPOLEINPLACEFRAMEINFO);
+	HRESULT ShowContainerUI(BOOL);
+	HRESULT QueryInsertObject(LPCLSID, LPSTORAGE, LONG);
+	HRESULT DeleteObject(LPOLEOBJECT);
+	HRESULT QueryAcceptData(LPDATAOBJECT, CLIPFORMAT*, DWORD, BOOL, HGLOBAL);
+	HRESULT ContextSensitiveHelp(BOOL);
+	HRESULT GetClipboardData(CHARRANGE*, DWORD, LPDATAOBJECT*);
+	HRESULT GetDragDropEffect(BOOL, DWORD, PDWORD);
+	HRESULT GetContextMenu(WORD, LPOLEOBJECT, CHARRANGE*, HMENU*);
+};
+alias IRichEditOleCallback* LPRICHEDITOLECALLBACK;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/rpc.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,31 @@
+/***********************************************************************\
+*                                 rpc.d                                 *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.rpc;
+
+/* Moved to rpcdecp (duplicate definition).
+	typedef void *I_RPC_HANDLE;
+	alias long RPC_STATUS;
+	// Moved to rpcdce:
+	RpcImpersonateClient
+	RpcRevertToSelf
+*/
+
+public import win32.unknwn;
+public import win32.rpcdce;  // also pulls in rpcdcep
+public import win32.rpcnsi;
+public import win32.rpcnterr;
+public import win32.winerror;
+
+alias MIDL_user_allocate midl_user_allocate;
+alias MIDL_user_free midl_user_free;
+
+extern (Windows) {
+	int I_RpcMapWin32Status(RPC_STATUS);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/rpcdce.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,449 @@
+/***********************************************************************\
+*                                rpcdce.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.rpcdce;
+pragma(lib, "Rpcrt4.lib");
+
+// TODO: I think MinGW got this wrong. RPC_UNICODE_SUPPORTED should be
+// replaced aliases for version(Unicode)
+
+public import win32.rpcdcep;
+private import win32.basetyps, win32.w32api, win32.windef;
+
+// FIXME: clean up Windows version support
+
+alias UUID uuid_t;
+alias UUID_VECTOR uuid_vector_t;
+alias void RPC_MGR_EPV;
+
+// for RpcMgmtSetComTimeout()
+enum : uint {
+	RPC_C_BINDING_MIN_TIMEOUT      = 0,
+	RPC_C_BINDING_DEFAULT_TIMEOUT  = 5,
+	RPC_C_BINDING_MAX_TIMEOUT      = 9,
+	RPC_C_BINDING_INFINITE_TIMEOUT = 10
+}
+
+const RPC_C_CANCEL_INFINITE_TIMEOUT= -1;
+const RPC_C_LISTEN_MAX_CALLS_DEFAULT=1234;
+const RPC_C_PROTSEQ_MAX_REQS_DEFAULT=10;
+const RPC_C_BIND_TO_ALL_NICS=1;
+const RPC_C_USE_INTERNET_PORT=1;
+const RPC_C_USE_INTRANET_PORT=2;
+
+// for RPC_STATS_VECTOR, used by RpcMgmyInqStats
+enum : uint {
+	RPC_C_STATS_CALLS_IN  = 0,
+	RPC_C_STATS_CALLS_OUT,
+	RPC_C_STATS_PKTS_IN,
+	RPC_C_STATS_PKTS_OUT
+}
+
+const RPC_IF_AUTOLISTEN=0x0001;
+const RPC_IF_OLE=2;
+const RPC_C_MGMT_INQ_IF_IDS=0;
+const RPC_C_MGMT_INQ_PRINC_NAME=1;
+const RPC_C_MGMT_INQ_STATS=2;
+const RPC_C_MGMT_IS_SERVER_LISTEN=3;
+const RPC_C_MGMT_STOP_SERVER_LISTEN=4;
+
+// Inquiry Type for RpcMgmtEpEltInqBegin()
+enum : uint {
+	RPC_C_EP_ALL_ELTS = 0,
+	RPC_C_EP_MATCH_BY_IF,
+	RPC_C_EP_MATCH_BY_OBJ,
+	RPC_C_EP_MATCH_BY_BOTH
+}
+
+// for RpcMgmtEpEltInqNext()
+enum : uint {
+	RPC_C_VERS_ALL = 1,
+	RPC_C_VERS_COMPATIBLE,
+	RPC_C_VERS_EXACT,
+	RPC_C_VERS_MAJOR_ONLY,
+	RPC_C_VERS_UPTO
+}
+
+const DCE_C_ERROR_STRING_LEN=256;
+const RPC_C_PARM_MAX_PACKET_LENGTH=1;
+const RPC_C_PARM_BUFFER_LENGTH=2;
+const RPC_C_AUTHN_LEVEL_DEFAULT=0;
+const RPC_C_AUTHN_LEVEL_NONE=1;
+const RPC_C_AUTHN_LEVEL_CONNECT=2;
+const RPC_C_AUTHN_LEVEL_CALL=3;
+const RPC_C_AUTHN_LEVEL_PKT=4;
+const RPC_C_AUTHN_LEVEL_PKT_INTEGRITY=5;
+const RPC_C_AUTHN_LEVEL_PKT_PRIVACY=6;
+const RPC_C_IMP_LEVEL_ANONYMOUS=1;
+const RPC_C_IMP_LEVEL_IDENTIFY=2;
+const RPC_C_IMP_LEVEL_IMPERSONATE=3;
+const RPC_C_IMP_LEVEL_DELEGATE=4;
+const RPC_C_QOS_IDENTITY_STATIC=0;
+const RPC_C_QOS_IDENTITY_DYNAMIC=1;
+const RPC_C_QOS_CAPABILITIES_DEFAULT=0;
+const RPC_C_QOS_CAPABILITIES_MUTUAL_AUTH=1;
+
+// These enums were buggy in MinGW !
+const RPC_C_PROTECT_LEVEL_DEFAULT = RPC_C_AUTHN_LEVEL_DEFAULT;
+const RPC_C_PROTECT_LEVEL_NONE = RPC_C_AUTHN_LEVEL_NONE;
+const RPC_C_PROTECT_LEVEL_CONNECT = RPC_C_AUTHN_LEVEL_CONNECT;
+const RPC_C_PROTECT_LEVEL_CALL = RPC_C_AUTHN_LEVEL_CALL;
+const RPC_C_PROTECT_LEVEL_PKT = RPC_C_AUTHN_LEVEL_PKT;
+const RPC_C_PROTECT_LEVEL_PKT_INTEGRITY = RPC_C_AUTHN_LEVEL_PKT_INTEGRITY;
+const RPC_C_PROTECT_LEVEL_PKT_PRIVACY = RPC_C_AUTHN_LEVEL_PKT_PRIVACY;
+
+const RPC_C_AUTHN_NONE=0;
+const RPC_C_AUTHN_DCE_PRIVATE=1;
+const RPC_C_AUTHN_DCE_PUBLIC=2;
+const RPC_C_AUTHN_DEC_PUBLIC=4;
+const RPC_C_AUTHN_WINNT=10;
+const RPC_C_AUTHN_DEFAULT=0xFFFFFFFF;
+//const RPC_C_SECURITY_QOS_VERSION=L; // FIXME(MinGW): This is nonsense!
+const SEC_WINNT_AUTH_IDENTITY_ANSI=0x1;
+const SEC_WINNT_AUTH_IDENTITY_UNICODE=0x2;
+const RPC_C_AUTHZ_NONE=0;
+const RPC_C_AUTHZ_NAME=1;
+const RPC_C_AUTHZ_DCE=2;
+const RPC_C_AUTHZ_DEFAULT=0xFFFFFFFF;
+
+alias I_RPC_HANDLE RPC_BINDING_HANDLE;
+alias RPC_BINDING_HANDLE handle_t;
+
+struct RPC_BINDING_VECTOR {
+	uint Count;
+	RPC_BINDING_HANDLE BindingH[1];
+}
+
+alias RPC_BINDING_HANDLE rpc_binding_handle_t;
+alias RPC_BINDING_VECTOR rpc_binding_vector_t;
+
+
+struct UUID_VECTOR {
+	uint Count;
+	UUID* Uuid[1];
+}
+
+alias void* RPC_IF_HANDLE;
+
+struct RPC_IF_ID {
+	UUID Uuid;
+	ushort VersMajor;
+	ushort VersMinor;
+}
+
+struct RPC_POLICY {
+	uint Length;
+	uint EndpointFlags;
+	uint NICFlags;
+}
+alias RPC_POLICY* PRPC_POLICY;
+
+extern (Windows) {
+	alias void function(UUID*, UUID*, RPC_STATUS*) RPC_OBJECT_INQ_FN;
+	alias RPC_STATUS function(RPC_IF_HANDLE, void*) RPC_IF_CALLBACK_FN;
+}
+
+struct RPC_STATS_VECTOR {
+	uint    Count;
+	uint[1] Stats;
+}
+
+struct RPC_IF_ID_VECTOR {
+	uint          Count;
+	RPC_IF_ID*[1] IfId;
+}
+alias HANDLE RPC_AUTH_IDENTITY_HANDLE, RPC_AUTHZ_HANDLE;
+
+struct RPC_SECURITY_QOS {
+	uint Version;
+	uint Capabilities;
+	uint IdentityTracking;
+	uint ImpersonationType;
+}
+alias RPC_SECURITY_QOS* PRPC_SECURITY_QOS;
+
+struct SEC_WINNT_AUTH_IDENTITY_W {
+	ushort* User;
+	uint UserLength;
+	ushort* Domain;
+	uint DomainLength;
+	ushort* Password;
+	uint PasswordLength;
+	uint Flags;
+}
+alias SEC_WINNT_AUTH_IDENTITY_W* PSEC_WINNT_AUTH_IDENTITY_W;
+
+struct SEC_WINNT_AUTH_IDENTITY_A {
+	ubyte* User;
+	uint UserLength;
+	ubyte* Domain;
+	uint DomainLength;
+	ubyte* Password;
+	uint PasswordLength;
+	uint Flags;
+}
+alias SEC_WINNT_AUTH_IDENTITY_A* PSEC_WINNT_AUTH_IDENTITY_A;
+
+struct RPC_CLIENT_INFORMATION1 {
+	ubyte* UserName;
+	ubyte* ComputerName;
+	ushort Privilege;
+	uint AuthFlags;
+}
+alias RPC_CLIENT_INFORMATION1* PRPC_CLIENT_INFORMATION1;
+alias I_RPC_HANDLE* RPC_EP_INQ_HANDLE;
+extern (Windows) {
+	alias int function(RPC_BINDING_HANDLE, uint, RPC_STATUS*) RPC_MGMT_AUTHORIZATION_FN;
+}
+
+static if(_WIN32_WINNT_ONLY) {
+
+	struct RPC_PROTSEQ_VECTORA {
+		uint Count;
+		ubyte*[1] Protseq;
+	}
+
+	struct RPC_PROTSEQ_VECTORW {
+		uint Count;
+		ushort*[1] Protseq;
+	}
+
+	extern (Windows) {
+		RPC_STATUS RpcBindingFromStringBindingA(char*, RPC_BINDING_HANDLE*);
+		RPC_STATUS RpcBindingFromStringBindingW(wchar*, RPC_BINDING_HANDLE*);
+		RPC_STATUS RpcBindingToStringBindingA(RPC_BINDING_HANDLE, char**);
+		RPC_STATUS RpcBindingToStringBindingW(RPC_BINDING_HANDLE, wchar**);
+		RPC_STATUS RpcStringBindingComposeA(char*, char*, char*, char*, char*, char**);
+		RPC_STATUS RpcStringBindingComposeW(wchar*, wchar*, wchar*, wchar*, wchar*, wchar**);
+		RPC_STATUS RpcStringBindingParseA(char*, char**, char**, char**, char**, char**);
+		RPC_STATUS RpcStringBindingParseW(wchar*, wchar**, wchar**, wchar**, wchar**, wchar**);
+		RPC_STATUS RpcStringFreeA(char**);
+		RPC_STATUS RpcStringFreeW(wchar**);
+		RPC_STATUS RpcNetworkIsProtseqValidA(char*);
+		RPC_STATUS RpcNetworkIsProtseqValidW(wchar*);
+		RPC_STATUS RpcNetworkInqProtseqsA(RPC_PROTSEQ_VECTORA**);
+		RPC_STATUS RpcNetworkInqProtseqsW(RPC_PROTSEQ_VECTORW**);
+		RPC_STATUS RpcProtseqVectorFreeA(RPC_PROTSEQ_VECTORA**);
+		RPC_STATUS RpcProtseqVectorFreeW(RPC_PROTSEQ_VECTORW**);
+		RPC_STATUS RpcServerUseProtseqA(char*, uint, void*);
+		RPC_STATUS RpcServerUseProtseqW(wchar*, uint, void*);
+		RPC_STATUS RpcServerUseProtseqExA(char*, uint MaxCalls, void*, PRPC_POLICY);
+		RPC_STATUS RpcServerUseProtseqExW(wchar*, uint, void*, PRPC_POLICY);
+		RPC_STATUS RpcServerUseProtseqEpA(char*, uint, char*, void*);
+		RPC_STATUS RpcServerUseProtseqEpExA(char*, uint, char*, void*, PRPC_POLICY);
+		RPC_STATUS RpcServerUseProtseqEpW(wchar*, uint, wchar*, void*);
+		RPC_STATUS RpcServerUseProtseqEpExW(wchar*, uint, wchar*, void*, PRPC_POLICY);
+		RPC_STATUS RpcServerUseProtseqIfA(char*, uint, RPC_IF_HANDLE, void*);
+		RPC_STATUS RpcServerUseProtseqIfExA(char*, uint, RPC_IF_HANDLE, void*, PRPC_POLICY);
+		RPC_STATUS RpcServerUseProtseqIfW(wchar*, uint, RPC_IF_HANDLE, void*);
+		RPC_STATUS RpcServerUseProtseqIfExW(wchar*, uint, RPC_IF_HANDLE, void*, PRPC_POLICY);
+		RPC_STATUS RpcMgmtInqServerPrincNameA(RPC_BINDING_HANDLE, uint, char**);
+		RPC_STATUS RpcMgmtInqServerPrincNameW(RPC_BINDING_HANDLE, uint, wchar**);
+		RPC_STATUS RpcServerInqDefaultPrincNameA(uint, char**);
+		RPC_STATUS RpcServerInqDefaultPrincNameW(uint, wchar**);
+		RPC_STATUS RpcNsBindingInqEntryNameA(RPC_BINDING_HANDLE, uint, char**);
+		RPC_STATUS RpcNsBindingInqEntryNameW(RPC_BINDING_HANDLE, uint, wchar**);
+		RPC_STATUS RpcBindingInqAuthClientA(RPC_BINDING_HANDLE, RPC_AUTHZ_HANDLE*, char**, uint*, uint*, uint*);
+		RPC_STATUS RpcBindingInqAuthClientW(RPC_BINDING_HANDLE, RPC_AUTHZ_HANDLE*, wchar**, uint*, uint*, uint*);
+		RPC_STATUS RpcBindingInqAuthInfoA(RPC_BINDING_HANDLE, char**, uint*, uint*, RPC_AUTH_IDENTITY_HANDLE*, uint*);
+		RPC_STATUS RpcBindingInqAuthInfoW(RPC_BINDING_HANDLE, wchar**, uint*, uint*, RPC_AUTH_IDENTITY_HANDLE*, uint*);
+		RPC_STATUS RpcBindingSetAuthInfoA(RPC_BINDING_HANDLE, char*, uint, uint, RPC_AUTH_IDENTITY_HANDLE, uint);
+		RPC_STATUS RpcBindingSetAuthInfoExA(RPC_BINDING_HANDLE, char*, uint, uint, RPC_AUTH_IDENTITY_HANDLE, uint, RPC_SECURITY_QOS*);
+		RPC_STATUS RpcBindingSetAuthInfoW(RPC_BINDING_HANDLE, wchar*, uint, uint, RPC_AUTH_IDENTITY_HANDLE, uint);
+		RPC_STATUS RpcBindingSetAuthInfoExW(RPC_BINDING_HANDLE, wchar*, uint, uint, RPC_AUTH_IDENTITY_HANDLE, uint, RPC_SECURITY_QOS*);
+		RPC_STATUS RpcBindingInqAuthInfoExA(RPC_BINDING_HANDLE, char**, uint*, uint*, RPC_AUTH_IDENTITY_HANDLE*, uint*, uint, RPC_SECURITY_QOS*);
+		RPC_STATUS RpcBindingInqAuthInfoExW(RPC_BINDING_HANDLE, wchar**, uint*, uint*, RPC_AUTH_IDENTITY_HANDLE*, uint*, uint, RPC_SECURITY_QOS*);
+		alias void function(void*, wchar*, uint, void**, RPC_STATUS*) RPC_AUTH_KEY_RETRIEVAL_FN;
+		RPC_STATUS RpcServerRegisterAuthInfoA(char*, uint, RPC_AUTH_KEY_RETRIEVAL_FN, void*);
+		RPC_STATUS RpcServerRegisterAuthInfoW(wchar*, uint, RPC_AUTH_KEY_RETRIEVAL_FN, void*);
+		RPC_STATUS UuidToStringA(UUID*, char**);
+		RPC_STATUS UuidFromStringA(char*, UUID*);
+		RPC_STATUS UuidToStringW(UUID*, wchar**);
+		RPC_STATUS UuidFromStringW(wchar*, UUID*);
+		RPC_STATUS RpcEpRegisterNoReplaceA(RPC_IF_HANDLE, RPC_BINDING_VECTOR*, UUID_VECTOR*, char*);
+		RPC_STATUS RpcEpRegisterNoReplaceW(RPC_IF_HANDLE, RPC_BINDING_VECTOR*, UUID_VECTOR*, wchar*);
+		RPC_STATUS RpcEpRegisterA(RPC_IF_HANDLE, RPC_BINDING_VECTOR*, UUID_VECTOR*, char*);
+		RPC_STATUS RpcEpRegisterW(RPC_IF_HANDLE, RPC_BINDING_VECTOR*, UUID_VECTOR*, wchar*);
+		RPC_STATUS DceErrorInqTextA(RPC_STATUS, char*);
+		RPC_STATUS DceErrorInqTextW(RPC_STATUS, wchar*);
+		RPC_STATUS RpcMgmtEpEltInqNextA(RPC_EP_INQ_HANDLE, RPC_IF_ID*, RPC_BINDING_HANDLE*, UUID*, char**);
+		RPC_STATUS RpcMgmtEpEltInqNextW(RPC_EP_INQ_HANDLE, RPC_IF_ID*, RPC_BINDING_HANDLE*, UUID*, wchar**);
+
+		// MinGW erroneously had these in rpc.h
+		RPC_STATUS RpcImpersonateClient(RPC_BINDING_HANDLE);
+		RPC_STATUS RpcRevertToSelf();
+	}
+
+	version(Unicode) {
+		alias RPC_PROTSEQ_VECTORW RPC_PROTSEQ_VECTOR;
+		alias SEC_WINNT_AUTH_IDENTITY_W SEC_WINNT_AUTH_IDENTITY;
+		alias PSEC_WINNT_AUTH_IDENTITY_W PSEC_WINNT_AUTH_IDENTITY;
+		alias RpcMgmtEpEltInqNextW RpcMgmtEpEltInqNext;
+		alias RpcBindingFromStringBindingW RpcBindingFromStringBinding;
+		alias RpcBindingToStringBindingW RpcBindingToStringBinding;
+		alias RpcStringBindingComposeW RpcStringBindingCompose;
+		alias RpcStringBindingParseW RpcStringBindingParse;
+		alias RpcStringFreeW RpcStringFree;
+		alias RpcNetworkIsProtseqValidW RpcNetworkIsProtseqValid;
+		alias RpcNetworkInqProtseqsW RpcNetworkInqProtseqs;
+		alias RpcProtseqVectorFreeW RpcProtseqVectorFree;
+		alias RpcServerUseProtseqW RpcServerUseProtseq;
+		alias RpcServerUseProtseqExW RpcServerUseProtseqEx;
+		alias RpcServerUseProtseqEpW RpcServerUseProtseqEp;
+		alias RpcServerUseProtseqEpExW RpcServerUseProtseqEpEx;
+		alias RpcServerUseProtseqIfW RpcServerUseProtseqIf;
+		alias RpcServerUseProtseqIfExW RpcServerUseProtseqIfEx;
+		alias RpcMgmtInqServerPrincNameW RpcMgmtInqServerPrincName;
+		alias RpcServerInqDefaultPrincNameW RpcServerInqDefaultPrincName;
+		alias RpcNsBindingInqEntryNameW RpcNsBindingInqEntryName;
+		alias RpcBindingInqAuthClientW RpcBindingInqAuthClient;
+		alias RpcBindingInqAuthInfoW RpcBindingInqAuthInfo;
+		alias RpcBindingSetAuthInfoW RpcBindingSetAuthInfo;
+		alias RpcServerRegisterAuthInfoW RpcServerRegisterAuthInfo;
+		alias RpcBindingInqAuthInfoExW RpcBindingInqAuthInfoEx;
+		alias RpcBindingSetAuthInfoExW RpcBindingSetAuthInfoEx;
+		alias UuidFromStringW UuidFromString;
+		alias UuidToStringW UuidToString;
+		alias RpcEpRegisterNoReplaceW RpcEpRegisterNoReplace;
+		alias RpcEpRegisterW RpcEpRegister;
+		alias DceErrorInqTextW DceErrorInqText;
+	} else { // Ansi
+		alias RPC_PROTSEQ_VECTORA RPC_PROTSEQ_VECTOR;
+		alias SEC_WINNT_AUTH_IDENTITY_A SEC_WINNT_AUTH_IDENTITY;
+		alias PSEC_WINNT_AUTH_IDENTITY_A PSEC_WINNT_AUTH_IDENTITY;
+		alias RpcMgmtEpEltInqNextA RpcMgmtEpEltInqNext;
+		alias RpcBindingFromStringBindingA RpcBindingFromStringBinding;
+		alias RpcBindingToStringBindingA RpcBindingToStringBinding;
+		alias RpcStringBindingComposeA RpcStringBindingCompose;
+		alias RpcStringBindingParseA RpcStringBindingParse;
+		alias RpcStringFreeA RpcStringFree;
+		alias RpcNetworkIsProtseqValidA RpcNetworkIsProtseqValid;
+		alias RpcNetworkInqProtseqsA RpcNetworkInqProtseqs;
+		alias RpcProtseqVectorFreeA RpcProtseqVectorFree;
+		alias RpcServerUseProtseqA RpcServerUseProtseq;
+		alias RpcServerUseProtseqExA RpcServerUseProtseqEx;
+		alias RpcServerUseProtseqEpA RpcServerUseProtseqEp;
+		alias RpcServerUseProtseqEpExA RpcServerUseProtseqEpEx;
+		alias RpcServerUseProtseqIfA RpcServerUseProtseqIf;
+		alias RpcServerUseProtseqIfExA RpcServerUseProtseqIfEx;
+		alias RpcMgmtInqServerPrincNameA RpcMgmtInqServerPrincName;
+		alias RpcServerInqDefaultPrincNameA RpcServerInqDefaultPrincName;
+		alias RpcNsBindingInqEntryNameA RpcNsBindingInqEntryName;
+		alias RpcBindingInqAuthClientA RpcBindingInqAuthClient;
+		alias RpcBindingInqAuthInfoA RpcBindingInqAuthInfo;
+		alias RpcBindingSetAuthInfoA RpcBindingSetAuthInfo;
+		alias RpcServerRegisterAuthInfoA RpcServerRegisterAuthInfo;
+		alias RpcBindingInqAuthInfoExA RpcBindingInqAuthInfoEx;
+		alias RpcBindingSetAuthInfoExA RpcBindingSetAuthInfoEx;
+		alias UuidFromStringA UuidFromString;
+		alias UuidToStringA UuidToString;
+		alias RpcEpRegisterNoReplaceA RpcEpRegisterNoReplace;
+		alias RpcEpRegisterA RpcEpRegister;
+		alias DceErrorInqTextA DceErrorInqText;
+	} //#endif // UNICODE
+
+} else { // _WIN32_WINNT_ONLY
+
+	struct RPC_PROTSEQ_VECTOR {
+		uint Count;
+		ubyte* Protseq[1];
+	}
+	// versions without Unicode.
+	RPC_STATUS RpcBindingFromStringBinding(char*, RPC_BINDING_HANDLE*);
+	RPC_STATUS RpcBindingToStringBinding(RPC_BINDING_HANDLE, char**);
+	RPC_STATUS RpcStringBindingCompose(char*, char*, char*, char*, char*, char**);
+	RPC_STATUS RpcStringBindingParse(char*, char**, char**, char**, char**, char**);
+	RPC_STATUS RpcStringFree(char**);
+	RPC_STATUS RpcNetworkIsProtseqValid(char*);
+	RPC_STATUS RpcNetworkInqProtseqs(RPC_PROTSEQ_VECTOR**);
+	RPC_STATUS RpcServerInqBindings(RPC_BINDING_VECTOR**);
+	RPC_STATUS RpcServerUseProtseq(char*, uint, void*);
+	RPC_STATUS RpcServerUseProtseqEx(char*, uint, void*, PRPC_POLICY);
+	RPC_STATUS RpcServerUseProtseqEp(char*, uint, char*, void*);
+	RPC_STATUS RpcServerUseProtseqEpEx(char*, uint, char*, void*, PRPC_POLICY);
+	RPC_STATUS RpcServerUseProtseqIf(char*, uint, RPC_IF_HANDLE, void*);
+	RPC_STATUS RpcServerUseProtseqIfEx(char*, uint, RPC_IF_HANDLE, void*, PRPC_POLICY);
+	RPC_STATUS RpcMgmtInqServerPrincName(RPC_BINDING_HANDLE, uint, char**);
+	RPC_STATUS RpcServerInqDefaultPrincName(uint, char**);
+	RPC_STATUS RpcNsBindingInqEntryName(RPC_BINDING_HANDLE, uint, char**);
+	RPC_STATUS RpcBindingInqAuthClient(RPC_BINDING_HANDLE, RPC_AUTHZ_HANDLE*, char**, uint*, uint*, uint*);
+	RPC_STATUS RpcBindingInqAuthInfo(RPC_BINDING_HANDLE, char**, uint*, uint*, RPC_AUTH_IDENTITY_HANDLE*, uint*);
+	RPC_STATUS RpcBindingSetAuthInfo(RPC_BINDING_HANDLE, char*, uint, uint, RPC_AUTH_IDENTITY_HANDLE, uint);
+	alias void function(void*, char*, uint, void**, RPC_STATUS*) RPC_AUTH_KEY_RETRIEVAL_FN;
+	RPC_STATUS RpcServerRegisterAuthInfo(char*, uint, RPC_AUTH_KEY_RETRIEVAL_FN, void*);
+	RPC_STATUS UuidToString(UUID*, char**);
+	RPC_STATUS UuidFromString(char*, UUID*);
+	RPC_STATUS RpcEpRegisterNoReplace(RPC_IF_HANDLE, RPC_BINDING_VECTOR*, UUID_VECTOR*, char*);
+	RPC_STATUS RpcEpRegister(RPC_IF_HANDLE, RPC_BINDING_VECTOR*, UUID_VECTOR*, char*);
+	RPC_STATUS DceErrorInqText(RPC_STATUS, char*);
+	RPC_STATUS RpcMgmtEpEltInqNext(RPC_EP_INQ_HANDLE, RPC_IF_ID*, RPC_BINDING_HANDLE*, char**);
+}// _WIN32_WINNT_ONLY
+
+
+RPC_STATUS RpcBindingCopy(RPC_BINDING_HANDLE, RPC_BINDING_HANDLE*);
+RPC_STATUS RpcBindingFree(RPC_BINDING_HANDLE*);
+RPC_STATUS RpcBindingInqObject(RPC_BINDING_HANDLE, UUID*);
+RPC_STATUS RpcBindingReset(RPC_BINDING_HANDLE);
+RPC_STATUS RpcBindingSetObject(RPC_BINDING_HANDLE, UUID*);
+RPC_STATUS RpcMgmtInqDefaultProtectLevel(uint, uint*);
+RPC_STATUS RpcBindingVectorFree(RPC_BINDING_VECTOR**);
+RPC_STATUS RpcIfInqId(RPC_IF_HANDLE, RPC_IF_ID*);
+RPC_STATUS RpcMgmtInqComTimeout(RPC_BINDING_HANDLE, uint*);
+RPC_STATUS RpcMgmtSetComTimeout(RPC_BINDING_HANDLE, uint);
+RPC_STATUS RpcMgmtSetCancelTimeout(int Timeout);
+RPC_STATUS RpcObjectInqType(UUID*, UUID*);
+RPC_STATUS RpcObjectSetInqFn(RPC_OBJECT_INQ_FN*);
+RPC_STATUS RpcObjectSetType(UUID*, UUID*);
+RPC_STATUS RpcProtseqVectorFree(RPC_PROTSEQ_VECTOR**);
+RPC_STATUS RpcServerInqIf(RPC_IF_HANDLE, UUID*, RPC_MGR_EPV**);
+RPC_STATUS RpcServerListen(uint, uint, uint);
+RPC_STATUS RpcServerRegisterIf(RPC_IF_HANDLE, UUID*, RPC_MGR_EPV*);
+RPC_STATUS RpcServerRegisterIfEx(RPC_IF_HANDLE, UUID*, RPC_MGR_EPV*, uint, uint, RPC_IF_CALLBACK_FN*);
+RPC_STATUS RpcServerRegisterIf2(RPC_IF_HANDLE, UUID*, RPC_MGR_EPV*, uint, uint, uint, RPC_IF_CALLBACK_FN*);
+RPC_STATUS RpcServerUnregisterIf(RPC_IF_HANDLE, UUID*, uint);
+RPC_STATUS RpcServerUseAllProtseqs(uint, void*);
+RPC_STATUS RpcServerUseAllProtseqsEx(uint, void*, PRPC_POLICY);
+RPC_STATUS RpcServerUseAllProtseqsIf(uint, RPC_IF_HANDLE, void*);
+RPC_STATUS RpcServerUseAllProtseqsIfEx(uint, RPC_IF_HANDLE, void*, PRPC_POLICY);
+RPC_STATUS RpcMgmtStatsVectorFree(RPC_STATS_VECTOR**);
+RPC_STATUS RpcMgmtInqStats(RPC_BINDING_HANDLE, RPC_STATS_VECTOR**);
+RPC_STATUS RpcMgmtIsServerListening(RPC_BINDING_HANDLE);
+RPC_STATUS RpcMgmtStopServerListening(RPC_BINDING_HANDLE);
+RPC_STATUS RpcMgmtWaitServerListen();
+RPC_STATUS RpcMgmtSetServerStackSize(uint);
+void RpcSsDontSerializeContext();
+RPC_STATUS RpcMgmtEnableIdleCleanup();
+RPC_STATUS RpcMgmtInqIfIds(RPC_BINDING_HANDLE, RPC_IF_ID_VECTOR**);
+RPC_STATUS RpcIfIdVectorFree(RPC_IF_ID_VECTOR**);
+RPC_STATUS RpcEpResolveBinding(RPC_BINDING_HANDLE, RPC_IF_HANDLE);
+RPC_STATUS RpcBindingServerFromClient(RPC_BINDING_HANDLE, RPC_BINDING_HANDLE*);
+
+// never returns
+void RpcRaiseException(RPC_STATUS);
+RPC_STATUS RpcTestCancel();
+RPC_STATUS RpcCancelThread(void*);
+RPC_STATUS UuidCreate(UUID*);
+int UuidCompare(UUID*, UUID*, RPC_STATUS*);
+RPC_STATUS UuidCreateNil(UUID*);
+int UuidEqual(UUID*, UUID*, RPC_STATUS*);
+ushort UuidHash(UUID*, RPC_STATUS*);
+int UuidIsNil(UUID*, RPC_STATUS*);
+RPC_STATUS RpcEpUnregister(RPC_IF_HANDLE, RPC_BINDING_VECTOR*, UUID_VECTOR*);
+RPC_STATUS RpcMgmtEpEltInqBegin(RPC_BINDING_HANDLE, uint, RPC_IF_ID*, uint, UUID*, RPC_EP_INQ_HANDLE*);
+RPC_STATUS RpcMgmtEpEltInqDone(RPC_EP_INQ_HANDLE*);
+RPC_STATUS RpcMgmtEpUnregister(RPC_BINDING_HANDLE, RPC_IF_ID*, RPC_BINDING_HANDLE, UUID*);
+RPC_STATUS RpcMgmtSetAuthorizationFn(RPC_MGMT_AUTHORIZATION_FN);
+RPC_STATUS RpcMgmtInqParameter(uint, uint*);
+RPC_STATUS RpcMgmtSetParameter(uint, uint);
+RPC_STATUS RpcMgmtBindingInqParameter(RPC_BINDING_HANDLE, uint, uint*);
+RPC_STATUS RpcMgmtBindingSetParameter(RPC_BINDING_HANDLE, uint, uint);
+
+static if (_WIN32_WINNT >= 0x0500) {
+	RPC_STATUS UuidCreateSequential(UUID*);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/rpcdce2.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,78 @@
+/***********************************************************************\
+*                               rpcdce2.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.rpcdce2;
+
+import win32.rpcdce;
+private import win32.basetyps;
+
+// FIXME: deal with RPC_UNICODE_SUPPORTED
+// FIXME: check types of constants
+
+enum {
+	RPC_C_EP_ALL_ELTS,
+	RPC_C_EP_MATCH_BY_IF,
+	RPC_C_EP_MATCH_BY_OBJ,
+	RPC_C_EP_MATCH_BY_BOTH
+}
+
+enum {
+	RPC_C_VERS_ALL = 1,
+	RPC_C_VERS_COMPATIBLE,
+	RPC_C_VERS_EXACT,
+	RPC_C_VERS_MAJOR_ONLY,
+	RPC_C_VERS_UPTO
+}
+
+const size_t DCE_C_ERROR_STRING_LEN = 256;
+
+enum {
+	RPC_C_MGMT_INQ_IF_IDS,
+	RPC_C_MGMT_INQ_PRINC_NAME,
+	RPC_C_MGMT_INQ_STATS,
+	RPC_C_MGMT_IS_SERVER_LISTEN,
+	RPC_C_MGMT_STOP_SERVER_LISTEN
+}
+
+extern (Windows) {
+	int UuidCompare(UUID*, UUID*, RPC_STATUS*);
+	RPC_STATUS UuidCreateNil(UUID*);
+	int UuidEqual(UUID*, UUID*, RPC_STATUS*);
+	ushort UuidHash(UUID*, RPC_STATUS*);
+	int UuidIsNil(UUID*, RPC_STATUS*);
+
+	RPC_STATUS RpcMgmtEpEltInqBegin(RPC_BINDING_HANDLE, uint, RPC_IF_ID*,
+	  uint, UUID*, RPC_EP_INQ_HANDLE*);
+	RPC_STATUS RpcMgmtEpEltInqDone(RPC_EP_INQ_HANDLE*);
+	RPC_STATUS RpcMgmtEpUnregister(RPC_BINDING_HANDLE, RPC_IF_ID*,
+	  RPC_BINDING_HANDLE, UUID*);
+	RPC_STATUS RpcMgmtSetAuthorizationFn(RPC_MGMT_AUTHORIZATION_FN);
+}
+
+
+//#ifdef RPC_UNICODE_SUPPORTED
+RPC_STATUS DceErrorInqTextA(RPC_STATUS, char*);
+RPC_STATUS DceErrorInqTextW(RPC_STATUS, wchar*);
+RPC_STATUS RpcMgmtEpEltInqNextA(RPC_EP_INQ_HANDLE, RPC_IF_ID*,
+  RPC_BINDING_HANDLE*, UUID*, char**);
+RPC_STATUS RpcMgmtEpEltInqNextW(RPC_EP_INQ_HANDLE, RPC_IF_ID*,
+  RPC_BINDING_HANDLE*, UUID*, wchar**);
+version (Unicode) {
+	alias RpcMgmtEpEltInqNextW RpcMgmtEpEltInqNext;
+	alias DceErrorInqTextW DceErrorInqText;
+} else {
+	alias RpcMgmtEpEltInqNextA RpcMgmtEpEltInqNext;
+	alias DceErrorInqTextA DceErrorInqText;
+}
+/+
+#else /* RPC_UNICODE_SUPPORTED */
+	RPC_STATUS RPC_ENTRY DceErrorInqText(RPC_STATUS,unsigned char*);
+	RPC_STATUS RPC_ENTRY RpcMgmtEpEltInqNext(RPC_EP_INQ_HANDLE,RPC_IF_ID*,RPC_BINDING_HANDLE*,UUID*,unsigned char**);
+#endif
++/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/rpcdcep.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,158 @@
+/***********************************************************************\
+*                               rpcdcep.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.rpcdcep;
+
+private import win32.basetyps;
+private import win32.w32api;
+private import win32.windef;
+
+alias HANDLE I_RPC_HANDLE;
+alias long RPC_STATUS;
+
+const RPC_NCA_FLAGS_DEFAULT=0;
+const RPC_NCA_FLAGS_IDEMPOTENT=1;
+const RPC_NCA_FLAGS_BROADCAST=2;
+const RPC_NCA_FLAGS_MAYBE=4;
+const RPCFLG_ASYNCHRONOUS=0x40000000;
+const RPCFLG_INPUT_SYNCHRONOUS=0x20000000;
+const RPC_FLAGS_VALID_BIT=0x8000;
+
+const TRANSPORT_TYPE_CN=1;
+const TRANSPORT_TYPE_DG=2;
+const TRANSPORT_TYPE_LPC=4;
+const TRANSPORT_TYPE_WMSG=8;
+
+struct RPC_VERSION {
+	ushort MajorVersion;
+	ushort MinorVersion;
+}
+struct RPC_SYNTAX_IDENTIFIER {
+	GUID        SyntaxGUID;
+	RPC_VERSION SyntaxVersion;
+}
+alias RPC_SYNTAX_IDENTIFIER* PRPC_SYNTAX_IDENTIFIER;
+
+struct RPC_MESSAGE {
+	HANDLE Handle;
+	uint  DataRepresentation;
+	void* Buffer;
+	uint  BufferLength;
+	uint  ProcNum;
+	PRPC_SYNTAX_IDENTIFIER TransferSyntax;
+	void* RpcInterfaceInformation;
+	void* ReservedForRuntime;
+	void* ManagerEpv;
+	void* ImportContext;
+	uint  RpcFlags;
+}
+alias RPC_MESSAGE* PRPC_MESSAGE;
+
+extern (Windows) {
+alias void function (PRPC_MESSAGE Message) RPC_DISPATCH_FUNCTION;
+}
+
+struct RPC_DISPATCH_TABLE {
+	uint DispatchTableCount;
+	RPC_DISPATCH_FUNCTION* DispatchTable;
+	int  Reserved;
+}
+alias RPC_DISPATCH_TABLE* PRPC_DISPATCH_TABLE;
+
+struct RPC_PROTSEQ_ENDPOINT {
+	ubyte* RpcProtocolSequence;
+	ubyte* Endpoint;
+}
+alias RPC_PROTSEQ_ENDPOINT* PRPC_PROTSEQ_ENDPOINT;
+
+struct RPC_SERVER_INTERFACE {
+	uint                  Length;
+	RPC_SYNTAX_IDENTIFIER InterfaceId;
+	RPC_SYNTAX_IDENTIFIER TransferSyntax;
+	PRPC_DISPATCH_TABLE   DispatchTable;
+	uint                  RpcProtseqEndpointCount;
+	PRPC_PROTSEQ_ENDPOINT RpcProtseqEndpoint;
+	void*                 DefaultManagerEpv;
+	void*                 InterpreterInfo;
+}
+alias RPC_SERVER_INTERFACE* PRPC_SERVER_INTERFACE;
+
+struct RPC_CLIENT_INTERFACE {
+	uint                  Length;
+	RPC_SYNTAX_IDENTIFIER InterfaceId;
+	RPC_SYNTAX_IDENTIFIER TransferSyntax;
+	PRPC_DISPATCH_TABLE   DispatchTable;
+	uint                  RpcProtseqEndpointCount;
+	PRPC_PROTSEQ_ENDPOINT RpcProtseqEndpoint;
+	uint                  Reserved;
+	void*                 InterpreterInfo;
+}
+alias RPC_CLIENT_INTERFACE* PRPC_CLIENT_INTERFACE;
+
+typedef void* I_RPC_MUTEX;
+
+struct RPC_TRANSFER_SYNTAX {
+	GUID   Uuid;
+	ushort VersMajor;
+	ushort VersMinor;
+}
+alias RPC_STATUS function(void*, void*, void*) RPC_BLOCKING_FN;
+
+extern (Windows) {
+	alias void function(void*) PRPC_RUNDOWN;
+	
+	int    I_RpcGetBuffer(RPC_MESSAGE*);
+	int    I_RpcSendReceive(RPC_MESSAGE*);
+	int    I_RpcSend(RPC_MESSAGE*);
+	int    I_RpcFreeBuffer(RPC_MESSAGE*);
+	void   I_RpcRequestMutex(I_RPC_MUTEX*);
+	void   I_RpcClearMutex(I_RPC_MUTEX);
+	void   I_RpcDeleteMutex(I_RPC_MUTEX);
+	void*  I_RpcAllocate(uint);
+	void   I_RpcFree(void*);
+	void   I_RpcPauseExecution(uint);
+	int    I_RpcMonitorAssociation(HANDLE, PRPC_RUNDOWN, void*);
+	int    I_RpcStopMonitorAssociation(HANDLE);
+	HANDLE I_RpcGetCurrentCallHandle();
+	int    I_RpcGetAssociationContext(void**);
+	int    I_RpcSetAssociationContext(void*);
+
+	static if (_WIN32_WINNT_ONLY) {
+		int I_RpcNsBindingSetEntryName(HANDLE, uint, wchar*);
+		int I_RpcBindingInqDynamicEndpoint(HANDLE, wchar**);
+	} else {
+		int I_RpcNsBindingSetEntryName(HANDLE, uint, char*);
+		int I_RpcBindingInqDynamicEndpoint(HANDLE, char**);
+	}
+
+	int   I_RpcBindingInqTransportType(HANDLE, uint*);
+	int   I_RpcIfInqTransferSyntaxes(HANDLE, RPC_TRANSFER_SYNTAX*, uint,
+	        uint*);
+	int   I_UuidCreate(GUID*);
+	int   I_RpcBindingCopy(HANDLE, HANDLE*);
+	int   I_RpcBindingIsClientLocal(HANDLE, uint*);
+	void  I_RpcSsDontSerializeContext();
+	int   I_RpcServerRegisterForwardFunction(int function (GUID*,
+	        RPC_VERSION*, GUID*, ubyte*, void**));
+	int   I_RpcConnectionInqSockBuffSize(uint*, uint*);
+	int   I_RpcConnectionSetSockBuffSize(uint, uint);
+	int   I_RpcBindingSetAsync(HANDLE, RPC_BLOCKING_FN);
+	int   I_RpcAsyncSendReceive(RPC_MESSAGE*, void*);
+	int   I_RpcGetThreadWindowHandle(void**);
+	int   I_RpcServerThreadPauseListening();
+	int   I_RpcServerThreadContinueListening();
+	int   I_RpcServerUnregisterEndpointA(ubyte*, ubyte*);
+	int   I_RpcServerUnregisterEndpointW(ushort*, ushort*);
+}
+
+version(Unicode) {
+	alias I_RpcServerUnregisterEndpointW I_RpcServerUnregisterEndpoint;
+} else {
+	alias I_RpcServerUnregisterEndpointA I_RpcServerUnregisterEndpoint;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/rpcndr.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,573 @@
+/***********************************************************************\
+*                               rpcndr.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.rpcndr;
+pragma(lib, "rpcrt4.lib");
+
+/* Translation notes:
+ RPC_CLIENT_ALLOC*, RPC_CLIENT_FREE* were replaced with PRPC_CLIENT_ALLOC, PRPC_CLIENT_FREE
+*/
+
+// TODO: Bitfields in MIDL_STUB_MESSAGE.
+//       Macros need to be converted.
+const __RPCNDR_H_VERSION__= 450;
+
+import win32.rpcnsip;
+private import win32.rpc, win32.rpcdce, win32.unknwn, win32.windef;
+private import win32.objidl; // for IRpcChannelBuffer, IRpcStubBuffer
+private import win32.basetyps;
+
+extern (Windows):
+
+const uint NDR_CHAR_REP_MASK      = 0xF,
+	NDR_INT_REP_MASK              = 0xF0,
+	NDR_FLOAT_REP_MASK            = 0xFF00,
+	NDR_LITTLE_ENDIAN             = 0x10,
+	NDR_BIG_ENDIAN                = 0,
+	NDR_IEEE_FLOAT                = 0,
+	NDR_VAX_FLOAT                 = 0x100,
+	NDR_ASCII_CHAR                = 0,
+	NDR_EBCDIC_CHAR               = 1,
+	NDR_LOCAL_DATA_REPRESENTATION = 0x10,
+	NDR_LOCAL_ENDIAN              = NDR_LITTLE_ENDIAN;
+
+alias MIDL_user_allocate midl_user_allocate;
+alias MIDL_user_free midl_user_free;
+
+alias long hyper;
+alias ulong MIDL_uhyper;
+alias char small;
+
+const cbNDRContext=20;
+//MACRO #define NDRSContextValue(hContext) (&(hContext)->userContext)
+//MACRO #define byte_from_ndr(source, target) { *(target) = *(*(char**)&(source)->Buffer)++; }
+
+//MACRO #define byte_array_from_ndr(Source, LowerIndex, UpperIndex, Target) { NDRcopy ((((char *)(Target))+(LowerIndex)), (Source)->Buffer, (unsigned int)((UpperIndex)-(LowerIndex))); *(unsigned long *)&(Source)->Buffer += ((UpperIndex)-(LowerIndex)); }
+
+//MACRO #define boolean_from_ndr(source, target) { *(target) = *(*(char**)&(source)->Buffer)++; }
+
+//MACRO #define boolean_array_from_ndr(Source, LowerIndex, UpperIndex, Target) { NDRcopy ((((char *)(Target))+(LowerIndex)), (Source)->Buffer, (unsigned int)((UpperIndex)-(LowerIndex))); *(unsigned long *)&(Source)->Buffer += ((UpperIndex)-(LowerIndex)); }
+
+//MACRO #define small_from_ndr(source, target) { *(target) = *(*(char**)&(source)->Buffer)++; }
+
+//MACRO #define small_from_ndr_temp(source, target, format) { *(target) = *(*(char**)(source))++; }
+
+//MACRO #define small_array_from_ndr(Source, LowerIndex, UpperIndex, Target) { NDRcopy ((((char *)(Target))+(LowerIndex)), (Source)->Buffer, (unsigned int)((UpperIndex)-(LowerIndex))); *(unsigned long *)&(Source)->Buffer += ((UpperIndex)-(LowerIndex)); }
+
+//MACRO #define MIDL_ascii_strlen(string) strlen(string)
+
+//MACRO #define MIDL_ascii_strcpy(target,source) strcpy(target,source)
+
+//MACRO #define MIDL_memset(s,c,n) memset(s,c,n)
+
+//MACRO #define _midl_ma1( p, cast ) *(*( cast **)&p)++
+//MACRO #define _midl_ma2( p, cast ) *(*( cast **)&p)++
+//MACRO #define _midl_ma4( p, cast ) *(*( cast **)&p)++
+//MACRO #define _midl_ma8( p, cast ) *(*( cast **)&p)++
+//MACRO #define _midl_unma1( p, cast ) *(( cast *)p)++
+//MACRO #define _midl_unma2( p, cast ) *(( cast *)p)++
+//MACRO #define _midl_unma3( p, cast ) *(( cast *)p)++
+//MACRO #define _midl_unma4( p, cast ) *(( cast *)p)++
+//MACRO #define _midl_fa2( p ) (p = (RPC_BUFPTR )((unsigned long)(p+1) & 0xfffffffe))
+//MACRO #define _midl_fa4( p ) (p = (RPC_BUFPTR )((unsigned long)(p+3) & 0xfffffffc))
+//MACRO #define _midl_fa8( p ) (p = (RPC_BUFPTR )((unsigned long)(p+7) & 0xfffffff8))
+//MACRO #define _midl_addp( p, n ) (p += n)
+//MACRO #define _midl_marsh_lhs( p, cast ) *(*( cast **)&p)++
+//MACRO #define _midl_marsh_up( mp, p ) *(*(unsigned long **)&mp)++ = (unsigned long)p
+//MACRO #define _midl_advmp( mp ) *(*(unsigned long **)&mp)++
+//MACRO #define _midl_unmarsh_up( p ) (*(*(unsigned long **)&p)++)
+
+//MACRO #define NdrMarshConfStringHdr( p, s, l ) (_midl_ma4( p, unsigned long) = s, _midl_ma4( p, unsigned long) = 0, _midl_ma4( p, unsigned long) = l)
+
+//MACRO #define NdrUnMarshConfStringHdr(p, s, l) ((s=_midl_unma4(p,unsigned long), (_midl_addp(p,4)), (l=_midl_unma4(p,unsigned long))
+
+//MACRO #define NdrMarshCCtxtHdl(pc,p) (NDRCContextMarshall( (NDR_CCONTEXT)pc, p ),p+20)
+//MACRO #define NdrUnMarshCCtxtHdl(pc,p,h,drep) (NDRCContextUnmarshall((NDR_CONTEXT)pc,h,p,drep), p+20)
+//MACRO #define NdrUnMarshSCtxtHdl(pc, p,drep) (pc = NdrSContextUnMarshall(p,drep ))
+//MACRO #define NdrMarshSCtxtHdl(pc,p,rd) (NdrSContextMarshall((NDR_SCONTEXT)pc,p, (NDR_RUNDOWN)rd)
+
+//MACRO #define NdrFieldOffset(s,f) (long)(& (((s *)0)->f))
+//MACRO #define NdrFieldPad(s,f,p,t) (NdrFieldOffset(s,f) - NdrFieldOffset(s,p) - sizeof(t))
+//MACRO #define NdrFcShort(s) (unsigned char)(s & 0xff), (unsigned char)(s >> 8)
+//MACRO #define NdrFcLong(s) (unsigned char)(s & 0xff), (unsigned char)((s & 0x0000ff00) >> 8), (unsigned char)((s & 0x00ff0000) >> 16), (unsigned char)(s >> 24)
+
+alias void * NDR_CCONTEXT;
+struct tagNDR_SCONTEXT {
+	void *pad[2];
+	void *userContext;
+}
+alias tagNDR_SCONTEXT * NDR_SCONTEXT;
+
+struct SCONTEXT_QUEUE {
+	uint NumberOfObjects;
+	NDR_SCONTEXT *ArrayOfObjects;
+}
+alias SCONTEXT_QUEUE * PSCONTEXT_QUEUE;
+
+struct _MIDL_STUB_MESSAGE;
+struct _MIDL_STUB_DESC;
+struct _FULL_PTR_XLAT_TABLES;
+
+alias ubyte *RPC_BUFPTR;
+alias uint RPC_LENGTH;
+
+alias  ubyte *PFORMAT_STRING;
+
+struct ARRAY_INFO {
+	int Dimension;
+	uint *BufferConformanceMark;
+	uint *BufferVarianceMark;
+	uint *MaxCountArray;
+	uint *OffsetArray;
+	uint *ActualCountArray;
+}
+alias ARRAY_INFO * PARRAY_INFO;
+
+RPC_BINDING_HANDLE  NDRCContextBinding(NDR_CCONTEXT);
+void  NDRCContextMarshall(NDR_CCONTEXT,void*);
+void  NDRCContextUnmarshall(NDR_CCONTEXT*,RPC_BINDING_HANDLE,void*,uint);
+void  NDRSContextMarshall(NDR_SCONTEXT,void*,NDR_RUNDOWN);
+NDR_SCONTEXT  NDRSContextUnmarshall(void*pBuff,uint);
+void  RpcSsDestroyClientContext(void**);
+void  NDRcopy(void*,void*,uint);
+uint  MIDL_wchar_strlen(wchar *);
+void  MIDL_wchar_strcpy(void*,wchar *);
+void  char_from_ndr(PRPC_MESSAGE,ubyte*);
+void  char_array_from_ndr(PRPC_MESSAGE,uint,uint,ubyte*);
+void  short_from_ndr(PRPC_MESSAGE,ushort*);
+void  short_array_from_ndr(PRPC_MESSAGE,uint,uint,ushort*);
+void  short_from_ndr_temp(ubyte**,ushort*,uint);
+void  int_from_ndr(PRPC_MESSAGE,uint*);
+void  int_array_from_ndr(PRPC_MESSAGE,uint,uint,uint*);
+void  int_from_ndr_temp(ubyte**,uint*,uint);
+void  enum_from_ndr(PRPC_MESSAGE,uint*);
+void  float_from_ndr(PRPC_MESSAGE,void*);
+void  float_array_from_ndr(PRPC_MESSAGE,uint,uint,void*);
+void  double_from_ndr(PRPC_MESSAGE,void*);
+void  double_array_from_ndr(PRPC_MESSAGE,uint,uint,void*);
+void  hyper_from_ndr(PRPC_MESSAGE,hyper*);
+void  hyper_array_from_ndr(PRPC_MESSAGE,uint,uint,hyper*);
+void  hyper_from_ndr_temp(ubyte**,hyper*,uint);
+void  data_from_ndr(PRPC_MESSAGE,void*,char*,ubyte);
+void  data_into_ndr(void*,PRPC_MESSAGE,char*,ubyte);
+void  tree_into_ndr(void*,PRPC_MESSAGE,char*,ubyte);
+void  data_size_ndr(void*,PRPC_MESSAGE,char*,ubyte);
+void  tree_size_ndr(void*,PRPC_MESSAGE,char*,ubyte);
+void  tree_peek_ndr(PRPC_MESSAGE,ubyte**,char*,ubyte);
+void * midl_allocate(int);
+
+align(4):
+struct MIDL_STUB_MESSAGE {
+	PRPC_MESSAGE RpcMsg;
+	ubyte *Buffer;
+	ubyte *BufferStart;
+	ubyte *BufferEnd;
+	ubyte *BufferMark;
+	uint BufferLength;
+	uint MemorySize;
+	ubyte *Memory;
+	int IsClient;
+	int ReuseBuffer;
+	ubyte *AllocAllNodesMemory;
+	ubyte *AllocAllNodesMemoryEnd;
+	int IgnoreEmbeddedPointers;
+	ubyte *PointerBufferMark;
+	ubyte fBufferValid;
+	ubyte Unused;
+	uint MaxCount;
+	uint Offset;
+	uint ActualCount;
+	void* function (uint) pfnAllocate;
+	void function (void*) pfnFree;
+	ubyte * StackTop;
+	ubyte * pPresentedType;
+	ubyte * pTransmitType;
+	handle_t SavedHandle;
+	_MIDL_STUB_DESC *StubDesc;
+	_FULL_PTR_XLAT_TABLES *FullPtrXlatTables;
+	uint FullPtrRefId;
+	int fCheckBounds;
+	// FIXME:
+	byte bit_fields_for_D; // FIXME: Bitfields
+//	int fInDontFree :1;
+//	int fDontCallFreeInst :1;
+//	int fInOnlyParam :1;
+//	int fHasReturn :1;
+	uint dwDestContext;
+	void* pvDestContext;
+	NDR_SCONTEXT * SavedContextHandles;
+	int ParamNumber;
+	IRpcChannelBuffer * pRpcChannelBuffer;
+	PARRAY_INFO pArrayInfo;
+	uint * SizePtrCountArray;
+	uint * SizePtrOffsetArray;
+	uint * SizePtrLengthArray;
+	void* pArgQueue;
+	uint dwStubPhase;
+	uint w2kReserved[5];
+}
+alias MIDL_STUB_MESSAGE * PMIDL_STUB_MESSAGE;
+
+extern (Windows) {
+	alias void* function (void*) GENERIC_BINDING_ROUTINE;
+	alias void function (void*,ubyte*) GENERIC_UNBIND_ROUTINE;
+	alias uint function (uint *,uint,void *) USER_MARSHAL_SIZING_ROUTINE;
+	alias ubyte * function (uint *,ubyte *,void *) USER_MARSHAL_MARSHALLING_ROUTINE;
+	alias ubyte * function (uint *,ubyte *,void *) USER_MARSHAL_UNMARSHALLING_ROUTINE;
+	alias void function (uint *,void *) USER_MARSHAL_FREEING_ROUTINE;
+	alias void function () NDR_NOTIFY_ROUTINE;
+}
+
+align:
+struct GENERIC_BINDING_ROUTINE_PAIR {
+	GENERIC_BINDING_ROUTINE pfnBind;
+	GENERIC_UNBIND_ROUTINE pfnUnbind;
+}
+alias GENERIC_BINDING_ROUTINE_PAIR * PGENERIC_BINDING_ROUTINE_PAIR;
+
+struct GENERIC_BINDING_INFO {
+	void *pObj;
+	uint Size;
+	GENERIC_BINDING_ROUTINE pfnBind;
+	GENERIC_UNBIND_ROUTINE pfnUnbind;
+}
+alias GENERIC_BINDING_INFO * PGENERIC_BINDING_INFO;
+
+
+struct XMIT_ROUTINE_QUINTUPLE {
+	XMIT_HELPER_ROUTINE pfnTranslateToXmit;
+	XMIT_HELPER_ROUTINE pfnTranslateFromXmit;
+	XMIT_HELPER_ROUTINE pfnFreeXmit;
+	XMIT_HELPER_ROUTINE pfnFreeInst;
+}
+alias XMIT_ROUTINE_QUINTUPLE * PXMIT_ROUTINE_QUINTUPLE;
+
+struct MALLOC_FREE_STRUCT {
+	void* function (uint) pfnAllocate;
+	void function (void*) pfnFree;
+}
+
+struct COMM_FAULT_OFFSETS {
+	short CommOffset;
+	short FaultOffset;
+}
+
+struct USER_MARSHAL_ROUTINE_QUADRUPLE {
+	USER_MARSHAL_SIZING_ROUTINE pfnBufferSize;
+	USER_MARSHAL_MARSHALLING_ROUTINE pfnMarshall;
+	USER_MARSHAL_UNMARSHALLING_ROUTINE pfnUnmarshall;
+	USER_MARSHAL_FREEING_ROUTINE pfnFree;
+}
+
+enum IDL_CS_CONVERT {
+	IDL_CS_NO_CONVERT,
+	IDL_CS_IN_PLACE_CONVERT,
+	IDL_CS_NEW_BUFFER_CONVERT
+}
+
+struct NDR_CS_SIZE_CONVERT_ROUTINES {
+	CS_TYPE_NET_SIZE_ROUTINE pfnNetSize;
+	CS_TYPE_TO_NETCS_ROUTINE pfnToNetCs;
+	CS_TYPE_LOCAL_SIZE_ROUTINE pfnLocalSize;
+	CS_TYPE_FROM_NETCS_ROUTINE pfnFromNetCs;
+}
+
+struct NDR_CS_ROUTINES {
+	NDR_CS_SIZE_CONVERT_ROUTINES *pSizeConvertRoutines;
+	CS_TAG_GETTING_ROUTINE *pTagGettingRoutines;
+}
+
+struct MIDL_STUB_DESC {
+	void* RpcInterfaceInformation;
+	void* function(uint) pfnAllocate;
+	void function (void*) pfnFree;
+	union _IMPLICIT_HANDLE_INFO {
+		handle_t *pAutoHandle;
+		handle_t *pPrimitiveHandle;
+		PGENERIC_BINDING_INFO pGenericBindingInfo;
+	}
+	_IMPLICIT_HANDLE_INFO IMPLICIT_HANDLE_INFO;	
+	NDR_RUNDOWN *apfnNdrRundownRoutines;
+	GENERIC_BINDING_ROUTINE_PAIR *aGenericBindingRoutinePairs;
+	EXPR_EVAL *apfnExprEval;
+	XMIT_ROUTINE_QUINTUPLE *aXmitQuintuple;
+	ubyte *pFormatTypes;
+	int fCheckBounds;
+	uint Version;
+	MALLOC_FREE_STRUCT *pMallocFreeStruct;
+	int MIDLVersion;
+	COMM_FAULT_OFFSETS *CommFaultOffsets;
+	USER_MARSHAL_ROUTINE_QUADRUPLE *aUserMarshalQuadruple;
+	NDR_NOTIFY_ROUTINE *NotifyRoutineTable;
+	ULONG_PTR mFlags;
+	NDR_CS_ROUTINES *CsRoutineTables;
+	void *Reserved4;
+	ULONG_PTR Reserved5;
+}
+alias  MIDL_STUB_DESC * PMIDL_STUB_DESC;
+
+alias void * PMIDL_XMIT_TYPE;
+
+struct MIDL_FORMAT_STRING {
+	short Pad;
+	ubyte Format[1];
+}
+
+struct MIDL_SERVER_INFO {
+	PMIDL_STUB_DESC pStubDesc;
+	SERVER_ROUTINE *DispatchTable;
+	PFORMAT_STRING ProcString;
+	ushort *FmtStringOffset;
+	STUB_THUNK *ThunkTable;
+}
+alias MIDL_SERVER_INFO * PMIDL_SERVER_INFO;
+
+struct MIDL_STUBLESS_PROXY_INFO {
+	PMIDL_STUB_DESC pStubDesc;
+	PFORMAT_STRING ProcFormatString;
+	ushort *FormatStringOffset;
+}
+alias MIDL_STUBLESS_PROXY_INFO *PMIDL_STUBLESS_PROXY_INFO;
+
+union CLIENT_CALL_RETURN {
+	void *Pointer;
+	int Simple;
+}
+
+enum XLAT_SIDE {
+	XLAT_SERVER = 1,
+	XLAT_CLIENT
+}
+struct FULL_PTR_TO_REFID_ELEMENT {
+	FULL_PTR_TO_REFID_ELEMENT * Next;
+	void* Pointer;
+	uint RefId;
+	ubyte State;
+}
+alias FULL_PTR_TO_REFID_ELEMENT * PFULL_PTR_TO_REFID_ELEMENT;
+
+struct FULL_PTR_XLAT_TABLES {
+	struct RefIdToPointer {
+		void **XlatTable;
+		ubyte *StateTable;
+		uint NumberOfEntries;
+	}
+	struct PointerToRefId {
+		PFULL_PTR_TO_REFID_ELEMENT *XlatTable;
+		uint NumberOfBuckets;
+		uint HashMask;
+	}
+	uint NextRefId;
+	XLAT_SIDE XlatSide;
+}
+alias FULL_PTR_XLAT_TABLES * PFULL_PTR_XLAT_TABLES;
+
+
+enum STUB_PHASE {
+	STUB_UNMARSHAL,
+	STUB_CALL_SERVER,
+	STUB_MARSHAL,
+	STUB_CALL_SERVER_NO_HRESULT
+}
+
+enum PROXY_PHASE {
+	PROXY_CALCSIZE,
+	PROXY_GETBUFFER,
+	PROXY_MARSHAL,
+	PROXY_SENDRECEIVE,
+	PROXY_UNMARSHAL
+}
+
+typedef void * RPC_SS_THREAD_HANDLE;
+
+extern (Windows) {
+alias void function (void*) NDR_RUNDOWN;
+alias void function (_MIDL_STUB_MESSAGE*) EXPR_EVAL;
+alias void function(PMIDL_STUB_MESSAGE) XMIT_HELPER_ROUTINE;
+alias void function (RPC_BINDING_HANDLE,uint,uint,IDL_CS_CONVERT*,uint*,error_status_t*) CS_TYPE_NET_SIZE_ROUTINE;
+alias void function (RPC_BINDING_HANDLE,uint,uint,IDL_CS_CONVERT*,uint*,error_status_t*) CS_TYPE_LOCAL_SIZE_ROUTINE;
+alias void function (RPC_BINDING_HANDLE,uint,void*,uint,byte*,uint*,error_status_t*) CS_TYPE_TO_NETCS_ROUTINE;
+alias void function (RPC_BINDING_HANDLE,uint,byte*,uint,uint,void*,uint*,error_status_t*) CS_TYPE_FROM_NETCS_ROUTINE;
+alias void function (RPC_BINDING_HANDLE,int,uint*,uint*,uint*,error_status_t*) CS_TAG_GETTING_ROUTINE;
+
+//alias void* RPC_CLIENT_ALLOC(uint);
+//alias void RPC_CLIENT_FREE(void*);
+alias void* function(uint) PRPC_CLIENT_ALLOC;
+alias void function(void*) PRPC_CLIENT_FREE;
+
+	alias void function (PMIDL_STUB_MESSAGE) STUB_THUNK;
+	alias int function() SERVER_ROUTINE;
+}
+
+void  NdrSimpleTypeMarshall(PMIDL_STUB_MESSAGE,ubyte*,ubyte);
+ubyte * NdrPointerMarshall(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING pFormat);
+ubyte * NdrSimpleStructMarshall(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+ubyte * NdrConformantStructMarshall(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+ubyte * NdrConformantVaryingStructMarshall(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+ubyte * NdrHardStructMarshall(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+ubyte * NdrComplexStructMarshall(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+ubyte * NdrFixedArrayMarshall(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+ubyte * NdrConformantArrayMarshall(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+ubyte * NdrConformantVaryingArrayMarshall(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+ubyte * NdrVaryingArrayMarshall(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+ubyte * NdrComplexArrayMarshall(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+ubyte * NdrNonConformantStringMarshall(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+ubyte * NdrConformantStringMarshall(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+ubyte * NdrEncapsulatedUnionMarshall(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+ubyte * NdrNonEncapsulatedUnionMarshall(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+ubyte * NdrByteCountPointerMarshall(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+ubyte * NdrXmitOrRepAsMarshall(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+ubyte * NdrInterfacePointerMarshall(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrClientContextMarshall(PMIDL_STUB_MESSAGE,NDR_CCONTEXT,int);
+void  NdrServerContextMarshall(PMIDL_STUB_MESSAGE,NDR_SCONTEXT,NDR_RUNDOWN);
+void  NdrSimpleTypeUnmarshall(PMIDL_STUB_MESSAGE,ubyte*,ubyte);
+ubyte * NdrPointerUnmarshall(PMIDL_STUB_MESSAGE,ubyte**,PFORMAT_STRING,ubyte);
+ubyte * NdrSimpleStructUnmarshall(PMIDL_STUB_MESSAGE,ubyte**,PFORMAT_STRING,ubyte);
+ubyte * NdrConformantStructUnmarshall(PMIDL_STUB_MESSAGE,ubyte**,PFORMAT_STRING,ubyte);
+ubyte * NdrConformantVaryingStructUnmarshall(PMIDL_STUB_MESSAGE,ubyte**,PFORMAT_STRING,ubyte);
+ubyte * NdrHardStructUnmarshall(PMIDL_STUB_MESSAGE,ubyte**,PFORMAT_STRING,ubyte);
+ubyte * NdrComplexStructUnmarshall(PMIDL_STUB_MESSAGE,ubyte**,PFORMAT_STRING,ubyte);
+ubyte * NdrFixedArrayUnmarshall(PMIDL_STUB_MESSAGE,ubyte**,PFORMAT_STRING,ubyte);
+ubyte * NdrConformantArrayUnmarshall(PMIDL_STUB_MESSAGE,ubyte**,PFORMAT_STRING,ubyte);
+ubyte * NdrConformantVaryingArrayUnmarshall(PMIDL_STUB_MESSAGE,ubyte**,PFORMAT_STRING,ubyte);
+ubyte * NdrVaryingArrayUnmarshall(PMIDL_STUB_MESSAGE,ubyte**,PFORMAT_STRING,ubyte);
+ubyte * NdrComplexArrayUnmarshall(PMIDL_STUB_MESSAGE,ubyte**,PFORMAT_STRING,ubyte);
+ubyte * NdrNonConformantStringUnmarshall(PMIDL_STUB_MESSAGE,ubyte**,PFORMAT_STRING,ubyte);
+ubyte * NdrConformantStringUnmarshall(PMIDL_STUB_MESSAGE,ubyte**,PFORMAT_STRING,ubyte);
+ubyte * NdrEncapsulatedUnionUnmarshall(PMIDL_STUB_MESSAGE,ubyte**,PFORMAT_STRING,ubyte);
+ubyte * NdrNonEncapsulatedUnionUnmarshall(PMIDL_STUB_MESSAGE,ubyte**,PFORMAT_STRING,ubyte);
+ubyte * NdrByteCountPointerUnmarshall(PMIDL_STUB_MESSAGE,ubyte**,PFORMAT_STRING,ubyte);
+ubyte * NdrXmitOrRepAsUnmarshall(PMIDL_STUB_MESSAGE,ubyte**,PFORMAT_STRING,ubyte);
+ubyte * NdrInterfacePointerUnmarshall(PMIDL_STUB_MESSAGE,ubyte**,PFORMAT_STRING,ubyte);
+void  NdrClientContextUnmarshall(PMIDL_STUB_MESSAGE,NDR_CCONTEXT*,RPC_BINDING_HANDLE);
+NDR_SCONTEXT  NdrServerContextUnmarshall(PMIDL_STUB_MESSAGE);
+void  NdrPointerBufferSize(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrSimpleStructBufferSize(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrConformantStructBufferSize(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrConformantVaryingStructBufferSize(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrHardStructBufferSize(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrComplexStructBufferSize(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrFixedArrayBufferSize(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrConformantArrayBufferSize(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrConformantVaryingArrayBufferSize(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrVaryingArrayBufferSize(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrComplexArrayBufferSize(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrConformantStringBufferSize(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrNonConformantStringBufferSize(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrEncapsulatedUnionBufferSize(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrNonEncapsulatedUnionBufferSize(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrByteCountPointerBufferSize(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrXmitOrRepAsBufferSize(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrInterfacePointerBufferSize(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrContextHandleSize(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+uint  NdrPointerMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+uint  NdrSimpleStructMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+uint  NdrConformantStructMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+uint  NdrConformantVaryingStructMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+uint  NdrHardStructMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+uint  NdrComplexStructMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+uint  NdrFixedArrayMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+uint  NdrConformantArrayMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+uint  NdrConformantVaryingArrayMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+uint  NdrVaryingArrayMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+uint  NdrComplexArrayMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+uint  NdrConformantStringMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+uint  NdrNonConformantStringMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+uint  NdrEncapsulatedUnionMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+uint  NdrNonEncapsulatedUnionMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+uint  NdrXmitOrRepAsMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+uint  NdrInterfacePointerMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+void  NdrPointerFree(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrSimpleStructFree(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrConformantStructFree(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrConformantVaryingStructFree(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrHardStructFree(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrComplexStructFree(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrFixedArrayFree(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrConformantArrayFree(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrConformantVaryingArrayFree(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrVaryingArrayFree(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrComplexArrayFree(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrEncapsulatedUnionFree(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrNonEncapsulatedUnionFree(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrByteCountPointerFree(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrXmitOrRepAsFree(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrInterfacePointerFree(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+void  NdrConvert(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+void  NdrClientInitializeNew(PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,uint);
+ubyte * NdrServerInitializeNew(PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC);
+void  NdrClientInitialize(PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,uint);
+ubyte * NdrServerInitialize(PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC);
+ubyte * NdrServerInitializeUnmarshall(PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,PRPC_MESSAGE);
+void  NdrServerInitializeMarshall(PRPC_MESSAGE,PMIDL_STUB_MESSAGE);
+ubyte * NdrGetBuffer(PMIDL_STUB_MESSAGE,uint,RPC_BINDING_HANDLE);
+ubyte * NdrNsGetBuffer(PMIDL_STUB_MESSAGE,uint,RPC_BINDING_HANDLE);
+ubyte * NdrSendReceive(PMIDL_STUB_MESSAGE,ubyte*);
+ubyte * NdrNsSendReceive(PMIDL_STUB_MESSAGE,ubyte*,RPC_BINDING_HANDLE*);
+void  NdrFreeBuffer(PMIDL_STUB_MESSAGE);
+
+CLIENT_CALL_RETURN  NdrClientCall(PMIDL_STUB_DESC,PFORMAT_STRING,...);
+
+int  NdrStubCall(IRpcStubBuffer*, IRpcChannelBuffer*,PRPC_MESSAGE,uint*);
+void  NdrServerCall(PRPC_MESSAGE);
+int  NdrServerUnmarshall(IRpcChannelBuffer*, PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,PFORMAT_STRING,void*);
+void  NdrServerMarshall(IRpcStubBuffer*, IRpcChannelBuffer*,PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+RPC_STATUS  NdrMapCommAndFaultStatus(PMIDL_STUB_MESSAGE,uint*,uint*,RPC_STATUS);
+int  NdrSH_UPDecision(PMIDL_STUB_MESSAGE,ubyte**,RPC_BUFPTR);
+int  NdrSH_TLUPDecision(PMIDL_STUB_MESSAGE,ubyte**);
+int  NdrSH_TLUPDecisionBuffer(PMIDL_STUB_MESSAGE,ubyte**);
+int  NdrSH_IfAlloc(PMIDL_STUB_MESSAGE,ubyte**,uint);
+int  NdrSH_IfAllocRef(PMIDL_STUB_MESSAGE,ubyte**,uint);
+int  NdrSH_IfAllocSet(PMIDL_STUB_MESSAGE,ubyte**,uint);
+RPC_BUFPTR  NdrSH_IfCopy(PMIDL_STUB_MESSAGE,ubyte**,uint);
+RPC_BUFPTR  NdrSH_IfAllocCopy(PMIDL_STUB_MESSAGE,ubyte**,uint);
+uint  NdrSH_Copy(ubyte*,ubyte*,uint);
+void  NdrSH_IfFree(PMIDL_STUB_MESSAGE,ubyte*);
+RPC_BUFPTR  NdrSH_StringMarshall(PMIDL_STUB_MESSAGE,ubyte*,uint,int);
+RPC_BUFPTR  NdrSH_StringUnMarshall(PMIDL_STUB_MESSAGE,ubyte**,int);
+void* RpcSsAllocate(uint);
+void  RpcSsDisableAllocate();
+void  RpcSsEnableAllocate();
+void  RpcSsFree(void*);
+RPC_SS_THREAD_HANDLE  RpcSsGetThreadHandle();
+void  RpcSsSetClientAllocFree(PRPC_CLIENT_ALLOC,PRPC_CLIENT_FREE);
+void  RpcSsSetThreadHandle(RPC_SS_THREAD_HANDLE);
+void  RpcSsSwapClientAllocFree(PRPC_CLIENT_ALLOC,PRPC_CLIENT_FREE,PRPC_CLIENT_ALLOC*,PRPC_CLIENT_FREE*);
+void* RpcSmAllocate(uint,RPC_STATUS*);
+RPC_STATUS  RpcSmClientFree(void*);
+RPC_STATUS  RpcSmDestroyClientContext(void**);
+RPC_STATUS  RpcSmDisableAllocate();
+RPC_STATUS  RpcSmEnableAllocate();
+RPC_STATUS  RpcSmFree(void*);
+RPC_SS_THREAD_HANDLE  RpcSmGetThreadHandle(RPC_STATUS*);
+RPC_STATUS  RpcSmSetClientAllocFree(PRPC_CLIENT_ALLOC,PRPC_CLIENT_FREE);
+RPC_STATUS  RpcSmSetThreadHandle(RPC_SS_THREAD_HANDLE);
+RPC_STATUS  RpcSmSwapClientAllocFree(PRPC_CLIENT_ALLOC,PRPC_CLIENT_FREE,PRPC_CLIENT_ALLOC*,PRPC_CLIENT_FREE*);
+void  NdrRpcSsEnableAllocate(PMIDL_STUB_MESSAGE);
+void  NdrRpcSsDisableAllocate(PMIDL_STUB_MESSAGE);
+void  NdrRpcSmSetClientToOsf(PMIDL_STUB_MESSAGE);
+void* NdrRpcSmClientAllocate(uint);
+void  NdrRpcSmClientFree(void*);
+void* NdrRpcSsDefaultAllocate(uint);
+void  NdrRpcSsDefaultFree(void*);
+PFULL_PTR_XLAT_TABLES  NdrFullPointerXlatInit(uint,XLAT_SIDE);
+void  NdrFullPointerXlatFree(PFULL_PTR_XLAT_TABLES);
+int  NdrFullPointerQueryPointer(PFULL_PTR_XLAT_TABLES,void*,ubyte,uint*);
+int  NdrFullPointerQueryRefId(PFULL_PTR_XLAT_TABLES,uint,ubyte,void**);
+void  NdrFullPointerInsertRefId(PFULL_PTR_XLAT_TABLES,uint,void*);
+int  NdrFullPointerFree(PFULL_PTR_XLAT_TABLES,void*);
+void* NdrAllocate(PMIDL_STUB_MESSAGE,uint);
+void  NdrClearOutParameters(PMIDL_STUB_MESSAGE,PFORMAT_STRING,void*);
+void* NdrOleAllocate(uint);
+void  NdrOleFree(void*);
+ubyte* NdrUserMarshalMarshall(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+ubyte* NdrUserMarshalUnmarshall(PMIDL_STUB_MESSAGE,ubyte**,PFORMAT_STRING,ubyte);
+void  NdrUserMarshalBufferSize(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
+uint  NdrUserMarshalMemorySize(PMIDL_STUB_MESSAGE,PFORMAT_STRING);
+void  NdrUserMarshalFree(PMIDL_STUB_MESSAGE,ubyte*,PFORMAT_STRING);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/rpcnsi.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,162 @@
+/***********************************************************************\
+*                                rpcnsi.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                     RPC Name Service (RpcNs APIs)                     *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.rpcnsi;
+pragma(lib, "rpcns4.lib");
+
+private import win32.basetyps, win32.rpcdcep, win32.rpcnsi, win32.rpcdce,
+  win32.w32api;
+private import win32.windef;  // for HANDLE
+
+alias HANDLE RPC_NS_HANDLE;
+
+const RPC_C_NS_SYNTAX_DEFAULT=0;
+const RPC_C_NS_SYNTAX_DCE=3;
+const RPC_C_PROFILE_DEFAULT_ELT=0;
+const RPC_C_PROFILE_ALL_ELT=1;
+const RPC_C_PROFILE_MATCH_BY_IF=2;
+const RPC_C_PROFILE_MATCH_BY_MBR=3;
+const RPC_C_PROFILE_MATCH_BY_BOTH=4;
+const RPC_C_NS_DEFAULT_EXP_AGE=-1;
+
+extern (Windows) {
+	RPC_STATUS RpcNsBindingExportA(uint, ubyte*, RPC_IF_HANDLE,
+	  RPC_BINDING_VECTOR*, UUID_VECTOR*);
+	RPC_STATUS RpcNsBindingUnexportA(uint, ubyte*, RPC_IF_HANDLE,
+	  UUID_VECTOR*);
+	RPC_STATUS RpcNsBindingLookupBeginA(uint, ubyte*, RPC_IF_HANDLE, UUID*,
+	  uint, RPC_NS_HANDLE*);
+	RPC_STATUS RpcNsBindingLookupNext(RPC_NS_HANDLE, RPC_BINDING_VECTOR**);
+	RPC_STATUS RpcNsBindingLookupDone(RPC_NS_HANDLE*);
+	RPC_STATUS RpcNsGroupDeleteA(uint, ubyte*);
+	RPC_STATUS RpcNsGroupMbrAddA(uint, ubyte*, uint, ubyte*);
+	RPC_STATUS RpcNsGroupMbrRemoveA(uint, ubyte*, uint, ubyte*);
+	RPC_STATUS RpcNsGroupMbrInqBeginA(uint, ubyte*, uint, RPC_NS_HANDLE*);
+	RPC_STATUS RpcNsGroupMbrInqNextA(RPC_NS_HANDLE, ubyte**);
+	RPC_STATUS RpcNsGroupMbrInqDone(RPC_NS_HANDLE*);
+	RPC_STATUS RpcNsProfileDeleteA(uint, ubyte*);
+	RPC_STATUS RpcNsProfileEltAddA(uint, ubyte*, RPC_IF_ID*, uint, ubyte*,
+	  uint, ubyte*);
+	RPC_STATUS RpcNsProfileEltRemoveA(uint, ubyte*, RPC_IF_ID*, uint, ubyte*);
+	RPC_STATUS RpcNsProfileEltInqBeginA(uint, ubyte*, uint, RPC_IF_ID*, uint,
+	  uint, ubyte*, RPC_NS_HANDLE*);
+	RPC_STATUS RpcNsProfileEltInqNextA(RPC_NS_HANDLE, RPC_IF_ID*, ubyte**,
+	  uint*, ubyte**);
+	RPC_STATUS RpcNsProfileEltInqDone(RPC_NS_HANDLE*);
+	RPC_STATUS RpcNsEntryObjectInqNext(in RPC_NS_HANDLE, out UUID*);
+	RPC_STATUS RpcNsEntryObjectInqDone(inout RPC_NS_HANDLE*);
+	RPC_STATUS RpcNsEntryExpandNameA(uint, ubyte*, ubyte**);
+	RPC_STATUS RpcNsMgmtBindingUnexportA(uint, ubyte*, RPC_IF_ID*, uint,
+	  UUID_VECTOR*);
+	RPC_STATUS RpcNsMgmtEntryCreateA(uint, ubyte*);
+	RPC_STATUS RpcNsMgmtEntryDeleteA(uint, ubyte*);
+	RPC_STATUS RpcNsMgmtEntryInqIfIdsA(uint, ubyte*, RPC_IF_ID_VECTOR**);
+	RPC_STATUS RpcNsMgmtHandleSetExpAge(RPC_NS_HANDLE, uint);
+	RPC_STATUS RpcNsMgmtInqExpAge(uint*);
+	RPC_STATUS RpcNsMgmtSetExpAge(uint);
+	RPC_STATUS RpcNsBindingImportNext(RPC_NS_HANDLE, RPC_BINDING_HANDLE*);
+	RPC_STATUS RpcNsBindingImportDone(RPC_NS_HANDLE*);
+	RPC_STATUS RpcNsBindingSelect(RPC_BINDING_VECTOR*, RPC_BINDING_HANDLE*);
+}
+
+// For the cases where Win95, 98, ME have no _W versions, and we must alias to
+// _A even for version(Unicode).
+
+version (Unicode) {
+	static if (_WIN32_WINNT_ONLY) {
+		const bool _WIN32_USE_UNICODE = true;
+	} else {
+		const bool _WIN32_USE_UNICODE = false;
+	}
+} else {
+	const bool _WIN32_USE_UNICODE = false;
+}
+
+static if (!_WIN32_USE_UNICODE) {
+	RPC_STATUS RpcNsEntryObjectInqBeginA(uint, ubyte*, RPC_NS_HANDLE*);
+	RPC_STATUS RpcNsBindingImportBeginA(uint, ubyte*, RPC_IF_HANDLE, UUID*,
+	  RPC_NS_HANDLE*);
+}
+
+static if (_WIN32_WINNT_ONLY) {
+	RPC_STATUS RpcNsBindingExportW(uint, ushort*, RPC_IF_HANDLE,
+	  RPC_BINDING_VECTOR*, UUID_VECTOR*);
+	RPC_STATUS RpcNsBindingUnexportW(uint, ushort*, RPC_IF_HANDLE,
+	  UUID_VECTOR*);
+	RPC_STATUS RpcNsBindingLookupBeginW(uint, ushort*, RPC_IF_HANDLE, UUID*,
+	  uint, RPC_NS_HANDLE*);
+	RPC_STATUS RpcNsGroupDeleteW(uint, ushort*);
+	RPC_STATUS RpcNsGroupMbrAddW(uint, ushort*, uint, ushort*);
+	RPC_STATUS RpcNsGroupMbrRemoveW(uint, ushort*, uint, ushort*);
+	RPC_STATUS RpcNsGroupMbrInqBeginW(uint, ushort*, uint, RPC_NS_HANDLE*);
+	RPC_STATUS RpcNsGroupMbrInqNextW(RPC_NS_HANDLE, ushort**);
+	RPC_STATUS RpcNsProfileDeleteW(uint, ushort*);
+	RPC_STATUS RpcNsProfileEltAddW(uint, ushort*, RPC_IF_ID*, uint, ushort*,
+	  uint, ushort*);
+	RPC_STATUS RpcNsProfileEltRemoveW(uint, ushort*, RPC_IF_ID*, uint,
+	  ushort*);
+	RPC_STATUS RpcNsProfileEltInqBeginW(uint, ushort*, uint, RPC_IF_ID*,
+	  uint, uint, ushort*, RPC_NS_HANDLE*);
+	RPC_STATUS RpcNsProfileEltInqNextW(RPC_NS_HANDLE, RPC_IF_ID*, ushort**,
+	  uint*, ushort**);
+	RPC_STATUS RpcNsEntryObjectInqBeginW(uint, ushort*, RPC_NS_HANDLE*);
+	RPC_STATUS RpcNsEntryExpandNameW(uint, ushort*, ushort**);
+	RPC_STATUS RpcNsMgmtBindingUnexportW(uint, ushort*, RPC_IF_ID*, uint,
+	  UUID_VECTOR*);
+	RPC_STATUS RpcNsMgmtEntryCreateW(uint, ushort*);
+	RPC_STATUS RpcNsMgmtEntryDeleteW(uint, ushort*);
+	RPC_STATUS RpcNsMgmtEntryInqIfIdsW(uint, ushort , RPC_IF_ID_VECTOR**);
+	RPC_STATUS RpcNsBindingImportBeginW(uint, ushort*, RPC_IF_HANDLE, UUID*,
+	  RPC_NS_HANDLE*);
+} // _WIN32_WINNT_ONLY
+
+static if (_WIN32_USE_UNICODE) {
+	alias RpcNsBindingLookupBeginW RpcNsBindingLookupBegin;
+	alias RpcNsBindingImportBeginW RpcNsBindingImportBegin;
+	alias RpcNsBindingExportW RpcNsBindingExport;
+	alias RpcNsBindingUnexportW RpcNsBindingUnexport;
+	alias RpcNsGroupDeleteW RpcNsGroupDelete;
+	alias RpcNsGroupMbrAddW RpcNsGroupMbrAdd;
+	alias RpcNsGroupMbrRemoveW RpcNsGroupMbrRemove;
+	alias RpcNsGroupMbrInqBeginW RpcNsGroupMbrInqBegin;
+	alias RpcNsGroupMbrInqNextW RpcNsGroupMbrInqNext;
+	alias RpcNsEntryExpandNameW RpcNsEntryExpandName;
+	alias RpcNsEntryObjectInqBeginW RpcNsEntryObjectInqBegin;
+	alias RpcNsMgmtBindingUnexportW RpcNsMgmtBindingUnexport;
+	alias RpcNsMgmtEntryCreateW RpcNsMgmtEntryCreate;
+	alias RpcNsMgmtEntryDeleteW RpcNsMgmtEntryDelete;
+	alias RpcNsMgmtEntryInqIfIdsW RpcNsMgmtEntryInqIfIds;
+	alias RpcNsProfileDeleteW RpcNsProfileDelete;
+	alias RpcNsProfileEltAddW RpcNsProfileEltAdd;
+	alias RpcNsProfileEltRemoveW RpcNsProfileEltRemove;
+	alias RpcNsProfileEltInqBeginW RpcNsProfileEltInqBegin;
+	alias RpcNsProfileEltInqNextW RpcNsProfileEltInqNext;
+} else {
+	alias RpcNsBindingLookupBeginA RpcNsBindingLookupBegin;
+	alias RpcNsBindingImportBeginA RpcNsBindingImportBegin;
+	alias RpcNsBindingExportA RpcNsBindingExport;
+	alias RpcNsBindingUnexportA RpcNsBindingUnexport;
+	alias RpcNsGroupDeleteA RpcNsGroupDelete;
+	alias RpcNsGroupMbrAddA RpcNsGroupMbrAdd;
+	alias RpcNsGroupMbrRemoveA RpcNsGroupMbrRemove;
+	alias RpcNsGroupMbrInqBeginA RpcNsGroupMbrInqBegin;
+	alias RpcNsGroupMbrInqNextA RpcNsGroupMbrInqNext;
+	alias RpcNsEntryExpandNameA RpcNsEntryExpandName;
+	alias RpcNsEntryObjectInqBeginA RpcNsEntryObjectInqBegin;
+	alias RpcNsMgmtBindingUnexportA RpcNsMgmtBindingUnexport;
+	alias RpcNsMgmtEntryCreateA RpcNsMgmtEntryCreate;
+	alias RpcNsMgmtEntryDeleteA RpcNsMgmtEntryDelete;
+	alias RpcNsMgmtEntryInqIfIdsA RpcNsMgmtEntryInqIfIds;
+	alias RpcNsProfileDeleteA RpcNsProfileDelete;
+	alias RpcNsProfileEltAddA RpcNsProfileEltAdd;
+	alias RpcNsProfileEltRemoveA RpcNsProfileEltRemove;
+	alias RpcNsProfileEltInqBeginA RpcNsProfileEltInqBegin;
+	alias RpcNsProfileEltInqNextA RpcNsProfileEltInqNext;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/rpcnsip.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,29 @@
+/***********************************************************************\
+*                               rpcnsip.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.rpcnsip;
+
+private import win32.rpcdce, win32.rpcdcep, win32.rpcnsi;
+
+struct RPC_IMPORT_CONTEXT_P {
+	RPC_NS_HANDLE       LookupContext;
+	RPC_BINDING_HANDLE  ProposedHandle;
+	RPC_BINDING_VECTOR* Bindings;
+}
+alias RPC_IMPORT_CONTEXT_P* PRPC_IMPORT_CONTEXT_P;
+
+extern(Windows) {
+	RPC_STATUS I_RpcNsGetBuffer(PRPC_MESSAGE);
+	RPC_STATUS I_RpcNsSendReceive(PRPC_MESSAGE, RPC_BINDING_HANDLE*);
+	void I_RpcNsRaiseException(PRPC_MESSAGE, RPC_STATUS);
+	RPC_STATUS I_RpcReBindBuffer(PRPC_MESSAGE);
+	RPC_STATUS I_NsServerBindSearch();
+	RPC_STATUS I_NsClientBindSearch();
+	void I_NsClientBindDone();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/rpcnterr.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,31 @@
+/***********************************************************************\
+*                               rpcnterr.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.rpcnterr;
+
+import win32.winerror;
+
+enum : uint {
+	RPC_S_OK                     = ERROR_SUCCESS,
+	RPC_S_INVALID_ARG            = ERROR_INVALID_PARAMETER,
+	RPC_S_OUT_OF_MEMORY          = ERROR_OUTOFMEMORY,
+	RPC_S_OUT_OF_THREADS         = ERROR_MAX_THRDS_REACHED,
+	RPC_S_INVALID_LEVEL          = ERROR_INVALID_PARAMETER,
+	RPC_S_BUFFER_TOO_SMALL       = ERROR_INSUFFICIENT_BUFFER,
+	RPC_S_INVALID_SECURITY_DESC  = ERROR_INVALID_SECURITY_DESCR,
+	RPC_S_ACCESS_DENIED          = ERROR_ACCESS_DENIED,
+	RPC_S_SERVER_OUT_OF_MEMORY   = ERROR_NOT_ENOUGH_SERVER_MEMORY,
+	RPC_X_NO_MEMORY              = RPC_S_OUT_OF_MEMORY,
+	RPC_X_INVALID_BOUND          = RPC_S_INVALID_BOUND,
+	RPC_X_INVALID_TAG            = RPC_S_INVALID_TAG,
+	RPC_X_ENUM_VALUE_TOO_LARGE   = RPC_X_ENUM_VALUE_OUT_OF_RANGE,
+	RPC_X_SS_CONTEXT_MISMATCH    = ERROR_INVALID_HANDLE,
+	RPC_X_INVALID_BUFFER         = ERROR_INVALID_USER_BUFFER,
+	RPC_X_INVALID_PIPE_OPERATION = RPC_X_WRONG_PIPE_ORDER
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/schannel.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,106 @@
+/***********************************************************************\
+*                               schannel.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.schannel;
+
+import win32.wincrypt;
+private import win32.windef;
+
+const DWORD SCHANNEL_CRED_VERSION = 4;
+const SCHANNEL_SHUTDOWN           = 1;
+/* Comment from MinGW
+	? Do these belong here or in wincrypt.h
+ */
+enum : DWORD {
+	AUTHTYPE_CLIENT = 1,
+	AUTHTYPE_SERVER = 2
+}
+
+const DWORD
+	SP_PROT_PCT1_SERVER = 0x01,
+	SP_PROT_PCT1_CLIENT = 0x02,
+	SP_PROT_SSL2_SERVER = 0x04,
+	SP_PROT_SSL2_CLIENT = 0x08,
+	SP_PROT_SSL3_SERVER = 0x10,
+	SP_PROT_SSL3_CLIENT = 0x20,
+	SP_PROT_TLS1_SERVER = 0x40,
+	SP_PROT_TLS1_CLIENT = 0x80,
+	SP_PROT_PCT1        = SP_PROT_PCT1_CLIENT | SP_PROT_PCT1_SERVER,
+	SP_PROT_TLS1        = SP_PROT_TLS1_CLIENT | SP_PROT_TLS1_SERVER,
+	SP_PROT_SSL2        = SP_PROT_SSL2_CLIENT | SP_PROT_SSL2_SERVER,
+	SP_PROT_SSL3        = SP_PROT_SSL3_CLIENT | SP_PROT_SSL3_SERVER;
+
+const DWORD
+	SCH_CRED_NO_SYSTEM_MAPPER                    = 0x0002,
+	SCH_CRED_NO_SERVERNAME_CHECK                 = 0x0004,
+	SCH_CRED_MANUAL_CRED_VALIDATION              = 0x0008,
+	SCH_CRED_NO_DEFAULT_CREDS                    = 0x0010,
+	SCH_CRED_AUTO_CRED_VALIDATION                = 0x0020,
+	SCH_CRED_USE_DEFAULT_CREDS                   = 0x0040,
+	SCH_CRED_REVOCATION_CHECK_END_CERT           = 0x0100,
+	SCH_CRED_REVOCATION_CHECK_CHAIN              = 0x0200,
+	SCH_CRED_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT = 0x0400,
+	SCH_CRED_IGNORE_NO_REVOCATION_CHECK          = 0x0800,
+	SCH_CRED_IGNORE_REVOCATION_OFFLINE           = 0x1000;
+
+// No definition - presumably an opaque structure
+struct _HMAPPER;
+
+struct SCHANNEL_CRED {
+	DWORD           dwVersion = SCHANNEL_CRED_VERSION;
+	DWORD           cCreds;
+	PCCERT_CONTEXT* paCred;
+	HCERTSTORE      hRootStore;
+	DWORD           cMappers;
+	_HMAPPER**      aphMappers;
+	DWORD           cSupportedAlgs;
+	ALG_ID*         palgSupportedAlgs;
+	DWORD           grbitEnabledProtocols;
+	DWORD           dwMinimumCypherStrength;
+	DWORD           dwMaximumCypherStrength;
+	DWORD           dwSessionLifespan;
+	DWORD           dwFlags;
+	DWORD           reserved;
+}
+alias SCHANNEL_CRED* PSCHANNEL_CRED;
+
+struct SecPkgCred_SupportedAlgs {
+	DWORD   cSupportedAlgs;
+	ALG_ID* palgSupportedAlgs;
+}
+alias SecPkgCred_SupportedAlgs* PSecPkgCred_SupportedAlgs;
+
+struct SecPkgCred_CypherStrengths {
+	DWORD dwMinimumCypherStrength;
+	DWORD dwMaximumCypherStrength;
+}
+alias SecPkgCred_CypherStrengths* PSecPkgCred_CypherStrengths;
+
+struct SecPkgCred_SupportedProtocols {
+	DWORD grbitProtocol;
+}
+alias SecPkgCred_SupportedProtocols* PSecPkgCred_SupportedProtocols;
+
+struct SecPkgContext_IssuerListInfoEx {
+	PCERT_NAME_BLOB aIssuers;
+	DWORD           cIssuers;
+}
+alias SecPkgContext_IssuerListInfoEx* PSecPkgContext_IssuerListInfoEx;
+
+struct SecPkgContext_ConnectionInfo {
+	DWORD  dwProtocol;
+	ALG_ID aiCipher;
+	DWORD  dwCipherStrength;
+	ALG_ID aiHash;
+	DWORD  dwHashStrength;
+	ALG_ID aiExch;
+	DWORD  dwExchStrength;
+}
+alias SecPkgContext_ConnectionInfo* PSecPkgContext_ConnectionInfo;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/secext.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,52 @@
+/***********************************************************************\
+*                                secext.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+// Don't include this file directly, use win32.security instead.
+module win32.secext;
+pragma(lib, "secur32.lib");
+
+private import win32.w32api, win32.windef;
+
+static assert (_WIN32_WINNT >= 0x0501,
+  "SecExt is only available on WindowsXP and later");
+
+enum EXTENDED_NAME_FORMAT {
+	NameUnknown,
+	NameFullyQualifiedDN,
+	NameSamCompatible,
+	NameDisplay,          // =  3
+	NameUniqueId             =  6,
+	NameCanonical,
+	NameUserPrincipal,
+	NameCanonicalEx,
+	NameServicePrincipal, // = 10
+	NameDnsDomain            = 12
+}
+alias EXTENDED_NAME_FORMAT* PEXTENDED_NAME_FORMAT;
+
+extern (Windows) {
+	BOOLEAN GetComputerObjectNameA(EXTENDED_NAME_FORMAT, LPSTR, PULONG);
+	BOOLEAN GetComputerObjectNameW(EXTENDED_NAME_FORMAT, LPWSTR, PULONG);
+	BOOLEAN GetUserNameExA(EXTENDED_NAME_FORMAT, LPSTR, PULONG);
+	BOOLEAN GetUserNameExW(EXTENDED_NAME_FORMAT, LPWSTR, PULONG);
+	BOOLEAN TranslateNameA(LPCSTR, EXTENDED_NAME_FORMAT,
+	  EXTENDED_NAME_FORMAT, LPSTR, PULONG);
+	BOOLEAN TranslateNameW(LPCWSTR, EXTENDED_NAME_FORMAT,
+	  EXTENDED_NAME_FORMAT, LPWSTR, PULONG);
+}
+
+version (Unicode) {
+	alias GetComputerObjectNameW GetComputerObjectName;
+	alias GetUserNameExW GetUserNameEx;
+	alias TranslateNameW TranslateName;
+} else {
+	alias GetComputerObjectNameA GetComputerObjectName;
+	alias GetUserNameExA GetUserNameEx;
+	alias TranslateNameA TranslateName;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/servprov.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,16 @@
+/***********************************************************************\
+*                               servprov.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*             Translated from MinGW API for MS-Windows 3.10             *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.servprov;
+
+private import win32.basetyps, win32.unknwn, win32.windef, win32.wtypes;
+
+interface IServiceProvider : public IUnknown {
+	HRESULT QueryService(REFGUID, REFIID, void**);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/setupapi.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,1979 @@
+/***********************************************************************\
+*                               setupapi.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Vladimir Vlasov                          *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.setupapi;
+pragma(lib, "setupapi.lib");
+
+private import win32.basetyps, win32.commctrl, win32.prsht, win32.w32api,
+  win32.winreg, win32.windef;
+private import win32.winbase; // for SYSTEMTIME
+
+/*static if(_WIN32_WINNT < _WIN32_WINDOWS) {
+	const UINT _SETUPAPI_VER = _WIN32_WINNT; // SetupAPI version follows Windows NT version
+} else static if(_WIN32_WINDOWS) {
+	static if(_WIN32_WINDOWS >= 0x0490) {
+		const UINT _SETUPAPI_VER = 0x0500;     // WinME uses same version of SetupAPI as Win2k
+	} else static if(_WIN32_WINDOWS >= 0x0410) {
+		const UINT _SETUPAPI_VER = 0x0410;     // Indicates version of SetupAPI shipped with Win98
+	} else {
+		const UINT _SETUPAPI_VER = 0x0400;     // Earliest SetupAPI version
+	}
+} else {
+	const UINT _SETUPAPI_VER = 0x0501;
+}
+
+version (WindowsNTonly) {
+	static if (_WIN32_WINNT >= 0x500) {
+		const UINT USE_SP_DRVINFO_DATA_V1 = 0;
+	} else {
+		const UINT USE_SP_DRVINFO_DATA_V1 = 1;
+	}
+} else {
+	const UINT USE_SP_DRVINFO_DATA_V1 = 1;
+}*/
+/+
+const UINT _SETUPAPI_VER = 0x0400;     // Earliest SetupAPI version
+const UINT USE_SP_DRVINFO_DATA_V1 = 1;
++/
+const UINT _SETUPAPI_VER          = WINVER;
+const bool USE_SP_DRVINFO_DATA_V1 = !_WIN32_WINNT_ONLY || _WIN32_WINNT < 0x500;
+
+enum : uint {
+	LINE_LEN                  = 256,
+	MAX_INF_STRING_LENGTH     = 4096,
+	MAX_TITLE_LEN             = 60,
+	MAX_INSTRUCTION_LEN       = 256,
+	MAX_LABEL_LEN             = 30,
+	MAX_SERVICE_NAME_LEN      = 256,
+	MAX_SUBTITLE_LEN          = 256,
+	SP_MAX_MACHINENAME_LENGTH = MAX_PATH + 3
+}
+
+enum : DWORD {
+	COPYFLG_WARN_IF_SKIP         = 0x00000001,
+	COPYFLG_NOSKIP               = 0x00000002,
+	COPYFLG_NOVERSIONCHECK       = 0x00000004,
+	COPYFLG_FORCE_FILE_IN_USE    = 0x00000008,
+	COPYFLG_NO_OVERWRITE         = 0x00000010,
+	COPYFLG_NO_VERSION_DIALOG    = 0x00000020,
+	COPYFLG_OVERWRITE_OLDER_ONLY = 0x00000040,
+	COPYFLG_REPLACEONLY          = 0x00000400,
+	COPYFLG_NODECOMP             = 0x00000800,
+	COPYFLG_REPLACE_BOOT_FILE    = 0x00001000,
+	COPYFLG_NOPRUNE              = 0x00002000
+}
+
+enum : DWORD {
+	DELFLG_IN_USE  = 0x00000001,
+	DELFLG_IN_USE1 = 0x00010000
+}
+
+enum : DWORD {
+	DI_REMOVEDEVICE_GLOBAL              = 0x00000001,
+	DI_REMOVEDEVICE_CONFIGSPECIFIC      = 0x00000002,
+	DI_UNREMOVEDEVICE_CONFIGSPECIFIC    = 0x00000002,
+	DI_SHOWOEM                          = 0x00000001,
+	DI_SHOWCOMPAT                       = 0x00000002,
+	DI_SHOWCLASS                        = 0x00000004,
+	DI_SHOWALL                          = 0x00000007,
+	DI_NOVCP                            = 0x00000008,
+	DI_DIDCOMPAT                        = 0x00000010,
+	DI_DIDCLASS                         = 0x00000020,
+	DI_AUTOASSIGNRES                    = 0x00000040,
+	DI_NEEDRESTART                      = 0x00000080,
+	DI_NEEDREBOOT                       = 0x00000100,
+	DI_NOBROWSE                         = 0x00000200,
+	DI_MULTMFGS                         = 0x00000400,
+	DI_DISABLED                         = 0x00000800,
+	DI_GENERALPAGE_ADDED                = 0x00001000,
+	DI_RESOURCEPAGE_ADDED               = 0x00002000,
+	DI_PROPERTIES_CHANGE                = 0x00004000,
+	DI_INF_IS_SORTED                    = 0x00008000,
+	DI_ENUMSINGLEINF                    = 0x00010000,
+	DI_DONOTCALLCONFIGMG                = 0x00020000,
+	DI_INSTALLDISABLED                  = 0x00040000,
+	DI_COMPAT_FROM_CLASS                = 0x00080000,
+	DI_CLASSINSTALLPARAMS               = 0x00100000,
+	DI_NODI_DEFAULTACTION               = 0x00200000,
+	DI_QUIETINSTALL                     = 0x00800000,
+	DI_NOFILECOPY                       = 0x01000000,
+	DI_FORCECOPY                        = 0x02000000,
+	DI_DRIVERPAGE_ADDED                 = 0x04000000,
+	DI_USECI_SELECTSTRINGS              = 0x08000000,
+	DI_OVERRIDE_INFFLAGS                = 0x10000000,
+	DI_PROPS_NOCHANGEUSAGE              = 0x20000000,
+	DI_NOSELECTICONS                    = 0x40000000,
+	DI_NOWRITE_IDS                      = 0x80000000,
+	DI_FLAGSEX_USEOLDINFSEARCH          = 0x00000001,
+	DI_FLAGSEX_AUTOSELECTRANK0          = 0x00000002,
+	DI_FLAGSEX_CI_FAILED                = 0x00000004,
+	DI_FLAGSEX_DIDINFOLIST              = 0x00000010,
+	DI_FLAGSEX_DIDCOMPATINFO            = 0x00000020,
+	DI_FLAGSEX_FILTERCLASSES            = 0x00000040,
+	DI_FLAGSEX_SETFAILEDINSTALL         = 0x00000080,
+	DI_FLAGSEX_DEVICECHANGE             = 0x00000100,
+	DI_FLAGSEX_ALWAYSWRITEIDS           = 0x00000200,
+	DI_FLAGSEX_PROPCHANGE_PENDING       = 0x00000400,
+	DI_FLAGSEX_ALLOWEXCLUDEDDRVS        = 0x00000800,
+	DI_FLAGSEX_NOUIONQUERYREMOVE        = 0x00001000,
+	DI_FLAGSEX_USECLASSFORCOMPAT        = 0x00002000,
+	DI_FLAGSEX_OLDINF_IN_CLASSLIST      = 0x00004000,
+	DI_FLAGSEX_NO_DRVREG_MODIFY         = 0x00008000,
+	DI_FLAGSEX_IN_SYSTEM_SETUP          = 0x00010000,
+	DI_FLAGSEX_INET_DRIVER              = 0x00020000,
+	DI_FLAGSEX_APPENDDRIVERLIST         = 0x00040000,
+	DI_FLAGSEX_PREINSTALLBACKUP         = 0x00080000,
+	DI_FLAGSEX_BACKUPONREPLACE          = 0x00100000,
+	DI_FLAGSEX_DRIVERLIST_FROM_URL      = 0x00200000,
+	DI_FLAGSEX_RESERVED1                = 0x00400000,
+	DI_FLAGSEX_EXCLUDE_OLD_INET_DRIVERS = 0x00800000,
+	DI_FLAGSEX_POWERPAGE_ADDED          = 0x01000000
+}
+
+enum : DWORD {
+	DIBCI_NOINSTALLCLASS = 0x00000001,
+	DIBCI_NODISPLAYCLASS = 0x00000002
+}
+
+enum : DWORD {
+	DICD_GENERATE_ID       = 0x00000001,
+	DICD_INHERIT_CLASSDRVS = 0x00000002
+}
+
+enum : DWORD {
+	DICS_ENABLE = 1,
+	DICS_DISABLE,
+	DICS_PROPCHANGE,
+	DICS_START,
+	DICS_STOP // = 5
+}
+
+enum : DWORD {
+	DICS_FLAG_GLOBAL         = 1,
+	DICS_FLAG_CONFIGSPECIFIC = 2,
+	DICS_FLAG_CONFIGGENERAL  = 4
+}
+
+alias UINT DI_FUNCTION;
+
+enum : DI_FUNCTION {
+	DIF_SELECTDEVICE = 1,
+	DIF_INSTALLDEVICE,
+	DIF_ASSIGNRESOURCES,
+	DIF_PROPERTIES,
+	DIF_REMOVE,
+	DIF_FIRSTTIMESETUP,
+	DIF_FOUNDDEVICE,
+	DIF_SELECTCLASSDRIVERS,
+	DIF_VALIDATECLASSDRIVERS,
+	DIF_INSTALLCLASSDRIVERS,
+	DIF_CALCDISKSPACE,
+	DIF_DESTROYPRIVATEDATA,
+	DIF_VALIDATEDRIVER,
+	DIF_MOVEDEVICE,
+	DIF_DETECT,
+	DIF_INSTALLWIZARD,
+	DIF_DESTROYWIZARDDATA,
+	DIF_PROPERTYCHANGE,
+	DIF_ENABLECLASS,
+	DIF_DETECTVERIFY,
+	DIF_INSTALLDEVICEFILES,
+	DIF_UNREMOVE,
+	DIF_SELECTBESTCOMPATDRV,
+	DIF_ALLOW_INSTALL,
+	DIF_REGISTERDEVICE,
+	DIF_NEWDEVICEWIZARD_PRESELECT,
+	DIF_NEWDEVICEWIZARD_SELECT,
+	DIF_NEWDEVICEWIZARD_PREANALYZE,
+	DIF_NEWDEVICEWIZARD_POSTANALYZE,
+	DIF_NEWDEVICEWIZARD_FINISHINSTALL,
+	DIF_UNUSED1,
+	DIF_INSTALLINTERFACES,
+	DIF_DETECTCANCEL,
+	DIF_REGISTER_COINSTALLERS,
+	DIF_ADDPROPERTYPAGE_ADVANCED,
+	DIF_ADDPROPERTYPAGE_BASIC,
+	DIF_RESERVED1,
+	DIF_TROUBLESHOOTER,
+	DIF_POWERMESSAGEWAKE // = 39
+}
+
+enum : DWORD {
+	DIGCF_DEFAULT         = 0x00000001,
+	DIGCF_PRESENT         = 0x00000002,
+	DIGCF_ALLCLASSES      = 0x00000004,
+	DIGCF_PROFILE         = 0x00000008,
+	DIGCF_DEVICEINTERFACE = 0x00000010
+}
+
+deprecated enum : DWORD {
+	DIGCF_INTERFACEDEVICE = DIGCF_DEVICEINTERFACE
+}
+
+enum : DWORD {
+	DIGCDP_FLAG_BASIC    = 0x00000001,
+	DIGCDP_FLAG_ADVANCED = 0x00000002
+}
+
+enum : DWORD {
+	DIOCR_INSTALLER = 0x00000001,
+	DIOCR_INTERFACE = 0x00000002
+}
+
+enum : DWORD {
+	DIODI_NO_ADD = 0x00000001
+}
+
+enum : DWORD {
+	DIOD_INHERIT_CLASSDRVS = 0x00000002,
+	DIOD_CANCEL_REMOVE     = 0x00000004
+}
+
+enum : DWORD {
+	DIREG_DEV  = 0x00000001,
+	DIREG_DRV  = 0x00000002,
+	DIREG_BOTH = 0x00000004
+}
+
+enum : int {
+	DIRID_ABSOLUTE       = -1,
+	DIRID_NULL           = 0,
+	DIRID_SRCPATH        = 1,
+	DIRID_WINDOWS        = 10,
+	DIRID_SYSTEM         = 11,
+	DIRID_DRIVERS        = 12,
+	DIRID_IOSUBSYS       = DIRID_DRIVERS,
+	DIRID_INF            = 17,
+	DIRID_HELP           = 18,
+	DIRID_FONTS          = 20,
+	DIRID_VIEWERS        = 21,
+	DIRID_COLOR          = 23,
+	DIRID_APPS           = 24,
+	DIRID_SHARED         = 25,
+	DIRID_BOOT           = 30,
+	DIRID_SYSTEM16       = 50,
+	DIRID_SPOOL          = 51,
+	DIRID_SPOOLDRIVERS   = 52,
+	DIRID_USERPROFILE    = 53,
+	DIRID_LOADER         = 54,
+	DIRID_PRINTPROCESSOR = 55,
+	DIRID_DEFAULT        = DIRID_SYSTEM
+}
+
+enum : int {
+	DIRID_COMMON_STARTMENU        = 16406,
+	DIRID_COMMON_PROGRAMS         = 16407,
+	DIRID_COMMON_STARTUP          = 16408,
+	DIRID_COMMON_DESKTOPDIRECTORY = 16409,
+	DIRID_COMMON_FAVORITES        = 16415,
+	DIRID_COMMON_APPDATA          = 16419,
+	DIRID_PROGRAM_FILES           = 16422,
+	DIRID_SYSTEM_X86              = 16425,
+	DIRID_PROGRAM_FILES_X86       = 16426,
+	DIRID_PROGRAM_FILES_COMMON    = 16427,
+	DIRID_PROGRAM_FILES_COMMONX86 = 16428,
+	DIRID_COMMON_TEMPLATES        = 16429,
+	DIRID_COMMON_DOCUMENTS        = 16430,
+	DIRID_USER                    = 0x8000,
+	DIRID_ABSOLUTE_16BIT          = 0xffff
+}
+
+enum : DWORD {
+	DMI_MASK    = 0x00000001,
+	DMI_BKCOLOR = 0x00000002,
+	DMI_USERECT = 0x00000004
+}
+
+enum : DWORD {
+	DNF_DUPDESC           = 0x00000001,
+	DNF_OLDDRIVER         = 0x00000002,
+	DNF_EXCLUDEFROMLIST   = 0x00000004,
+	DNF_NODRIVER          = 0x00000008,
+	DNF_LEGACYINF         = 0x00000010,
+	DNF_CLASS_DRIVER      = 0x00000020,
+	DNF_COMPATIBLE_DRIVER = 0x00000040,
+	DNF_INET_DRIVER       = 0x00000080,
+	DNF_UNUSED1           = 0x00000100,
+	DNF_INDEXED_DRIVER    = 0x00000200,
+	DNF_OLD_INET_DRIVER   = 0x00000400,
+	DNF_BAD_DRIVER        = 0x00000800,
+	DNF_DUPPROVIDER       = 0x00001000
+}
+
+enum : UINT {
+	DPROMPT_SUCCESS,
+	DPROMPT_CANCEL,
+	DPROMPT_SKIPFILE,
+	DPROMPT_BUFFERTOOSMALL,
+	DPROMPT_OUTOFMEMORY // = 4
+}
+
+enum : DWORD {
+	DRIVER_HARDWAREID_RANK             = 0x00000FFF,
+	DRIVER_COMPATID_RANK               = 0x00003FFF,
+	DRIVER_UNTRUSTED_RANK              = 0x00008000,
+	DRIVER_UNTRUSTED_HARDWAREID_RANK   = 0x00008FFF,
+	DRIVER_UNTRUSTED_COMPATID_RANK     = 0x0000BFFF,
+	DRIVER_W9X_SUSPECT_RANK            = 0x0000C000,
+	DRIVER_W9X_SUSPECT_HARDWAREID_RANK = 0x0000CFFF,
+	DRIVER_W9X_SUSPECT_COMPATID_RANK   = 0x0000FFFF
+}
+
+enum : DWORD {
+	DYNAWIZ_FLAG_PAGESADDED             = 0x00000001,
+	DYNAWIZ_FLAG_INSTALLDET_NEXT        = 0x00000002,
+	DYNAWIZ_FLAG_INSTALLDET_PREV        = 0x00000004,
+	DYNAWIZ_FLAG_ANALYZE_HANDLECONFLICT = 0x00000008
+}
+
+enum : WORD {
+	ENABLECLASS_QUERY,
+	ENABLECLASS_SUCCESS,
+	ENABLECLASS_FAILURE // = 2
+}
+
+enum : DWORD {
+	ERROR_EXPECTED_SECTION_NAME       = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0,
+	ERROR_BAD_SECTION_NAME_LINE       = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 1,
+	ERROR_SECTION_NAME_TOO_LONG       = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 2,
+	ERROR_GENERAL_SYNTAX              = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 3,
+	ERROR_WRONG_INF_STYLE             = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x100,
+	ERROR_NOT_INSTALLED               = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x1000,
+	ERROR_SECTION_NOT_FOUND           = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x101,
+	ERROR_LINE_NOT_FOUND              = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x102,
+	ERROR_NO_BACKUP                   = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x103,
+	ERROR_NO_ASSOCIATED_CLASS         = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x200,
+	ERROR_CLASS_MISMATCH              = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x201,
+	ERROR_DUPLICATE_FOUND             = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x202,
+	ERROR_NO_DRIVER_SELECTED          = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x203,
+	ERROR_KEY_DOES_NOT_EXIST          = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x204,
+	ERROR_INVALID_DEVINST_NAME        = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x205,
+	ERROR_INVALID_CLASS               = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x206,
+	ERROR_DEVINST_ALREADY_EXISTS      = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x207,
+	ERROR_DEVINFO_NOT_REGISTERED      = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x208,
+	ERROR_INVALID_REG_PROPERTY        = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x209,
+	ERROR_NO_INF                      = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x20A,
+	ERROR_NO_SUCH_DEVINST             = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x20B,
+	ERROR_CANT_LOAD_CLASS_ICON        = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x20C,
+	ERROR_INVALID_CLASS_INSTALLER     = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x20D,
+	ERROR_DI_DO_DEFAULT               = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x20E,
+	ERROR_DI_NOFILECOPY               = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x20F,
+	ERROR_INVALID_HWPROFILE           = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x210,
+	ERROR_NO_DEVICE_SELECTED          = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x211,
+	ERROR_DEVINFO_LIST_LOCKED         = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x212,
+	ERROR_DEVINFO_DATA_LOCKED         = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x213,
+	ERROR_DI_BAD_PATH                 = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x214,
+	ERROR_NO_CLASSINSTALL_PARAMS      = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x215,
+	ERROR_FILEQUEUE_LOCKED            = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x216,
+	ERROR_BAD_SERVICE_INSTALLSECT     = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x217,
+	ERROR_NO_CLASS_DRIVER_LIST        = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x218,
+	ERROR_NO_ASSOCIATED_SERVICE       = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x219,
+	ERROR_NO_DEFAULT_DEVICE_INTERFACE = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x21A,
+	ERROR_DEVICE_INTERFACE_ACTIVE     = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x21B,
+	ERROR_DEVICE_INTERFACE_REMOVED    = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x21C,
+	ERROR_BAD_INTERFACE_INSTALLSECT   = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x21D,
+	ERROR_NO_SUCH_INTERFACE_CLASS     = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x21E,
+	ERROR_INVALID_REFERENCE_STRING    = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x21F,
+	ERROR_INVALID_MACHINENAME         = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x220,
+	ERROR_REMOTE_COMM_FAILURE         = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x221,
+	ERROR_MACHINE_UNAVAILABLE         = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x222,
+	ERROR_NO_CONFIGMGR_SERVICES       = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x223,
+	ERROR_INVALID_PROPPAGE_PROVIDER   = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x224,
+	ERROR_NO_SUCH_DEVICE_INTERFACE    = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x225,
+	ERROR_DI_POSTPROCESSING_REQUIRED  = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x226,
+	ERROR_INVALID_COINSTALLER         = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x227,
+	ERROR_NO_COMPAT_DRIVERS           = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x228,
+	ERROR_NO_DEVICE_ICON              = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x229,
+	ERROR_INVALID_INF_LOGCONFIG       = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x22A,
+	ERROR_DI_DONT_INSTALL             = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x22B,
+	ERROR_INVALID_FILTER_DRIVER       = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x22C,
+	ERROR_NON_WINDOWS_NT_DRIVER       = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x22D,
+	ERROR_NON_WINDOWS_DRIVER          = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x22E,
+	ERROR_NO_CATALOG_FOR_OEM_INF      = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x22F,
+	ERROR_DEVINSTALL_QUEUE_NONNATIVE  = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x230,
+	ERROR_NOT_DISABLEABLE             = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x231,
+	ERROR_CANT_REMOVE_DEVINST         = APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR | 0x232
+}
+
+deprecated enum : DWORD {
+	ERROR_NO_DEFAULT_INTERFACE_DEVICE = ERROR_NO_DEFAULT_DEVICE_INTERFACE,
+	ERROR_INTERFACE_DEVICE_ACTIVE     = ERROR_DEVICE_INTERFACE_ACTIVE,
+	ERROR_INTERFACE_DEVICE_REMOVED    = ERROR_DEVICE_INTERFACE_REMOVED,
+	ERROR_NO_SUCH_INTERFACE_DEVICE    = ERROR_NO_SUCH_DEVICE_INTERFACE,
+}
+
+enum : UINT {
+	FILEOP_COPY,
+	FILEOP_RENAME,
+	FILEOP_DELETE,
+	FILEOP_BACKUP,
+	FILEOP_NEWPATH, // = 4
+	FILEOP_ABORT = 0,
+	FILEOP_DOIT,
+	FILEOP_SKIP, // = 2
+	FILEOP_RETRY = FILEOP_DOIT
+}
+
+enum : UINT {
+	FILE_COMPRESSION_NONE,
+	FILE_COMPRESSION_WINLZA,
+	FILE_COMPRESSION_MSZIP,
+	FILE_COMPRESSION_NTCAB // = 3
+}
+
+enum : DWORD {
+	FLG_ADDREG_TYPE_SZ        = 0x00000000,
+	FLG_ADDREG_BINVALUETYPE   = 0x00000001,
+	FLG_ADDREG_NOCLOBBER      = 0x00000002,
+	FLG_ADDREG_DELVAL         = 0x00000004,
+	FLG_ADDREG_APPEND         = 0x00000008,
+	FLG_ADDREG_KEYONLY        = 0x00000010,
+	FLG_ADDREG_OVERWRITEONLY  = 0x00000020,
+	FLG_ADDREG_TYPE_MULTI_SZ  = 0x00010000,
+	FLG_ADDREG_TYPE_EXPAND_SZ = 0x00020000,
+	FLG_ADDREG_TYPE_BINARY    = 0x00000000 | FLG_ADDREG_BINVALUETYPE,
+	FLG_ADDREG_TYPE_DWORD     = 0x00010000 | FLG_ADDREG_BINVALUETYPE,
+	FLG_ADDREG_TYPE_NONE      = 0x00020000 | FLG_ADDREG_BINVALUETYPE,
+	FLG_ADDREG_TYPE_MASK      = 0xFFFF0000 | FLG_ADDREG_BINVALUETYPE
+}
+
+static if(_SETUPAPI_VER >= 0x0501) {
+	enum : DWORD {
+		FLG_ADDREG_64BITKEY       = 0x00001000,
+		FLG_ADDREG_KEYONLY_COMMON = 0x00002000,
+		FLG_ADDREG_32BITKEY       = 0x00004000,
+		FLG_ADDREG_DELREG_BIT     = 0x00008000
+	}
+}
+
+enum : DWORD {
+	FLG_DELREG_VALUE = 0x00000000
+}
+
+static if(_SETUPAPI_VER >= 0x0501) {
+	enum : DWORD {
+		FLG_DELREG_TYPE_MASK          = FLG_ADDREG_TYPE_MASK,
+		FLG_DELREG_TYPE_SZ            = FLG_ADDREG_TYPE_SZ,
+		FLG_DELREG_TYPE_MULTI_SZ      = FLG_ADDREG_TYPE_MULTI_SZ,
+		FLG_DELREG_TYPE_EXPAND_SZ     = FLG_ADDREG_TYPE_EXPAND_SZ,
+		FLG_DELREG_TYPE_BINARY        = FLG_ADDREG_TYPE_BINARY,
+		FLG_DELREG_TYPE_DWORD         = FLG_ADDREG_TYPE_DWORD,
+		FLG_DELREG_TYPE_NONE          = FLG_ADDREG_TYPE_NONE,
+		FLG_DELREG_64BITKEY           = FLG_ADDREG_64BITKEY,
+		FLG_DELREG_KEYONLY_COMMON     = FLG_ADDREG_KEYONLY_COMMON,
+		FLG_DELREG_32BITKEY           = FLG_ADDREG_32BITKEY,
+		FLG_DELREG_OPERATION_MASK     = 0x000000FE,
+		FLG_DELREG_MULTI_SZ_DELSTRING = 0x00000002 | FLG_DELREG_TYPE_MULTI_SZ | FLG_ADDREG_DELREG_BIT
+	}
+}
+
+enum : DWORD {
+	FLG_BITREG_CLEARBITS = 0x00000000,
+	FLG_BITREG_SETBITS   = 0x00000001
+}
+
+static if(_SETUPAPI_VER >= 0x0501) {
+	enum : DWORD {
+		FLG_BITREG_64BITKEY = 0x00001000,
+		FLG_BITREG_32BITKEY = 0x00004000
+	}
+}
+
+enum : DWORD {
+	FLG_PROFITEM_CURRENTUSER = 0x00000001,
+	FLG_PROFITEM_DELETE      = 0x00000002,
+	FLG_PROFITEM_GROUP       = 0x00000004,
+	FLG_PROFITEM_CSIDL       = 0x00000008
+}
+
+enum : DWORD {
+	FLG_REGSVR_DLLREGISTER = 0x00000001,
+	FLG_REGSVR_DLLINSTALL  = 0x00000002
+}
+
+enum {
+	IDD_DYNAWIZ_FIRSTPAGE = 10000,
+	IDD_DYNAWIZ_SELECT_PREVPAGE,
+	IDD_DYNAWIZ_SELECT_NEXTPAGE,
+	IDD_DYNAWIZ_ANALYZE_PREVPAGE,
+	IDD_DYNAWIZ_ANALYZE_NEXTPAGE, // = 1004
+	IDD_DYNAWIZ_INSTALLDETECTED_PREVPAGE = 10006,
+	IDD_DYNAWIZ_INSTALLDETECTED_NEXTPAGE,
+	IDD_DYNAWIZ_INSTALLDETECTED_NODEVS,
+	IDD_DYNAWIZ_SELECTDEV_PAGE,
+	IDD_DYNAWIZ_ANALYZEDEV_PAGE,
+	IDD_DYNAWIZ_INSTALLDETECTEDDEVS_PAGE,
+	IDD_DYNAWIZ_SELECTCLASS_PAGE, // = 10012
+	MIN_IDD_DYNAWIZ_RESOURCE_ID = 10000,
+	MAX_IDD_DYNAWIZ_RESOURCE_ID = 11000
+}
+
+enum : DWORD {
+	IDF_NOBROWSE     = 0x00000001,
+	IDF_NOSKIP       = 0x00000002,
+	IDF_NODETAILS    = 0x00000004,
+	IDF_NOCOMPRESSED = 0x00000008,
+	IDF_CHECKFIRST   = 0x00000100,
+	IDF_NOBEEP       = 0x00000200,
+	IDF_NOFOREGROUND = 0x00000400,
+	IDF_WARNIFSKIP   = 0x00000800
+}
+
+static if(_SETUPAPI_VER >= 0x0501) {
+	enum : DWORD {
+		IDF_NOREMOVABLEMEDIAPROMPT = 0x00001000,
+		IDF_USEDISKNAMEASPROMPT    = 0x00002000,
+		IDF_OEMDISK                = 0x80000000
+	}
+}
+
+enum {
+	IDI_RESOURCEFIRST          = 159,
+	IDI_RESOURCE               = 159,
+	IDI_RESOURCELAST           = 161,
+	IDI_RESOURCEOVERLAYFIRST   = 161,
+	IDI_RESOURCEOVERLAYLAST    = 161,
+	IDI_CONFLICT               = 161,
+	IDI_PROBLEM_OVL            = 500,
+	IDI_DISABLED_OVL           = 501,
+	IDI_FORCED_OVL             = 502,
+	IDI_CLASSICON_OVERLAYFIRST = 500,
+	IDI_CLASSICON_OVERLAYLAST  = 502
+}
+
+enum : DWORD {
+	INF_STYLE_NONE          = 0x00000000,
+	INF_STYLE_OLDNT         = 0x00000001,
+	INF_STYLE_WIN4          = 0x00000002,
+	INF_STYLE_CACHE_ENABLE  = 0x00000010,
+	INF_STYLE_CACHE_DISABLE = 0x00000020
+}
+
+enum : DWORD {
+	INFINFO_INF_SPEC_IS_HINF = 1,
+	INFINFO_INF_NAME_IS_ABSOLUTE,
+	INFINFO_DEFAULT_SEARCH,
+	INFINFO_REVERSE_DEFAULT_SEARCH,
+	INFINFO_INF_PATH_LIST_SEARCH // = 5
+}
+
+alias DWORD LogSeverity;
+enum : LogSeverity {
+	LogSevInformation,
+	LogSevWarning,
+	LogSevError,
+	LogSevFatalError,
+	LogSevMaximum // = 4
+}
+
+const MAX_INSTALLWIZARD_DYNAPAGES = 20;
+
+enum : DWORD {
+	NDW_INSTALLFLAG_DIDFACTDEFS        = 0x00000001,
+	NDW_INSTALLFLAG_HARDWAREALLREADYIN = 0x00000002,
+	NDW_INSTALLFLAG_NEEDSHUTDOWN       = 0x00000200,
+	NDW_INSTALLFLAG_EXPRESSINTRO       = 0x00000400,
+	NDW_INSTALLFLAG_SKIPISDEVINSTALLED = 0x00000800,
+	NDW_INSTALLFLAG_NODETECTEDDEVS     = 0x00001000,
+	NDW_INSTALLFLAG_INSTALLSPECIFIC    = 0x00002000,
+	NDW_INSTALLFLAG_SKIPCLASSLIST      = 0x00004000,
+	NDW_INSTALLFLAG_CI_PICKED_OEM      = 0x00008000,
+	NDW_INSTALLFLAG_PCMCIAMODE         = 0x00010000,
+	NDW_INSTALLFLAG_PCMCIADEVICE       = 0x00020000,
+	NDW_INSTALLFLAG_USERCANCEL         = 0x00040000,
+	NDW_INSTALLFLAG_KNOWNCLASS         = 0x00080000,
+	NDW_INSTALLFLAG_NEEDRESTART        = 0x00000080,
+	NDW_INSTALLFLAG_NEEDREBOOT         = 0x00000100
+}
+
+enum : DWORD {
+	SETDIRID_NOT_FULL_PATH = 0x00000001
+}
+
+enum : DWORD {
+	SP_COPY_DELETESOURCE        = 0x0000001,
+	SP_COPY_REPLACEONLY         = 0x0000002,
+	SP_COPY_NEWER               = 0x0000004,
+	SP_COPY_NEWER_OR_SAME       = 0x0000004,
+	SP_COPY_NOOVERWRITE         = 0x0000008,
+	SP_COPY_NODECOMP            = 0x0000010,
+	SP_COPY_LANGUAGEAWARE       = 0x0000020,
+	SP_COPY_SOURCE_ABSOLUTE     = 0x0000040,
+	SP_COPY_SOURCEPATH_ABSOLUTE = 0x0000080,
+	SP_COPY_IN_USE_NEEDS_REBOOT = 0x0000100,
+	SP_COPY_FORCE_IN_USE        = 0x0000200,
+	SP_COPY_NOSKIP              = 0x0000400,
+	SP_FLAG_CABINETCONTINUATION = 0x0000800,
+	SP_COPY_FORCE_NOOVERWRITE   = 0x0001000,
+	SP_COPY_FORCE_NEWER         = 0x0002000,
+	SP_COPY_WARNIFSKIP          = 0x0004000,
+	SP_COPY_NOBROWSE            = 0x0008000,
+	SP_COPY_NEWER_ONLY          = 0x0010000,
+	SP_COPY_SOURCE_SIS_MASTER   = 0x0020000,
+	SP_COPY_OEMINF_CATALOG_ONLY = 0x0040000,
+	SP_COPY_REPLACE_BOOT_FILE   = 0x0080000,
+	SP_COPY_NOPRUNE             = 0x0100000
+}
+
+static if(_SETUPAPI_VER >= 0x0501) {
+	enum : DWORD {
+		SP_COPY_OEM_F6_INF = 0x0200000
+	}
+}
+
+enum : DWORD {
+	SPCRP_SECURITY = 23,
+	SPCRP_SECURITY_SDS,
+	SPCRP_DEVTYPE,
+	SPCRP_EXCLUSIVE,
+	SPCRP_CHARACTERISTICS,
+	SPCRP_MAXIMUM_PROPERTY // = 28
+}
+
+enum : DWORD {
+	SPDIT_NODRIVER,
+	SPDIT_CLASSDRIVER,
+	SPDIT_COMPATDRIVER // = 2
+}
+
+enum : DWORD {
+	SPDRP_DEVICEDESC,
+	SPDRP_HARDWAREID,
+	SPDRP_COMPATIBLEIDS,
+	SPDRP_UNUSED0,
+	SPDRP_SERVICE,
+	SPDRP_UNUSED1,
+	SPDRP_UNUSED2,
+	SPDRP_CLASS,
+	SPDRP_CLASSGUID,
+	SPDRP_DRIVER,
+	SPDRP_CONFIGFLAGS,
+	SPDRP_MFG,
+	SPDRP_FRIENDLYNAME,
+	SPDRP_LOCATION_INFORMATION,
+	SPDRP_PHYSICAL_DEVICE_OBJECT_NAME,
+	SPDRP_CAPABILITIES,
+	SPDRP_UI_NUMBER,
+	SPDRP_UPPERFILTERS,
+	SPDRP_LOWERFILTERS,
+	SPDRP_BUSTYPEGUID,
+	SPDRP_LEGACYBUSTYPE,
+	SPDRP_BUSNUMBER,
+	SPDRP_ENUMERATOR_NAME,
+	SPDRP_SECURITY,
+	SPDRP_SECURITY_SDS,
+	SPDRP_DEVTYPE,
+	SPDRP_EXCLUSIVE,
+	SPDRP_CHARACTERISTICS,
+	SPDRP_ADDRESS, // = 28
+	SPDRP_UI_NUMBER_DESC_FORMAT = 30,
+	SPDRP_MAXIMUM_PROPERTY      = 31
+}
+
+enum : UINT {
+	SPDSL_IGNORE_DISK = 1,
+	SPDSL_DISALLOW_NEGATIVE_ADJUST
+}
+
+enum : UINT {
+	SPFILENOTIFY_STARTQUEUE = 1,
+	SPFILENOTIFY_ENDQUEUE,
+	SPFILENOTIFY_STARTSUBQUEUE,
+	SPFILENOTIFY_ENDSUBQUEUE,
+	SPFILENOTIFY_STARTDELETE,
+	SPFILENOTIFY_ENDDELETE,
+	SPFILENOTIFY_DELETEERROR,
+	SPFILENOTIFY_STARTRENAME,
+	SPFILENOTIFY_ENDRENAME,
+	SPFILENOTIFY_RENAMEERROR,
+	SPFILENOTIFY_STARTCOPY,
+	SPFILENOTIFY_ENDCOPY,
+	SPFILENOTIFY_COPYERROR,
+	SPFILENOTIFY_NEEDMEDIA,
+	SPFILENOTIFY_QUEUESCAN,
+	SPFILENOTIFY_CABINETINFO,
+	SPFILENOTIFY_FILEINCABINET,
+	SPFILENOTIFY_NEEDNEWCABINET,
+	SPFILENOTIFY_FILEEXTRACTED,
+	SPFILENOTIFY_FILEOPDELAYED,
+	SPFILENOTIFY_STARTBACKUP,
+	SPFILENOTIFY_BACKUPERROR,
+	SPFILENOTIFY_ENDBACKUP,
+	SPFILENOTIFY_QUEUESCAN_EX,
+	SPFILENOTIFY_STARTREGISTRATION, // = 25
+	SPFILENOTIFY_ENDREGISTRATION = 32,
+	SPFILENOTIFY_LANGMISMATCH    = 0x00010000,
+	SPFILENOTIFY_TARGETEXISTS    = 0x00020000,
+	SPFILENOTIFY_TARGETNEWER     = 0x00040000
+}
+
+static if(_SETUPAPI_VER >= 0x0501) {
+	enum : UINT {
+		SPFILENOTIFY_QUEUESCAN_SIGNERINFO = 0x00000040
+	}
+}
+
+enum : DWORD {
+	SPFILELOG_SYSTEMLOG = 0x00000001,
+	SPFILELOG_OEMFILE   = 0x00000001,
+	SPFILELOG_FORCENEW  = 0x00000002,
+	SPFILELOG_QUERYONLY = 0x00000004
+}
+
+enum : INT {
+	SPFILEQ_FILE_IN_USE        = 0x00000001,
+	SPFILEQ_REBOOT_RECOMMENDED = 0x00000002,
+	SPFILEQ_REBOOT_IN_PROGRESS = 0x00000004
+}
+
+enum : DWORD {
+	SPINT_ACTIVE  = 0x00000001,
+	SPINT_DEFAULT = 0x00000002,
+	SPINT_REMOVED = 0x00000004
+}
+
+deprecated enum : DWORD {
+	SPID_ACTIVE  = SPINT_ACTIVE,
+	SPID_DEFAULT = SPINT_DEFAULT,
+	SPID_REMOVED = SPINT_REMOVED
+}
+
+enum : UINT {
+	SPINST_LOGCONFIG                = 0x00000001,
+	SPINST_INIFILES                 = 0x00000002,
+	SPINST_REGISTRY                 = 0x00000004,
+	SPINST_INI2REG                  = 0x00000008,
+	SPINST_FILES                    = 0x00000010,
+	SPINST_BITREG                   = 0x00000020,
+	SPINST_REGSVR                   = 0x00000040,
+	SPINST_UNREGSVR                 = 0x00000080,
+	SPINST_PROFILEITEMS             = 0x00000100,
+	SPINST_SINGLESECTION            = 0x00010000,
+	SPINST_LOGCONFIG_IS_FORCED      = 0x00020000,
+	SPINST_LOGCONFIGS_ARE_OVERRIDES = 0x00040000
+}
+
+static if(_SETUPAPI_VER >= 0x0501) {
+	enum : UINT {
+		SPINST_COPYINF               = 0x00000200,
+		SPINST_ALL                   = 0x000003ff,
+		SPINST_REGISTERCALLBACKAWARE = 0x00080000
+	}
+} else {
+	enum : UINT {
+		SPINST_ALL = 0x000001ff
+	}
+}
+
+enum : DWORD {
+	SPOST_NONE,
+	SPOST_PATH,
+	SPOST_URL,
+	SPOST_MAX // = 3
+}
+
+enum : DWORD {
+	SPPSR_SELECT_DEVICE_RESOURCES = 1,
+	SPPSR_ENUM_BASIC_DEVICE_PROPERTIES,
+	SPPSR_ENUM_ADV_DEVICE_PROPERTIES
+}
+
+enum : DWORD {
+	SPQ_SCAN_FILE_PRESENCE    = 0x00000001,
+	SPQ_SCAN_FILE_VALIDITY    = 0x00000002,
+	SPQ_SCAN_USE_CALLBACK     = 0x00000004,
+	SPQ_SCAN_USE_CALLBACKEX   = 0x00000008,
+	SPQ_SCAN_INFORM_USER      = 0x00000010,
+	SPQ_SCAN_PRUNE_COPY_QUEUE = 0x00000020
+}
+
+static if(_SETUPAPI_VER >= 0x0501) {
+	enum : DWORD {
+		SPQ_SCAN_USE_CALLBACK_SIGNERINFO = 0x00000040,
+		SPQ_SCAN_PRUNE_DELREN            = 0x00000080
+	}
+}
+
+enum : UINT_PTR {
+	SPQ_DELAYED_COPY = 0x00000001
+}
+
+enum : DWORD {
+	SPRDI_FIND_DUPS = 0x00000001,
+}
+
+enum : DWORD {
+	SPSVCINST_TAGTOFRONT               = 0x00000001,
+	SPSVCINST_ASSOCSERVICE             = 0x00000002,
+	SPSVCINST_DELETEEVENTLOGENTRY      = 0x00000004,
+	SPSVCINST_NOCLOBBER_DISPLAYNAME    = 0x00000008,
+	SPSVCINST_NOCLOBBER_STARTTYPE      = 0x00000010,
+	SPSVCINST_NOCLOBBER_ERRORCONTROL   = 0x00000020,
+	SPSVCINST_NOCLOBBER_LOADORDERGROUP = 0x00000040,
+	SPSVCINST_NOCLOBBER_DEPENDENCIES   = 0x00000080,
+	SPSVCINST_NOCLOBBER_DESCRIPTION    = 0x00000100,
+	SPSVCINST_STOPSERVICE              = 0x00000200
+}
+
+static if(_SETUPAPI_VER >= 0x0501) {
+	enum : DWORD {
+		SPSVCINST_CLOBBER_SECURITY = 0x00000400
+	}
+}
+
+enum : DWORD {
+	SPWPT_SELECTDEVICE = 0x00000001
+}
+
+enum : DWORD {
+	SPWP_USE_DEVINFO_DATA = 0x00000001
+}
+
+enum : UINT {
+	SRCINFO_PATH = 1,
+	SRCINFO_TAGFILE,
+	SRCINFO_DESCRIPTION,
+	SRCINFO_FLAGS // = 4
+}
+
+enum : DWORD {
+	SRCLIST_TEMPORARY       = 0x00000001,
+	SRCLIST_NOBROWSE        = 0x00000002,
+	SRCLIST_SYSTEM          = 0x00000010,
+	SRCLIST_USER            = 0x00000020,
+	SRCLIST_SYSIFADMIN      = 0x00000040,
+	SRCLIST_SUBDIRS         = 0x00000100,
+	SRCLIST_APPEND          = 0x00000200,
+	SRCLIST_NOSTRIPPLATFORM = 0x00000400
+}
+
+alias PVOID HINF;
+alias PVOID HDSKSPC;
+alias HANDLE HDEVINFO;
+alias PVOID HSPFILEQ;
+alias PVOID HSPFILELOG;
+
+enum SetupFileLogInfo {
+	SetupFileLogSourceFilename,
+	SetupFileLogChecksum,
+	SetupFileLogDiskTagfile,
+	SetupFileLogDiskDescription,
+	SetupFileLogOtherInfo,
+	SetupFileLogMax
+}
+
+align(1):
+
+struct INFCONTEXT {
+	PVOID Inf;
+	PVOID CurrentInf;
+	UINT  Section;
+	UINT  Line;
+}
+alias INFCONTEXT* PINFCONTEXT;
+
+struct SP_INF_INFORMATION {
+	DWORD InfStyle;
+	DWORD InfCount;
+	BYTE  _VersionData[1];
+	BYTE* VersionData() { return _VersionData.ptr; }
+}
+alias SP_INF_INFORMATION* PSP_INF_INFORMATION;
+
+struct SP_ALTPLATFORM_INFO {
+	DWORD cbSize = SP_ALTPLATFORM_INFO.sizeof;
+	DWORD Platform;
+	DWORD MajorVersion;
+	DWORD MinorVersion;
+	WORD  ProcessorArchitecture;
+	WORD  Reserved;
+}
+alias SP_ALTPLATFORM_INFO* PSP_ALTPLATFORM_INFO;
+
+struct SP_ORIGINAL_FILE_INFO_A {
+	DWORD cbSize = SP_ORIGINAL_FILE_INFO_A.sizeof;
+	CHAR  OriginalInfName[MAX_PATH];
+	CHAR  OriginalCatalogName[MAX_PATH];
+}
+alias SP_ORIGINAL_FILE_INFO_A* PSP_ORIGINAL_FILE_INFO_A;
+
+struct SP_ORIGINAL_FILE_INFO_W {
+	DWORD cbSize = SP_ORIGINAL_FILE_INFO_W.sizeof;
+	WCHAR OriginalInfName[MAX_PATH];
+	WCHAR OriginalCatalogName[MAX_PATH];
+}
+alias SP_ORIGINAL_FILE_INFO_W* PSP_ORIGINAL_FILE_INFO_W;
+
+struct FILEPATHS_A {
+	PCSTR Target;
+	PCSTR Source;
+	UINT  Win32Error;
+	DWORD Flags;
+}
+alias FILEPATHS_A* PFILEPATHS_A;
+
+struct FILEPATHS_W {
+	PCWSTR Target;
+	PCWSTR Source;
+	UINT   Win32Error;
+	DWORD  Flags;
+}
+alias FILEPATHS_W* PFILEPATHS_W;
+
+struct SOURCE_MEDIA_A {
+	PCSTR Reserved;
+	PCSTR Tagfile;
+	PCSTR Description;
+	PCSTR SourcePath;
+	PCSTR SourceFile;
+	DWORD Flags;
+}
+alias SOURCE_MEDIA_A* PSOURCE_MEDIA_A;
+
+struct SOURCE_MEDIA_W {
+	PCWSTR Reserved;
+	PCWSTR Tagfile;
+	PCWSTR Description;
+	PCWSTR SourcePath;
+	PCWSTR SourceFile;
+	DWORD  Flags;
+}
+alias SOURCE_MEDIA_W* PSOURCE_MEDIA_W;
+
+struct CABINET_INFO_A {
+	PCSTR  CabinetPath;
+	PCSTR  CabinetFile;
+	PCSTR  DiskName;
+	USHORT SetId;
+	USHORT CabinetNumber;
+}
+alias CABINET_INFO_A* PCABINET_INFO_A;
+
+struct CABINET_INFO_W {
+	PCWSTR CabinetPath;
+	PCWSTR CabinetFile;
+	PCWSTR DiskName;
+	USHORT SetId;
+	USHORT CabinetNumber;
+}
+alias CABINET_INFO_W* PCABINET_INFO_W;
+
+struct FILE_IN_CABINET_INFO_A {
+	PCSTR NameInCabinet;
+	DWORD FileSize;
+	DWORD Win32Error;
+	WORD  DosDate;
+	WORD  DosTime;
+	WORD  DosAttribs;
+	CHAR  FullTargetName[MAX_PATH];
+}
+alias FILE_IN_CABINET_INFO_A* PFILE_IN_CABINET_INFO_A;
+
+struct FILE_IN_CABINET_INFO_W {
+	PCWSTR NameInCabinet;
+	DWORD  FileSize;
+	DWORD  Win32Error;
+	WORD   DosDate;
+	WORD   DosTime;
+	WORD   DosAttribs;
+	WCHAR  FullTargetName[MAX_PATH];
+}
+alias FILE_IN_CABINET_INFO_W* PFILE_IN_CABINET_INFO_W;
+
+struct SP_FILE_COPY_PARAMS_A {
+	DWORD    cbSize = SP_FILE_COPY_PARAMS_A.sizeof;
+	HSPFILEQ QueueHandle;
+	PCSTR    SourceRootPath;
+	PCSTR    SourcePath;
+	PCSTR    SourceFilename;
+	PCSTR    SourceDescription;
+	PCSTR    SourceTagfile;
+	PCSTR    TargetDirectory;
+	PCSTR    TargetFilename;
+	DWORD    CopyStyle;
+	HINF     LayoutInf;
+	PCSTR    SecurityDescriptor;
+}
+alias SP_FILE_COPY_PARAMS_A* PSP_FILE_COPY_PARAMS_A;
+
+struct SP_FILE_COPY_PARAMS_W {
+	DWORD    cbSize = SP_FILE_COPY_PARAMS_W.sizeof;
+	HSPFILEQ QueueHandle;
+	PCWSTR   SourceRootPath;
+	PCWSTR   SourcePath;
+	PCWSTR   SourceFilename;
+	PCWSTR   SourceDescription;
+	PCWSTR   SourceTagfile;
+	PCWSTR   TargetDirectory;
+	PCWSTR   TargetFilename;
+	DWORD    CopyStyle;
+	HINF     LayoutInf;
+	PCWSTR   SecurityDescriptor;
+}
+alias SP_FILE_COPY_PARAMS_W* PSP_FILE_COPY_PARAMS_W;
+
+struct SP_DEVINFO_DATA {
+	DWORD     cbSize = SP_DEVINFO_DATA.sizeof;
+	GUID      ClassGuid;
+	DWORD     DevInst;
+	ULONG_PTR Reserved;
+}
+alias SP_DEVINFO_DATA* PSP_DEVINFO_DATA;
+
+struct SP_DEVICE_INTERFACE_DATA {
+	DWORD     cbSize = SP_DEVICE_INTERFACE_DATA.sizeof;
+	GUID      InterfaceClassGuid;
+	DWORD     Flags;
+	ULONG_PTR Reserved;
+}
+alias SP_DEVICE_INTERFACE_DATA* PSP_DEVICE_INTERFACE_DATA;
+deprecated alias SP_DEVICE_INTERFACE_DATA SP_INTERFACE_DEVICE_DATA;
+deprecated alias SP_DEVICE_INTERFACE_DATA* PSP_INTERFACE_DEVICE_DATA;
+
+struct SP_DEVICE_INTERFACE_DETAIL_DATA_A {
+	DWORD cbSize = SP_DEVICE_INTERFACE_DETAIL_DATA_A.sizeof;
+	CHAR  _DevicePath[1];
+	CHAR* DevicePath() { return _DevicePath.ptr; }
+}
+alias SP_DEVICE_INTERFACE_DETAIL_DATA_A* PSP_DEVICE_INTERFACE_DETAIL_DATA_A;
+
+struct SP_DEVICE_INTERFACE_DETAIL_DATA_W {
+	DWORD  cbSize = SP_DEVICE_INTERFACE_DETAIL_DATA_W.sizeof;
+	WCHAR  _DevicePath[1];
+	WCHAR* DevicePath() { return _DevicePath.ptr; }
+}
+alias SP_DEVICE_INTERFACE_DETAIL_DATA_W* PSP_DEVICE_INTERFACE_DETAIL_DATA_W;
+
+deprecated alias SP_DEVICE_INTERFACE_DETAIL_DATA_A SP_INTERFACE_DEVICE_DETAIL_DATA_A;
+deprecated alias SP_DEVICE_INTERFACE_DETAIL_DATA_A* PSP_INTERFACE_DEVICE_DETAIL_DATA_A;
+deprecated alias SP_DEVICE_INTERFACE_DETAIL_DATA_W SP_INTERFACE_DEVICE_DETAIL_DATA_W;
+deprecated alias SP_DEVICE_INTERFACE_DETAIL_DATA_W* PSP_INTERFACE_DEVICE_DETAIL_DATA_W;
+
+struct SP_DEVINFO_LIST_DETAIL_DATA_A {
+	DWORD  cbSize = SP_DEVINFO_LIST_DETAIL_DATA_A.sizeof;
+	GUID   ClassGuid;
+	HANDLE RemoteMachineHandle;
+	CHAR   RemoteMachineName[SP_MAX_MACHINENAME_LENGTH];
+}
+alias SP_DEVINFO_LIST_DETAIL_DATA_A* PSP_DEVINFO_LIST_DETAIL_DATA_A;
+
+struct SP_DEVINFO_LIST_DETAIL_DATA_W {
+	DWORD  cbSize = SP_DEVINFO_LIST_DETAIL_DATA_W.sizeof;
+	GUID   ClassGuid;
+	HANDLE RemoteMachineHandle;
+	WCHAR  RemoteMachineName[SP_MAX_MACHINENAME_LENGTH];
+}
+alias SP_DEVINFO_LIST_DETAIL_DATA_W* PSP_DEVINFO_LIST_DETAIL_DATA_W;
+
+extern(Windows) alias UINT function(PVOID,UINT,UINT_PTR,UINT_PTR) PSP_FILE_CALLBACK_A;
+extern(Windows) alias UINT function(PVOID,UINT,UINT_PTR,UINT_PTR) PSP_FILE_CALLBACK_W;
+
+struct SP_DEVINSTALL_PARAMS_A {
+	DWORD               cbSize = SP_DEVINSTALL_PARAMS_A.sizeof;
+	DWORD               Flags;
+	DWORD               FlagsEx;
+	HWND                hwndParent;
+	PSP_FILE_CALLBACK_A InstallMsgHandler;
+	PVOID               InstallMsgHandlerContext;
+	HSPFILEQ            FileQueue;
+	ULONG_PTR           ClassInstallReserved;
+	DWORD               Reserved;
+	CHAR                DriverPath[MAX_PATH];
+}
+alias SP_DEVINSTALL_PARAMS_A* PSP_DEVINSTALL_PARAMS_A;
+
+struct SP_DEVINSTALL_PARAMS_W {
+	DWORD               cbSize = SP_DEVINSTALL_PARAMS_W.sizeof;
+	DWORD               Flags;
+	DWORD               FlagsEx;
+	HWND                hwndParent;
+	PSP_FILE_CALLBACK_W InstallMsgHandler;
+	PVOID               InstallMsgHandlerContext;
+	HSPFILEQ            FileQueue;
+	ULONG_PTR           ClassInstallReserved;
+	DWORD               Reserved;
+	WCHAR               DriverPath[MAX_PATH];
+}
+alias SP_DEVINSTALL_PARAMS_W* PSP_DEVINSTALL_PARAMS_W;
+
+struct SP_CLASSINSTALL_HEADER {
+	DWORD       cbSize = SP_CLASSINSTALL_HEADER.sizeof;
+	DI_FUNCTION InstallFunction;
+}
+alias SP_CLASSINSTALL_HEADER* PSP_CLASSINSTALL_HEADER;
+
+struct SP_ENABLECLASS_PARAMS {
+	SP_CLASSINSTALL_HEADER ClassInstallHeader;
+	GUID                   ClassGuid;
+	DWORD                  EnableMessage;
+}
+alias SP_ENABLECLASS_PARAMS* PSP_ENABLECLASS_PARAMS;
+
+struct SP_MOVEDEV_PARAMS {
+	SP_CLASSINSTALL_HEADER ClassInstallHeader;
+	SP_DEVINFO_DATA        SourceDeviceInfoData;
+}
+alias SP_MOVEDEV_PARAMS* PSP_MOVEDEV_PARAMS;
+
+struct SP_PROPCHANGE_PARAMS {
+	SP_CLASSINSTALL_HEADER ClassInstallHeader;
+	DWORD                  StateChange;
+	DWORD                  Scope;
+	DWORD                  HwProfile;
+}
+alias SP_PROPCHANGE_PARAMS* PSP_PROPCHANGE_PARAMS;
+
+struct SP_REMOVEDEVICE_PARAMS {
+	SP_CLASSINSTALL_HEADER ClassInstallHeader;
+	DWORD                  Scope;
+	DWORD                  HwProfile;
+}
+alias SP_REMOVEDEVICE_PARAMS* PSP_REMOVEDEVICE_PARAMS;
+
+struct SP_UNREMOVEDEVICE_PARAMS {
+	SP_CLASSINSTALL_HEADER ClassInstallHeader;
+	DWORD                  Scope;
+	DWORD                  HwProfile;
+}
+alias SP_UNREMOVEDEVICE_PARAMS* PSP_UNREMOVEDEVICE_PARAMS;
+
+struct SP_SELECTDEVICE_PARAMS_A {
+	SP_CLASSINSTALL_HEADER ClassInstallHeader;
+	CHAR                   Title[MAX_TITLE_LEN];
+	CHAR                   Instructions[MAX_INSTRUCTION_LEN];
+	CHAR                   ListLabel[MAX_LABEL_LEN];
+	CHAR                   SubTitle[MAX_SUBTITLE_LEN];
+	BYTE                   Reserved[2];
+}
+alias SP_SELECTDEVICE_PARAMS_A* PSP_SELECTDEVICE_PARAMS_A;
+
+struct SP_SELECTDEVICE_PARAMS_W {
+	SP_CLASSINSTALL_HEADER ClassInstallHeader;
+	WCHAR                  Title[MAX_TITLE_LEN];
+	WCHAR                  Instructions[MAX_INSTRUCTION_LEN];
+	WCHAR                  ListLabel[MAX_LABEL_LEN];
+	WCHAR                  SubTitle[MAX_SUBTITLE_LEN];
+}
+alias SP_SELECTDEVICE_PARAMS_W* PSP_SELECTDEVICE_PARAMS_W;
+
+extern(Windows) alias BOOL function(PVOID,DWORD) PDETECT_PROGRESS_NOTIFY;
+
+struct SP_DETECTDEVICE_PARAMS {
+	SP_CLASSINSTALL_HEADER  ClassInstallHeader;
+	PDETECT_PROGRESS_NOTIFY DetectProgressNotify;
+	PVOID                   ProgressNotifyParam;
+}
+alias SP_DETECTDEVICE_PARAMS* PSP_DETECTDEVICE_PARAMS;
+
+struct SP_INSTALLWIZARD_DATA {
+	SP_CLASSINSTALL_HEADER ClassInstallHeader;
+	DWORD                  Flags;
+	HPROPSHEETPAGE         DynamicPages[MAX_INSTALLWIZARD_DYNAPAGES];
+	DWORD                  NumDynamicPages;
+	DWORD                  DynamicPageFlags;
+	DWORD                  PrivateFlags;
+	LPARAM                 PrivateData;
+	HWND                   hwndWizardDlg;
+}
+alias SP_INSTALLWIZARD_DATA* PSP_INSTALLWIZARD_DATA;
+
+struct SP_NEWDEVICEWIZARD_DATA {
+	SP_CLASSINSTALL_HEADER ClassInstallHeader;
+	DWORD                  Flags;
+	HPROPSHEETPAGE         DynamicPages[MAX_INSTALLWIZARD_DYNAPAGES];
+	DWORD                  NumDynamicPages;
+	HWND                   hwndWizardDlg;
+}
+alias SP_NEWDEVICEWIZARD_DATA* PSP_NEWDEVICEWIZARD_DATA;
+alias SP_NEWDEVICEWIZARD_DATA SP_ADDPROPERTYPAGE_DATA;
+alias SP_NEWDEVICEWIZARD_DATA* PSP_ADDPROPERTYPAGE_DATA;
+
+struct SP_TROUBLESHOOTER_PARAMS_A {
+	SP_CLASSINSTALL_HEADER ClassInstallHeader;
+	CHAR                   ChmFile[MAX_PATH];
+	CHAR                   HtmlTroubleShooter[MAX_PATH];
+}
+alias SP_TROUBLESHOOTER_PARAMS_A* PSP_TROUBLESHOOTER_PARAMS_A;
+
+struct SP_TROUBLESHOOTER_PARAMS_W {
+	SP_CLASSINSTALL_HEADER ClassInstallHeader;
+	WCHAR                  ChmFile[MAX_PATH];
+	WCHAR                  HtmlTroubleShooter[MAX_PATH];
+}
+alias SP_TROUBLESHOOTER_PARAMS_W* PSP_TROUBLESHOOTER_PARAMS_W;
+
+struct SP_POWERMESSAGEWAKE_PARAMS_A {
+	SP_CLASSINSTALL_HEADER ClassInstallHeader;
+	CHAR                   PowerMessageWake[LINE_LEN*2];
+}
+alias SP_POWERMESSAGEWAKE_PARAMS_A* PSP_POWERMESSAGEWAKE_PARAMS_A;
+
+struct SP_POWERMESSAGEWAKE_PARAMS_W {
+	SP_CLASSINSTALL_HEADER ClassInstallHeader;
+	WCHAR                  PowerMessageWake[LINE_LEN*2];
+}
+alias SP_POWERMESSAGEWAKE_PARAMS_W* PSP_POWERMESSAGEWAKE_PARAMS_W;
+
+struct SP_DRVINFO_DATA_V2_A {
+	DWORD     cbSize = SP_DRVINFO_DATA_V2_A.sizeof;
+	DWORD     DriverType;
+	ULONG_PTR Reserved;
+	CHAR      Description[LINE_LEN];
+	CHAR      MfgName[LINE_LEN];
+	CHAR      ProviderName[LINE_LEN];
+	FILETIME  DriverDate;
+	DWORDLONG DriverVersion;
+}
+alias SP_DRVINFO_DATA_V2_A* PSP_DRVINFO_DATA_V2_A;
+
+struct SP_DRVINFO_DATA_V2_W {
+	DWORD     cbSize = SP_DRVINFO_DATA_V2_A.sizeof;
+	DWORD     DriverType;
+	ULONG_PTR Reserved;
+	WCHAR     Description[LINE_LEN];
+	WCHAR     MfgName[LINE_LEN];
+	WCHAR     ProviderName[LINE_LEN];
+	FILETIME  DriverDate;
+	DWORDLONG DriverVersion;
+}
+alias SP_DRVINFO_DATA_V2_W* PSP_DRVINFO_DATA_V2_W;
+
+struct SP_DRVINFO_DATA_V1_A {
+	DWORD     cbSize = SP_DRVINFO_DATA_V1_A.sizeof;
+	DWORD     DriverType;
+	ULONG_PTR Reserved;
+	CHAR      Description[LINE_LEN];
+	CHAR      MfgName[LINE_LEN];
+	CHAR      ProviderName[LINE_LEN];
+}
+alias SP_DRVINFO_DATA_V1_A* PSP_DRVINFO_DATA_V1_A;
+
+struct SP_DRVINFO_DATA_V1_W {
+	DWORD     cbSize = SP_DRVINFO_DATA_V1_W.sizeof;
+	DWORD     DriverType;
+	ULONG_PTR Reserved;
+	WCHAR     Description[LINE_LEN];
+	WCHAR     MfgName[LINE_LEN];
+	WCHAR     ProviderName[LINE_LEN];
+}
+alias SP_DRVINFO_DATA_V1_W* PSP_DRVINFO_DATA_V1_W;
+
+version (Unicode) {
+	alias SP_DRVINFO_DATA_V1_W SP_DRVINFO_DATA_V1;
+	alias SP_DRVINFO_DATA_V2_W SP_DRVINFO_DATA_V2;
+} else {
+	alias SP_DRVINFO_DATA_V1_A SP_DRVINFO_DATA_V1;
+	alias SP_DRVINFO_DATA_V2_A SP_DRVINFO_DATA_V2;
+}
+alias SP_DRVINFO_DATA_V1* PSP_DRVINFO_DATA_V1;
+alias SP_DRVINFO_DATA_V2* PSP_DRVINFO_DATA_V2;
+
+static if(USE_SP_DRVINFO_DATA_V1) {
+	alias SP_DRVINFO_DATA_V1_A SP_DRVINFO_DATA_A;
+	alias SP_DRVINFO_DATA_V1_A* PSP_DRVINFO_DATA_A;
+	alias SP_DRVINFO_DATA_V1_W SP_DRVINFO_DATA_W;
+	alias SP_DRVINFO_DATA_V1_W* PSP_DRVINFO_DATA_W;
+	alias SP_DRVINFO_DATA_V1 SP_DRVINFO_DATA;
+	alias SP_DRVINFO_DATA_V1* PSP_DRVINFO_DATA;
+} else {
+	alias SP_DRVINFO_DATA_V2_A SP_DRVINFO_DATA_A;
+	alias SP_DRVINFO_DATA_V2_A* PSP_DRVINFO_DATA_A;
+	alias SP_DRVINFO_DATA_V2_W SP_DRVINFO_DATA_W;
+	alias SP_DRVINFO_DATA_V2_W* PSP_DRVINFO_DATA_W;
+	alias SP_DRVINFO_DATA_V2 SP_DRVINFO_DATA;
+	alias SP_DRVINFO_DATA_V2* PSP_DRVINFO_DATA;
+}
+
+extern(Windows) alias DWORD function(HDEVINFO,PSP_DEVINFO_DATA,PSP_DEVINFO_DATA,PVOID) PSP_DETSIG_CMPPROC;
+
+struct SP_DRVINFO_DETAIL_DATA_A {
+	DWORD     cbSize = SP_DRVINFO_DETAIL_DATA_A.sizeof;
+	FILETIME  InfDate;
+	DWORD     CompatIDsOffset;
+	DWORD     CompatIDsLength;
+	ULONG_PTR Reserved;
+	CHAR      SectionName[LINE_LEN];
+	CHAR      InfFileName[MAX_PATH];
+	CHAR      DrvDescription[LINE_LEN];
+	CHAR      _HardwareID[1];
+	CHAR*     HardwareID() { return _HardwareID.ptr; }
+}
+alias SP_DRVINFO_DETAIL_DATA_A* PSP_DRVINFO_DETAIL_DATA_A;
+
+struct SP_DRVINFO_DETAIL_DATA_W {
+	DWORD     cbSize = SP_DRVINFO_DETAIL_DATA_W.sizeof;
+	FILETIME  InfDate;
+	DWORD     CompatIDsOffset;
+	DWORD     CompatIDsLength;
+	ULONG_PTR Reserved;
+	WCHAR     SectionName[LINE_LEN];
+	WCHAR     InfFileName[MAX_PATH];
+	WCHAR     DrvDescription[LINE_LEN];
+	WCHAR     _HardwareID[1];
+	WCHAR*    HardwareID() { return _HardwareID.ptr; }
+}
+alias SP_DRVINFO_DETAIL_DATA_W* PSP_DRVINFO_DETAIL_DATA_W;
+
+struct SP_DRVINSTALL_PARAMS {
+	DWORD cbSize = SP_DRVINSTALL_PARAMS.sizeof;
+	DWORD Rank;
+	DWORD Flags;
+	DWORD_PTR PrivateData;
+	DWORD Reserved;
+}
+alias SP_DRVINSTALL_PARAMS* PSP_DRVINSTALL_PARAMS;
+
+struct COINSTALLER_CONTEXT_DATA {
+	BOOL  PostProcessing;
+	DWORD InstallResult;
+	PVOID PrivateData;
+}
+alias COINSTALLER_CONTEXT_DATA* PCOINSTALLER_CONTEXT_DATA;
+
+struct SP_CLASSIMAGELIST_DATA {
+	DWORD      cbSize = SP_CLASSIMAGELIST_DATA.sizeof;
+	HIMAGELIST ImageList;
+	ULONG_PTR  Reserved;
+}
+alias SP_CLASSIMAGELIST_DATA* PSP_CLASSIMAGELIST_DATA;
+
+struct SP_PROPSHEETPAGE_REQUEST {
+	DWORD            cbSize = SP_PROPSHEETPAGE_REQUEST.sizeof;
+	DWORD            PageRequested;
+	HDEVINFO         DeviceInfoSet;
+	PSP_DEVINFO_DATA DeviceInfoData;
+}
+alias SP_PROPSHEETPAGE_REQUEST* PSP_PROPSHEETPAGE_REQUEST;
+
+struct SP_BACKUP_QUEUE_PARAMS_A {
+	DWORD cbSize = SP_BACKUP_QUEUE_PARAMS_A.sizeof;
+	CHAR  FullInfPath[MAX_PATH];
+	INT   FilenameOffset;
+}
+alias SP_BACKUP_QUEUE_PARAMS_A* PSP_BACKUP_QUEUE_PARAMS_A;
+
+struct SP_BACKUP_QUEUE_PARAMS_W {
+	DWORD cbSize = SP_BACKUP_QUEUE_PARAMS_W.sizeof;
+	WCHAR FullInfPath[MAX_PATH];
+	INT   FilenameOffset;
+}
+alias SP_BACKUP_QUEUE_PARAMS_W* PSP_BACKUP_QUEUE_PARAMS_W;
+
+version (Unicode) {
+	alias SP_ORIGINAL_FILE_INFO_W SP_ORIGINAL_FILE_INFO;
+	alias SP_ORIGINAL_FILE_INFO_W* PSP_ORIGINAL_FILE_INFO;
+	alias FILEPATHS_W FILEPATHS;
+	alias FILEPATHS_W* PFILEPATHS;
+	alias SOURCE_MEDIA_W SOURCE_MEDIA;
+	alias SOURCE_MEDIA_W* PSOURCE_MEDIA;
+	alias CABINET_INFO_W CABINET_INFO;
+	alias CABINET_INFO_W* PCABINET_INFO;
+	alias FILE_IN_CABINET_INFO_W FILE_IN_CABINET_INFO;
+	alias FILE_IN_CABINET_INFO_W* PFILE_IN_CABINET_INFO;
+	alias SP_FILE_COPY_PARAMS_W SP_FILE_COPY_PARAMS;
+	alias SP_FILE_COPY_PARAMS_W* PSP_FILE_COPY_PARAMS;
+	alias SP_DEVICE_INTERFACE_DETAIL_DATA_W SP_DEVICE_INTERFACE_DETAIL_DATA;
+	alias SP_DEVICE_INTERFACE_DETAIL_DATA_W* PSP_DEVICE_INTERFACE_DETAIL_DATA;
+	deprecated {
+		alias SP_DEVICE_INTERFACE_DETAIL_DATA_W SP_INTERFACE_DEVICE_DETAIL_DATA;
+		alias SP_DEVICE_INTERFACE_DETAIL_DATA_W* PSP_INTERFACE_DEVICE_DETAIL_DATA;
+	}
+	alias SP_DEVINFO_LIST_DETAIL_DATA_W SP_DEVINFO_LIST_DETAIL_DATA;
+	alias SP_DEVINFO_LIST_DETAIL_DATA_W *PSP_DEVINFO_LIST_DETAIL_DATA;
+	alias SP_DEVINSTALL_PARAMS_W SP_DEVINSTALL_PARAMS;
+	alias SP_DEVINSTALL_PARAMS_W* PSP_DEVINSTALL_PARAMS;
+	alias SP_SELECTDEVICE_PARAMS_W SP_SELECTDEVICE_PARAMS;
+	alias SP_SELECTDEVICE_PARAMS_W* PSP_SELECTDEVICE_PARAMS;
+	alias SP_TROUBLESHOOTER_PARAMS_W SP_TROUBLESHOOTER_PARAMS;
+	alias SP_TROUBLESHOOTER_PARAMS_W* PSP_TROUBLESHOOTER_PARAMS;
+	alias SP_POWERMESSAGEWAKE_PARAMS_W SP_POWERMESSAGEWAKE_PARAMS;
+	alias SP_POWERMESSAGEWAKE_PARAMS_W* PSP_POWERMESSAGEWAKE_PARAMS;
+	alias SP_DRVINFO_DETAIL_DATA_W SP_DRVINFO_DETAIL_DATA;
+	alias SP_DRVINFO_DETAIL_DATA_W* PSP_DRVINFO_DETAIL_DATA;
+	alias SP_BACKUP_QUEUE_PARAMS_W SP_BACKUP_QUEUE_PARAMS;
+	alias SP_BACKUP_QUEUE_PARAMS_W* PSP_BACKUP_QUEUE_PARAMS;
+} else {
+	alias SP_ORIGINAL_FILE_INFO_A SP_ORIGINAL_FILE_INFO;
+	alias SP_ORIGINAL_FILE_INFO_A* PSP_ORIGINAL_FILE_INFO;
+	alias FILEPATHS_A FILEPATHS;
+	alias FILEPATHS_A* PFILEPATHS;
+	alias SOURCE_MEDIA_A SOURCE_MEDIA;
+	alias SOURCE_MEDIA_A* PSOURCE_MEDIA;
+	alias CABINET_INFO_A CABINET_INFO;
+	alias CABINET_INFO_A* PCABINET_INFO;
+	alias FILE_IN_CABINET_INFO_A FILE_IN_CABINET_INFO;
+	alias FILE_IN_CABINET_INFO_A* PFILE_IN_CABINET_INFO;
+	alias SP_FILE_COPY_PARAMS_A SP_FILE_COPY_PARAMS;
+	alias SP_FILE_COPY_PARAMS_A* PSP_FILE_COPY_PARAMS;
+	alias SP_DEVICE_INTERFACE_DETAIL_DATA_A SP_DEVICE_INTERFACE_DETAIL_DATA;
+	alias SP_DEVICE_INTERFACE_DETAIL_DATA_A* PSP_DEVICE_INTERFACE_DETAIL_DATA;
+	deprecated {
+		alias SP_DEVICE_INTERFACE_DETAIL_DATA_A SP_INTERFACE_DEVICE_DETAIL_DATA;
+		alias SP_DEVICE_INTERFACE_DETAIL_DATA_A* PSP_INTERFACE_DEVICE_DETAIL_DATA;
+	}
+	alias SP_DEVINFO_LIST_DETAIL_DATA_A SP_DEVINFO_LIST_DETAIL_DATA;
+	alias SP_DEVINFO_LIST_DETAIL_DATA_A* PSP_DEVINFO_LIST_DETAIL_DATA;
+	alias SP_DEVINSTALL_PARAMS_A SP_DEVINSTALL_PARAMS;
+	alias SP_DEVINSTALL_PARAMS_A* PSP_DEVINSTALL_PARAMS;
+	alias SP_SELECTDEVICE_PARAMS_A SP_SELECTDEVICE_PARAMS;
+	alias SP_SELECTDEVICE_PARAMS_A* PSP_SELECTDEVICE_PARAMS;
+	alias SP_TROUBLESHOOTER_PARAMS_A SP_TROUBLESHOOTER_PARAMS;
+	alias SP_TROUBLESHOOTER_PARAMS_A* PSP_TROUBLESHOOTER_PARAMS;
+	alias SP_POWERMESSAGEWAKE_PARAMS_A SP_POWERMESSAGEWAKE_PARAMS;
+	alias SP_POWERMESSAGEWAKE_PARAMS_A* PSP_POWERMESSAGEWAKE_PARAMS;
+	alias SP_DRVINFO_DETAIL_DATA_A SP_DRVINFO_DETAIL_DATA;
+	alias SP_DRVINFO_DETAIL_DATA_A* PSP_DRVINFO_DETAIL_DATA;
+	alias SP_BACKUP_QUEUE_PARAMS_A SP_BACKUP_QUEUE_PARAMS;
+	alias SP_BACKUP_QUEUE_PARAMS_A* PSP_BACKUP_QUEUE_PARAMS;
+}
+
+extern (Windows) {
+	BOOL SetupAddInstallSectionToDiskSpaceListA(HDSKSPC,HINF,HINF,PCSTR,PVOID,UINT);
+	BOOL SetupAddInstallSectionToDiskSpaceListW(HDSKSPC,HINF,HINF,PCWSTR,PVOID,UINT);
+	BOOL SetupAddSectionToDiskSpaceListA(HDSKSPC,HINF,HINF,PCSTR,UINT,PVOID,UINT);
+	BOOL SetupAddSectionToDiskSpaceListW(HDSKSPC,HINF,HINF,PCWSTR,UINT,PVOID,UINT);
+	BOOL SetupAddToDiskSpaceListA(HDSKSPC,PCSTR,LONGLONG,UINT,PVOID,UINT);
+	BOOL SetupAddToDiskSpaceListW(HDSKSPC,PCWSTR,LONGLONG,UINT,PVOID,UINT);
+	BOOL SetupAddToSourceListA(DWORD,PCSTR);
+	BOOL SetupAddToSourceListW(DWORD,PCWSTR);
+	BOOL SetupQuerySourceListA(DWORD,PCSTR**List,PUINT);
+	BOOL SetupQuerySourceListW(DWORD,PCWSTR**List,PUINT);
+	BOOL SetupFreeSourceListA(PCSTR**List,UINT);
+	BOOL SetupFreeSourceListW(PCWSTR**List,UINT);
+	BOOL SetupAdjustDiskSpaceListA(HDSKSPC,LPCSTR,LONGLONG,PVOID,UINT);
+	BOOL SetupAdjustDiskSpaceListW(HDSKSPC,LPCWSTR,LONGLONG,PVOID,UINT);
+	UINT SetupBackupErrorA(HWND,PCSTR,PCSTR,PCSTR,UINT,DWORD);
+	UINT SetupBackupErrorW(HWND,PCWSTR,PCWSTR,PCWSTR,UINT,DWORD);
+	BOOL SetupCancelTemporary();
+	BOOL SetupCloseFileQueue(HSPFILEQ);
+	VOID SetupCloseInfFile(HINF);
+	VOID SetupCloseLog();
+	BOOL SetupCommitFileQueueA(HWND,HSPFILEQ,PSP_FILE_CALLBACK_A,PVOID);
+	BOOL SetupCommitFileQueueW(HWND,HSPFILEQ,PSP_FILE_CALLBACK_W,PVOID);
+	UINT SetupCopyErrorA(HWND,PCSTR,PCSTR,PCSTR,PCSTR,PCSTR,UINT,DWORD,PSTR,DWORD,PDWORD);
+	UINT SetupCopyErrorW(HWND,PCWSTR,PCWSTR,PCWSTR,PCWSTR,PCWSTR,UINT,DWORD,PWSTR,DWORD,PDWORD);
+	BOOL SetupCopyOEMInfA(PCSTR,PCSTR,DWORD,DWORD,PSTR,DWORD,PDWORD,PSTR*);
+	BOOL SetupCopyOEMInfW(PCWSTR,PCWSTR,DWORD,DWORD,PWSTR,DWORD,PDWORD,PWSTR*);
+	HDSKSPC SetupCreateDiskSpaceListA(PVOID,DWORD,UINT);
+	HDSKSPC SetupCreateDiskSpaceListW(PVOID,DWORD,UINT);
+	DWORD SetupDecompressOrCopyFileA(PCSTR,PCSTR,PUINT);
+	DWORD SetupDecompressOrCopyFileW(PCWSTR,PCWSTR,PUINT);
+	UINT SetupDefaultQueueCallbackA(PVOID,UINT,UINT_PTR,UINT_PTR);
+	UINT SetupDefaultQueueCallbackW(PVOID,UINT,UINT_PTR,UINT_PTR);
+	UINT SetupDeleteErrorA(HWND,PCSTR,PCSTR,UINT,DWORD);
+	UINT SetupDeleteErrorW(HWND,PCWSTR,PCWSTR,UINT,DWORD);
+	BOOL SetupDestroyDiskSpaceList(HDSKSPC);
+	BOOL SetupDiAskForOEMDisk(HDEVINFO,PSP_DEVINFO_DATA);
+	BOOL SetupDiBuildClassInfoList(DWORD,LPGUID,DWORD,PDWORD);
+	BOOL SetupDiBuildClassInfoListExA(DWORD,LPGUID,DWORD,PDWORD,PCSTR,PVOID);
+	BOOL SetupDiBuildClassInfoListExW(DWORD,LPGUID,DWORD,PDWORD,PCWSTR,PVOID);
+	BOOL SetupDiBuildDriverInfoList(HDEVINFO,PSP_DEVINFO_DATA,DWORD);
+	BOOL SetupDiCallClassInstaller(DI_FUNCTION,HDEVINFO,PSP_DEVINFO_DATA);
+	BOOL SetupDiCancelDriverInfoSearch(HDEVINFO);
+	BOOL SetupDiChangeState(HDEVINFO,PSP_DEVINFO_DATA);
+	BOOL SetupDiClassGuidsFromNameA(PCSTR,LPGUID,DWORD,PDWORD);
+	BOOL SetupDiClassGuidsFromNameW(PCWSTR,LPGUID,DWORD,PDWORD);
+	BOOL SetupDiClassGuidsFromNameExA(PCSTR,LPGUID,DWORD,PDWORD,PCSTR,PVOID);
+	BOOL SetupDiClassGuidsFromNameExW(PCWSTR,LPGUID,DWORD,PDWORD,PCWSTR,PVOID);
+	BOOL SetupDiClassNameFromGuidA(GUID*,PSTR,DWORD,PDWORD);
+	BOOL SetupDiClassNameFromGuidW(GUID*,PWSTR,DWORD,PDWORD);
+	BOOL SetupDiClassNameFromGuidExA(GUID*,PSTR,DWORD,PDWORD,PCSTR,PVOID);
+	BOOL SetupDiClassNameFromGuidExW(GUID*,PWSTR,DWORD,PDWORD,PCWSTR,PVOID);
+	BOOL SetupDiCreateDeviceInfoA(HDEVINFO,PCSTR,GUID*,PCSTR,HWND,DWORD,PSP_DEVINFO_DATA);
+	BOOL SetupDiCreateDeviceInfoW(HDEVINFO,PCWSTR,GUID*,PCWSTR,HWND,DWORD,PSP_DEVINFO_DATA);
+	HDEVINFO SetupDiCreateDeviceInfoList(GUID*,HWND);
+	HDEVINFO SetupDiCreateDeviceInfoListExA(GUID*,HWND,PCSTR,PVOID);
+	HDEVINFO SetupDiCreateDeviceInfoListExW(GUID*,HWND,PCWSTR,PVOID);
+	BOOL SetupDiCreateDeviceInterfaceA(HDEVINFO,PSP_DEVINFO_DATA,GUID*,PCSTR,DWORD,PSP_DEVICE_INTERFACE_DATA);
+	BOOL SetupDiCreateDeviceInterfaceW(HDEVINFO,PSP_DEVINFO_DATA,GUID*,PCWSTR,DWORD,PSP_DEVICE_INTERFACE_DATA);
+	HKEY SetupDiCreateDeviceInterfaceRegKeyA(HDEVINFO,PSP_DEVICE_INTERFACE_DATA,DWORD,REGSAM,HINF,PCSTR);
+	HKEY SetupDiCreateDeviceInterfaceRegKeyW(HDEVINFO,PSP_DEVICE_INTERFACE_DATA,DWORD,REGSAM,HINF,PCWSTR);
+	HKEY SetupDiCreateDevRegKeyA(HDEVINFO,PSP_DEVINFO_DATA,DWORD,DWORD,DWORD,HINF,PCSTR);
+	HKEY SetupDiCreateDevRegKeyW(HDEVINFO,PSP_DEVINFO_DATA,DWORD,DWORD,DWORD,HINF,PCWSTR);
+	BOOL SetupDiDeleteDeviceInfo(HDEVINFO,PSP_DEVINFO_DATA);
+	BOOL SetupDiDeleteDeviceInterfaceData(HDEVINFO,PSP_DEVICE_INTERFACE_DATA);
+	BOOL SetupDiDeleteDeviceInterfaceRegKey(HDEVINFO,PSP_DEVICE_INTERFACE_DATA,DWORD);
+	BOOL SetupDiDeleteDevRegKey(HDEVINFO,PSP_DEVINFO_DATA,DWORD,DWORD,DWORD);
+	BOOL SetupDiDestroyClassImageList(PSP_CLASSIMAGELIST_DATA);
+	BOOL SetupDiDestroyDeviceInfoList(HDEVINFO);
+	BOOL SetupDiDestroyDriverInfoList(HDEVINFO,PSP_DEVINFO_DATA,DWORD);
+	INT SetupDiDrawMiniIcon(HDC,RECT,INT,DWORD);
+	BOOL SetupDiEnumDeviceInfo(HDEVINFO,DWORD,PSP_DEVINFO_DATA);
+	BOOL SetupDiEnumDeviceInterfaces(HDEVINFO,PSP_DEVINFO_DATA,GUID*,DWORD,PSP_DEVICE_INTERFACE_DATA);
+	BOOL SetupDiEnumDriverInfoA(HDEVINFO,PSP_DEVINFO_DATA,DWORD,DWORD,PSP_DRVINFO_DATA_A);
+	BOOL SetupDiEnumDriverInfoW(HDEVINFO,PSP_DEVINFO_DATA,DWORD,DWORD,PSP_DRVINFO_DATA_W);
+	BOOL SetupDiGetActualSectionToInstallA(HINF,PCSTR,PSTR,DWORD,PDWORD,PSTR*);
+	BOOL SetupDiGetActualSectionToInstallW(HINF,PCWSTR,PWSTR,DWORD,PDWORD,PWSTR*);
+	BOOL SetupDiGetClassBitmapIndex(GUID*,PINT);
+	BOOL SetupDiGetClassDescriptionA(GUID*,PSTR,DWORD,PDWORD);
+	BOOL SetupDiGetClassDescriptionW(GUID*,PWSTR,DWORD,PDWORD);
+	BOOL SetupDiGetClassDescriptionExA(GUID*,PSTR,DWORD,PDWORD,PCSTR,PVOID);
+	BOOL SetupDiGetClassDescriptionExW(GUID*,PWSTR,DWORD,PDWORD,PCWSTR,PVOID);
+	BOOL SetupDiGetClassDevPropertySheetsA(HDEVINFO,PSP_DEVINFO_DATA,LPPROPSHEETHEADERA,DWORD,PDWORD,DWORD);
+	BOOL SetupDiGetClassDevPropertySheetsW(HDEVINFO,PSP_DEVINFO_DATA,LPPROPSHEETHEADERW,DWORD,PDWORD,DWORD);
+	HDEVINFO SetupDiGetClassDevsA(GUID*,PCSTR,HWND,DWORD);
+	HDEVINFO SetupDiGetClassDevsW(GUID*,PCWSTR,HWND,DWORD);
+	HDEVINFO SetupDiGetClassDevsExA(GUID*,PCSTR,HWND,DWORD,HDEVINFO,PCSTR,PVOID);
+	HDEVINFO SetupDiGetClassDevsExW(GUID*,PCWSTR,HWND,DWORD,HDEVINFO,PCWSTR,PVOID);
+	BOOL SetupDiGetClassImageIndex(PSP_CLASSIMAGELIST_DATA,GUID*,PINT);
+	BOOL SetupDiGetClassImageList(PSP_CLASSIMAGELIST_DATA);
+	BOOL SetupDiGetClassImageListExA(PSP_CLASSIMAGELIST_DATA,PCSTR,PVOID);
+	BOOL SetupDiGetClassImageListExW(PSP_CLASSIMAGELIST_DATA,PCWSTR,PVOID);
+	BOOL SetupDiGetClassInstallParamsA(HDEVINFO,PSP_DEVINFO_DATA,PSP_CLASSINSTALL_HEADER,DWORD,PDWORD);
+	BOOL SetupDiGetClassInstallParamsW(HDEVINFO,PSP_DEVINFO_DATA,PSP_CLASSINSTALL_HEADER,DWORD,PDWORD);
+	BOOL SetupDiGetClassRegistryPropertyA(LPGUID,DWORD,PDWORD,PBYTE,DWORD,PDWORD,PCSTR,PVOID);
+	BOOL SetupDiGetClassRegistryPropertyW(LPGUID,DWORD,PDWORD,PBYTE,DWORD,PDWORD,PCWSTR,PVOID);
+	BOOL SetupDiGetDeviceInfoListClass(HDEVINFO,LPGUID);
+	BOOL SetupDiGetDeviceInfoListDetailA(HDEVINFO,PSP_DEVINFO_LIST_DETAIL_DATA_A);
+	BOOL SetupDiGetDeviceInfoListDetailW(HDEVINFO,PSP_DEVINFO_LIST_DETAIL_DATA_W);
+	BOOL SetupDiGetDeviceInstallParamsA(HDEVINFO,PSP_DEVINFO_DATA,PSP_DEVINSTALL_PARAMS_A);
+	BOOL SetupDiGetDeviceInstallParamsW(HDEVINFO,PSP_DEVINFO_DATA,PSP_DEVINSTALL_PARAMS_W);
+	BOOL SetupDiGetDeviceInstanceIdA(HDEVINFO,PSP_DEVINFO_DATA,PSTR,DWORD,PDWORD);
+	BOOL SetupDiGetDeviceInstanceIdW(HDEVINFO,PSP_DEVINFO_DATA,PWSTR,DWORD,PDWORD);
+	BOOL SetupDiGetDeviceInterfaceAlias(HDEVINFO,PSP_DEVICE_INTERFACE_DATA,GUID*,PSP_DEVICE_INTERFACE_DATA);
+	BOOL SetupDiGetDeviceInterfaceDetailA(HDEVINFO,PSP_DEVICE_INTERFACE_DATA,PSP_DEVICE_INTERFACE_DETAIL_DATA_A,DWORD,PDWORD,PSP_DEVINFO_DATA);
+	BOOL SetupDiGetDeviceInterfaceDetailW(HDEVINFO,PSP_DEVICE_INTERFACE_DATA,PSP_DEVICE_INTERFACE_DETAIL_DATA_W,DWORD,PDWORD,PSP_DEVINFO_DATA);
+	BOOL SetupDiGetDeviceRegistryPropertyA(HDEVINFO,PSP_DEVINFO_DATA,DWORD,PDWORD,PBYTE,DWORD,PDWORD);
+	BOOL SetupDiGetDeviceRegistryPropertyW(HDEVINFO,PSP_DEVINFO_DATA,DWORD,PDWORD,PBYTE,DWORD,PDWORD);
+	BOOL SetupDiGetDriverInfoDetailA(HDEVINFO,PSP_DEVINFO_DATA,PSP_DRVINFO_DATA_A,PSP_DRVINFO_DETAIL_DATA_A,DWORD,PDWORD);
+	BOOL SetupDiGetDriverInfoDetailW(HDEVINFO,PSP_DEVINFO_DATA,PSP_DRVINFO_DATA_W,PSP_DRVINFO_DETAIL_DATA_W,DWORD,PDWORD);
+	BOOL SetupDiGetDriverInstallParamsA(HDEVINFO,PSP_DEVINFO_DATA,PSP_DRVINFO_DATA_A,PSP_DRVINSTALL_PARAMS);
+	BOOL SetupDiGetDriverInstallParamsW(HDEVINFO,PSP_DEVINFO_DATA,PSP_DRVINFO_DATA_W,PSP_DRVINSTALL_PARAMS);
+	BOOL SetupDiGetHwProfileFriendlyNameA(DWORD,PSTR,DWORD,PDWORD);
+	BOOL SetupDiGetHwProfileFriendlyNameExA(DWORD,PSTR,DWORD,PDWORD,PCSTR,PVOID);
+	BOOL SetupDiGetHwProfileFriendlyNameExW(DWORD,PWSTR,DWORD,PDWORD,PCWSTR,PVOID);
+	BOOL SetupDiGetHwProfileFriendlyNameW(DWORD,PWSTR,DWORD,PDWORD);
+	BOOL SetupDiGetHwProfileList(PDWORD,DWORD,PDWORD,PDWORD);
+	BOOL SetupDiGetHwProfileListExA(PDWORD,DWORD,PDWORD,PDWORD,PCSTR,PVOID);
+	BOOL SetupDiGetHwProfileListExW(PDWORD,DWORD,PDWORD,PDWORD,PCWSTR,PVOID);
+	BOOL SetupDiGetINFClassA(PCSTR,LPGUID,PSTR,DWORD,PDWORD);
+	BOOL SetupDiGetINFClassW(PCWSTR,LPGUID,PWSTR,DWORD,PDWORD);
+	BOOL SetupDiGetSelectedDevice(HDEVINFO,PSP_DEVINFO_DATA);
+	BOOL SetupDiGetSelectedDriverA(HDEVINFO,PSP_DEVINFO_DATA,PSP_DRVINFO_DATA_A);
+	BOOL SetupDiGetSelectedDriverW(HDEVINFO,PSP_DEVINFO_DATA,PSP_DRVINFO_DATA_W);
+	HPROPSHEETPAGE SetupDiGetWizardage(HDEVINFO,PSP_DEVINFO_DATA,PSP_INSTALLWIZARD_DATA,DWORD,DWORD);
+	BOOL SetupDiInstallClassA(HWND,PCSTR,DWORD,HSPFILEQ);
+	BOOL SetupDiInstallClassW(HWND,PCWSTR,DWORD,HSPFILEQ);
+	BOOL SetupDiInstallClassExA(HWND,PCSTR,DWORD,HSPFILEQ,GUID*,PVOID,PVOID);
+	BOOL SetupDiInstallClassExW(HWND,PCWSTR,DWORD,HSPFILEQ,GUID*,PVOID,PVOID);
+	BOOL SetupDiInstallDevice(HDEVINFO,PSP_DEVINFO_DATA);
+	BOOL SetupDiInstallDeviceInterfaces(HDEVINFO,PSP_DEVINFO_DATA);
+	BOOL SetupDiInstallDriverFiles(HDEVINFO,PSP_DEVINFO_DATA);
+	BOOL SetupDiLoadClassIcon(GUID*,HICON*,PINT);
+	BOOL SetupDiMoveDuplicateDevice(HDEVINFO,PSP_DEVINFO_DATA);
+	HKEY SetupDiOpenClassRegKey(GUID*,REGSAM);
+	HKEY SetupDiOpenClassRegKeyExA(GUID*,REGSAM,DWORD,PCSTR,PVOID);
+	HKEY SetupDiOpenClassRegKeyExW(GUID*,REGSAM,DWORD,PCWSTR,PVOID);
+	BOOL SetupDiOpenDeviceInfoA(HDEVINFO,PCSTR,HWND,DWORD,PSP_DEVINFO_DATA);
+	BOOL SetupDiOpenDeviceInfoW(HDEVINFO,PCWSTR,HWND,DWORD,PSP_DEVINFO_DATA);
+	BOOL SetupDiOpenDeviceInterfaceA(HDEVINFO,PCSTR,DWORD,PSP_DEVICE_INTERFACE_DATA);
+	BOOL SetupDiOpenDeviceInterfaceW(HDEVINFO,PCWSTR,DWORD,PSP_DEVICE_INTERFACE_DATA);
+	HKEY SetupDiOpenDeviceInterfaceRegKey(HDEVINFO,PSP_DEVICE_INTERFACE_DATA,DWORD,REGSAM);
+	HKEY SetupDiOpenDevRegKey(HDEVINFO,PSP_DEVINFO_DATA,DWORD,DWORD,DWORD,REGSAM);
+	BOOL SetupDiRegisterCoDeviceInstallers(HDEVINFO,PSP_DEVINFO_DATA);
+	BOOL SetupDiRegisterDeviceInfo(HDEVINFO,PSP_DEVINFO_DATA,DWORD,PSP_DETSIG_CMPPROC,PVOID,PSP_DEVINFO_DATA);
+	BOOL SetupDiRemoveDevice(HDEVINFO,PSP_DEVINFO_DATA);
+	BOOL SetupDiRemoveDeviceInterface(HDEVINFO,PSP_DEVICE_INTERFACE_DATA);
+	BOOL SetupDiSelectBestCompatDrv(HDEVINFO,PSP_DEVINFO_DATA);
+	BOOL SetupDiSelectDevice(HDEVINFO,PSP_DEVINFO_DATA);
+	BOOL SetupDiSelectOEMDrv(HWND,HDEVINFO,PSP_DEVINFO_DATA);
+	BOOL SetupDiSetClassInstallParamsA(HDEVINFO,PSP_DEVINFO_DATA,PSP_CLASSINSTALL_HEADER,DWORD);
+	BOOL SetupDiSetClassInstallParamsW(HDEVINFO,PSP_DEVINFO_DATA,PSP_CLASSINSTALL_HEADER,DWORD);
+	BOOL SetupDiSetClassRegistryPropertyA(LPGUID,DWORD,BYTE*,DWORD,PCSTR,PVOID);
+	BOOL SetupDiSetClassRegistryPropertyW(LPGUID,DWORD,BYTE*,DWORD,PCWSTR,PVOID);
+	BOOL SetupDiSetDeviceInstallParamsA(HDEVINFO,PSP_DEVINFO_DATA,PSP_DEVINSTALL_PARAMS_A);
+	BOOL SetupDiSetDeviceInstallParamsW(HDEVINFO,PSP_DEVINFO_DATA,PSP_DEVINSTALL_PARAMS_W);
+	BOOL SetupDiSetDeviceRegistryPropertyA(HDEVINFO,PSP_DEVINFO_DATA,DWORD,BYTE*,DWORD);
+	BOOL SetupDiSetDeviceRegistryPropertyW(HDEVINFO,PSP_DEVINFO_DATA,DWORD,BYTE*,DWORD);
+	BOOL SetupDiSetDriverInstallParamsA(HDEVINFO,PSP_DEVINFO_DATA,PSP_DRVINFO_DATA_A,PSP_DRVINSTALL_PARAMS);
+	BOOL SetupDiSetDriverInstallParamsW(HDEVINFO,PSP_DEVINFO_DATA,PSP_DRVINFO_DATA_W,PSP_DRVINSTALL_PARAMS);
+	BOOL SetupDiSetSelectedDevice(HDEVINFO,PSP_DEVINFO_DATA);
+	BOOL SetupDiSetSelectedDriverA(HDEVINFO,PSP_DEVINFO_DATA,PSP_DRVINFO_DATA_A);
+	BOOL SetupDiSetSelectedDriverW(HDEVINFO,PSP_DEVINFO_DATA,PSP_DRVINFO_DATA_W);
+	BOOL SetupDiUnremoveDevice(HDEVINFO,PSP_DEVINFO_DATA);
+	HDSKSPC SetupDuplicateDiskSpaceListA(HDSKSPC,PVOID,DWORD,UINT);
+	HDSKSPC SetupDuplicateDiskSpaceListW(HDSKSPC,PVOID,DWORD,UINT);
+	BOOL SetupFindFirstLineA(HINF,PCSTR,PCSTR,PINFCONTEXT);
+	BOOL SetupFindFirstLineW(HINF,PCWSTR,PCWSTR,PINFCONTEXT);
+	BOOL SetupFindNextLine(PINFCONTEXT,PINFCONTEXT);
+	BOOL SetupFindNextMatchLineA(PINFCONTEXT,PCSTR,PINFCONTEXT);
+	BOOL SetupFindNextMatchLineW(PINFCONTEXT,PCWSTR,PINFCONTEXT);
+	BOOL SetupFreeA(PCSTR**,UINT);
+	BOOL SetupFreeW(PCWSTR**,UINT);
+	BOOL SetupGetBackupInformationA(HSPFILEQ,PSP_BACKUP_QUEUE_PARAMS_A);
+	BOOL SetupGetBackupInformationW(HSPFILEQ,PSP_BACKUP_QUEUE_PARAMS_W);
+	BOOL SetupGetBinaryField(PINFCONTEXT,DWORD,PBYTE,DWORD,LPDWORD);
+	DWORD SetupGetFieldCount(PINFCONTEXT);
+	DWORD SetupGetFileCompressionInfoA(PCSTR,PSTR*,PDWORD,PDWORD,PUINT);
+	DWORD SetupGetFileCompressionInfoW(PCWSTR,PWSTR*,PDWORD,PDWORD,PUINT);
+	BOOL SetupGetInfFileListA(PCSTR,DWORD,PSTR,DWORD,PDWORD);
+	BOOL SetupGetInfFileListW(PCWSTR,DWORD,PWSTR,DWORD,PDWORD);
+	BOOL SetupGetInfInformationA(LPCVOID,DWORD,PSP_INF_INFORMATION,DWORD,PDWORD);
+	BOOL SetupGetInfInformationW(LPCVOID,DWORD,PSP_INF_INFORMATION,DWORD,PDWORD);
+	BOOL SetupGetIntField(PINFCONTEXT,DWORD,PINT);
+	BOOL SetupGetLineByIndexA(HINF,PCSTR,DWORD,PINFCONTEXT);
+	BOOL SetupGetLineByIndexW(HINF,PCWSTR,DWORD,PINFCONTEXT);
+	LONG SetupGetLineCountA(HINF,PCSTR);
+	LONG SetupGetLineCountW(HINF,PCWSTR);
+	BOOL SetupGetLineTextA(PINFCONTEXT,HINF,PCSTR,PCSTR,PSTR,DWORD,PDWORD);
+	BOOL SetupGetLineTextW(PINFCONTEXT,HINF,PCWSTR,PCWSTR,PWSTR,DWORD,PDWORD);
+	BOOL SetupGetMultiSzFieldA(PINFCONTEXT,DWORD,PSTR,DWORD,LPDWORD);
+	BOOL SetupGetMultiSzFieldW(PINFCONTEXT,DWORD,PWSTR,DWORD,LPDWORD);
+	BOOL SetupGetSourceFileLocationA(HINF,PINFCONTEXT,PCSTR,PUINT,PSTR,DWORD,PDWORD);
+	BOOL SetupGetSourceFileLocationW(HINF,PINFCONTEXT,PCWSTR,PUINT,PWSTR,DWORD,PDWORD);
+	BOOL SetupGetSourceFileSizeA(HINF,PINFCONTEXT,PCSTR,PCSTR,PDWORD,UINT);
+	BOOL SetupGetSourceFileSizeW(HINF,PINFCONTEXT,PCWSTR,PCWSTR,PDWORD,UINT);
+	BOOL SetupGetSourceInfoA(HINF,UINT,UINT,PSTR,DWORD,PDWORD);
+	BOOL SetupGetSourceInfoW(HINF,UINT,UINT,PWSTR,DWORD,PDWORD);
+	BOOL SetupGetStringFieldA(PINFCONTEXT,DWORD,PSTR,DWORD,PDWORD);
+	BOOL SetupGetStringFieldW(PINFCONTEXT,DWORD,PWSTR,DWORD,PDWORD);
+	BOOL SetupGetTargetPathA(HINF,PINFCONTEXT,PCSTR,PSTR,DWORD,PDWORD);
+	BOOL SetupGetTargetPathW(HINF,PINFCONTEXT,PCWSTR,PWSTR,DWORD,PDWORD);
+	PVOID SetupInitDefaultQueueCallback(HWND);
+	PVOID SetupInitDefaultQueueCallbackEx(HWND,HWND,UINT,DWORD,PVOID);
+	HSPFILELOG SetupInitializeFileLogA(PCSTR,DWORD);
+	HSPFILELOG SetupInitializeFileLogW(PCWSTR,DWORD);
+	BOOL SetupInstallFileA(HINF,PINFCONTEXT,PCSTR,PCSTR,PCSTR,DWORD,PSP_FILE_CALLBACK_A,PVOID);
+	BOOL SetupInstallFileW(HINF,PINFCONTEXT,PCWSTR,PCWSTR,PCWSTR,DWORD,PSP_FILE_CALLBACK_W,PVOID);
+	BOOL SetupInstallFileExA(HINF,PINFCONTEXT,PCSTR,PCSTR,PCSTR,DWORD,PSP_FILE_CALLBACK_A,PVOID,PBOOL);
+	BOOL SetupInstallFileExW(HINF,PINFCONTEXT,PCWSTR,PCWSTR,PCWSTR,DWORD,PSP_FILE_CALLBACK_W,PVOID,PBOOL);
+	BOOL SetupInstallFilesFromInfSectionA(HINF,HINF,HSPFILEQ,PCSTR,PCSTR,UINT);
+	BOOL SetupInstallFilesFromInfSectionW(HINF,HINF,HSPFILEQ,PCWSTR,PCWSTR,UINT);
+	BOOL SetupInstallFromInfSectionA(HWND,HINF,PCSTR,UINT,HKEY,PCSTR,UINT,PSP_FILE_CALLBACK_A,PVOID,HDEVINFO,PSP_DEVINFO_DATA);
+	BOOL SetupInstallFromInfSectionW(HWND,HINF,PCWSTR,UINT,HKEY,PCWSTR,UINT,PSP_FILE_CALLBACK_W,PVOID,HDEVINFO,PSP_DEVINFO_DATA);
+	BOOL SetupInstallServicesFromInfSectionA(HINF,PCSTR,DWORD);
+	BOOL SetupInstallServicesFromInfSectionW(HINF,PCWSTR,DWORD);
+	BOOL SetupInstallServicesFromInfSectionExA(HINF,PCSTR,DWORD,HDEVINFO,PSP_DEVINFO_DATA,PVOID,PVOID);
+	BOOL SetupInstallServicesFromInfSectionExW(HINF,PCWSTR,DWORD,HDEVINFO,PSP_DEVINFO_DATA,PVOID,PVOID);
+	BOOL SetupIterateCabinetA(PCSTR,DWORD,PSP_FILE_CALLBACK_A,PVOID);
+	BOOL SetupIterateCabinetW(PCWSTR,DWORD,PSP_FILE_CALLBACK_W,PVOID);
+	BOOL SetupLogErrorA(LPCSTR,LogSeverity);
+	BOOL SetupLogErrorW(LPCWSTR,LogSeverity);
+	BOOL SetupLogFileA(HSPFILELOG,PCSTR,PCSTR,PCSTR,DWORD,PCSTR,PCSTR,PCSTR,DWORD);
+	BOOL SetupLogFileW(HSPFILELOG,PCWSTR,PCWSTR,PCWSTR,DWORD,PCWSTR,PCWSTR,PCWSTR,DWORD);
+	BOOL SetupOpenAppendInfFileA(PCSTR,HINF,PUINT);
+	BOOL SetupOpenAppendInfFileW(PCWSTR,HINF,PUINT);
+	HSPFILEQ SetupOpenFileQueue();
+	HINF SetupOpenInfFileA(PCSTR,PCSTR,DWORD,PUINT);
+	HINF SetupOpenInfFileW(PCWSTR,PCWSTR,DWORD,PUINT);
+	BOOL SetupOpenLog(BOOL);
+	HINF SetupOpenMasterInf();
+	UINT SetupPromptForDiskA(HWND,PCSTR,PCSTR,PCSTR,PCSTR,PCSTR,DWORD,PSTR,DWORD,PDWORD);
+	UINT SetupPromptForDiskW(HWND,PCWSTR,PCWSTR,PCWSTR,PCWSTR,PCWSTR,DWORD,PWSTR,DWORD,PDWORD);
+	INT SetupPromptReboot(HSPFILEQ,HWND,BOOL);
+	BOOL SetupQueryA(DWORD,PCSTR**,PUINT);
+	BOOL SetupQueryW(DWORD,PCWSTR**,PUINT);
+	BOOL SetupQueryDrivesInDiskSpaceListA(HDSKSPC,PSTR,DWORD,PDWORD);
+	BOOL SetupQueryDrivesInDiskSpaceListW(HDSKSPC,PWSTR,DWORD,PDWORD);
+	BOOL SetupQueryFileLogA(HSPFILELOG,PCSTR,PCSTR,SetupFileLogInfo,PSTR,DWORD,PDWORD);
+	BOOL SetupQueryFileLogW(HSPFILELOG,PCWSTR,PCWSTR,SetupFileLogInfo,PWSTR,DWORD,PDWORD);
+	BOOL SetupQueryInfFileInformationA(PSP_INF_INFORMATION,UINT,PSTR,DWORD,PDWORD);
+	BOOL SetupQueryInfFileInformationW(PSP_INF_INFORMATION,UINT,PWSTR,DWORD,PDWORD);
+	BOOL SetupQueryInfOriginalFileInformationA(PSP_INF_INFORMATION,UINT,PSP_ALTPLATFORM_INFO,PSP_ORIGINAL_FILE_INFO_A);
+	BOOL SetupQueryInfOriginalFileInformationW(PSP_INF_INFORMATION,UINT,PSP_ALTPLATFORM_INFO,PSP_ORIGINAL_FILE_INFO_W);
+	BOOL SetupQueryInfVersionInformationA(PSP_INF_INFORMATION,UINT,PSTR,PSTR,DWORD,PDWORD);
+	BOOL SetupQueryInfVersionInformationW(PSP_INF_INFORMATION,UINT,PCWSTR,PWSTR,DWORD,PDWORD);
+	BOOL SetupQuerySpaceRequiredOnDriveA(HDSKSPC,PCSTR,LONGLONG*,PVOID,UINT);
+	BOOL SetupQuerySpaceRequiredOnDriveW(HDSKSPC,PCWSTR,LONGLONG*,PVOID,UINT);
+	BOOL SetupQueueCopyA(HSPFILEQ,PCSTR,PCSTR,PCSTR,PCSTR,PCSTR,PCSTR,PCSTR,DWORD);
+	BOOL SetupQueueCopyW(HSPFILEQ,PCWSTR,PCWSTR,PCWSTR,PCWSTR,PCWSTR,PCWSTR,PCWSTR,DWORD);
+	BOOL SetupQueueCopyIndirectA(PSP_FILE_COPY_PARAMS_A);
+	BOOL SetupQueueCopyIndirectW(PSP_FILE_COPY_PARAMS_W);
+	BOOL SetupQueueCopySectionA(HSPFILEQ,PCSTR,HINF,HINF,PCSTR,DWORD);
+	BOOL SetupQueueCopySectionW(HSPFILEQ,PCWSTR,HINF,HINF,PCWSTR,DWORD);
+	BOOL SetupQueueDefaultCopyA(HSPFILEQ,HINF,PCSTR,PCSTR,PCSTR,DWORD);
+	BOOL SetupQueueDefaultCopyW(HSPFILEQ,HINF,PCWSTR,PCWSTR,PCWSTR,DWORD);
+	BOOL SetupQueueDeleteA(HSPFILEQ,PCSTR,PCSTR);
+	BOOL SetupQueueDeleteW(HSPFILEQ,PCWSTR,PCWSTR);
+	BOOL SetupQueueDeleteSectionA(HSPFILEQ,HINF,HINF,PCSTR);
+	BOOL SetupQueueDeleteSectionW(HSPFILEQ,HINF,HINF,PCWSTR);
+	BOOL SetupQueueRenameA(HSPFILEQ,PCSTR,PCSTR,PCSTR,PCSTR);
+	BOOL SetupQueueRenameW(HSPFILEQ,PCWSTR,PCWSTR,PCWSTR,PCWSTR);
+	BOOL SetupQueueRenameSectionA(HSPFILEQ,HINF,HINF,PCSTR);
+	BOOL SetupQueueRenameSectionW(HSPFILEQ,HINF,HINF,PCWSTR);
+	BOOL SetupRemoveFileLogEntryA(HSPFILELOG,PCSTR,PCSTR);
+	BOOL SetupRemoveFileLogEntryW(HSPFILELOG,PCWSTR,PCWSTR);
+	BOOL SetupRemoveFromDiskSpaceListA(HDSKSPC,PCSTR,UINT,PVOID,UINT);
+	BOOL SetupRemoveFromDiskSpaceListW(HDSKSPC,PCWSTR,UINT,PVOID,UINT);
+	BOOL SetupRemoveFromSourceListA(DWORD,PCSTR);
+	BOOL SetupRemoveFromSourceListW(DWORD,PCWSTR);
+	BOOL SetupRemoveInstallSectionFromDiskSpaceListA(HDSKSPC,HINF,HINF,PCSTR,PVOID,UINT);
+	BOOL SetupRemoveInstallSectionFromDiskSpaceListW(HDSKSPC,HINF,HINF,PCWSTR,PVOID,UINT);
+	BOOL SetupRemoveSectionFromDiskSpaceListA(HDSKSPC,HINF,HINF,PCSTR,UINT,PVOID,UINT);
+	BOOL SetupRemoveSectionFromDiskSpaceListW(HDSKSPC,HINF,HINF,PCWSTR,UINT,PVOID,UINT);
+	UINT SetupRenameErrorA(HWND,PCSTR,PCSTR,PCSTR,UINT,DWORD);
+	UINT SetupRenameErrorW(HWND,PCWSTR,PCWSTR,PCWSTR,UINT,DWORD);
+	BOOL SetupScanFileQueueA(HSPFILEQ,DWORD,HWND,PSP_FILE_CALLBACK_A,PVOID,PDWORD);
+	BOOL SetupScanFileQueueW(HSPFILEQ,DWORD,HWND,PSP_FILE_CALLBACK_W,PVOID,PDWORD);
+	BOOL SetupSetDirectoryIdA(HINF,DWORD,PCSTR);
+	BOOL SetupSetDirectoryIdW(HINF,DWORD,PCWSTR);
+	BOOL SetupSetDirectoryIdExA(HINF,DWORD,PCSTR,DWORD,DWORD,PVOID);
+	BOOL SetupSetDirectoryIdExW(HINF,DWORD,PCWSTR,DWORD,DWORD,PVOID);
+	BOOL SetupSetFileQueueAlternatePlatformA(HSPFILEQ,PSP_ALTPLATFORM_INFO,PCSTR);
+	BOOL SetupSetFileQueueAlternatePlatformW(HSPFILEQ,PSP_ALTPLATFORM_INFO,PCWSTR);
+	BOOL SetupSetPlatformPathOverrideA(PCSTR);
+	BOOL SetupSetPlatformPathOverrideW(PCWSTR);
+	BOOL SetupSetSourceListA(DWORD,PCSTR*,UINT);
+	BOOL SetupSetSourceListW(DWORD,PCWSTR*,UINT);
+	VOID SetupTermDefaultQueueCallback(PVOID);
+	BOOL SetupTerminateFileLog(HSPFILELOG);
+}
+
+deprecated {
+	alias SetupDiCreateDeviceInterfaceW SetupDiCreateInterfaceDeviceW;
+	alias SetupDiCreateDeviceInterfaceRegKeyW SetupDiCreateInterfaceDeviceRegKeyW;
+	alias SetupDiOpenDeviceInterfaceW SetupDiOpenInterfaceDeviceW;
+	alias SetupDiGetDeviceInterfaceDetailW SetupDiGetInterfaceDeviceDetailW;
+	alias SetupDiCreateDeviceInterfaceA SetupDiCreateInterfaceDeviceA;
+	alias SetupDiCreateDeviceInterfaceRegKeyA SetupDiCreateInterfaceDeviceRegKeyA;
+	alias SetupDiOpenDeviceInterfaceA SetupDiOpenInterfaceDeviceA;
+	alias SetupDiGetDeviceInterfaceDetailA SetupDiGetInterfaceDeviceDetailA;
+}
+
+version (Unicode) {
+	alias PSP_FILE_CALLBACK_W PSP_FILE_CALLBACK;
+	alias SetupAddInstallSectionToDiskSpaceListW SetupAddInstallSectionToDiskSpaceList;
+	alias SetupAddSectionToDiskSpaceListW SetupAddSectionToDiskSpaceList;
+	alias SetupAddToDiskSpaceListW SetupAddToDiskSpaceList;
+	alias SetupAddToSourceListW SetupAddToSourceList;
+	alias SetupAdjustDiskSpaceListW SetupAdjustDiskSpaceList;
+	alias SetupBackupErrorW SetupBackupError;
+	alias SetupCommitFileQueueW SetupCommitFileQueue;
+	alias SetupCopyErrorW SetupCopyError;
+	alias SetupCopyOEMInfW SetupCopyOEMInf;
+	alias SetupCreateDiskSpaceListW SetupCreateDiskSpaceList;
+	alias SetupDecompressOrCopyFileW SetupDecompressOrCopyFile;
+	alias SetupDefaultQueueCallbackW SetupDefaultQueueCallback;
+	alias SetupDeleteErrorW SetupDeleteError;
+	alias SetupDiBuildClassInfoListExW SetupDiBuildClassInfoListEx;
+	alias SetupDiClassGuidsFromNameExW SetupDiClassGuidsFromNameEx;
+	alias SetupDiClassGuidsFromNameW SetupDiClassGuidsFromName;
+	alias SetupDiClassNameFromGuidExW SetupDiClassNameFromGuidEx;
+	alias SetupDiClassNameFromGuidW SetupDiClassNameFromGuid;
+	alias SetupDiCreateDeviceInfoListExW SetupDiCreateDeviceInfoListEx;
+	alias SetupDiCreateDeviceInfoW SetupDiCreateDeviceInfo;
+	alias SetupDiCreateDeviceInterfaceRegKeyW SetupDiCreateDeviceInterfaceRegKey;
+	deprecated alias SetupDiCreateDeviceInterfaceRegKeyW SetupDiCreateInterfaceDeviceRegKey;
+	alias SetupDiCreateDeviceInterfaceW SetupDiCreateDeviceInterface;
+	deprecated alias SetupDiCreateDeviceInterfaceW SetupDiCreateInterfaceDevice;
+	alias SetupDiCreateDevRegKeyW SetupDiCreateDevRegKey;
+	alias SetupDiEnumDriverInfoW SetupDiEnumDriverInfo;
+	alias SetupDiGetActualSectionToInstallW SetupDiGetActualSectionToInstall;
+	alias SetupDiGetClassDescriptionExW SetupDiGetClassDescriptionEx;
+	alias SetupDiGetClassDescriptionW SetupDiGetClassDescription;
+	alias SetupDiGetClassDevPropertySheetsW SetupDiGetClassDevPropertySheets;
+	alias SetupDiGetClassDevsExW SetupDiGetClassDevsEx;
+	alias SetupDiGetClassDevsW SetupDiGetClassDevs;
+	alias SetupDiGetClassImageListExW SetupDiGetClassImageListEx;
+	alias SetupDiGetClassInstallParamsW SetupDiGetClassInstallParams;
+	alias SetupDiGetClassRegistryPropertyW SetupDiGetClassRegistryProperty;
+	alias SetupDiGetDeviceInfoListDetailW SetupDiGetDeviceInfoListDetail;
+	alias SetupDiGetDeviceInstallParamsW SetupDiGetDeviceInstallParams;
+	alias SetupDiGetDeviceInstanceIdW SetupDiGetDeviceInstanceId;
+	alias SetupDiGetDeviceInterfaceDetailW SetupDiGetDeviceInterfaceDetail;
+	deprecated alias SetupDiGetDeviceInterfaceDetailW SetupDiGetInterfaceDeviceDetail;
+	alias SetupDiGetDeviceRegistryPropertyW SetupDiGetDeviceRegistryProperty;
+	alias SetupDiGetDriverInfoDetailW SetupDiGetDriverInfoDetail;
+	alias SetupDiGetDriverInstallParamsW SetupDiGetDriverInstallParams;
+	alias SetupDiGetHwProfileFriendlyNameExW SetupDiGetHwProfileFriendlyNameEx;
+	alias SetupDiGetHwProfileFriendlyNameW SetupDiGetHwProfileFriendlyName;
+	alias SetupDiGetHwProfileListExW SetupDiGetHwProfileListEx;
+	alias SetupDiGetINFClassW SetupDiGetINFClass;
+	alias SetupDiGetSelectedDriverW SetupDiGetSelectedDriver;
+	alias SetupDiInstallClassExW SetupDiInstallClassEx;
+	alias SetupDiInstallClassW SetupDiInstallClass;
+	alias SetupDiOpenClassRegKeyExW SetupDiOpenClassRegKeyEx;
+	alias SetupDiOpenDeviceInfoW SetupDiOpenDeviceInfo;
+	alias SetupDiOpenDeviceInterfaceW SetupDiOpenDeviceInterface;
+	deprecated alias SetupDiOpenDeviceInterfaceW SetupDiOpenInterfaceDevice;
+	alias SetupDiSetClassInstallParamsW SetupDiSetClassInstallParams;
+	alias SetupDiSetClassRegistryPropertyW SetupDiSetClassRegistryProperty;
+	alias SetupDiSetDeviceInstallParamsW SetupDiSetDeviceInstallParams;
+	alias SetupDiSetDeviceRegistryPropertyW SetupDiSetDeviceRegistryProperty;
+	alias SetupDiSetDriverInstallParamsW SetupDiSetDriverInstallParams;
+	alias SetupDiSetSelectedDriverW SetupDiSetSelectedDriver;
+	alias SetupDuplicateDiskSpaceListW SetupDuplicateDiskSpaceList;
+	alias SetupFindFirstLineW SetupFindFirstLine;
+	alias SetupFindNextMatchLineW SetupFindNextMatchLine;
+	alias SetupFreeSourceListW SetupFreeSourceList;
+	alias SetupGetBackupInformationW SetupGetBackupInformation;
+	alias SetupGetFileCompressionInfoW SetupGetFileCompressionInfo;
+	alias SetupGetInfFileListW SetupGetInfFileList;
+	alias SetupGetInfInformationW SetupGetInfInformation;
+	alias SetupGetLineByIndexW SetupGetLineByIndex;
+	alias SetupGetLineCountW SetupGetLineCount;
+	alias SetupGetLineTextW SetupGetLineText;
+	alias SetupGetMultiSzFieldW SetupGetMultiSzField;
+	alias SetupGetSourceFileLocationW SetupGetSourceFileLocation;
+	alias SetupGetSourceFileSizeW SetupGetSourceFileSize;
+	alias SetupGetSourceInfoW SetupGetSourceInfo;
+	alias SetupGetStringFieldW SetupGetStringField;
+	alias SetupGetTargetPathW SetupGetTargetPath;
+	alias SetupInitializeFileLogW SetupInitializeFileLog;
+	alias SetupInstallFileExW SetupInstallFileEx;
+	alias SetupInstallFilesFromInfSectionW SetupInstallFilesFromInfSection;
+	alias SetupInstallFileW SetupInstallFile;
+	alias SetupInstallFromInfSectionW SetupInstallFromInfSection;
+	alias SetupInstallServicesFromInfSectionExW SetupInstallServicesFromInfSectionEx;
+	alias SetupInstallServicesFromInfSectionW SetupInstallServicesFromInfSection;
+	alias SetupIterateCabinetW SetupIterateCabinet;
+	alias SetupLogErrorW SetupLogError;
+	alias SetupLogFileW SetupLogFile;
+	alias SetupOpenAppendInfFileW SetupOpenAppendInfFile;
+	alias SetupOpenInfFileW SetupOpenInfFile;
+	alias SetupPromptForDiskW SetupPromptForDisk;
+	alias SetupQueryDrivesInDiskSpaceListW SetupQueryDrivesInDiskSpaceList;
+	alias SetupQueryFileLogW SetupQueryFileLog;
+	alias SetupQueryInfFileInformationW SetupQueryInfFileInformation;
+	alias SetupQueryInfOriginalFileInformationW SetupQueryInfOriginalFileInformation;
+	alias SetupQueryInfVersionInformationW SetupQueryInfVersionInformation;
+	alias SetupQuerySourceListW SetupQuerySourceList;
+	alias SetupQuerySpaceRequiredOnDriveW SetupQuerySpaceRequiredOnDrive;
+	alias SetupQueueCopyIndirectW SetupQueueCopyIndirect;
+	alias SetupQueueCopySectionW SetupQueueCopySection;
+	alias SetupQueueCopyW SetupQueueCopy;
+	alias SetupQueueDefaultCopyW SetupQueueDefaultCopy;
+	alias SetupQueueDeleteSectionW SetupQueueDeleteSection;
+	alias SetupQueueDeleteW SetupQueueDelete;
+	alias SetupQueueRenameSectionW SetupQueueRenameSection;
+	alias SetupQueueRenameW SetupQueueRename;
+	alias SetupRemoveFileLogEntryW SetupRemoveFileLogEntry;
+	alias SetupRemoveFromDiskSpaceListW SetupRemoveFromDiskSpaceList;
+	alias SetupRemoveFromSourceListW SetupRemoveFromSourceList;
+	alias SetupRemoveInstallSectionFromDiskSpaceListW SetupRemoveInstallSectionFromDiskSpaceList;
+	alias SetupRemoveSectionFromDiskSpaceListW SetupRemoveSectionFromDiskSpaceList;
+	alias SetupRenameErrorW SetupRenameError;
+	alias SetupScanFileQueueW SetupScanFileQueue;
+	alias SetupSetDirectoryIdExW SetupSetDirectoryIdEx;
+	alias SetupSetDirectoryIdW SetupSetDirectoryId;
+	alias SetupSetFileQueueAlternatePlatformW SetupSetFileQueueAlternatePlatform;
+	alias SetupSetPlatformPathOverrideW SetupSetPlatformPathOverride;
+	alias SetupSetSourceListW SetupSetSourceList;
+} else {
+	alias PSP_FILE_CALLBACK_A PSP_FILE_CALLBACK;
+	alias SetupAddInstallSectionToDiskSpaceListA SetupAddInstallSectionToDiskSpaceList;
+	alias SetupAddSectionToDiskSpaceListA SetupAddSectionToDiskSpaceList;
+	alias SetupAddToDiskSpaceListA SetupAddToDiskSpaceList;
+	alias SetupAddToSourceListA SetupAddToSourceList;
+	alias SetupAdjustDiskSpaceListA SetupAdjustDiskSpaceList;
+	alias SetupBackupErrorA SetupBackupError;
+	alias SetupCommitFileQueueA SetupCommitFileQueue;
+	alias SetupCopyErrorA SetupCopyError;
+	alias SetupCopyOEMInfA SetupCopyOEMInf;
+	alias SetupCreateDiskSpaceListA SetupCreateDiskSpaceList;
+	alias SetupDecompressOrCopyFileA SetupDecompressOrCopyFile;
+	alias SetupDefaultQueueCallbackA SetupDefaultQueueCallback;
+	alias SetupDeleteErrorA SetupDeleteError;
+	alias SetupDiBuildClassInfoListExA SetupDiBuildClassInfoListEx;
+	alias SetupDiClassGuidsFromNameA SetupDiClassGuidsFromName;
+	alias SetupDiClassGuidsFromNameExA SetupDiClassGuidsFromNameEx;
+	alias SetupDiClassNameFromGuidA SetupDiClassNameFromGuid;
+	alias SetupDiClassNameFromGuidExA SetupDiClassNameFromGuidEx;
+	alias SetupDiCreateDeviceInfoA SetupDiCreateDeviceInfo;
+	alias SetupDiCreateDeviceInfoListExA SetupDiCreateDeviceInfoListEx;
+	alias SetupDiCreateDeviceInterfaceA SetupDiCreateDeviceInterface;
+	deprecated alias SetupDiCreateDeviceInterfaceA SetupDiCreateInterfaceDevice;
+	alias SetupDiCreateDeviceInterfaceRegKeyA SetupDiCreateDeviceInterfaceRegKey;
+	deprecated alias SetupDiCreateDeviceInterfaceRegKeyA SetupDiCreateInterfaceDeviceRegKey;
+	alias SetupDiCreateDevRegKeyA SetupDiCreateDevRegKey;
+	alias SetupDiDeleteDeviceInterfaceData SetupDiDeleteInterfaceDeviceData;
+	alias SetupDiEnumDriverInfoA SetupDiEnumDriverInfo;
+	alias SetupDiGetActualSectionToInstallA SetupDiGetActualSectionToInstall;
+	alias SetupDiGetClassDescriptionA SetupDiGetClassDescription;
+	alias SetupDiGetClassDescriptionExA SetupDiGetClassDescriptionEx;
+	alias SetupDiGetClassDevPropertySheetsA SetupDiGetClassDevPropertySheets;
+	alias SetupDiGetClassDevsA SetupDiGetClassDevs;
+	alias SetupDiGetClassDevsExA SetupDiGetClassDevsEx;
+	alias SetupDiGetClassImageListExA SetupDiGetClassImageListEx;
+	alias SetupDiGetClassInstallParamsA SetupDiGetClassInstallParams;
+	alias SetupDiGetClassRegistryPropertyA SetupDiGetClassRegistryProperty;
+	alias SetupDiGetDeviceInfoListDetailA SetupDiGetDeviceInfoListDetail;
+	alias SetupDiGetDeviceInstallParamsA SetupDiGetDeviceInstallParams;
+	alias SetupDiGetDeviceInstanceIdA SetupDiGetDeviceInstanceId;
+	alias SetupDiGetDeviceInterfaceDetailA SetupDiGetDeviceInterfaceDetail;
+	deprecated alias SetupDiGetDeviceInterfaceDetailA SetupDiGetInterfaceDeviceDetail;
+	alias SetupDiGetDeviceRegistryPropertyA SetupDiGetDeviceRegistryProperty;
+	alias SetupDiGetDriverInfoDetailA SetupDiGetDriverInfoDetail;
+	alias SetupDiGetDriverInstallParamsA SetupDiGetDriverInstallParams;
+	alias SetupDiGetHwProfileFriendlyNameA SetupDiGetHwProfileFriendlyName;
+	alias SetupDiGetHwProfileFriendlyNameExA SetupDiGetHwProfileFriendlyNameEx;
+	alias SetupDiGetHwProfileListExA SetupDiGetHwProfileListEx;
+	alias SetupDiGetINFClassA SetupDiGetINFClass;
+	alias SetupDiGetSelectedDriverA SetupDiGetSelectedDriver;
+	alias SetupDiInstallClassA SetupDiInstallClass;
+	alias SetupDiInstallClassExA SetupDiInstallClassEx;
+	alias SetupDiOpenClassRegKeyExA SetupDiOpenClassRegKeyEx;
+	alias SetupDiOpenDeviceInfoA SetupDiOpenDeviceInfo;
+	alias SetupDiOpenDeviceInterfaceA SetupDiOpenDeviceInterface;
+	deprecated alias SetupDiOpenDeviceInterfaceA SetupDiOpenInterfaceDevice;
+	alias SetupDiSetClassInstallParamsA SetupDiSetClassInstallParams;
+	alias SetupDiSetClassRegistryPropertyA SetupDiSetClassRegistryProperty;
+	alias SetupDiSetDeviceInstallParamsA SetupDiSetDeviceInstallParams;
+	alias SetupDiSetDeviceRegistryPropertyA SetupDiSetDeviceRegistryProperty;
+	alias SetupDiSetDriverInstallParamsA SetupDiSetDriverInstallParams;
+	alias SetupDiSetSelectedDriverA SetupDiSetSelectedDriver;
+	alias SetupDuplicateDiskSpaceListA SetupDuplicateDiskSpaceList;
+	alias SetupFindFirstLineA SetupFindFirstLine;
+	alias SetupFindNextMatchLineA SetupFindNextMatchLine;
+	alias SetupFreeSourceListA SetupFreeSourceList;
+	alias SetupGetBackupInformationA SetupGetBackupInformation;
+	alias SetupGetFileCompressionInfoA SetupGetFileCompressionInfo;
+	alias SetupGetInfFileListA SetupGetInfFileList;
+	alias SetupGetInfInformationA SetupGetInfInformation;
+	alias SetupGetLineByIndexA SetupGetLineByIndex;
+	alias SetupGetLineCountA SetupGetLineCount;
+	alias SetupGetLineTextA SetupGetLineText;
+	alias SetupGetMultiSzFieldA SetupGetMultiSzField;
+	alias SetupGetSourceFileLocationA SetupGetSourceFileLocation;
+	alias SetupGetSourceFileSizeA SetupGetSourceFileSize;
+	alias SetupGetSourceInfoA SetupGetSourceInfo;
+	alias SetupGetStringFieldA SetupGetStringField;
+	alias SetupGetTargetPathA SetupGetTargetPath;
+	alias SetupInitializeFileLogA SetupInitializeFileLog;
+	alias SetupInstallFileA SetupInstallFile;
+	alias SetupInstallFileExA SetupInstallFileEx;
+	alias SetupInstallFilesFromInfSectionA SetupInstallFilesFromInfSection;
+	alias SetupInstallFromInfSectionA SetupInstallFromInfSection;
+	alias SetupInstallServicesFromInfSectionA SetupInstallServicesFromInfSection;
+	alias SetupInstallServicesFromInfSectionExA SetupInstallServicesFromInfSectionEx;
+	alias SetupIterateCabinetA SetupIterateCabinet;
+	alias SetupLogErrorA SetupLogError;
+	alias SetupLogFileA SetupLogFile;
+	alias SetupOpenAppendInfFileA SetupOpenAppendInfFile;
+	alias SetupOpenInfFileA SetupOpenInfFile;
+	alias SetupPromptForDiskA SetupPromptForDisk;
+	alias SetupQueryDrivesInDiskSpaceListA SetupQueryDrivesInDiskSpaceList;
+	alias SetupQueryFileLogA SetupQueryFileLog;
+	alias SetupQueryInfFileInformationA SetupQueryInfFileInformation;
+	alias SetupQueryInfOriginalFileInformationA SetupQueryInfOriginalFileInformation;
+	alias SetupQueryInfVersionInformationA SetupQueryInfVersionInformation;
+	alias SetupQuerySourceListA SetupQuerySourceList;
+	alias SetupQuerySpaceRequiredOnDriveA SetupQuerySpaceRequiredOnDrive;
+	alias SetupQueueCopyA SetupQueueCopy;
+	alias SetupQueueCopyIndirectA SetupQueueCopyIndirect;
+	alias SetupQueueCopySectionA SetupQueueCopySection;
+	alias SetupQueueDefaultCopyA SetupQueueDefaultCopy;
+	alias SetupQueueDeleteA SetupQueueDelete;
+	alias SetupQueueDeleteSectionA SetupQueueDeleteSection;
+	alias SetupQueueRenameA SetupQueueRename;
+	alias SetupQueueRenameSectionA SetupQueueRenameSection;
+	alias SetupRemoveFileLogEntryA SetupRemoveFileLogEntry;
+	alias SetupRemoveFromDiskSpaceListA SetupRemoveFromDiskSpaceList;
+	alias SetupRemoveFromSourceListA SetupRemoveFromSourceList;
+	alias SetupRemoveInstallSectionFromDiskSpaceListA SetupRemoveInstallSectionFromDiskSpaceList;
+	alias SetupRemoveSectionFromDiskSpaceListA SetupRemoveSectionFromDiskSpaceList;
+	alias SetupRenameErrorA SetupRenameError;
+	alias SetupScanFileQueueA SetupScanFileQueue;
+	alias SetupSetDirectoryIdA SetupSetDirectoryId;
+	alias SetupSetDirectoryIdExA SetupSetDirectoryIdEx;
+	alias SetupSetFileQueueAlternatePlatformA SetupSetFileQueueAlternatePlatform;
+	alias SetupSetPlatformPathOverrideA SetupSetPlatformPathOverride;
+	alias SetupSetSourceListA SetupSetSourceList;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/shellapi.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,412 @@
+/***********************************************************************\
+*                               shellapi.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.shellapi;
+pragma(lib, "shell32.lib");
+
+private import win32.w32api, win32.windef, win32.basetyps;
+
+enum : UINT {
+	ABE_LEFT,
+	ABE_TOP,
+	ABE_RIGHT,
+	ABE_BOTTOM // = 3
+}
+
+enum : UINT {
+	ABS_AUTOHIDE    = 1,
+	ABS_ALWAYSONTOP
+}
+
+const ULONG
+	SEE_MASK_CLASSNAME      =        1,
+	SEE_MASK_CLASSKEY       =        3,
+	SEE_MASK_IDLIST         =        4,
+	SEE_MASK_INVOKEIDLIST   =       12,
+	SEE_MASK_ICON           = 0x000010,
+	SEE_MASK_HOTKEY         = 0x000020,
+	SEE_MASK_NOCLOSEPROCESS = 0x000040,
+	SEE_MASK_CONNECTNETDRV  = 0x000080,
+	SEE_MASK_FLAG_DDEWAIT   = 0x000100,
+	SEE_MASK_DOENVSUBST     = 0x000200,
+	SEE_MASK_FLAG_NO_UI     = 0x000400,
+	SEE_MASK_NO_CONSOLE     = 0x008000,
+	SEE_MASK_UNICODE        = 0x010000,
+	SEE_MASK_ASYNCOK        = 0x100000,
+	SEE_MASK_HMONITOR       = 0x200000;
+
+enum : DWORD {
+	ABM_NEW,
+	ABM_REMOVE,
+	ABM_QUERYPOS,
+	ABM_SETPOS,
+	ABM_GETSTATE,
+	ABM_GETTASKBARPOS,
+	ABM_ACTIVATE,
+	ABM_GETAUTOHIDEBAR,
+	ABM_SETAUTOHIDEBAR,
+	ABM_WINDOWPOSCHANGED // = 9
+}
+
+static if (WINVER >= 0x501) {
+	const DWORD ABM_SETSTATE = 10;
+}
+
+enum : UINT {
+	ABN_STATECHANGE,
+	ABN_POSCHANGED,
+	ABN_FULLSCREENAPP,
+	ABN_WINDOWARRANGE
+}
+
+enum : DWORD {
+	NIM_ADD,
+	NIM_MODIFY,
+	NIM_DELETE
+}
+
+static if (_WIN32_IE >= 0x500) {
+	const NOTIFYICON_VERSION = 3;
+
+	enum : DWORD {
+		NIM_SETFOCUS = 3,
+		NIM_SETVERSION
+	}
+}
+
+const UINT
+	NIF_MESSAGE = 1,
+	NIF_ICON    = 2,
+	NIF_TIP     = 4,
+	NIF_STATE   = 8;
+
+static if (_WIN32_IE >= 0x500) {
+	const UINT NIF_INFO = 0x00000010;
+}
+
+static if (_WIN32_IE >= 0x600) {
+	const UINT NIF_GUID = 0x00000020;
+}
+
+static if (_WIN32_IE >= 0x500) {
+	enum : DWORD {
+		NIIF_NONE,
+		NIIF_INFO,
+		NIIF_WARNING,
+		NIIF_ERROR
+	}
+}
+
+static if (_WIN32_IE >= 0x600) {
+	enum : DWORD {
+		NIIF_ICON_MASK = 15,
+		NIIF_NOSOUND
+	}
+}
+
+const DWORD
+	NIS_HIDDEN     = 1,
+	NIS_SHAREDICON = 2;
+
+const HINSTANCE
+	SE_ERR_FNF             = cast(HANDLE)  2,
+	SE_ERR_PNF             = cast(HANDLE)  3,
+	SE_ERR_ACCESSDENIED    = cast(HANDLE)  5,
+	SE_ERR_OOM             = cast(HANDLE)  8,
+	SE_ERR_DLLNOTFOUND     = cast(HANDLE) 32,
+	SE_ERR_SHARE           = cast(HANDLE) 26,
+	SE_ERR_ASSOCINCOMPLETE = cast(HANDLE) 27,
+	SE_ERR_DDETIMEOUT      = cast(HANDLE) 28,
+	SE_ERR_DDEFAIL         = cast(HANDLE) 29,
+	SE_ERR_DDEBUSY         = cast(HANDLE) 30,
+	SE_ERR_NOASSOC         = cast(HANDLE) 31;
+
+enum : UINT {
+	FO_MOVE = 1,
+	FO_COPY,
+	FO_DELETE,
+	FO_RENAME
+}
+
+const FILEOP_FLAGS
+	FOF_MULTIDESTFILES        = 0x0001,
+	FOF_CONFIRMMOUSE          = 0x0002,
+	FOF_SILENT                = 0x0004,
+	FOF_RENAMEONCOLLISION     = 0x0008,
+	FOF_NOCONFIRMATION        = 0x0010,
+	FOF_WANTMAPPINGHANDLE     = 0x0020,
+	FOF_ALLOWUNDO             = 0x0040,
+	FOF_FILESONLY             = 0x0080,
+	FOF_SIMPLEPROGRESS        = 0x0100,
+	FOF_NOCONFIRMMKDIR        = 0x0200,
+	FOF_NOERRORUI             = 0x0400,
+	FOF_NOCOPYSECURITYATTRIBS = 0x0800;
+
+// these are not documented on the MSDN site
+enum {
+	PO_DELETE     = 19,
+	PO_RENAME     = 20,
+	PO_PORTCHANGE = 32,
+	PO_REN_PORT   = 52
+}
+
+const UINT
+	SHGFI_LARGEICON         = 0x000000,
+	SHGFI_SMALLICON         = 0x000001,
+	SHGFI_OPENICON          = 0x000002,
+	SHGFI_SHELLICONSIZE     = 0x000004,
+	SHGFI_PIDL              = 0x000008,
+	SHGFI_USEFILEATTRIBUTES = 0x000010,
+	SHGFI_ICON              = 0x000100,
+	SHGFI_DISPLAYNAME       = 0x000200,
+	SHGFI_TYPENAME          = 0x000400,
+	SHGFI_ATTRIBUTES        = 0x000800,
+	SHGFI_ICONLOCATION      = 0x001000,
+	SHGFI_EXETYPE           = 0x002000,
+	SHGFI_SYSICONINDEX      = 0x004000,
+	SHGFI_LINKOVERLAY       = 0x008000,
+	SHGFI_SELECTED          = 0x010000,
+	SHGFI_ATTR_SPECIFIED    = 0x020000;
+
+const SHERB_NOCONFIRMATION = 1;
+const SHERB_NOPROGRESSUI   = 2;
+const SHERB_NOSOUND        = 4;
+
+alias WORD FILEOP_FLAGS, PRINTEROP_FLAGS;
+alias HANDLE HDROP;
+
+align(2):
+
+struct APPBARDATA {
+	DWORD  cbSize = APPBARDATA.sizeof;
+	HWND   hWnd;
+	UINT   uCallbackMessage;
+	UINT   uEdge;
+	RECT   rc;
+	LPARAM lParam;
+}
+alias APPBARDATA* PAPPBARDATA;
+
+struct NOTIFYICONDATAA {
+	DWORD cbSize = NOTIFYICONDATAA.sizeof;
+	HWND  hWnd;
+	UINT  uID;
+	UINT  uFlags;
+	UINT  uCallbackMessage;
+	HICON hIcon;
+	static if (_WIN32_IE >= 0x500) {
+		CHAR[128] szTip;
+		DWORD     dwState;
+		DWORD     dwStateMask;
+		CHAR[256] szInfo;
+		union {
+			UINT  uTimeout;
+			UINT  uVersion;
+		}
+		CHAR[64]  szInfoTitle;
+		DWORD     dwInfoFlags;
+	} else {
+		CHAR[64]  szTip;
+	}
+	static if (_WIN32_IE >= 0x600) {
+		GUID      guidItem;
+	}
+}
+alias NOTIFYICONDATAA* PNOTIFYICONDATAA;
+
+struct NOTIFYICONDATAW {
+	DWORD cbSize = NOTIFYICONDATAW.sizeof;
+	HWND  hWnd;
+	UINT  uID;
+	UINT  uFlags;
+	UINT  uCallbackMessage;
+	HICON hIcon;
+	static if (_WIN32_IE >= 0x500) {
+		WCHAR[128] szTip;
+		DWORD      dwState;
+		DWORD      dwStateMask;
+		WCHAR[256] szInfo;
+		union {
+			UINT   uTimeout;
+			UINT   uVersion;
+		}
+		WCHAR[64]  szInfoTitle;
+		DWORD      dwInfoFlags;
+	} else {
+		WCHAR[64]  szTip;
+	}
+	static if (_WIN32_IE >= 0x600) {
+		GUID guidItem;
+	}
+}
+alias NOTIFYICONDATAW* PNOTIFYICONDATAW;
+
+struct SHELLEXECUTEINFOA {
+	DWORD     cbSize = SHELLEXECUTEINFOA.sizeof;
+	ULONG     fMask;
+	HWND      hwnd;
+	LPCSTR    lpVerb;
+	LPCSTR    lpFile;
+	LPCSTR    lpParameters;
+	LPCSTR    lpDirectory;
+	int       nShow;
+	HINSTANCE hInstApp;
+	PVOID     lpIDList;
+	LPCSTR    lpClass;
+	HKEY      hkeyClass;
+	DWORD     dwHotKey;
+	HANDLE    hIcon;
+	HANDLE    hProcess;
+}
+alias SHELLEXECUTEINFOA* LPSHELLEXECUTEINFOA;
+
+struct SHELLEXECUTEINFOW {
+	DWORD     cbSize = SHELLEXECUTEINFOW.sizeof;
+	ULONG     fMask;
+	HWND      hwnd;
+	LPCWSTR   lpVerb;
+	LPCWSTR   lpFile;
+	LPCWSTR   lpParameters;
+	LPCWSTR   lpDirectory;
+	int       nShow;
+	HINSTANCE hInstApp;
+	PVOID     lpIDList;
+	LPCWSTR   lpClass;
+	HKEY      hkeyClass;
+	DWORD     dwHotKey;
+	HANDLE    hIcon;
+	HANDLE    hProcess;
+}
+alias SHELLEXECUTEINFOW* LPSHELLEXECUTEINFOW;
+
+struct SHFILEOPSTRUCTA {
+	HWND         hwnd;
+	UINT         wFunc;
+	LPCSTR       pFrom;
+	LPCSTR       pTo;
+	FILEOP_FLAGS fFlags;
+	BOOL         fAnyOperationsAborted;
+	PVOID        hNameMappings;
+	LPCSTR       lpszProgressTitle;
+}
+alias SHFILEOPSTRUCTA* LPSHFILEOPSTRUCTA;
+
+struct SHFILEOPSTRUCTW {
+	HWND         hwnd;
+	UINT         wFunc;
+	LPCWSTR      pFrom;
+	LPCWSTR      pTo;
+	FILEOP_FLAGS fFlags;
+	BOOL         fAnyOperationsAborted;
+	PVOID        hNameMappings;
+	LPCWSTR      lpszProgressTitle;
+}
+alias SHFILEOPSTRUCTW* LPSHFILEOPSTRUCTW;
+
+struct SHFILEINFOA {
+	HICON          hIcon;
+	int            iIcon;
+	DWORD          dwAttributes;
+	CHAR[MAX_PATH] szDisplayName;
+	CHAR[80]       szTypeName;
+}
+
+struct SHFILEINFOW {
+	HICON           hIcon;
+	int             iIcon;
+	DWORD           dwAttributes;
+	WCHAR[MAX_PATH] szDisplayName;
+	WCHAR[80]       szTypeName;
+}
+
+struct SHQUERYRBINFO {
+	DWORD cbSize = SHQUERYRBINFO.sizeof;
+	long  i64Size;
+	long  i64NumItems;
+}
+alias SHQUERYRBINFO* LPSHQUERYRBINFO;
+
+extern (Windows) {
+	LPWSTR* CommandLineToArgvW(LPCWSTR, int*);
+	void DragAcceptFiles(HWND, BOOL);
+	void DragFinish(HDROP);
+	UINT DragQueryFileA(HDROP, UINT, LPSTR, UINT);
+	UINT DragQueryFileW(HDROP, UINT, LPWSTR, UINT);
+	BOOL DragQueryPoint(HDROP, LPPOINT);
+	HICON DuplicateIcon(HINSTANCE, HICON);
+	HICON ExtractAssociatedIconA(HINSTANCE, LPCSTR, PWORD);
+	HICON ExtractAssociatedIconW(HINSTANCE, LPCWSTR, PWORD);
+	HICON ExtractIconA(HINSTANCE, LPCSTR, UINT);
+	HICON ExtractIconW(HINSTANCE, LPCWSTR, UINT);
+	UINT ExtractIconExA(LPCSTR, int, HICON*, HICON*, UINT);
+	UINT ExtractIconExW(LPCWSTR, int, HICON*, HICON*, UINT);
+	HINSTANCE FindExecutableA(LPCSTR, LPCSTR, LPSTR);
+	HINSTANCE FindExecutableW(LPCWSTR, LPCWSTR, LPWSTR);
+	UINT SHAppBarMessage(DWORD, PAPPBARDATA);
+	BOOL Shell_NotifyIconA(DWORD, PNOTIFYICONDATAA);
+	BOOL Shell_NotifyIconW(DWORD, PNOTIFYICONDATAW);
+	int ShellAboutA(HWND, LPCSTR, LPCSTR, HICON);
+	int ShellAboutW(HWND, LPCWSTR, LPCWSTR, HICON);
+	HINSTANCE ShellExecuteA(HWND, LPCSTR, LPCSTR, LPCSTR, LPCSTR, INT);
+	HINSTANCE ShellExecuteW(HWND, LPCWSTR, LPCWSTR, LPCWSTR, LPCWSTR, INT);
+	BOOL ShellExecuteExA(LPSHELLEXECUTEINFOA);
+	BOOL ShellExecuteExW(LPSHELLEXECUTEINFOW);
+	int SHFileOperationA(LPSHFILEOPSTRUCTA);
+	int SHFileOperationW(LPSHFILEOPSTRUCTW);
+	void SHFreeNameMappings(HANDLE);
+	DWORD SHGetFileInfoA(LPCSTR, DWORD, SHFILEINFOA*, UINT, UINT);
+	DWORD SHGetFileInfoW(LPCWSTR, DWORD, SHFILEINFOW*, UINT, UINT);
+	HRESULT SHQueryRecycleBinA(LPCSTR,  LPSHQUERYRBINFO);
+	HRESULT SHQueryRecycleBinW(LPCWSTR,  LPSHQUERYRBINFO);
+	HRESULT SHEmptyRecycleBinA(HWND, LPCSTR, DWORD);
+	HRESULT SHEmptyRecycleBinW(HWND, LPCWSTR, DWORD);
+}
+
+version (Unicode) {
+	alias NOTIFYICONDATAW NOTIFYICONDATA;
+	alias SHELLEXECUTEINFOW SHELLEXECUTEINFO;
+	alias SHFILEOPSTRUCTW SHFILEOPSTRUCT;
+	alias SHFILEINFOW SHFILEINFO;
+	alias DragQueryFileW DragQueryFile;
+	alias ExtractAssociatedIconW ExtractAssociatedIcon;
+	alias ExtractIconW ExtractIcon;
+	alias ExtractIconExW ExtractIconEx;
+	alias FindExecutableW FindExecutable;
+	alias Shell_NotifyIconW Shell_NotifyIcon;
+	alias ShellAboutW ShellAbout;
+	alias ShellExecuteW ShellExecute;
+	alias ShellExecuteExW ShellExecuteEx;
+	alias SHFileOperationW SHFileOperation;
+	alias SHGetFileInfoW SHGetFileInfo;
+	alias SHQueryRecycleBinW SHQueryRecycleBin;
+	alias SHEmptyRecycleBinW SHEmptyRecycleBin;
+} else {
+	alias NOTIFYICONDATAA NOTIFYICONDATA;
+	alias SHELLEXECUTEINFOA SHELLEXECUTEINFO;
+	alias SHFILEOPSTRUCTA SHFILEOPSTRUCT;
+	alias SHFILEINFOA SHFILEINFO;
+	alias DragQueryFileA DragQueryFile;
+	alias ExtractAssociatedIconA ExtractAssociatedIcon;
+	alias ExtractIconA ExtractIcon;
+	alias ExtractIconExA ExtractIconEx;
+	alias FindExecutableA FindExecutable;
+	alias Shell_NotifyIconA Shell_NotifyIcon;
+	alias ShellAboutA ShellAbout;
+	alias ShellExecuteA ShellExecute;
+	alias ShellExecuteExA ShellExecuteEx;
+	alias SHFileOperationA SHFileOperation;
+	alias SHGetFileInfoA SHGetFileInfo;
+	alias SHQueryRecycleBinA SHQueryRecycleBin;
+	alias SHEmptyRecycleBinA SHEmptyRecycleBin;
+}
+
+alias NOTIFYICONDATA* PNOTIFYICONDATA;
+alias SHELLEXECUTEINFO* LPSHELLEXECUTEINFO;
+alias SHFILEOPSTRUCT* LPSHFILEOPSTRUCT;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/shldisp.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,27 @@
+/***********************************************************************\
+*                               shldisp.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.shldisp;
+
+private import win32.unknwn, win32.windef, win32.wtypes;
+
+// options for IAutoComplete2
+const DWORD ACO_AUTOSUGGEST = 0x01;
+
+interface IAutoComplete : public IUnknown {
+	HRESULT Init(HWND, IUnknown*, LPCOLESTR, LPCOLESTR);
+	HRESULT Enable(BOOL);
+}
+alias IAutoComplete* LPAUTOCOMPLETE;
+
+interface IAutoComplete2 : public IAutoComplete {
+	HRESULT SetOptions(DWORD);
+	HRESULT GetOptions(DWORD*);
+}
+alias IAutoComplete2* LPAUTOCOMPLETE2;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/shlguid.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,18 @@
+/***********************************************************************\
+*                               shlguid.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.shlguid;
+
+private import win32.basetyps, win32.w32api;
+
+// FIXME: clean up Windows version support
+
+// I think this is just a helper macro for other win32 headers?
+//MACRO #define DEFINE_SHLGUID(n,l,w1,w2) DEFINE_GUID(n,l,w1,w2,0xC0,0,0,0,0,0,0,0x46)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/shlobj.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,1351 @@
+/***********************************************************************\
+*                                shlobj.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.shlobj;
+pragma(lib, "shell32.lib");
+
+// TODO: fix bitfields
+// TODO: CMIC_VALID_SEE_FLAGS
+// SHGetFolderPath in shfolder.dll on W9x, NT4, also in shell32.dll on W2K
+
+import win32.commctrl, win32.ole2, win32.shlguid, win32.shellapi;
+private import win32.prsht, win32.unknwn, win32.w32api, win32.winbase,
+  win32.winnt, win32.winuser, win32.wtypes, win32.objfwd, win32.objidl;
+private import win32.winnetwk; // for NETRESOURCE
+
+
+// FIXME: clean up Windows version support
+
+align(1):
+
+const BIF_RETURNONLYFSDIRS = 1;
+const BIF_DONTGOBELOWDOMAIN = 2;
+const BIF_STATUSTEXT = 4;
+const BIF_RETURNFSANCESTORS = 8;
+const BIF_EDITBOX = 16;
+const BIF_VALIDATE = 32;
+const BIF_NEWDIALOGSTYLE = 64;
+const BIF_BROWSEINCLUDEURLS = 128;
+const BIF_USENEWUI =  BIF_EDITBOX | BIF_NEWDIALOGSTYLE;
+const BIF_BROWSEFORCOMPUTER = 0x1000;
+const BIF_BROWSEFORPRINTER = 0x2000;
+const BIF_BROWSEINCLUDEFILES = 0x4000;
+const BIF_SHAREABLE = 0x8000;
+const BFFM_INITIALIZED = 1;
+const BFFM_SELCHANGED = 2;
+const BFFM_VALIDATEFAILEDA = 3;
+const BFFM_VALIDATEFAILEDW = 4;
+const BFFM_SETSTATUSTEXTA = WM_USER + 100;
+const BFFM_ENABLEOK = WM_USER + 101;
+const BFFM_SETSELECTIONA = WM_USER + 102;
+const BFFM_SETSELECTIONW = WM_USER + 103;
+const BFFM_SETSTATUSTEXTW = WM_USER + 104;
+const BFFM_SETOKTEXT = WM_USER + 105;
+const BFFM_SETEXPANDED = WM_USER + 106;
+
+version(Unicode) {
+	alias BFFM_SETSTATUSTEXTW BFFM_SETSTATUSTEXT;
+	alias BFFM_SETSELECTIONW BFFM_SETSELECTION;
+	alias BFFM_VALIDATEFAILEDW BFFM_VALIDATEFAILED;
+} else {
+	alias BFFM_SETSTATUSTEXTA BFFM_SETSTATUSTEXT;
+	alias BFFM_SETSELECTIONA BFFM_SETSELECTION;
+	alias BFFM_VALIDATEFAILEDA BFFM_VALIDATEFAILED;
+}
+
+const DVASPECT_SHORTNAME = 2;
+
+const SHARD_PIDL = 1;
+const SHARD_PATH = 2;
+
+const SHCNE_RENAMEITEM = 1;
+const SHCNE_CREATE = 2;
+const SHCNE_DELETE = 4;
+const SHCNE_MKDIR = 8;
+const SHCNE_RMDIR = 16;
+const SHCNE_MEDIAINSERTED = 32;
+const SHCNE_MEDIAREMOVED = 64;
+const SHCNE_DRIVEREMOVED = 128;
+const SHCNE_DRIVEADD = 256;
+const SHCNE_NETSHARE = 512;
+const SHCNE_NETUNSHARE = 1024;
+const SHCNE_ATTRIBUTES = 2048;
+const SHCNE_UPDATEDIR = 4096;
+const SHCNE_UPDATEITEM = 8192;
+const SHCNE_SERVERDISCONNECT = 16384;
+const SHCNE_UPDATEIMAGE = 32768;
+const SHCNE_DRIVEADDGUI = 65536;
+const SHCNE_RENAMEFOLDER = 0x20000;
+const SHCNE_FREESPACE = 0x40000;
+const SHCNE_ASSOCCHANGED = 0x8000000;
+const SHCNE_DISKEVENTS = 0x2381F;
+const SHCNE_GLOBALEVENTS = 0xC0581E0;
+const SHCNE_ALLEVENTS = 0x7FFFFFFF;
+const SHCNE_INTERRUPT = 0x80000000;
+
+const SHCNF_IDLIST = 0;
+const SHCNF_PATHA = 1;
+const SHCNF_PRINTERA = 2;
+const SHCNF_DWORD = 3;
+const SHCNF_PATHW = 5;
+const SHCNF_PRINTERW = 6;
+const SHCNF_TYPE = 0xFF;
+const SHCNF_FLUSH = 0x1000;
+const SHCNF_FLUSHNOWAIT = 0x2000;
+
+version(Unicode) {
+	alias SHCNF_PATHW SHCNF_PATH;
+	alias SHCNF_PRINTERW SHCNF_PRINTER;
+} else {
+	alias SHCNF_PATHA SHCNF_PATH;
+	alias SHCNF_PRINTERA SHCNF_PRINTER;
+}
+
+const SFGAO_CANCOPY = DROPEFFECT.DROPEFFECT_COPY;
+const SFGAO_CANMOVE = DROPEFFECT.DROPEFFECT_MOVE;
+const SFGAO_CANLINK = DROPEFFECT.DROPEFFECT_LINK;
+const SFGAO_CANRENAME = 0x00000010L;
+const SFGAO_CANDELETE = 0x00000020L;
+const SFGAO_HASPROPSHEET = 0x00000040L;
+const SFGAO_DROPTARGET = 0x00000100L;
+const SFGAO_CAPABILITYMASK = 0x00000177L;
+const SFGAO_GHOSTED = 0x00008000L;
+const SFGAO_LINK = 0x00010000L;
+const SFGAO_SHARE = 0x00020000L;
+const SFGAO_READONLY = 0x00040000L;
+const SFGAO_HIDDEN = 0x00080000L;
+const SFGAO_DISPLAYATTRMASK = 0x000F0000L;
+const SFGAO_FILESYSANCESTOR = 0x10000000L;
+const SFGAO_FOLDER = 0x20000000L;
+const SFGAO_FILESYSTEM = 0x40000000L;
+const SFGAO_HASSUBFOLDER = 0x80000000L;
+const SFGAO_CONTENTSMASK = 0x80000000L;
+const SFGAO_VALIDATE = 0x01000000L;
+const SFGAO_REMOVABLE = 0x02000000L;
+const SFGAO_COMPRESSED = 0x04000000L;
+const STRRET_WSTR = 0;
+const STRRET_OFFSET = 1;
+const STRRET_CSTR = 2;
+
+enum {
+	SHGDFIL_FINDDATA = 1,
+	SHGDFIL_NETRESOURCE,
+	SHGDFIL_DESCRIPTIONID
+}
+
+enum {
+	SHDID_ROOT_REGITEM = 1,
+	SHDID_FS_FILE,
+	SHDID_FS_DIRECTORY,
+	SHDID_FS_OTHER,
+	SHDID_COMPUTER_DRIVE35,
+	SHDID_COMPUTER_DRIVE525,
+	SHDID_COMPUTER_REMOVABLE,
+	SHDID_COMPUTER_FIXED,
+	SHDID_COMPUTER_NETDRIVE,
+	SHDID_COMPUTER_CDROM,
+	SHDID_COMPUTER_RAMDISK,
+	SHDID_COMPUTER_OTHER,
+	SHDID_NET_DOMAIN,
+	SHDID_NET_SERVER,
+	SHDID_NET_SHARE,
+	SHDID_NET_RESTOFNET,
+	SHDID_NET_OTHER
+}
+
+const TCHAR[] REGSTR_PATH_EXPLORER = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer";
+const TCHAR[] REGSTR_PATH_SPECIAL_FOLDERS=REGSTR_PATH_EXPLORER ~ "\\Shell Folders";
+
+enum {
+	CSIDL_DESKTOP = 0,
+	CSIDL_INTERNET,
+	CSIDL_PROGRAMS,
+	CSIDL_CONTROLS,
+	CSIDL_PRINTERS,
+	CSIDL_PERSONAL,
+	CSIDL_FAVORITES,
+	CSIDL_STARTUP,
+	CSIDL_RECENT,
+	CSIDL_SENDTO,
+	CSIDL_BITBUCKET,
+	CSIDL_STARTMENU, // = 11
+	CSIDL_DESKTOPDIRECTORY = 16,
+	CSIDL_DRIVES,
+	CSIDL_NETWORK,
+	CSIDL_NETHOOD,
+	CSIDL_FONTS,
+	CSIDL_TEMPLATES,
+	CSIDL_COMMON_STARTMENU,
+	CSIDL_COMMON_PROGRAMS,
+	CSIDL_COMMON_STARTUP,
+	CSIDL_COMMON_DESKTOPDIRECTORY,
+	CSIDL_APPDATA,
+	CSIDL_PRINTHOOD,
+	CSIDL_LOCAL_APPDATA,
+	CSIDL_ALTSTARTUP,
+	CSIDL_COMMON_ALTSTARTUP,
+	CSIDL_COMMON_FAVORITES,
+	CSIDL_INTERNET_CACHE,
+	CSIDL_COOKIES,
+	CSIDL_HISTORY,
+	CSIDL_COMMON_APPDATA,
+	CSIDL_WINDOWS,
+	CSIDL_SYSTEM,
+	CSIDL_PROGRAM_FILES,
+	CSIDL_MYPICTURES,
+	CSIDL_PROFILE,
+	CSIDL_SYSTEMX86,
+	CSIDL_PROGRAM_FILESX86,
+	CSIDL_PROGRAM_FILES_COMMON,
+	CSIDL_PROGRAM_FILES_COMMONX86,
+	CSIDL_COMMON_TEMPLATES,
+	CSIDL_COMMON_DOCUMENTS,
+	CSIDL_COMMON_ADMINTOOLS,
+	CSIDL_ADMINTOOLS,
+	CSIDL_CONNECTIONS, // =49
+	CSIDL_COMMON_MUSIC = 53,
+	CSIDL_COMMON_PICTURES,
+	CSIDL_COMMON_VIDEO,
+	CSIDL_RESOURCES,
+	CSIDL_RESOURCES_LOCALIZED,
+	CSIDL_COMMON_OEM_LINKS,
+	CSIDL_CDBURN_AREA, // = 59
+	CSIDL_COMPUTERSNEARME = 61,
+	CSIDL_FLAG_DONT_VERIFY = 0x4000,
+	CSIDL_FLAG_CREATE = 0x8000,
+	CSIDL_FLAG_MASK = 0xFF00
+}
+
+const TCHAR[]
+	CFSTR_SHELLIDLIST       = "Shell IDList Array",
+	CFSTR_SHELLIDLISTOFFSET = "Shell Object Offsets",
+	CFSTR_NETRESOURCES      = "Net Resource",
+	CFSTR_FILECONTENTS      = "FileContents",
+	CFSTR_FILENAMEA         = "FileName",
+	CFSTR_FILENAMEMAPA      = "FileNameMap",
+	CFSTR_FILEDESCRIPTORA   = "FileGroupDescriptor",
+	CFSTR_INETURLA          = "UniformResourceLocator",
+	CFSTR_SHELLURL          = CFSTR_INETURLA,
+	CFSTR_FILENAMEW         = "FileNameW",
+	CFSTR_FILENAMEMAPW      = "FileNameMapW",
+	CFSTR_FILEDESCRIPTORW   = "FileGroupDescriptorW",
+	CFSTR_INETURLW          = "UniformResourceLocatorW";
+
+version(Unicode) {
+	alias CFSTR_FILENAMEW CFSTR_FILENAME;
+	alias CFSTR_FILENAMEMAPW CFSTR_FILENAMEMAP;
+	alias CFSTR_FILEDESCRIPTORW CFSTR_FILEDESCRIPTOR;
+	alias CFSTR_INETURLW CFSTR_INETURL;
+} else {
+	alias CFSTR_FILENAMEA CFSTR_FILENAME;
+	alias CFSTR_FILENAMEMAPA CFSTR_FILENAMEMAP;
+	alias CFSTR_FILEDESCRIPTORA CFSTR_FILEDESCRIPTOR;
+	alias CFSTR_INETURLA CFSTR_INETURL;
+}
+const TCHAR[]
+	CFSTR_PRINTERGROUP        = "PrinterFriendlyName",
+	CFSTR_INDRAGLOOP          = "InShellDragLoop",
+	CFSTR_PASTESUCCEEDED      = "Paste Succeeded",
+	CFSTR_PERFORMEDDROPEFFECT = "Performed DropEffect",
+	CFSTR_PREFERREDDROPEFFECT = "Preferred DropEffect";
+
+const CMF_NORMAL=0;
+const CMF_DEFAULTONLY=1;
+const CMF_VERBSONLY=2;
+const CMF_EXPLORE=4;
+const CMF_NOVERBS=8;
+const CMF_CANRENAME=16;
+const CMF_NODEFAULT=32;
+const CMF_INCLUDESTATIC=64;
+const CMF_RESERVED=0xffff0000;
+const GCS_VERBA=0;
+const GCS_HELPTEXTA=1;
+const GCS_VALIDATEA=2;
+const GCS_VERBW=4;
+const GCS_HELPTEXTW=5;
+const GCS_VALIDATEW=6;
+const GCS_UNICODE=4;
+
+version(Unicode) {
+	alias GCS_VERBW GCS_VERB;
+	alias GCS_HELPTEXTW GCS_HELPTEXT;
+	alias GCS_VALIDATEW GCS_VALIDATE;
+} else {
+	alias GCS_VERBA GCS_VERB;
+	alias GCS_HELPTEXTA GCS_HELPTEXT;
+	alias GCS_VALIDATEA GCS_VALIDATE;
+}
+
+const TCHAR[]
+	CMDSTR_NEWFOLDER   = "NewFolder",
+	CMDSTR_VIEWLIST    = "ViewList",
+	CMDSTR_VIEWDETAILS = "ViewDetails";
+
+const CMIC_MASK_HOTKEY     = SEE_MASK_HOTKEY;
+const CMIC_MASK_ICON       = SEE_MASK_ICON;
+const CMIC_MASK_FLAG_NO_UI = SEE_MASK_FLAG_NO_UI;
+const CMIC_MASK_MODAL      = 0x80000000;
+// TODO: This isn't defined anywhere in MinGW.
+//const CMIC_VALID_SEE_FLAGS=SEE_VALID_CMIC_FLAGS;
+
+const GIL_OPENICON = 1;
+const GIL_FORSHELL = 2;
+const GIL_SIMULATEDOC = 1;
+const GIL_PERINSTANCE = 2;
+const GIL_PERCLASS = 4;
+const GIL_NOTFILENAME = 8;
+const GIL_DONTCACHE = 16;
+
+const FVSIF_RECT = 1;
+const FVSIF_PINNED = 2;
+const FVSIF_NEWFAILED = 0x8000000;
+const FVSIF_NEWFILE = 0x80000000;
+const FVSIF_CANVIEWIT = 0x40000000;
+
+const CDBOSC_SETFOCUS = 0;
+const CDBOSC_KILLFOCUS = 1;
+const CDBOSC_SELCHANGE = 2;
+const CDBOSC_RENAME = 3;
+
+const FCIDM_SHVIEWFIRST = 0;
+const FCIDM_SHVIEWLAST = 0x7fff;
+const FCIDM_BROWSERFIRST = 0xa000;
+const FCIDM_BROWSERLAST = 0xbf00;
+const FCIDM_GLOBALFIRST = 0x8000;
+const FCIDM_GLOBALLAST = 0x9fff;
+const FCIDM_MENU_FILE = FCIDM_GLOBALFIRST;
+const FCIDM_MENU_EDIT = FCIDM_GLOBALFIRST+0x0040;
+const FCIDM_MENU_VIEW = FCIDM_GLOBALFIRST+0x0080;
+const FCIDM_MENU_VIEW_SEP_OPTIONS = FCIDM_GLOBALFIRST+0x0081;
+const FCIDM_MENU_TOOLS = FCIDM_GLOBALFIRST+0x00c0;
+const FCIDM_MENU_TOOLS_SEP_GOTO = FCIDM_GLOBALFIRST+0x00c1;
+const FCIDM_MENU_HELP = FCIDM_GLOBALFIRST+0x0100;
+const FCIDM_MENU_FIND = FCIDM_GLOBALFIRST+0x0140;
+const FCIDM_MENU_EXPLORE = FCIDM_GLOBALFIRST+0x0150;
+const FCIDM_MENU_FAVORITES = FCIDM_GLOBALFIRST+0x0170;
+const FCIDM_TOOLBAR = FCIDM_BROWSERFIRST;
+const FCIDM_STATUS = FCIDM_BROWSERFIRST+1;
+
+const SBSP_DEFBROWSER = 0;
+const SBSP_SAMEBROWSER = 1;
+const SBSP_NEWBROWSER = 2;
+const SBSP_DEFMODE = 0;
+const SBSP_OPENMODE = 16;
+const SBSP_EXPLOREMODE = 32;
+const SBSP_ABSOLUTE = 0;
+const SBSP_RELATIVE = 0x1000;
+const SBSP_PARENT = 0x2000;
+const SBSP_INITIATEDBYHLINKFRAME = 0x80000000;
+const SBSP_REDIRECT = 0x40000000;
+
+enum {
+	FCW_STATUS=1,
+	FCW_TOOLBAR,
+	FCW_TREE
+}
+
+const FCT_MERGE=1;
+const FCT_CONFIGABLE=2;
+const FCT_ADDTOEND=4;
+
+const SVSI_DESELECT=0;
+const SVSI_SELECT=1;
+const SVSI_EDIT=3;
+const SVSI_DESELECTOTHERS=4;
+const SVSI_ENSUREVISIBLE=8;
+const SVSI_FOCUSED=16;
+
+const SVGIO_BACKGROUND=0;
+const SVGIO_SELECTION=1;
+const SVGIO_ALLVIEW=2;
+
+const UINT SV2GV_CURRENTVIEW=-1;
+const UINT SV2GV_DEFAULTVIEW=-2;
+
+alias ULONG SFGAOF;
+alias DWORD SHGDNF;
+
+struct CIDA {
+	UINT    cidl;
+	UINT[1] aoffset;
+}
+alias CIDA* LPIDA;
+
+struct SHITEMID {
+	USHORT  cb;
+	BYTE[1] abID;
+}
+alias SHITEMID* LPSHITEMID, LPCSHITEMID;
+
+struct ITEMIDLIST {
+	SHITEMID mkid;
+}
+alias ITEMIDLIST* LPITEMIDLIST, LPCITEMIDLIST;
+
+alias int function(HWND,UINT,LPARAM,LPARAM) BFFCALLBACK;
+
+struct BROWSEINFOA {
+	HWND          hwndOwner;
+	LPCITEMIDLIST pidlRoot;
+	LPSTR         pszDisplayName;
+	LPCSTR        lpszTitle;
+	UINT          ulFlags;
+	BFFCALLBACK   lpfn;
+	LPARAM        lParam;
+	int           iImage;
+}
+alias BROWSEINFOA* PBROWSEINFOA, LPBROWSEINFOA;
+
+struct BROWSEINFOW {
+	HWND          hwndOwner;
+	LPCITEMIDLIST pidlRoot;
+	LPWSTR        pszDisplayName;
+	LPCWSTR       lpszTitle;
+	UINT          ulFlags;
+	BFFCALLBACK   lpfn;
+	LPARAM        lParam;
+	int           iImage;
+}
+alias BROWSEINFOW* PBROWSEINFOW, LPBROWSEINFOW;
+
+struct CMINVOKECOMMANDINFO {
+	DWORD cbSize = this.sizeof;
+	DWORD fMask;
+	HWND hwnd;
+	LPCSTR lpVerb;
+	LPCSTR lpParameters;
+	LPCSTR lpDirectory;
+	int nShow;
+	DWORD dwHotKey;
+	HANDLE hIcon;
+}
+alias CMINVOKECOMMANDINFO* LPCMINVOKECOMMANDINFO;
+
+struct DROPFILES {
+	DWORD pFiles;
+	POINT pt;
+	BOOL fNC;
+	BOOL fWide;
+}
+alias DROPFILES* LPDROPFILES;
+
+enum SHGNO {
+	SHGDN_NORMAL             = 0,
+	SHGDN_INFOLDER,
+	SHGDN_FOREDITING         = 0x1000,
+	SHGDN_INCLUDE_NONFILESYS = 0x2000,
+	SHGDN_FORADDRESSBAR      = 0x4000,
+	SHGDN_FORPARSING         = 0x8000
+}
+
+enum SHCONTF {
+	SHCONTF_FOLDERS            = 32,
+	SHCONTF_NONFOLDERS         = 64,
+	SHCONTF_INCLUDEHIDDEN      = 128,
+	SHCONTF_INIT_ON_FIRST_NEXT = 256,
+	SHCONTF_NETPRINTERSRCH     = 512,
+	SHCONTF_SHAREABLE          = 1024,
+	SHCONTF_STORAGE            = 2048
+}
+
+struct STRRET {
+	UINT uType;
+	union {
+		LPWSTR pOleStr;
+		UINT uOffset;
+		char cStr[MAX_PATH];
+	}
+}
+alias STRRET* LPSTRRET;
+
+enum FD_FLAGS {
+	FD_CLSID      = 1,
+	FD_SIZEPOINT  = 2,
+	FD_ATTRIBUTES = 4,
+	FD_CREATETIME = 8,
+	FD_ACCESSTIME = 16,
+	FD_WRITESTIME = 32,
+	FD_FILESIZE   = 64,
+	FD_LINKUI     = 0x8000
+}
+
+struct FILEDESCRIPTORA {
+	DWORD dwFlags;
+	CLSID clsid;
+	SIZEL sizel;
+	POINTL pointl;
+	DWORD dwFileAttributes;
+	FILETIME ftCreationTime;
+	FILETIME ftLastAccessTime;
+	FILETIME ftLastWriteTime;
+	DWORD nFileSizeHigh;
+	DWORD nFileSizeLow;
+	CHAR cFileName[MAX_PATH];
+}
+alias FILEDESCRIPTORA* LPFILEDESCRIPTORA;
+
+struct FILEDESCRIPTORW {
+	DWORD dwFlags;
+	CLSID clsid;
+	SIZEL sizel;
+	POINTL pointl;
+	DWORD dwFileAttributes;
+	FILETIME ftCreationTime;
+	FILETIME ftLastAccessTime;
+	FILETIME ftLastWriteTime;
+	DWORD nFileSizeHigh;
+	DWORD nFileSizeLow;
+	WCHAR cFileName[MAX_PATH];
+}
+alias FILEDESCRIPTORW* LPFILEDESCRIPTORW;
+
+struct FILEGROUPDESCRIPTORA {
+	UINT cItems;
+	FILEDESCRIPTORA fgd[1];
+}
+alias FILEGROUPDESCRIPTORA* LPFILEGROUPDESCRIPTORA;
+
+struct FILEGROUPDESCRIPTORW {
+	UINT cItems;
+	FILEDESCRIPTORW fgd[1];
+}
+alias FILEGROUPDESCRIPTORW* LPFILEGROUPDESCRIPTORW;
+
+enum SLR_FLAGS {
+	SLR_NO_UI      = 1,
+	SLR_ANY_MATCH  = 2,
+	SLR_UPDATE     = 4,
+	SLR_NOUPDATE   = 8,
+	SLR_NOSEARCH   = 16,
+	SLR_NOTRACK    = 32,
+	SLR_NOLINKINFO = 64,
+	SLR_INVOKE_MSI = 128
+}
+
+enum SLGP_FLAGS {
+	SLGP_SHORTPATH=1,
+	SLGP_UNCPRIORITY=2,
+	SLGP_RAWPATH=4
+}
+
+alias PBYTE LPVIEWSETTINGS;
+
+enum FOLDERFLAGS {
+	FWF_AUTOARRANGE         = 1,
+	FWF_ABBREVIATEDNAMES    = 2,
+	FWF_SNAPTOGRID          = 4,
+	FWF_OWNERDATA           = 8,
+	FWF_BESTFITWINDOW       = 16,
+	FWF_DESKTOP             = 32,
+	FWF_SINGLESEL           = 64,
+	FWF_NOSUBFOLDERS        = 128,
+	FWF_TRANSPARENT         = 256,
+	FWF_NOCLIENTEDGE        = 512,
+	FWF_NOSCROLL            = 0x400,
+	FWF_ALIGNLEFT           = 0x800,
+	FWF_SINGLECLICKACTIVATE = 0x8000
+}
+
+enum FOLDERVIEWMODE {
+	FVM_ICON      = 1,
+	FVM_SMALLICON,
+	FVM_LIST,
+	FVM_DETAILS
+}
+
+struct FOLDERSETTINGS {
+	UINT ViewMode;
+	UINT fFlags;
+}
+alias FOLDERSETTINGS* LPFOLDERSETTINGS, LPCFOLDERSETTINGS;
+
+struct FVSHOWINFO {
+	DWORD cbSize = this.sizeof;
+	HWND hwndOwner;
+	int iShow;
+	DWORD dwFlags;
+	RECT rect;
+	LPUNKNOWN punkRel;
+	OLECHAR strNewFile[MAX_PATH];
+}
+alias FVSHOWINFO* LPFVSHOWINFO;
+
+struct NRESARRAY {
+	UINT cItems;
+	NETRESOURCE nr[1];
+}
+alias NRESARRAY* LPNRESARRAY;
+
+enum {
+	SBSC_HIDE,
+	SBSC_SHOW,
+	SBSC_TOGGLE,
+	SBSC_QUERY
+}
+
+enum {
+	SBCMDID_ENABLESHOWTREE,
+	SBCMDID_SHOWCONTROL,
+	SBCMDID_CANCELNAVIGATION,
+	SBCMDID_MAYSAVECHANGES,
+	SBCMDID_SETHLINKFRAME,
+	SBCMDID_ENABLESTOP,
+	SBCMDID_OPTIONS
+}
+enum SVUIA_STATUS {
+	SVUIA_DEACTIVATE,
+	SVUIA_ACTIVATE_NOFOCUS,
+	SVUIA_ACTIVATE_FOCUS,
+	SVUIA_INPLACEACTIVATE
+}
+
+static if (_WIN32_IE >= 0x0500) {
+
+	struct EXTRASEARCH
+	 {
+		GUID guidSearch;
+		WCHAR wszFriendlyName[80];
+		WCHAR wszUrl[2084];
+	}
+	alias EXTRASEARCH* LPEXTRASEARCH;
+
+	alias DWORD SHCOLSTATEF;
+
+	struct SHCOLUMNID {
+		GUID fmtid;
+		DWORD pid;
+	}
+	alias SHCOLUMNID* LPSHCOLUMNID, LPCSHCOLUMNID;
+
+	struct SHELLDETAILS {
+		int fmt;
+		int cxChar;
+		STRRET str;
+	}
+	alias SHELLDETAILS* LPSHELLDETAILS;
+
+	struct PERSIST_FOLDER_TARGET_INFO
+	 {
+		LPITEMIDLIST pidlTargetFolder;
+		WCHAR szTargetParsingName[MAX_PATH];
+		WCHAR szNetworkProvider[MAX_PATH];
+		DWORD dwAttributes;
+		int csidl;
+	}
+
+	enum SHGFP_TYPE {
+		SHGFP_TYPE_CURRENT = 0,
+		SHGFP_TYPE_DEFAULT = 1,
+	}
+
+}
+
+interface IEnumIDList: public IUnknown
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT Next(ULONG,LPITEMIDLIST*,ULONG*);
+	HRESULT Skip(ULONG);
+	HRESULT Reset();
+	HRESULT Clone(IEnumIDList**);
+}
+alias IEnumIDList *LPENUMIDLIST;
+
+interface IObjMgr : public IUnknown
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT Append(IUnknown*);
+	HRESULT Remove(IUnknown*);
+}
+
+interface IContextMenu : public IUnknown
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT QueryContextMenu(HMENU,UINT,UINT,UINT,UINT);
+	HRESULT InvokeCommand(LPCMINVOKECOMMANDINFO);
+	HRESULT GetCommandString(UINT,UINT,PUINT,LPSTR,UINT);
+}
+alias IContextMenu* LPCONTEXTMENU;
+
+interface IContextMenu2 : public IContextMenu
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT QueryContextMenu(HMENU,UINT,UINT,UINT,UINT);
+	HRESULT InvokeCommand(LPCMINVOKECOMMANDINFO);
+	HRESULT GetCommandString(UINT,UINT,PUINT,LPSTR,UINT);
+	HRESULT HandleMenuMsg(UINT,WPARAM,LPARAM);
+};
+alias IContextMenu2* LPCONTEXTMENU2;
+
+static if (_WIN32_IE >= 0x0500) {
+
+	align(8):
+	struct SHCOLUMNINIT {
+		ULONG dwFlags;
+		ULONG dwReserved;
+		WCHAR wszFolder[MAX_PATH];
+	}
+	alias SHCOLUMNINIT* LPSHCOLUMNINIT, LPCSHCOLUMNINIT;
+
+	struct SHCOLUMNDATA {
+		ULONG dwFlags;
+		DWORD dwFileAttributes;
+		ULONG dwReserved;
+		WCHAR *pwszExt;
+		WCHAR wszFile[MAX_PATH];
+	}
+	alias SHCOLUMNDATA* LPSHCOLUMNDATA, LPCSHCOLUMNDATA;
+	align:
+
+	const MAX_COLUMN_NAME_LEN = 80;
+	const MAX_COLUMN_DESC_LEN = 128;
+
+	align(1):
+	struct SHCOLUMNINFO {
+		SHCOLUMNID scid;
+		VARTYPE vt;
+		DWORD fmt;
+		UINT cChars;
+		DWORD csFlags;
+		WCHAR wszTitle[MAX_COLUMN_NAME_LEN];
+		WCHAR wszDescription[MAX_COLUMN_DESC_LEN];
+	}
+	alias SHCOLUMNINFO* LPSHCOLUMNINFO, LPCSHCOLUMNINFO;
+	align:
+
+	enum SHCOLSTATE {
+		SHCOLSTATE_TYPE_STR      = 0x00000001,
+		SHCOLSTATE_TYPE_INT      = 0x00000002,
+		SHCOLSTATE_TYPE_DATE     = 0x00000003,
+		SHCOLSTATE_TYPEMASK      = 0x0000000f,
+		SHCOLSTATE_ONBYDEFAULT   = 0x00000010,
+		SHCOLSTATE_SLOW          = 0x00000020,
+		SHCOLSTATE_EXTENDED      = 0x00000040,
+		SHCOLSTATE_SECONDARYUI   = 0x00000080,
+		SHCOLSTATE_HIDDEN        = 0x00000100,
+		SHCOLSTATE_PREFER_VARCMP = 0x00000200
+	}
+
+	interface IColumnProvider : public IUnknown
+	 {
+		HRESULT QueryInterface(REFIID,PVOID*);
+		ULONG AddRef();
+		ULONG Release();
+		HRESULT Initialize(LPCSHCOLUMNINIT);
+		HRESULT GetColumnInfo(DWORD,SHCOLUMNINFO*);
+		HRESULT GetItemData(LPCSHCOLUMNID,LPCSHCOLUMNDATA,VARIANT*);
+	}
+}/* _WIN32_IE >= 0x0500 */
+
+interface IQueryInfo : public IUnknown
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT GetInfoTip(DWORD,WCHAR**);
+	HRESULT GetInfoFlags(DWORD*);
+}
+
+interface IShellExtInit : public IUnknown
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT Initialize(LPCITEMIDLIST,LPDATAOBJECT,HKEY);
+}
+alias IShellExtInit *LPSHELLEXTINIT;
+
+interface IShellPropSheetExt : public IUnknown
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT AddPages(LPFNADDPROPSHEETPAGE,LPARAM);
+	HRESULT ReplacePage(UINT,LPFNADDPROPSHEETPAGE,LPARAM);
+}
+alias IShellPropSheetExt *LPSHELLPROPSHEETEXT;
+
+interface IExtractIconA : public IUnknown
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT GetIconLocation(UINT,LPSTR,UINT,int*,PUINT);
+	HRESULT Extract(LPCSTR,UINT,HICON*,HICON*,UINT);
+};
+alias IExtractIconA *LPEXTRACTICONA;
+
+interface IExtractIconW : public IUnknown
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT GetIconLocation(UINT,LPWSTR,UINT,int*,PUINT);
+	HRESULT Extract(LPCWSTR,UINT,HICON*,HICON*,UINT);
+}
+alias IExtractIconW *LPEXTRACTICONW;
+
+version(Unicode) {
+	alias IExtractIconW IExtractIcon;
+	alias LPEXTRACTICONW LPEXTRACTICON;
+} else {
+	alias IExtractIconA IExtractIcon;
+	alias LPEXTRACTICONA LPEXTRACTICON;
+}
+
+interface IShellLinkA : public IUnknown
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT GetPath(LPSTR,int,WIN32_FIND_DATAA*,DWORD);
+	HRESULT GetIDList(LPITEMIDLIST*);
+	HRESULT SetIDList(LPCITEMIDLIST);
+	HRESULT GetDescription(LPSTR,int);
+	HRESULT SetDescription(LPCSTR);
+	HRESULT GetWorkingDirectory(LPSTR,int);
+	HRESULT SetWorkingDirectory(LPCSTR);
+	HRESULT GetArguments(LPSTR,int);
+	HRESULT SetArguments(LPCSTR);
+	HRESULT GetHotkey(PWORD);
+	HRESULT SetHotkey(WORD);
+	HRESULT GetShowCmd(int*);
+	HRESULT SetShowCmd(int);
+	HRESULT GetIconLocation(LPSTR,int,int*);
+	HRESULT SetIconLocation(LPCSTR,int);
+	HRESULT SetRelativePath(LPCSTR ,DWORD);
+	HRESULT Resolve(HWND,DWORD);
+	HRESULT SetPath(LPCSTR);
+}
+
+interface IShellLinkW : public IUnknown
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT GetPath(LPWSTR,int,WIN32_FIND_DATAW*,DWORD);
+	HRESULT GetIDList(LPITEMIDLIST*);
+	HRESULT SetIDList(LPCITEMIDLIST);
+	HRESULT GetDescription(LPWSTR,int);
+	HRESULT SetDescription(LPCWSTR);
+	HRESULT GetWorkingDirectory(LPWSTR,int);
+	HRESULT SetWorkingDirectory(LPCWSTR);
+	HRESULT GetArguments(LPWSTR,int);
+	HRESULT SetArguments(LPCWSTR);
+	HRESULT GetHotkey(PWORD);
+	HRESULT SetHotkey(WORD);
+	HRESULT GetShowCmd(int*);
+	HRESULT SetShowCmd(int);
+	HRESULT GetIconLocation(LPWSTR,int,int*);
+	HRESULT SetIconLocation(LPCWSTR,int);
+	HRESULT SetRelativePath(LPCWSTR ,DWORD);
+	HRESULT Resolve(HWND,DWORD);
+	HRESULT SetPath(LPCWSTR);
+}
+
+
+interface IShellFolder : public IUnknown
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT ParseDisplayName(HWND,LPBC,LPOLESTR,PULONG,LPITEMIDLIST*,PULONG);
+	HRESULT EnumObjects(HWND,DWORD,LPENUMIDLIST*);
+	HRESULT BindToObject(LPCITEMIDLIST,LPBC,REFIID,PVOID*);
+	HRESULT BindToStorage(LPCITEMIDLIST,LPBC,REFIID,PVOID*);
+	HRESULT CompareIDs(LPARAM,LPCITEMIDLIST,LPCITEMIDLIST);
+	HRESULT CreateViewObject(HWND,REFIID,PVOID*);
+	HRESULT GetAttributesOf(UINT,LPCITEMIDLIST*,PULONG);
+	HRESULT GetUIObjectOf(HWND,UINT,LPCITEMIDLIST*,REFIID,PUINT,PVOID*);
+	HRESULT GetDisplayNameOf(LPCITEMIDLIST,DWORD,LPSTRRET);
+	HRESULT SetNameOf(HWND,LPCITEMIDLIST,LPCOLESTR,DWORD,LPITEMIDLIST*);
+}
+alias IShellFolder *LPSHELLFOLDER;
+
+static if (_WIN32_IE >= 0x0500) {
+
+interface IEnumExtraSearch: public IUnknown
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT Next(ULONG,LPEXTRASEARCH*,ULONG*);
+	HRESULT Skip(ULONG);
+	HRESULT Reset();
+	HRESULT Clone(IEnumExtraSearch**);
+}
+alias IEnumExtraSearch *LPENUMEXTRASEARCH;
+
+interface IShellFolder2 : public IShellFolder
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT ParseDisplayName(HWND,LPBC,LPOLESTR,PULONG,LPITEMIDLIST*,PULONG);
+	HRESULT EnumObjects(HWND,DWORD,LPENUMIDLIST*);
+	HRESULT BindToObject(LPCITEMIDLIST,LPBC,REFIID,PVOID*);
+	HRESULT BindToStorage(LPCITEMIDLIST,LPBC,REFIID,PVOID*);
+	HRESULT CompareIDs(LPARAM,LPCITEMIDLIST,LPCITEMIDLIST);
+	HRESULT CreateViewObject(HWND,REFIID,PVOID*);
+	HRESULT GetAttributesOf(UINT,LPCITEMIDLIST*,PULONG);
+	HRESULT GetUIObjectOf(HWND,UINT,LPCITEMIDLIST*,REFIID,PUINT,PVOID*);
+	HRESULT GetDisplayNameOf(LPCITEMIDLIST,DWORD,LPSTRRET);
+	HRESULT SetNameOf(HWND,LPCITEMIDLIST,LPCOLESTR,DWORD,LPITEMIDLIST*);
+	HRESULT GetDefaultSearchGUID(GUID*);
+	HRESULT EnumSearches(IEnumExtraSearch**);
+	HRESULT GetDefaultColumn(DWORD,ULONG*,ULONG*);
+	HRESULT GetDefaultColumnState(UINT,SHCOLSTATEF*);
+	HRESULT GetDetailsEx(LPCITEMIDLIST, SHCOLUMNID*,VARIANT*);
+	HRESULT GetDetailsOf(LPCITEMIDLIST,UINT,SHELLDETAILS*);
+	HRESULT MapColumnToSCID(UINT,SHCOLUMNID*);
+}
+alias IShellFolder2 *LPSHELLFOLDER2;
+
+} /* _WIN32_IE >= 0x0500 */
+
+interface ICopyHook : public IUnknown
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	UINT CopyCallback(HWND,UINT,UINT,LPCSTR,DWORD,LPCSTR,DWORD);
+}
+alias ICopyHook *LPCOPYHOOK;
+
+interface IFileViewerSite : public IUnknown
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT SetPinnedWindow(HWND);
+	HRESULT GetPinnedWindow(HWND*);
+}
+alias IFileViewerSite *LPFILEVIEWERSITE;
+
+interface IFileViewer : public IUnknown
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT ShowInitialize(LPFILEVIEWERSITE);
+	HRESULT Show(LPFVSHOWINFO);
+	HRESULT PrintTo(LPSTR,BOOL);
+}
+alias IFileViewer *LPFILEVIEWER;
+
+interface IFileSystemBindData : public IUnknown
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT SetFindData( WIN32_FIND_DATAW*);
+	HRESULT GetFindData(WIN32_FIND_DATAW*);
+}
+
+interface IPersistFolder : public IPersist
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT GetClassID(CLSID*);
+	HRESULT Initialize(LPCITEMIDLIST);
+}
+alias IPersistFolder *LPPERSISTFOLDER;
+
+static if (_WIN32_IE >= 0x0400 || _WIN32_WINNT >= 0x0500) {
+
+interface IPersistFolder2 : public IPersistFolder
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT GetClassID(CLSID*);
+	HRESULT Initialize(LPCITEMIDLIST);
+	HRESULT GetCurFolder(LPITEMIDLIST*);
+}
+alias IPersistFolder2 *LPPERSISTFOLDER2;
+
+}/* _WIN32_IE >= 0x0400 || _WIN32_WINNT >= 0x0500 */
+
+static if (_WIN32_IE >= 0x0500) {
+
+interface IPersistFolder3 : public IPersistFolder2
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT GetClassID(CLSID*);
+	HRESULT Initialize(LPCITEMIDLIST);
+	HRESULT GetCurFolder(LPITEMIDLIST*);
+	HRESULT InitializeEx(IBindCtx*,LPCITEMIDLIST, PERSIST_FOLDER_TARGET_INFO*);
+	HRESULT GetFolderTargetInfo(PERSIST_FOLDER_TARGET_INFO*);
+}
+alias IPersistFolder3 *LPPERSISTFOLDER3;
+
+} /* _WIN32_IE >= 0x0500 */
+
+alias IShellBrowser* LPSHELLBROWSER;
+alias IShellView* LPSHELLVIEW;
+
+interface IShellBrowser : public IOleWindow
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT GetWindow(HWND*);
+	HRESULT ContextSensitiveHelp(BOOL);
+	HRESULT InsertMenusSB(HMENU,LPOLEMENUGROUPWIDTHS);
+	HRESULT SetMenuSB(HMENU,HOLEMENU,HWND);
+	HRESULT RemoveMenusSB(HMENU);
+	HRESULT SetStatusTextSB(LPCOLESTR);
+	HRESULT EnableModelessSB(BOOL);
+	HRESULT TranslateAcceleratorSB(LPMSG,WORD);
+	HRESULT BrowseObject(LPCITEMIDLIST,UINT);
+	HRESULT GetViewStateStream(DWORD,LPSTREAM*);
+	HRESULT GetControlWindow(UINT,HWND*);
+	HRESULT SendControlMsg(UINT,UINT,WPARAM,LPARAM,LRESULT*);
+	HRESULT QueryActiveShellView(LPSHELLVIEW*);
+	HRESULT OnViewWindowActive(LPSHELLVIEW);
+	HRESULT SetToolbarItems(LPTBBUTTON,UINT,UINT);
+}
+
+interface IShellView : public IOleWindow
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT GetWindow(HWND*);
+	HRESULT ContextSensitiveHelp(BOOL);
+	HRESULT TranslateAccelerator(LPMSG);
+//[No] #ifdef _FIX_ENABLEMODELESS_CONFLICT
+//[No] 	STDMETHOD(EnableModelessSV)(THIS_ BOOL) PURE;
+//[Yes] #else
+	HRESULT EnableModeless(BOOL);
+//[Yes] #endif
+	HRESULT UIActivate(UINT);
+	HRESULT Refresh();
+	HRESULT CreateViewWindow(IShellView*,LPCFOLDERSETTINGS,LPSHELLBROWSER,RECT*,HWND*);
+	HRESULT DestroyViewWindow();
+	HRESULT GetCurrentInfo(LPFOLDERSETTINGS);
+	HRESULT AddPropertySheetPages(DWORD,LPFNADDPROPSHEETPAGE,LPARAM);
+	HRESULT SaveViewState();
+	HRESULT SelectItem(LPCITEMIDLIST,UINT);
+	HRESULT GetItemObject(UINT,REFIID,PVOID*);
+}
+
+interface ICommDlgBrowser : public IUnknown
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT OnDefaultCommand(IShellView*);
+	HRESULT OnStateChange(IShellView*,ULONG);
+	HRESULT IncludeObject(IShellView*,LPCITEMIDLIST);
+}
+alias ICommDlgBrowser *LPCOMMDLGBROWSER;
+
+alias GUID SHELLVIEWID;
+
+struct SV2CVW2_PARAMS {
+	DWORD cbSize = this.sizeof;
+	IShellView *psvPrev;
+	FOLDERSETTINGS  *pfs;
+	IShellBrowser *psbOwner;
+	RECT *prcView;
+	SHELLVIEWID  *pvid;
+	HWND hwndView;
+}
+alias SV2CVW2_PARAMS* LPSV2CVW2_PARAMS;
+
+interface IShellView2 : public IShellView
+{
+
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT GetWindow(HWND*);
+	HRESULT ContextSensitiveHelp(BOOL);
+	HRESULT TranslateAccelerator(LPMSG);
+//[No] #ifdef _FIX_ENABLEMODELESS_CONFLICT
+//[No] 	STDMETHOD(EnableModelessSV)(THIS_ BOOL) PURE;
+//[Yes] #else
+	HRESULT EnableModeless(BOOL);
+//[Yes] #endif
+	HRESULT UIActivate(UINT);
+	HRESULT Refresh();
+	HRESULT CreateViewWindow(IShellView*,LPCFOLDERSETTINGS,LPSHELLBROWSER,RECT*,HWND*);
+	HRESULT DestroyViewWindow();
+	HRESULT GetCurrentInfo(LPFOLDERSETTINGS);
+	HRESULT AddPropertySheetPages(DWORD,LPFNADDPROPSHEETPAGE,LPARAM);
+	HRESULT SaveViewState();
+	HRESULT SelectItem(LPCITEMIDLIST,UINT);
+	HRESULT GetItemObject(UINT,REFIID,PVOID*);
+	HRESULT GetView(SHELLVIEWID*,ULONG);
+	HRESULT CreateViewWindow2(LPSV2CVW2_PARAMS);
+}
+
+interface IShellExecuteHookA : public IUnknown
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT Execute(LPSHELLEXECUTEINFOA);
+}
+
+interface IShellExecuteHookW : public IUnknown
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT Execute(LPSHELLEXECUTEINFOW);
+}
+
+interface IShellIcon : public IUnknown
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT GetIconOf(LPCITEMIDLIST,UINT,PINT);
+}
+alias IShellIcon* LPSHELLICON;
+
+struct SHELLFLAGSTATE {
+// TODO
+ short bitflags_; // for D.
+ /*
+	BOOL fShowAllObjects : 1;
+	BOOL fShowExtensions : 1;
+	BOOL fNoConfirmRecycle : 1;
+	BOOL fShowSysFiles : 1;
+	BOOL fShowCompColor : 1;
+	BOOL fDoubleClickInWebView : 1;
+	BOOL fDesktopHTML : 1;
+	BOOL fWin95Classic : 1;
+	BOOL fDontPrettyPath : 1;
+	BOOL fShowAttribCol : 1;
+	BOOL fMapNetDrvBtn : 1;
+	BOOL fShowInfoTip : 1;
+	BOOL fHideIcons : 1;
+	UINT fRestFlags : 3;
+*/
+}
+alias SHELLFLAGSTATE* LPSHELLFLAGSTATE;
+
+const SSF_SHOWALLOBJECTS = 0x1;
+const SSF_SHOWEXTENSIONS = 0x2;
+const SSF_SHOWCOMPCOLOR = 0x8;
+const SSF_SHOWSYSFILES = 0x20;
+const SSF_DOUBLECLICKINWEBVIEW = 0x80;
+const SSF_SHOWATTRIBCOL = 0x100;
+const SSF_DESKTOPHTML = 0x200;
+const SSF_WIN95CLASSIC = 0x400;
+const SSF_DONTPRETTYPATH = 0x800;
+const SSF_MAPNETDRVBUTTON = 0x1000;
+const SSF_SHOWINFOTIP = 0x2000;
+const SSF_HIDEICONS = 0x4000;
+const SSF_NOCONFIRMRECYCLE = 0x8000;
+
+interface IShellIconOverlayIdentifier : public IUnknown
+{
+	HRESULT QueryInterface(REFIID,PVOID*);
+	ULONG AddRef();
+	ULONG Release();
+	HRESULT IsMemberOf(LPCWSTR,DWORD);
+	HRESULT GetOverlayInfo(LPWSTR,int,int*,DWORD*);
+	HRESULT GetPriority(int*);
+}
+
+const ISIOI_ICONFILE  = 0x00000001;
+const ISIOI_ICONINDEX = 0x00000002;
+
+static if (_WIN32_WINNT >= 0x0500) {/* W2K */
+	struct SHELLSTATE {
+	//TODO:
+	/*
+		BOOL fShowAllObjects : 1;
+		BOOL fShowExtensions : 1;
+		BOOL fNoConfirmRecycle : 1;
+		BOOL fShowSysFiles : 1;
+		BOOL fShowCompColor : 1;
+		BOOL fDoubleClickInWebView : 1;
+		BOOL fDesktopHTML : 1;
+		BOOL fWin95Classic : 1;
+		BOOL fDontPrettyPath : 1;
+		BOOL fShowAttribCol : 1;
+		BOOL fMapNetDrvBtn : 1;
+		BOOL fShowInfoTip : 1;
+		BOOL fHideIcons : 1;
+		BOOL fWebView : 1;
+		BOOL fFilter : 1;
+		BOOL fShowSuperHidden : 1;
+		BOOL fNoNetCrawling : 1;
+		DWORD dwWin95Unused;
+		UINT uWin95Unused;
+		LONG lParamSort;
+		int iSortDirection;
+		UINT version;
+		UINT uNotUsed;
+		BOOL fSepProcess : 1;
+		BOOL fStartPanelOn : 1;
+		BOOL fShowStartPage : 1;
+		UINT fSpareFlags : 13;
+*/
+	}
+	alias SHELLSTATE* LPSHELLSTATE;
+}
+
+static if (_WIN32_IE >= 0x0500) {
+	align(8):
+	struct SHDRAGIMAGE {
+		SIZE sizeDragImage;
+		POINT ptOffset;
+		HBITMAP hbmpDragImage;
+		COLORREF crColorKey;
+	}
+	alias SHDRAGIMAGE* LPSHDRAGIMAGE;
+	align:
+
+	interface IDragSourceHelper : public IUnknown
+	 {
+		HRESULT QueryInterface(REFIID riid, void **ppv);
+		ULONG AddRef();
+		ULONG Release();
+		HRESULT InitializeFromBitmap(LPSHDRAGIMAGE pshdi, IDataObject* pDataObject);
+		HRESULT InitializeFromWindow(HWND hwnd, POINT* ppt, IDataObject* pDataObject);
+	}
+
+	interface IDropTargetHelper : public IUnknown
+	 {
+		HRESULT QueryInterface(REFIID riid, void** ppv);
+		ULONG AddRef();
+		ULONG Release();
+		HRESULT DragEnter(HWND hwndTarget, IDataObject* pDataObject, POINT* ppt, DWORD dwEffect);
+		HRESULT DragLeave();
+		HRESULT DragOver(POINT* ppt, DWORD dwEffect);
+		HRESULT Drop(IDataObject* pDataObject, POINT* ppt, DWORD dwEffect);
+		HRESULT Show(BOOL fShow);
+	}
+}
+
+extern (Windows):
+void SHAddToRecentDocs(UINT,PCVOID);
+LPITEMIDLIST SHBrowseForFolderA(PBROWSEINFOA);
+LPITEMIDLIST SHBrowseForFolderW(PBROWSEINFOW);
+void SHChangeNotify(LONG,UINT,PCVOID,PCVOID);
+HRESULT SHGetDataFromIDListA(LPSHELLFOLDER,LPCITEMIDLIST,int,PVOID,int);
+HRESULT SHGetDataFromIDListW(LPSHELLFOLDER,LPCITEMIDLIST,int,PVOID,int);
+HRESULT SHGetDesktopFolder(LPSHELLFOLDER*);
+HRESULT SHGetInstanceExplorer(IUnknown **);
+HRESULT SHGetMalloc(LPMALLOC*);
+BOOL SHGetPathFromIDListA(LPCITEMIDLIST,LPSTR);
+BOOL SHGetPathFromIDListW(LPCITEMIDLIST,LPWSTR);
+HRESULT SHGetSpecialFolderLocation(HWND,int,LPITEMIDLIST*);
+HRESULT SHLoadInProc(REFCLSID);
+
+static if (_WIN32_IE >= 0x0400) {
+	BOOL SHGetSpecialFolderPathA(HWND,LPSTR,int,BOOL);
+	BOOL SHGetSpecialFolderPathW(HWND,LPWSTR,int,BOOL);
+}
+
+/* SHGetFolderPath in shfolder.dll on W9x, NT4, also in shell32.dll on W2K */
+HRESULT SHGetFolderPathA(HWND,int,HANDLE,DWORD,LPSTR);
+HRESULT SHGetFolderPathW(HWND,int,HANDLE,DWORD,LPWSTR);
+
+static if ((_WIN32_WINDOWS >= 0x0490) || (_WIN32_WINNT >= 0x0500)) {/* ME or W2K */
+	HRESULT SHGetFolderLocation(HWND,int,HANDLE,DWORD,LPITEMIDLIST*);
+}
+
+static if (_WIN32_WINNT >= 0x0500) {
+	INT SHCreateDirectoryExA(HWND,LPCSTR,LPSECURITY_ATTRIBUTES);
+	INT SHCreateDirectoryExW(HWND,LPCWSTR,LPSECURITY_ATTRIBUTES);
+	HRESULT SHBindToParent(LPCITEMIDLIST,REFIID,VOID**,LPCITEMIDLIST*);
+}
+
+static if (_WIN32_WINNT >= 0x0501) {/* XP */
+	HRESULT SHGetFolderPathAndSubDirA(HWND,int,HANDLE,DWORD,LPCSTR,LPSTR);
+	HRESULT SHGetFolderPathAndSubDirW(HWND,int,HANDLE,DWORD,LPCWSTR,LPWSTR);
+}
+
+void SHGetSettings(LPSHELLFLAGSTATE,DWORD);
+
+static if (_WIN32_WINNT >= 0x0500) {/* W2K */
+	void SHGetSetSettings(LPSHELLSTATE,DWORD,BOOL);
+}
+
+static if (_WIN32_WINNT >= 0x0500) {/* W2K */
+	BOOL ILIsEqual(LPCITEMIDLIST, LPCITEMIDLIST);
+	BOOL ILIsParent(LPCITEMIDLIST, LPCITEMIDLIST, BOOL);
+	BOOL ILRemoveLastID(LPITEMIDLIST);
+	HRESULT ILLoadFromStream(IStream*, LPITEMIDLIST*);
+	HRESULT ILSaveToStream(IStream*, LPCITEMIDLIST);
+	LPITEMIDLIST ILAppendID(LPITEMIDLIST, LPCSHITEMID, BOOL);
+	LPITEMIDLIST ILClone(LPCITEMIDLIST);
+	LPITEMIDLIST ILCloneFirst(LPCITEMIDLIST);
+	LPITEMIDLIST ILCombine(LPCITEMIDLIST, LPCITEMIDLIST);
+	LPITEMIDLIST ILFindChild(LPCITEMIDLIST, LPCITEMIDLIST);
+	LPITEMIDLIST ILFindLastID(LPCITEMIDLIST);
+	LPITEMIDLIST ILGetNext(LPCITEMIDLIST);
+	UINT ILGetSize(LPCITEMIDLIST);
+	void ILFree(LPITEMIDLIST);
+
+	HRESULT SHCoCreateInstance(LPCWSTR,REFCLSID,IUnknown*,REFIID,void**);
+}
+
+version(Unicode) {
+	alias IShellExecuteHookW IShellExecuteHook;
+	alias IShellLinkW IShellLink;
+	alias BROWSEINFOW BROWSEINFO;
+	alias SHBrowseForFolderW SHBrowseForFolder;
+	alias SHGetDataFromIDListW SHGetDataFromIDList;
+	alias SHGetPathFromIDListW SHGetPathFromIDList;
+	static if (_WIN32_IE >= 0x0400) {
+		alias SHGetSpecialFolderPathW SHGetSpecialFolderPath;
+	}
+	alias SHGetFolderPathW SHGetFolderPath;
+	static if (_WIN32_WINNT >= 0x0500) {
+		alias SHCreateDirectoryExW SHCreateDirectoryEx;
+	}
+	static if (_WIN32_WINNT >= 0x0501) {
+		alias SHGetFolderPathAndSubDirW SHGetFolderPathAndSubDir;
+	}
+	alias FILEDESCRIPTORW FILEDESCRIPTOR;
+	alias LPFILEDESCRIPTORW LPFILEDESCRIPTOR;
+	alias FILEGROUPDESCRIPTORW FILEGROUPDESCRIPTOR;
+	alias LPFILEGROUPDESCRIPTORW LPFILEGROUPDESCRIPTOR;
+
+} else {
+	alias IShellExecuteHookA IShellExecuteHook;
+	alias IShellLinkA IShellLink;
+	alias BROWSEINFOA BROWSEINFO;
+	alias SHBrowseForFolderA SHBrowseForFolder;
+	alias SHGetDataFromIDListA SHGetDataFromIDList;
+	alias SHGetPathFromIDListA SHGetPathFromIDList;
+	static if (_WIN32_IE >= 0x0400) {
+		alias SHGetSpecialFolderPathA SHGetSpecialFolderPath;
+	}
+	alias SHGetFolderPathA SHGetFolderPath;
+	static if (_WIN32_WINNT >= 0x0500) {
+		alias SHCreateDirectoryExA SHCreateDirectoryEx;
+	}
+	static if (_WIN32_WINNT >= 0x0501) {
+		alias SHGetFolderPathAndSubDirA SHGetFolderPathAndSubDir;
+	}
+	alias FILEDESCRIPTORA FILEDESCRIPTOR;
+	alias LPFILEDESCRIPTORA LPFILEDESCRIPTOR;
+	alias FILEGROUPDESCRIPTORA FILEGROUPDESCRIPTOR;
+	alias LPFILEGROUPDESCRIPTORA LPFILEGROUPDESCRIPTOR;
+}
+alias BROWSEINFO* PBROWSEINFO, LPBROWSEINFO;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/shlwapi.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,730 @@
+/***********************************************************************\
+*                               shlwapi.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.shlwapi;
+pragma(lib, "shlwapi.lib");
+
+/* Changes compared to MinGW:
+wnsprintf functions are not included.
+// Macros unneeded for D
+#define StrCmpIA lstrcmpiA;
+#define StrCmpA lstrcmpA;
+#define StrCpyA lstrcpyA;
+#define StrCpyNA lstrcpynA;
+#define MAKEDLLVERULL(major, minor, build, qfe) \
+        (((ULONGLONG)(major) << 48) | \
+         ((ULONGLONG)(minor) << 32) | \
+         ((ULONGLONG)(build) << 16) | \
+         ((ULONGLONG)(  qfe) <<  0))
+*/
+
+import win32.objbase, win32.shlobj;
+private import win32.basetyps, win32.objidl, win32.unknwn, win32.windef,
+  win32.winbase, win32.winreg;
+
+const DLLVER_PLATFORM_WINDOWS = 0x00000001;
+const DLLVER_PLATFORM_NT      = 0x00000002;
+
+const URL_DONT_ESCAPE_EXTRA_INFO  = 0x02000000;
+const URL_DONT_SIMPLIFY           = 0x08000000;
+const URL_ESCAPE_PERCENT          = 0x00001000;
+const URL_ESCAPE_SEGMENT_ONLY     = 0x00002000;
+const URL_ESCAPE_SPACES_ONLY      = 0x04000000;
+const URL_ESCAPE_UNSAFE           = 0x20000000;
+const URL_INTERNAL_PATH           = 0x00800000;
+const URL_PARTFLAG_KEEPSCHEME     = 0x00000001;
+const URL_PLUGGABLE_PROTOCOL      = 0x40000000;
+const URL_UNESCAPE                = 0x10000000;
+const URL_UNESCAPE_HIGH_ANSI_ONLY = 0x00400000;
+const URL_UNESCAPE_INPLACE        = 0x00100000;
+
+align(1):
+struct DLLVERSIONINFO
+{
+	DWORD cbSize = this.sizeof;
+	DWORD dwMajorVersion;
+	DWORD dwMinorVersion;
+	DWORD dwBuildNumber;
+	DWORD dwPlatformID;
+}
+
+struct DLLVERSIONINFO2
+{
+	DLLVERSIONINFO info1;
+	DWORD dwFlags;
+	ULONGLONG ullVersion;
+}
+
+enum ASSOCSTR {
+	ASSOCSTR_COMMAND,
+	ASSOCSTR_EXECUTABLE,
+	ASSOCSTR_FRIENDLYDOCNAME,
+	ASSOCSTR_FRIENDLYAPPNAME,
+	ASSOCSTR_NOOPEN,
+	ASSOCSTR_SHELLNEWVALUE,
+	ASSOCSTR_DDECOMMAND,
+	ASSOCSTR_DDEIFEXEC,
+	ASSOCSTR_DDEAPPLICATION,
+	ASSOCSTR_DDETOPIC
+}
+
+enum ASSOCKEY
+{
+	ASSOCKEY_SHELLEXECCLASS = 1,
+	ASSOCKEY_APP,
+	ASSOCKEY_CLASS,
+	ASSOCKEY_BASECLASS
+}
+
+enum ASSOCDATA
+{
+	ASSOCDATA_MSIDESCRIPTOR = 1,
+	ASSOCDATA_NOACTIVATEHANDLER,
+	ASSOCDATA_QUERYCLASSSTORE
+}
+
+alias DWORD ASSOCF;
+
+enum SHREGDEL_FLAGS
+{
+	SHREGDEL_DEFAULT = 0x00000000,
+	SHREGDEL_HKCU    = 0x00000001,
+	SHREGDEL_HKLM    = 0x00000010,
+	SHREGDEL_BOTH    = 0x00000011
+}
+
+enum SHREGENUM_FLAGS
+{
+	SHREGENUM_DEFAULT = 0x00000000,
+	SHREGENUM_HKCU    = 0x00000001,
+	SHREGENUM_HKLM    = 0x00000010,
+	SHREGENUM_BOTH    = 0x00000011
+}
+
+enum URLIS
+{
+	URLIS_URL,
+	URLIS_OPAQUE,
+	URLIS_NOHISTORY,
+	URLIS_FILEURL,
+	URLIS_APPLIABLE,
+	URLIS_DIRECTORY,
+	URLIS_HASQUERY
+}
+
+alias HANDLE HUSKEY;
+alias HUSKEY* PHUSKEY;
+
+extern (Windows)
+{
+	alias HRESULT function (DLLVERSIONINFO *) DLLGETVERSIONPROC;
+}
+
+
+BOOL IntlStrEqNA(LPCSTR pStr1, LPCSTR pStr2, int nChar)
+{
+	return IntlStrEqWorkerA(TRUE, pStr1, pStr2, nChar);
+}
+
+BOOL IntlStrEqNW(LPCWSTR pStr1, LPCWSTR pStr2, int nChar)
+{
+	return IntlStrEqWorkerW(TRUE, pStr1, pStr2, nChar);
+}
+
+BOOL IntlStrEqNIA(LPCSTR pStr1, LPCSTR pStr2, int nChar)
+{
+	return IntlStrEqWorkerA(FALSE, pStr1, pStr2, nChar);
+}
+
+BOOL IntlStrEqNIW(LPCWSTR pStr1, LPCWSTR pStr2, int nChar)
+{
+	return IntlStrEqWorkerW(FALSE, pStr1, pStr2, nChar);
+}
+
+BOOL UrlIsFileUrlA(LPCSTR pszURL)
+{
+	return UrlIsA(pszURL, URLIS.URLIS_FILEURL);
+}
+
+BOOL UrlIsFileUrlW(LPCWSTR pszURL)
+{
+	return UrlIsW(pszURL, URLIS.URLIS_FILEURL);
+}
+
+HRESULT UrlUnescapeInPlaceA(LPSTR pszUrl,DWORD dwFlags)
+{
+	return UrlUnescapeA(pszUrl, null, null, dwFlags | URL_UNESCAPE_INPLACE);
+}
+HRESULT UrlUnescapeInPlaceW(LPWSTR pszUrl,DWORD dwFlags)
+{
+	return UrlUnescapeW(pszUrl, null, null, dwFlags | URL_UNESCAPE_INPLACE);
+}
+
+extern (Windows):
+BOOL ChrCmpIA(WORD,WORD);
+BOOL ChrCmpIW(WCHAR,WCHAR);
+BOOL IntlStrEqWorkerA(BOOL,LPCSTR,LPCSTR,int);
+BOOL IntlStrEqWorkerW(BOOL,LPCWSTR,LPCWSTR,int);
+HRESULT SHStrDupA(LPCSTR,LPWSTR*);
+HRESULT SHStrDupW(LPCWSTR,LPWSTR*);
+LPSTR StrCatA(LPSTR,LPCSTR);
+LPWSTR StrCatW(LPWSTR,LPCWSTR);
+LPSTR StrCatBuffA(LPSTR,LPCSTR,int);
+LPWSTR StrCatBuffW(LPWSTR,LPCWSTR,int);
+DWORD StrCatChainW(LPWSTR,DWORD,DWORD,LPCWSTR);
+LPSTR StrChrA(LPCSTR,WORD);
+LPWSTR StrChrW(LPCWSTR,WCHAR);
+LPSTR StrChrIA(LPCSTR,WORD);
+LPWSTR StrChrIW(LPCWSTR,WCHAR);
+int StrCmpIW(LPCWSTR,LPCWSTR);
+int StrCmpW(LPCWSTR,LPCWSTR);
+LPWSTR StrCpyW(LPWSTR,LPCWSTR);
+LPWSTR StrCpyNW(LPWSTR,LPCWSTR,int);
+int StrCmpNA(LPCSTR,LPCSTR,int);
+int StrCmpNW(LPCWSTR,LPCWSTR,int);
+int StrCmpNIA(LPCSTR,LPCSTR,int);
+int StrCmpNIW(LPCWSTR,LPCWSTR,int);
+int StrCSpnA(LPCSTR,LPCSTR);
+int StrCSpnW(LPCWSTR,LPCWSTR);
+int StrCSpnIA(LPCSTR,LPCSTR);
+int StrCSpnIW(LPCWSTR,LPCWSTR);
+LPSTR StrDupA(LPCSTR);
+LPWSTR StrDupW(LPCWSTR);
+LPSTR StrFormatByteSize64A(LONGLONG,LPSTR,UINT);
+LPSTR StrFormatByteSizeA(DWORD,LPSTR,UINT);
+LPWSTR StrFormatByteSizeW(LONGLONG,LPWSTR,UINT);
+LPSTR StrFormatKBSizeA(LONGLONG,LPSTR,UINT);
+LPWSTR StrFormatKBSizeW(LONGLONG,LPWSTR,UINT);
+int StrFromTimeIntervalA(LPSTR,UINT,DWORD,int);
+int StrFromTimeIntervalW(LPWSTR,UINT,DWORD,int);
+BOOL StrIsIntlEqualA(BOOL,LPCSTR,LPCSTR,int);
+BOOL StrIsIntlEqualW(BOOL,LPCWSTR,LPCWSTR,int);
+LPSTR StrNCatA(LPSTR,LPCSTR,int);
+LPWSTR StrNCatW(LPWSTR,LPCWSTR,int);
+LPSTR StrPBrkA(LPCSTR,LPCSTR);
+LPWSTR StrPBrkW(LPCWSTR,LPCWSTR);
+LPSTR StrRChrA(LPCSTR,LPCSTR,WORD);
+LPWSTR StrRChrW(LPCWSTR,LPCWSTR,WCHAR);
+LPSTR StrRChrIA(LPCSTR,LPCSTR,WORD);
+LPWSTR StrRChrIW(LPCWSTR,LPCWSTR,WCHAR);
+LPSTR StrRStrIA(LPCSTR,LPCSTR,LPCSTR);
+LPWSTR StrRStrIW(LPCWSTR,LPCWSTR,LPCWSTR);
+int StrSpnA(LPCSTR,LPCSTR);
+int StrSpnW(LPCWSTR,LPCWSTR);
+LPSTR StrStrA(LPCSTR, LPCSTR);
+LPSTR StrStrIA(LPCSTR,LPCSTR);
+LPWSTR StrStrIW(LPCWSTR,LPCWSTR);
+LPWSTR StrStrW(LPCWSTR,LPCWSTR);
+int StrToIntA(LPCSTR);
+int StrToIntW(LPCWSTR);
+BOOL StrToIntExA(LPCSTR,DWORD,int*);
+BOOL StrToIntExW(LPCWSTR,DWORD,int*);
+BOOL StrTrimA(LPSTR,LPCSTR);
+BOOL StrTrimW(LPWSTR,LPCWSTR);
+LPSTR PathAddBackslashA(LPSTR);
+LPWSTR PathAddBackslashW(LPWSTR);
+BOOL PathAddExtensionA(LPSTR,LPCSTR);
+BOOL PathAddExtensionW(LPWSTR,LPCWSTR);
+BOOL PathAppendA(LPSTR,LPCSTR);
+BOOL PathAppendW(LPWSTR,LPCWSTR);
+LPSTR PathBuildRootA(LPSTR,int);
+LPWSTR PathBuildRootW(LPWSTR,int);
+BOOL PathCanonicalizeA(LPSTR,LPCSTR);
+BOOL PathCanonicalizeW(LPWSTR,LPCWSTR);
+LPSTR PathCombineA(LPSTR,LPCSTR,LPCSTR);
+LPWSTR PathCombineW(LPWSTR,LPCWSTR,LPCWSTR);
+int PathCommonPrefixA(LPCSTR,LPCSTR,LPSTR);
+int PathCommonPrefixW(LPCWSTR,LPCWSTR,LPWSTR);
+BOOL PathCompactPathA(HDC,LPSTR,UINT);
+BOOL PathCompactPathW(HDC,LPWSTR,UINT);
+BOOL PathCompactPathExA(LPSTR,LPCSTR,UINT,DWORD);
+BOOL PathCompactPathExW(LPWSTR,LPCWSTR,UINT,DWORD);
+HRESULT PathCreateFromUrlA(LPCSTR,LPSTR,LPDWORD,DWORD);
+HRESULT PathCreateFromUrlW(LPCWSTR,LPWSTR,LPDWORD,DWORD);
+BOOL PathFileExistsA(LPCSTR);
+BOOL PathFileExistsW(LPCWSTR);
+LPSTR PathFindExtensionA(LPCSTR);
+LPWSTR PathFindExtensionW(LPCWSTR);
+LPSTR PathFindFileNameA(LPCSTR);
+LPWSTR PathFindFileNameW(LPCWSTR);
+LPSTR PathFindNextComponentA(LPCSTR);
+LPWSTR PathFindNextComponentW(LPCWSTR);
+BOOL PathFindOnPathA(LPSTR,LPCSTR*);
+BOOL PathFindOnPathW(LPWSTR,LPCWSTR*);
+LPCSTR PathFindSuffixArrayA(LPCSTR,LPCSTR*,int);
+LPCWSTR PathFindSuffixArrayW(LPCWSTR,LPCWSTR*,int);
+LPSTR PathGetArgsA(LPCSTR);
+LPWSTR PathGetArgsW(LPCWSTR);
+UINT PathGetCharTypeA(UCHAR);
+UINT PathGetCharTypeW(WCHAR);
+int PathGetDriveNumberA(LPCSTR);
+int PathGetDriveNumberW(LPCWSTR);
+BOOL PathIsContentTypeA(LPCSTR,LPCSTR);
+BOOL PathIsContentTypeW(LPCWSTR,LPCWSTR);
+BOOL PathIsDirectoryA(LPCSTR);
+BOOL PathIsDirectoryEmptyA(LPCSTR);
+BOOL PathIsDirectoryEmptyW(LPCWSTR);
+BOOL PathIsDirectoryW(LPCWSTR);
+BOOL PathIsFileSpecA(LPCSTR);
+BOOL PathIsFileSpecW(LPCWSTR);
+BOOL PathIsLFNFileSpecA(LPCSTR);
+BOOL PathIsLFNFileSpecW(LPCWSTR);
+BOOL PathIsNetworkPathA(LPCSTR);
+BOOL PathIsNetworkPathW(LPCWSTR);
+BOOL PathIsPrefixA(LPCSTR,LPCSTR);
+BOOL PathIsPrefixW(LPCWSTR,LPCWSTR);
+BOOL PathIsRelativeA(LPCSTR);
+BOOL PathIsRelativeW(LPCWSTR);
+BOOL PathIsRootA(LPCSTR);
+BOOL PathIsRootW(LPCWSTR);
+BOOL PathIsSameRootA(LPCSTR,LPCSTR);
+BOOL PathIsSameRootW(LPCWSTR,LPCWSTR);
+BOOL PathIsSystemFolderA(LPCSTR,DWORD);
+BOOL PathIsSystemFolderW(LPCWSTR,DWORD);
+BOOL PathIsUNCA(LPCSTR);
+BOOL PathIsUNCServerA(LPCSTR);
+BOOL PathIsUNCServerShareA(LPCSTR);
+BOOL PathIsUNCServerShareW(LPCWSTR);
+BOOL PathIsUNCServerW(LPCWSTR);
+BOOL PathIsUNCW(LPCWSTR);
+BOOL PathIsURLA(LPCSTR);
+BOOL PathIsURLW(LPCWSTR);
+BOOL PathMakePrettyA(LPSTR);
+BOOL PathMakePrettyW(LPWSTR);
+BOOL PathMakeSystemFolderA(LPSTR);
+BOOL PathMakeSystemFolderW(LPWSTR);
+BOOL PathMatchSpecA(LPCSTR,LPCSTR);
+BOOL PathMatchSpecW(LPCWSTR,LPCWSTR);
+int PathParseIconLocationA(LPSTR);
+int PathParseIconLocationW(LPWSTR);
+void PathQuoteSpacesA(LPSTR);
+void PathQuoteSpacesW(LPWSTR);
+BOOL PathRelativePathToA(LPSTR,LPCSTR,DWORD,LPCSTR,DWORD);
+BOOL PathRelativePathToW(LPWSTR,LPCWSTR,DWORD,LPCWSTR,DWORD);
+void PathRemoveArgsA(LPSTR);
+void PathRemoveArgsW(LPWSTR);
+LPSTR PathRemoveBackslashA(LPSTR);
+LPWSTR PathRemoveBackslashW(LPWSTR);
+void PathRemoveBlanksA(LPSTR);
+void PathRemoveBlanksW(LPWSTR);
+void PathRemoveExtensionA(LPSTR);
+void PathRemoveExtensionW(LPWSTR);
+BOOL PathRemoveFileSpecA(LPSTR);
+BOOL PathRemoveFileSpecW(LPWSTR);
+BOOL PathRenameExtensionA(LPSTR,LPCSTR);
+BOOL PathRenameExtensionW(LPWSTR,LPCWSTR);
+BOOL PathSearchAndQualifyA(LPCSTR,LPSTR,UINT);
+BOOL PathSearchAndQualifyW(LPCWSTR,LPWSTR,UINT);
+void PathSetDlgItemPathA(HWND,int,LPCSTR);
+void PathSetDlgItemPathW(HWND,int,LPCWSTR);
+LPSTR PathSkipRootA(LPCSTR);
+LPWSTR PathSkipRootW(LPCWSTR);
+void PathStripPathA(LPSTR);
+void PathStripPathW(LPWSTR);
+BOOL PathStripToRootA(LPSTR);
+BOOL PathStripToRootW(LPWSTR);
+void PathUndecorateA(LPSTR);
+void PathUndecorateW(LPWSTR);
+BOOL PathUnExpandEnvStringsA(LPCSTR,LPSTR,UINT);
+BOOL PathUnExpandEnvStringsW(LPCWSTR,LPWSTR,UINT);
+BOOL PathUnmakeSystemFolderA(LPSTR);
+BOOL PathUnmakeSystemFolderW(LPWSTR);
+void PathUnquoteSpacesA(LPSTR);
+void PathUnquoteSpacesW(LPWSTR);
+HRESULT SHAutoComplete(HWND,DWORD);
+BOOL SHCreateThread(LPTHREAD_START_ROUTINE,void*,DWORD,LPTHREAD_START_ROUTINE);
+DWORD SHCopyKeyA(HKEY,LPCSTR,HKEY,DWORD);
+DWORD SHCopyKeyW(HKEY,LPCWSTR,HKEY,DWORD);
+DWORD SHDeleteEmptyKeyA(HKEY,LPCSTR);
+DWORD SHDeleteEmptyKeyW(HKEY,LPCWSTR);
+DWORD SHDeleteKeyA(HKEY,LPCSTR);
+DWORD SHDeleteKeyW(HKEY,LPCWSTR);
+DWORD SHEnumKeyExA(HKEY,DWORD,LPSTR,LPDWORD);
+DWORD SHEnumKeyExW(HKEY,DWORD,LPWSTR,LPDWORD);
+DWORD SHQueryInfoKeyA(HKEY,LPDWORD,LPDWORD,LPDWORD,LPDWORD);
+DWORD SHQueryInfoKeyW(HKEY,LPDWORD,LPDWORD,LPDWORD,LPDWORD);
+DWORD SHQueryValueExA(HKEY,LPCSTR,LPDWORD,LPDWORD,LPVOID,LPDWORD);
+DWORD SHQueryValueExW(HKEY,LPCWSTR,LPDWORD,LPDWORD,LPVOID,LPDWORD);
+HRESULT SHGetThreadRef(IUnknown**);
+HRESULT SHSetThreadRef(IUnknown*);
+BOOL SHSkipJunction(IBindCtx*, CLSID*);
+DWORD SHEnumValueA(HKEY,DWORD,LPSTR,LPDWORD,LPDWORD,LPVOID,LPDWORD);
+DWORD SHEnumValueW(HKEY,DWORD,LPWSTR,LPDWORD,LPDWORD,LPVOID,LPDWORD);
+DWORD SHGetValueA(HKEY,LPCSTR,LPCSTR,LPDWORD,LPVOID,LPDWORD);
+DWORD SHGetValueW(HKEY,LPCWSTR,LPCWSTR,LPDWORD,LPVOID,LPDWORD);
+DWORD SHSetValueA(HKEY,LPCSTR,LPCSTR,DWORD,LPCVOID,DWORD);
+DWORD SHSetValueW(HKEY,LPCWSTR,LPCWSTR,DWORD,LPCVOID,DWORD);
+DWORD SHDeleteValueA(HKEY,LPCSTR,LPCSTR);
+DWORD SHDeleteValueW(HKEY,LPCWSTR,LPCWSTR);
+HRESULT AssocCreate(CLSID, IID* ,LPVOID*);
+HRESULT AssocQueryKeyA(ASSOCF,ASSOCKEY,LPCSTR,LPCSTR,HKEY*);
+HRESULT AssocQueryKeyW(ASSOCF,ASSOCKEY,LPCWSTR,LPCWSTR,HKEY*);
+HRESULT AssocQueryStringA(ASSOCF,ASSOCSTR,LPCSTR,LPCSTR,LPSTR,DWORD*);
+HRESULT AssocQueryStringByKeyA(ASSOCF,ASSOCSTR,HKEY,LPCSTR,LPSTR,DWORD*);
+HRESULT AssocQueryStringByKeyW(ASSOCF,ASSOCSTR,HKEY,LPCWSTR,LPWSTR,DWORD*);
+HRESULT AssocQueryStringW(ASSOCF,ASSOCSTR,LPCWSTR,LPCWSTR,LPWSTR,DWORD*);
+HRESULT UrlApplySchemeA(LPCSTR,LPSTR,LPDWORD,DWORD);
+HRESULT UrlApplySchemeW(LPCWSTR,LPWSTR,LPDWORD,DWORD);
+HRESULT UrlCanonicalizeA(LPCSTR,LPSTR,LPDWORD,DWORD);
+HRESULT UrlCanonicalizeW(LPCWSTR,LPWSTR,LPDWORD,DWORD);
+HRESULT UrlCombineA(LPCSTR,LPCSTR,LPSTR,LPDWORD,DWORD);
+HRESULT UrlCombineW(LPCWSTR,LPCWSTR,LPWSTR,LPDWORD,DWORD);
+int UrlCompareA(LPCSTR,LPCSTR,BOOL);
+int UrlCompareW(LPCWSTR,LPCWSTR,BOOL);
+HRESULT UrlCreateFromPathA(LPCSTR,LPSTR,LPDWORD,DWORD);
+HRESULT UrlCreateFromPathW(LPCWSTR,LPWSTR,LPDWORD,DWORD);
+HRESULT UrlEscapeA(LPCSTR,LPSTR,LPDWORD,DWORD);
+HRESULT UrlEscapeW(LPCWSTR,LPWSTR,LPDWORD,DWORD);
+LPCSTR UrlGetLocationA(LPCSTR);
+LPCWSTR UrlGetLocationW(LPCWSTR);
+HRESULT UrlGetPartA(LPCSTR,LPSTR,LPDWORD,DWORD,DWORD);
+HRESULT UrlGetPartW(LPCWSTR,LPWSTR,LPDWORD,DWORD,DWORD);
+HRESULT UrlHashA(LPCSTR,LPBYTE,DWORD);
+HRESULT UrlHashW(LPCWSTR,LPBYTE,DWORD);
+BOOL UrlIsA(LPCSTR,URLIS);
+BOOL UrlIsW(LPCWSTR,URLIS);
+BOOL UrlIsNoHistoryA(LPCSTR);
+BOOL UrlIsNoHistoryW(LPCWSTR);
+BOOL UrlIsOpaqueA(LPCSTR);
+BOOL UrlIsOpaqueW(LPCWSTR);
+HRESULT UrlUnescapeA(LPSTR,LPSTR,LPDWORD,DWORD);
+HRESULT UrlUnescapeW(LPWSTR,LPWSTR,LPDWORD,DWORD);
+DWORD SHRegCloseUSKey(HUSKEY);
+LONG SHRegCreateUSKeyA(LPCSTR,REGSAM,HUSKEY,PHUSKEY,DWORD);
+LONG SHRegCreateUSKeyW(LPCWSTR,REGSAM,HUSKEY,PHUSKEY,DWORD);
+LONG SHRegDeleteEmptyUSKeyA(HUSKEY,LPCSTR,SHREGDEL_FLAGS);
+LONG SHRegDeleteEmptyUSKeyW(HUSKEY,LPCWSTR,SHREGDEL_FLAGS);
+LONG SHRegDeleteUSValueA(HUSKEY,LPCSTR,SHREGDEL_FLAGS);
+LONG SHRegDeleteUSValueW(HUSKEY,LPCWSTR,SHREGDEL_FLAGS);
+HKEY SHRegDuplicateHKey(HKEY);
+DWORD SHRegEnumUSKeyA(HUSKEY,DWORD,LPSTR,LPDWORD,SHREGENUM_FLAGS);
+DWORD SHRegEnumUSKeyW(HUSKEY,DWORD,LPWSTR,LPDWORD,SHREGENUM_FLAGS);
+DWORD SHRegEnumUSValueA(HUSKEY,DWORD,LPSTR,LPDWORD,LPDWORD,LPVOID,LPDWORD,SHREGENUM_FLAGS);
+DWORD SHRegEnumUSValueW(HUSKEY,DWORD,LPWSTR,LPDWORD,LPDWORD,LPVOID,LPDWORD,SHREGENUM_FLAGS);
+BOOL SHRegGetBoolUSValueA(LPCSTR,LPCSTR,BOOL,BOOL);
+BOOL SHRegGetBoolUSValueW(LPCWSTR,LPCWSTR,BOOL,BOOL);
+DWORD SHRegGetPathA(HKEY,LPCSTR,LPCSTR,LPSTR,DWORD);
+DWORD SHRegGetPathW(HKEY,LPCWSTR,LPCWSTR,LPWSTR,DWORD);
+LONG SHRegGetUSValueA(LPCSTR,LPCSTR,LPDWORD,LPVOID,LPDWORD,BOOL,LPVOID,DWORD);
+LONG SHRegGetUSValueW(LPCWSTR,LPCWSTR,LPDWORD,LPVOID,LPDWORD,BOOL,LPVOID,DWORD);
+LONG SHRegOpenUSKeyA(LPCSTR,REGSAM,HUSKEY,PHUSKEY,BOOL);
+LONG SHRegOpenUSKeyW(LPCWSTR,REGSAM,HUSKEY,PHUSKEY,BOOL);
+DWORD SHRegQueryInfoUSKeyA(HUSKEY,LPDWORD,LPDWORD,LPDWORD,LPDWORD,SHREGENUM_FLAGS);
+DWORD SHRegQueryInfoUSKeyW(HUSKEY,LPDWORD,LPDWORD,LPDWORD,LPDWORD,SHREGENUM_FLAGS);
+LONG SHRegQueryUSValueA(HUSKEY,LPCSTR,LPDWORD,LPVOID,LPDWORD,BOOL,LPVOID,DWORD);
+LONG SHRegQueryUSValueW(HUSKEY,LPCWSTR,LPDWORD,LPVOID,LPDWORD,BOOL,LPVOID,DWORD);
+DWORD SHRegSetPathA(HKEY,LPCSTR,LPCSTR,LPCSTR,DWORD);
+DWORD SHRegSetPathW(HKEY,LPCWSTR,LPCWSTR,LPCWSTR,DWORD);
+LONG SHRegSetUSValueA(LPCSTR,LPCSTR,DWORD,LPVOID,DWORD,DWORD);
+LONG SHRegSetUSValueW(LPCWSTR,LPCWSTR,DWORD,LPVOID,DWORD,DWORD);
+LONG SHRegWriteUSValueA(HUSKEY,LPCSTR,DWORD,LPVOID,DWORD,DWORD);
+LONG SHRegWriteUSValueW(HUSKEY,LPCWSTR,DWORD,LPVOID,DWORD,DWORD);
+HRESULT HashData(LPBYTE,DWORD,LPBYTE,DWORD);
+HPALETTE SHCreateShellPalette(HDC);
+COLORREF ColorHLSToRGB(WORD,WORD,WORD);
+COLORREF ColorAdjustLuma(COLORREF,int,BOOL);
+void ColorRGBToHLS(COLORREF,WORD*,WORD*,WORD*);
+/** Should not be necessary for D?
+extern (C):
+int  wnsprintfA(LPSTR,int,LPCSTR,...);
+int  wnsprintfW(LPWSTR,int,LPCWSTR,...);
+extern (Windows):
+int wvnsprintfA(LPSTR,int,LPCSTR,va_list);
+int wvnsprintfW(LPWSTR,int,LPCWSTR,va_list);
+*/
+
+HINSTANCE MLLoadLibraryA(LPCSTR,HANDLE,DWORD,LPCSTR,BOOL);
+HINSTANCE MLLoadLibraryW(LPCWSTR,HANDLE,DWORD,LPCWSTR,BOOL);
+
+HRESULT DllInstall(BOOL,LPCWSTR);
+
+HRESULT StrRetToBufA(LPSTRRET,LPCITEMIDLIST,LPSTR,UINT);
+HRESULT StrRetToBufW(LPSTRRET,LPCITEMIDLIST,LPWSTR,UINT);
+HRESULT StrRetToStrA(LPSTRRET,LPCITEMIDLIST,LPSTR*);
+HRESULT StrRetToStrW(LPSTRRET,LPCITEMIDLIST,LPWSTR*);
+HRESULT SHCreateStreamOnFileA(LPCSTR,DWORD,IStream**);
+HRESULT SHCreateStreamOnFileW(LPCWSTR,DWORD,IStream**);
+IStream* SHOpenRegStream2A(HKEY,LPCSTR,LPCSTR,DWORD);
+IStream* SHOpenRegStream2W(HKEY,LPCWSTR,LPCWSTR,DWORD);
+IStream* SHOpenRegStreamA(HKEY,LPCSTR,LPCSTR,DWORD);
+IStream* SHOpenRegStreamW(HKEY,LPCWSTR,LPCWSTR,DWORD);
+
+version(Unicode) {
+alias ChrCmpIW ChrCmpI;
+alias IntlStrEqNW IntlStrEqN;
+alias IntlStrEqNIW IntlStrEqNI;
+alias IntlStrEqWorkerW IntlStrEqWorker;
+alias SHStrDupW SHStrDup;
+alias StrCatW StrCat;
+alias StrCatBuffW StrCatBuff;
+alias StrChrW StrChr;
+alias StrChrIW StrChrI;
+alias StrCmpW StrCmp;
+alias StrCmpIW StrCmpI;
+alias StrCmpNIW StrCmpNI;
+alias StrCmpNW StrCmpN;
+alias StrCpyNW StrCpyN;
+alias StrCpyW StrCpy;
+alias StrCSpnIW StrCSpnI;
+alias StrCSpnW StrCSpn;
+alias StrDupW StrDup;
+alias StrFormatByteSizeW StrFormatByteSize;
+alias StrFormatKBSizeW StrFormatKBSize;
+alias StrFromTimeIntervalW StrFromTimeInterval;
+alias StrIsIntlEqualW StrIsIntlEqual;
+alias StrNCatW StrNCat;
+alias StrPBrkW StrPBrk;
+alias StrRChrW StrRChr;
+alias StrRChrIW StrRChrI;
+alias StrRetToBufW StrRetToBuf;
+alias StrRetToStrW StrRetToStr;
+alias StrRStrIW StrRStrI;
+alias StrSpnW StrSpn;
+alias StrStrIW StrStrI;
+alias StrStrW StrStr;
+alias StrToIntW StrToInt;
+alias StrToIntExW StrToIntEx;
+alias StrTrimW StrTrim;
+alias PathAddBackslashW PathAddBackslash;
+alias PathAddExtensionW PathAddExtension;
+alias PathAppendW PathAppend;
+alias PathBuildRootW PathBuildRoot;
+alias PathCanonicalizeW PathCanonicalize;
+alias PathCombineW PathCombine;
+alias PathCommonPrefixW PathCommonPrefix;
+alias PathCompactPathW PathCompactPath;
+alias PathCompactPathExW PathCompactPathEx;
+alias PathCreateFromUrlW PathCreateFromUrl;
+alias PathFileExistsW PathFileExists;
+alias PathFindExtensionW PathFindExtension;
+alias PathFindFileNameW PathFindFileName;
+alias PathFindNextComponentW PathFindNextComponent;
+alias PathFindOnPathW PathFindOnPath;
+alias PathFindSuffixArrayW PathFindSuffixArray;
+alias PathGetArgsW PathGetArgs;
+alias PathGetCharTypeW PathGetCharType;
+alias PathGetDriveNumberW PathGetDriveNumber;
+alias PathIsContentTypeW PathIsContentType;
+alias PathIsDirectoryEmptyW PathIsDirectoryEmpty;
+alias PathIsDirectoryW PathIsDirectory;
+alias PathIsFileSpecW PathIsFileSpec;
+alias PathIsLFNFileSpecW PathIsLFNFileSpec;
+alias PathIsNetworkPathW PathIsNetworkPath;
+alias PathIsPrefixW PathIsPrefix;
+alias PathIsRelativeW PathIsRelative;
+alias PathIsRootW PathIsRoot;
+alias PathIsSameRootW PathIsSameRoot;
+alias PathIsSystemFolderW PathIsSystemFolder;
+alias PathIsUNCServerShareW PathIsUNCServerShare;
+alias PathIsUNCServerW PathIsUNCServer;
+alias PathIsUNCW PathIsUNC;
+alias PathIsURLW PathIsURL;
+alias PathMakePrettyW PathMakePretty;
+alias PathMakeSystemFolderW PathMakeSystemFolder;
+alias PathMatchSpecW PathMatchSpec;
+alias PathParseIconLocationW PathParseIconLocation;
+alias PathQuoteSpacesW PathQuoteSpaces;
+alias PathRelativePathToW PathRelativePathTo;
+alias PathRemoveArgsW PathRemoveArgs;
+alias PathRemoveBackslashW PathRemoveBackslash;
+alias PathRemoveBlanksW PathRemoveBlanks;
+alias PathRemoveExtensionW PathRemoveExtension;
+alias PathRemoveFileSpecW PathRemoveFileSpec;
+alias PathRenameExtensionW PathRenameExtension;
+alias PathSearchAndQualifyW PathSearchAndQualify;
+alias PathSetDlgItemPathW PathSetDlgItemPath;
+alias PathSkipRootW PathSkipRoot;
+alias PathStripPathW PathStripPath;
+alias PathStripToRootW PathStripToRoot;
+alias PathUndecorateW PathUndecorate;
+alias PathUnExpandEnvStringsW PathUnExpandEnvStrings;
+alias PathUnmakeSystemFolderW PathUnmakeSystemFolder;
+alias PathUnquoteSpacesW PathUnquoteSpaces;
+alias SHCreateStreamOnFileW SHCreateStreamOnFile;
+alias SHOpenRegStreamW SHOpenRegStream;
+alias SHOpenRegStream2W SHOpenRegStream2;
+alias SHCopyKeyW SHCopyKey;
+alias SHDeleteEmptyKeyW SHDeleteEmptyKey;
+alias SHDeleteKeyW SHDeleteKey;
+alias SHEnumKeyExW SHEnumKeyEx;
+alias SHQueryInfoKeyW SHQueryInfoKey;
+alias SHQueryValueExW SHQueryValueEx;
+alias SHEnumValueW SHEnumValue;
+alias SHGetValueW SHGetValue;
+alias SHSetValueW SHSetValue;
+alias SHDeleteValueW SHDeleteValue;
+alias AssocQueryKeyW AssocQueryKey;
+alias AssocQueryStringByKeyW AssocQueryStringByKey;
+alias AssocQueryStringW AssocQueryString;
+alias UrlApplySchemeW UrlApplyScheme;
+alias UrlCanonicalizeW UrlCanonicalize;
+alias UrlCombineW UrlCombine;
+alias UrlCompareW UrlCompare;
+alias UrlCreateFromPathW UrlCreateFromPath;
+alias UrlEscapeW UrlEscape;
+alias UrlGetLocationW UrlGetLocation;
+alias UrlGetPartW UrlGetPart;
+alias UrlHashW UrlHash;
+alias UrlIsW UrlIs;
+alias UrlIsFileUrlW UrlIsFileUrl;
+alias UrlIsNoHistoryW UrlIsNoHistory;
+alias UrlIsOpaqueW UrlIsOpaque;
+alias UrlUnescapeW UrlUnescape;
+alias UrlUnescapeInPlaceW UrlUnescapeInPlace;
+alias SHRegCreateUSKeyW SHRegCreateUSKey;
+alias SHRegDeleteEmptyUSKeyW SHRegDeleteEmptyUSKey;
+alias SHRegDeleteUSValueW SHRegDeleteUSValue;
+alias SHRegEnumUSKeyW SHRegEnumUSKey;
+alias SHRegEnumUSValueW SHRegEnumUSValue;
+alias SHRegGetBoolUSValueW SHRegGetBoolUSValue;
+alias SHRegGetPathW SHRegGetPath;
+alias SHRegGetUSValueW SHRegGetUSValue;
+alias SHRegOpenUSKeyW SHRegOpenUSKey;
+alias SHRegQueryInfoUSKeyW SHRegQueryInfoUSKey;
+alias SHRegQueryUSValueW SHRegQueryUSValue;
+alias SHRegSetPathW SHRegSetPath;
+alias SHRegSetUSValueW SHRegSetUSValue;
+alias SHRegWriteUSValueW SHRegWriteUSValue;
+//alias wnsprintfW wnsprintf;
+//alias wvnsprintfW wvnsprintf;
+} else {
+alias ChrCmpIA ChrCmpI;
+alias IntlStrEqNA IntlStrEqN;
+alias IntlStrEqNIA IntlStrEqNI;
+alias IntlStrEqWorkerA IntlStrEqWorker;
+alias SHStrDupA SHStrDup;
+alias StrCatBuffA StrCatBuff;
+alias StrChrA StrChr;
+alias StrChrIA StrChrI;
+alias StrCmpNIA StrCmpNI;
+alias StrCmpNA StrCmpN;
+alias StrCSpnIA StrCSpnI;
+alias StrCSpnA StrCSpn;
+alias StrDupA StrDup;
+alias StrFormatByteSizeA StrFormatByteSize;
+alias StrFormatKBSizeA StrFormatKBSize;
+alias StrFromTimeIntervalA StrFromTimeInterval;
+alias StrIsIntlEqualA StrIsIntlEqual;
+alias StrNCatA StrNCat;
+alias StrPBrkA StrPBrk;
+alias StrRChrA StrRChr;
+alias StrRChrIA StrRChrI;
+alias StrRetToBufA StrRetToBuf;
+alias StrRetToStrA StrRetToStr;
+alias StrRStrIA StrRStrI;
+alias StrSpnA StrSpn;
+alias StrStrIA StrStrI;
+alias StrStrA StrStr;
+alias StrToIntA StrToInt;
+alias StrToIntExA StrToIntEx;
+alias StrTrimA StrTrim;
+alias PathAddBackslashA PathAddBackslash;
+alias PathAddExtensionA PathAddExtension;
+alias PathAppendA PathAppend;
+alias PathBuildRootA PathBuildRoot;
+alias PathCanonicalizeA PathCanonicalize;
+alias PathCombineA PathCombine;
+alias PathCommonPrefixA PathCommonPrefix;
+alias PathCompactPathA PathCompactPath;
+alias PathCompactPathExA PathCompactPathEx;
+alias PathCreateFromUrlA PathCreateFromUrl;
+alias PathFileExistsA PathFileExists;
+alias PathFindExtensionA PathFindExtension;
+alias PathFindFileNameA PathFindFileName;
+alias PathFindNextComponentA PathFindNextComponent;
+alias PathFindOnPathA PathFindOnPath;
+alias PathFindSuffixArrayA PathFindSuffixArray;
+alias PathGetArgsA PathGetArgs;
+alias PathGetCharTypeA PathGetCharType;
+alias PathGetDriveNumberA PathGetDriveNumber;
+alias PathIsContentTypeA PathIsContentType;
+alias PathIsDirectoryEmptyA PathIsDirectoryEmpty;
+alias PathIsDirectoryA PathIsDirectory;
+alias PathIsFileSpecA PathIsFileSpec;
+alias PathIsLFNFileSpecA PathIsLFNFileSpec;
+alias PathIsNetworkPathA PathIsNetworkPath;
+alias PathIsPrefixA PathIsPrefix;
+alias PathIsRelativeA PathIsRelative;
+alias PathIsRootA PathIsRoot;
+alias PathIsSameRootA PathIsSameRoot;
+alias PathIsSystemFolderA PathIsSystemFolder;
+alias PathIsUNCServerShareA PathIsUNCServerShare;
+alias PathIsUNCServerA PathIsUNCServer;
+alias PathIsUNCA PathIsUNC;
+alias PathIsURLA PathIsURL;
+alias PathMakePrettyA PathMakePretty;
+alias PathMakeSystemFolderA PathMakeSystemFolder;
+alias PathMatchSpecA PathMatchSpec;
+alias PathParseIconLocationA PathParseIconLocation;
+alias PathQuoteSpacesA PathQuoteSpaces;
+alias PathRelativePathToA PathRelativePathTo;
+alias PathRemoveArgsA PathRemoveArgs;
+alias PathRemoveBackslashA PathRemoveBackslash;
+alias PathRemoveBlanksA PathRemoveBlanks;
+alias PathRemoveExtensionA PathRemoveExtension;
+alias PathRemoveFileSpecA PathRemoveFileSpec;
+alias PathRenameExtensionA PathRenameExtension;
+alias PathSearchAndQualifyA PathSearchAndQualify;
+alias PathSetDlgItemPathA PathSetDlgItemPath;
+alias PathSkipRootA PathSkipRoot;
+alias PathStripPathA PathStripPath;
+alias PathStripToRootA PathStripToRoot;
+alias PathUndecorateA PathUndecorate;
+alias PathUnExpandEnvStringsA PathUnExpandEnvStrings;
+alias PathUnmakeSystemFolderA PathUnmakeSystemFolder;
+alias PathUnquoteSpacesA PathUnquoteSpaces;
+alias SHCreateStreamOnFileA SHCreateStreamOnFile;
+alias SHOpenRegStreamA SHOpenRegStream;
+alias SHOpenRegStream2A SHOpenRegStream2;
+alias SHCopyKeyA SHCopyKey;
+alias SHDeleteEmptyKeyA SHDeleteEmptyKey;
+alias SHDeleteKeyA SHDeleteKey;
+alias SHEnumKeyExA SHEnumKeyEx;
+alias SHQueryInfoKeyA SHQueryInfoKey;
+alias SHQueryValueExA SHQueryValueEx;
+alias SHEnumValueA SHEnumValue;
+alias SHGetValueA SHGetValue;
+alias SHSetValueA SHSetValue;
+alias SHDeleteValueA SHDeleteValue;
+alias AssocQueryKeyA AssocQueryKey;
+alias AssocQueryStringByKeyA AssocQueryStringByKey;
+alias AssocQueryStringA AssocQueryString;
+alias UrlApplySchemeA UrlApplyScheme;
+alias UrlCanonicalizeA UrlCanonicalize;
+alias UrlCombineA UrlCombine;
+alias UrlCompareA UrlCompare;
+alias UrlCreateFromPathA UrlCreateFromPath;
+alias UrlEscapeA UrlEscape;
+alias UrlGetLocationA UrlGetLocation;
+alias UrlGetPartA UrlGetPart;
+alias UrlHashA UrlHash;
+alias UrlIsA UrlIs;
+alias UrlIsNoHistoryA UrlIsNoHistory;
+alias UrlIsOpaqueA UrlIsOpaque;
+alias UrlUnescapeA UrlUnescape;
+alias UrlUnescapeInPlaceA UrlUnescapeInPlace;
+alias SHRegCreateUSKeyA SHRegCreateUSKey;
+alias SHRegDeleteEmptyUSKeyA SHRegDeleteEmptyUSKey;
+alias SHRegDeleteUSValueA SHRegDeleteUSValue;
+alias SHRegEnumUSKeyA SHRegEnumUSKey;
+alias SHRegEnumUSValueA SHRegEnumUSValue;
+alias SHRegGetBoolUSValueA SHRegGetBoolUSValue;
+alias SHRegGetPathA SHRegGetPath;
+alias SHRegGetUSValueA SHRegGetUSValue;
+alias SHRegOpenUSKeyA SHRegOpenUSKey;
+alias SHRegQueryInfoUSKeyA SHRegQueryInfoUSKey;
+alias SHRegQueryUSValueA SHRegQueryUSValue;
+alias SHRegSetPathA SHRegSetPath;
+alias SHRegSetUSValueA SHRegSetUSValue;
+alias SHRegWriteUSValueA SHRegWriteUSValue;
+//alias wnsprintfA wnsprintf;
+//alias wvnsprintfA wvnsprintf;
+}
+
+alias StrToInt StrToLong;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/snmp.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,269 @@
+/***********************************************************************\
+*                                 snmp.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.snmp;
+
+private import win32.windows;
+
+// These are not documented on MSDN
+enum {
+	DEFAULT_SNMP_PORT_UDP     =   161,
+	DEFAULT_SNMP_PORT_IPX     = 36879,
+	DEFAULT_SNMPTRAP_PORT_UDP =   162,
+	DEFAULT_SNMPTRAP_PORT_IPX = 36880
+}
+
+enum : BYTE {
+	ASN_UNIVERSAL                 = 0x00,
+	ASN_PRIMITIVE                 = 0x00,
+	ASN_CONSTRUCTOR               = 0x20,
+	ASN_APPLICATION               = 0x40,
+	ASN_CONTEXT                   = 0x80,
+	ASN_PRIVATE                   = 0xC0,
+
+	SNMP_PDU_GET                  = ASN_CONTEXT | ASN_CONSTRUCTOR,
+	SNMP_PDU_GETNEXT,
+	SNMP_PDU_RESPONSE,
+	SNMP_PDU_SET,
+	SNMP_PDU_GETBULK,          // = ASN_CONTEXT | ASN_CONSTRUCTOR | 4
+	SNMP_PDU_V1TRAP               = ASN_CONTEXT | ASN_CONSTRUCTOR | 4,
+	SNMP_PDU_INFORM               = ASN_CONTEXT | ASN_CONSTRUCTOR | 6,
+	SNMP_PDU_TRAP,
+	SNMP_PDU_REPORT,
+	ASN_INTEGER                   = ASN_UNIVERSAL | ASN_PRIMITIVE | 2,
+	ASN_BITS,
+	ASN_OCTETSTRING,
+	ASN_NULL,
+	ASN_OBJECTIDENTIFIER,      // = ASN_UNIVERSAL | ASN_PRIMITIVE | 6
+	ASN_INTEGER32                 = ASN_INTEGER,
+	ASN_SEQUENCE                  = ASN_UNIVERSAL | ASN_CONSTRUCTOR | 0x10,
+	ASN_SEQUENCEOF                = ASN_SEQUENCE,
+	ASN_IPADDRESS                 = ASN_APPLICATION | ASN_PRIMITIVE,
+	ASN_COUNTER32,
+	ASN_GAUGE32,
+	ASN_TIMETICKS,
+	ASN_OPAQUE,                // = ASN_APPLICATION | ASN_PRIMITIVE | 4
+	ASN_COUNTER64                 = ASN_APPLICATION | ASN_PRIMITIVE | 6,
+	ASN_UNSIGNED32,            // = ASN_APPLICATION | ASN_PRIMITIVE | 7
+	SNMP_EXCEPTION_NOSUCHOBJECT   = ASN_CONTEXT | ASN_PRIMITIVE,
+	SNMP_EXCEPTION_NOSUCHINSTANCE,
+	SNMP_EXCEPTION_ENDOFMIBVIEW,
+	SNMP_EXTENSION_GET            = SNMP_PDU_GET,
+	SNMP_EXTENSION_GET_NEXT       = SNMP_PDU_GETNEXT,
+	SNMP_EXTENSION_GET_BULK       = SNMP_PDU_GETBULK,
+	SNMP_EXTENSION_SET_TEST       = ASN_PRIVATE | ASN_CONSTRUCTOR,
+	SNMP_EXTENSION_SET_COMMIT     = SNMP_PDU_SET,
+	SNMP_EXTENSION_SET_UNDO       = ASN_PRIVATE | ASN_CONSTRUCTOR | 1,
+	SNMP_EXTENSION_SET_CLEANUP
+}
+
+
+enum : AsnInteger {
+	SNMP_ERRORSTATUS_NOERROR,
+	SNMP_ERRORSTATUS_TOOBIG,
+	SNMP_ERRORSTATUS_NOSUCHNAME,
+	SNMP_ERRORSTATUS_BADVALUE,
+	SNMP_ERRORSTATUS_READONLY,
+	SNMP_ERRORSTATUS_GENERR,
+	SNMP_ERRORSTATUS_NOACCESS,
+	SNMP_ERRORSTATUS_WRONGTYPE,
+	SNMP_ERRORSTATUS_WRONGLENGTH,
+	SNMP_ERRORSTATUS_WRONGENCODING,
+	SNMP_ERRORSTATUS_WRONGVALUE,
+	SNMP_ERRORSTATUS_NOCREATION,
+	SNMP_ERRORSTATUS_INCONSISTENTVALUE,
+	SNMP_ERRORSTATUS_RESOURCEUNAVAILABLE,
+	SNMP_ERRORSTATUS_COMMITFAILED,
+	SNMP_ERRORSTATUS_UNDOFAILED,
+	SNMP_ERRORSTATUS_AUTHORIZATIONERROR,
+	SNMP_ERRORSTATUS_NOTWRITABLE,
+	SNMP_ERRORSTATUS_INCONSISTENTNAME
+}
+
+enum : AsnInteger {
+	SNMP_GENERICTRAP_COLDSTART,
+	SNMP_GENERICTRAP_WARMSTART,
+	SNMP_GENERICTRAP_LINKDOWN,
+	SNMP_GENERICTRAP_LINKUP,
+	SNMP_GENERICTRAP_AUTHFAILURE,
+	SNMP_GENERICTRAP_EGPNEIGHLOSS,
+	SNMP_GENERICTRAP_ENTERSPECIFIC
+}
+
+// These are not documented on MSDN
+enum {
+	SNMP_ACCESS_NONE,
+	SNMP_ACCESS_NOTIFY,
+	SNMP_ACCESS_READ_ONLY,
+	SNMP_ACCESS_READ_WRITE,
+	SNMP_ACCESS_READ_CREATE
+}
+
+enum : BOOL {
+	SNMPAPI_ERROR   = false,
+	SNMPAPI_NOERROR = true
+}
+
+enum : INT {
+	SNMP_LOG_SILENT,
+	SNMP_LOG_FATAL,
+	SNMP_LOG_ERROR,
+	SNMP_LOG_WARNING,
+	SNMP_LOG_TRACE,
+	SNMP_LOG_VERBOSE
+}
+
+const INT
+	SNMP_OUTPUT_TO_CONSOLE  = 1,
+	SNMP_OUTPUT_TO_LOGFILE  = 2,
+	SNMP_OUTPUT_TO_EVENTLOG = 4,
+	SNMP_OUTPUT_TO_DEBUGGER = 8;
+
+const size_t SNMP_MAX_OID_LEN = 128;
+
+enum : DWORD {
+	SNMP_MEM_ALLOC_ERROR          =  1,
+	SNMP_BERAPI_INVALID_LENGTH    = 10,
+	SNMP_BERAPI_INVALID_TAG,
+	SNMP_BERAPI_OVERFLOW,
+	SNMP_BERAPI_SHORT_BUFFER,
+	SNMP_BERAPI_INVALID_OBJELEM,
+	SNMP_PDUAPI_UNRECOGNIZED_PDU  = 20,
+	SNMP_PDUAPI_INVALID_ES,
+	SNMP_PDUAPI_INVALID_GT,
+	SNMP_AUTHAPI_INVALID_VERSION  = 30,
+	SNMP_AUTHAPI_INVALID_MSG_TYPE,
+	SNMP_AUTHAPI_TRIV_AUTH_FAILED,
+}
+
+alias INT SNMPAPI;
+alias LONG AsnInteger32;
+alias ULONG AsnUnsigned32, AsnCounter32, AsnGauge32, AsnTimeticks;
+alias ULARGE_INTEGER AsnCounter64;
+
+align (4):
+
+struct AsnOctetString {
+	BYTE* stream;
+	UINT  length;
+	BOOL  dynamic;
+}
+alias AsnOctetString AsnBits, AsnSequence, AsnImplicitSequence,
+  AsnIPAddress, AsnNetworkAddress, AsnDisplayString, AsnOpaque;
+
+struct AsnObjectIdentifier {
+	UINT  idLength;
+	UINT* ids;
+}
+alias AsnObjectIdentifier AsnObjectName;
+
+struct AsnAny {
+	BYTE      asnType;
+	union _asnValue {
+		AsnInteger32        number;
+		AsnUnsigned32       unsigned32;
+		AsnCounter64        counter64;
+		AsnOctetString      string;
+		AsnBits             bits;
+		AsnObjectIdentifier object;
+		AsnSequence         sequence;
+		AsnIPAddress        address;
+		AsnCounter32        counter;
+		AsnGauge32          gauge;
+		AsnTimeticks        ticks;
+		AsnOpaque           arbitrary;
+	}
+	_asnValue asnValue;
+}
+alias AsnAny AsnObjectSyntax;
+
+struct SnmpVarBind {
+	AsnObjectName   name;
+	AsnObjectSyntax value;
+}
+
+struct SnmpVarBindList {
+	SnmpVarBind* list;
+	UINT         len;
+}
+
+extern (Windows) {
+	VOID SnmpExtensionClose();
+	BOOL SnmpExtensionInit(DWORD, HANDLE*, AsnObjectIdentifier*);
+	BOOL SnmpExtensionInitEx(AsnObjectIdentifier*);
+	BOOL SnmpExtensionMonitor(LPVOID);
+	BOOL SnmpExtensionQuery(BYTE, SnmpVarBindList*, AsnInteger32*,
+	  AsnInteger32*);
+	BOOL SnmpExtensionQueryEx(DWORD, DWORD, SnmpVarBindList*, AsnOctetString*,
+	  AsnInteger32*, AsnInteger32*);
+	BOOL SnmpExtensionTrap(AsnObjectIdentifier*, AsnInteger32*, AsnInteger32*,
+	  AsnTimeticks*, SnmpVarBindList*);
+	DWORD SnmpSvcGetUptime();
+	VOID SnmpSvcSetLogLevel(INT);
+	VOID SnmpSvcSetLogType(INT);
+	SNMPAPI SnmpUtilAsnAnyCpy(AsnAny*, AsnAny*);
+	VOID SnmpUtilAsnAnyFree(AsnAny*);
+	VOID SnmpUtilDbgPrint(INT, LPSTR, ...);
+	LPSTR SnmpUtilIdsToA(UINT*, UINT);
+	LPVOID SnmpUtilMemAlloc(UINT);
+	VOID SnmpUtilMemFree(LPVOID);
+	LPVOID SnmpUtilMemReAlloc(LPVOID, UINT);
+	SNMPAPI SnmpUtilOctetsCmp(AsnOctetString*, AsnOctetString*);
+	SNMPAPI SnmpUtilOctetsCpy(AsnOctetString*, AsnOctetString*);
+	VOID SnmpUtilOctetsFree(AsnOctetString*);
+	SNMPAPI SnmpUtilOctetsNCmp(AsnOctetString*, AsnOctetString*, UINT);
+	SNMPAPI SnmpUtilOidAppend(AsnObjectIdentifier*, AsnObjectIdentifier*);
+	SNMPAPI SnmpUtilOidCmp(AsnObjectIdentifier*, AsnObjectIdentifier*);
+	SNMPAPI SnmpUtilOidCpy(AsnObjectIdentifier*, AsnObjectIdentifier*);
+	VOID SnmpUtilOidFree(AsnObjectIdentifier*);
+	SNMPAPI SnmpUtilOidNCmp(AsnObjectIdentifier*, AsnObjectIdentifier*, UINT);
+	LPSTR SnmpUtilOidToA(AsnObjectIdentifier*);
+	VOID SnmpUtilPrintAsnAny(AsnAny*);
+	VOID SnmpUtilPrintOid(AsnObjectIdentifier*);
+	SNMPAPI SnmpUtilVarBindCpy(SnmpVarBind*, SnmpVarBind*);
+	SNMPAPI SnmpUtilVarBindListCpy(SnmpVarBindList*, SnmpVarBindList*);
+	VOID SnmpUtilVarBindFree(SnmpVarBind*);
+	VOID SnmpUtilVarBindListFree(SnmpVarBindList*);
+}
+
+alias SnmpUtilMemAlloc SNMP_malloc;
+alias SnmpUtilMemFree SNMP_free;
+alias SnmpUtilMemReAlloc SNMP_realloc;
+alias SnmpUtilMemAlloc SNMP_DBG_malloc;
+alias SnmpUtilMemFree SNMP_DBG_free;
+alias SnmpUtilMemReAlloc SNMP_DBG_realloc;
+alias SnmpUtilOidAppend SNMP_oidappend;
+alias SnmpUtilOidCmp SNMP_oidcmp;
+alias SnmpUtilOidCpy SNMP_oidcpy;
+alias SnmpUtilOidFree SNMP_oidfree;
+alias SnmpUtilOidNCmp SNMP_oidncmp;
+alias SnmpUtilPrintAsnAny SNMP_printany;
+alias SnmpUtilVarBindCpy SNMP_CopyVarBind;
+alias SnmpUtilVarBindListCpy SNMP_CopyVarBindList;
+alias SnmpUtilVarBindFree SNMP_FreeVarBind;
+alias SnmpUtilVarBindListFree SNMP_FreeVarBindList;
+alias ASN_IPADDRESS ASN_RFC1155_IPADDRESS;
+alias ASN_COUNTER32 ASN_RFC1155_COUNTER;
+alias ASN_GAUGE32 ASN_RFC1155_GAUGE;
+alias ASN_TIMETICKS ASN_RFC1155_TIMETICKS;
+alias ASN_OPAQUE ASN_RFC1155_OPAQUE;
+alias ASN_OCTETSTRING ASN_RFC1213_DISPSTRING;
+alias SNMP_PDU_GET ASN_RFC1157_GETREQUEST;
+alias SNMP_PDU_GETNEXT ASN_RFC1157_GETNEXTREQUEST;
+alias SNMP_PDU_RESPONSE ASN_RFC1157_GETRESPONSE;
+alias SNMP_PDU_SET ASN_RFC1157_SETREQUEST;
+alias SNMP_PDU_V1TRAP ASN_RFC1157_TRAP;
+alias ASN_CONTEXT ASN_CONTEXTSPECIFIC;
+alias ASN_PRIMITIVE ASN_PRIMATIVE;
+alias SnmpVarBindList RFC1157VarBindList;
+alias SnmpVarBind RFC1157VarBind;
+alias AsnInteger32 AsnInteger;
+alias AsnCounter32 AsnCounter;
+alias AsnGauge32 AsnGauge;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/sql.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,434 @@
+/***********************************************************************\
+*                                 sql.d                                 *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.sql;
+
+public import win32.sqltypes;
+private import win32.windef;
+
+const ODBCVER = 0x0351;
+
+const SQL_ACCESSIBLE_PROCEDURES=20;
+const SQL_ACCESSIBLE_TABLES=19;
+const SQL_ALL_TYPES=0;
+const SQL_ALTER_TABLE=86;
+const SQL_API_SQLALLOCCONNECT=1;
+const SQL_API_SQLALLOCENV=2;
+const SQL_API_SQLALLOCSTMT=3;
+const SQL_API_SQLBINDCOL=4;
+const SQL_API_SQLCANCEL=5;
+const SQL_API_SQLCOLUMNS=40;
+const SQL_API_SQLCONNECT=7;
+const SQL_API_SQLDATASOURCES=57;
+const SQL_API_SQLDESCRIBECOL=8;
+const SQL_API_SQLDISCONNECT=9;
+const SQL_API_SQLERROR=10;
+const SQL_API_SQLEXECDIRECT=11;
+const SQL_API_SQLEXECUTE=12;
+const SQL_API_SQLFETCH=13;
+const SQL_API_SQLFREECONNECT=14;
+const SQL_API_SQLFREEENV=15;
+const SQL_API_SQLFREESTMT=16;
+const SQL_API_SQLGETCONNECTOPTION=42;
+const SQL_API_SQLGETCURSORNAME=17;
+const SQL_API_SQLGETDATA=43;
+const SQL_API_SQLGETFUNCTIONS=44;
+const SQL_API_SQLGETINFO=45;
+const SQL_API_SQLGETSTMTOPTION=46;
+const SQL_API_SQLGETTYPEINFO=47;
+const SQL_API_SQLNUMRESULTCOLS=18;
+const SQL_API_SQLPARAMDATA=48;
+const SQL_API_SQLPREPARE=19;
+const SQL_API_SQLPUTDATA=49;
+const SQL_API_SQLROWCOUNT=20;
+const SQL_API_SQLSETCONNECTOPTION=50;
+const SQL_API_SQLSETCURSORNAME=21;
+const SQL_API_SQLSETPARAM=22;
+const SQL_API_SQLSETSTMTOPTION=51;
+const SQL_API_SQLSPECIALCOLUMNS=52;
+const SQL_API_SQLSTATISTICS=53;
+const SQL_API_SQLTABLES=54;
+const SQL_API_SQLTRANSACT=23;
+
+const SQL_CB_DELETE=0;
+const SQL_CB_CLOSE=1;
+const SQL_CB_PRESERVE=2;
+
+const SQL_CHAR=1;
+const SQL_CLOSE=0;
+const SQL_COMMIT=0;
+const SQL_CURSOR_COMMIT_BEHAVIOR=23;
+const SQL_DATA_AT_EXEC=-2;
+const SQL_DATA_SOURCE_NAME=2;
+const SQL_DATA_SOURCE_READ_ONLY=25;
+const SQL_DBMS_NAME=17;
+const SQL_DBMS_VER=18;
+const SQL_DECIMAL=3;
+const SQL_DEFAULT_TXN_ISOLATION=26;
+const SQL_DOUBLE=8;
+const SQL_DROP=1;
+const SQL_ERROR=-1;
+
+const SQL_FD_FETCH_NEXT=1;
+const SQL_FD_FETCH_FIRST=2;
+const SQL_FD_FETCH_LAST=4;
+const SQL_FD_FETCH_PRIOR=8;
+const SQL_FD_FETCH_ABSOLUTE=16;
+const SQL_FD_FETCH_RELATIVE=32;
+
+const SQL_FETCH_ABSOLUTE=5;
+const SQL_FETCH_DIRECTION=8;
+const SQL_FETCH_FIRST=2;
+const SQL_FETCH_LAST=3;
+const SQL_FETCH_NEXT=1;
+const SQL_FETCH_PRIOR=4;
+const SQL_FETCH_RELATIVE=6;
+const SQL_FLOAT=6;
+const SQL_GD_ANY_COLUMN=1;
+const SQL_GD_ANY_ORDER=2;
+const SQL_GETDATA_EXTENSIONS=81;
+const SQL_IC_LOWER=2;
+const SQL_IC_MIXED=4;
+const SQL_IC_SENSITIVE=3;
+const SQL_IC_UPPER=1;
+const SQL_IDENTIFIER_CASE=28;
+const SQL_IDENTIFIER_QUOTE_CHAR=29;
+
+const SQL_INDEX_ALL=1;
+const SQL_INDEX_CLUSTERED=1;
+const SQL_INDEX_HASHED=2;
+const SQL_INDEX_OTHER=3;
+const SQL_INDEX_UNIQUE=0;
+
+const SQL_INTEGER=4;
+const SQL_INTEGRITY=73;
+const SQL_INVALID_HANDLE=-2;
+
+const SQL_MAX_CATALOG_NAME_LEN=34;
+const SQL_MAX_COLUMN_NAME_LEN=30;
+const SQL_MAX_COLUMNS_IN_GROUP_BY=97;
+const SQL_MAX_COLUMNS_IN_INDEX=98;
+const SQL_MAX_COLUMNS_IN_ORDER_BY=99;
+const SQL_MAX_COLUMNS_IN_SELECT=100;
+const SQL_MAX_COLUMNS_IN_TABLE=101;
+const SQL_MAX_CURSOR_NAME_LEN=31;
+const SQL_MAX_INDEX_SIZE=102;
+const SQL_MAX_MESSAGE_LENGTH=512;
+const SQL_MAX_ROW_SIZE=104;
+const SQL_MAX_SCHEMA_NAME_LEN=32;
+const SQL_MAX_STATEMENT_LEN=105;
+const SQL_MAX_TABLE_NAME_LEN=35;
+const SQL_MAX_TABLES_IN_SELECT=106;
+const SQL_MAX_USER_NAME_LEN=107;
+
+const SQL_MAXIMUM_CATALOG_NAME_LENGTH=SQL_MAX_CATALOG_NAME_LEN;
+const SQL_MAXIMUM_COLUMN_NAME_LENGTH=SQL_MAX_COLUMN_NAME_LEN;
+const SQL_MAXIMUM_COLUMNS_IN_GROUP_BY=SQL_MAX_COLUMNS_IN_GROUP_BY;
+const SQL_MAXIMUM_COLUMNS_IN_INDEX=SQL_MAX_COLUMNS_IN_INDEX;
+const SQL_MAXIMUM_COLUMNS_IN_ORDER_BY=SQL_MAX_COLUMNS_IN_ORDER_BY;
+const SQL_MAXIMUM_COLUMNS_IN_SELECT=SQL_MAX_COLUMNS_IN_SELECT;
+const SQL_MAXIMUM_CURSOR_NAME_LENGTH=SQL_MAX_CURSOR_NAME_LEN;
+const SQL_MAXIMUM_INDEX_SIZE=SQL_MAX_INDEX_SIZE;
+const SQL_MAXIMUM_ROW_SIZE=SQL_MAX_ROW_SIZE;
+const SQL_MAXIMUM_SCHEMA_NAME_LENGTH=SQL_MAX_SCHEMA_NAME_LEN;
+const SQL_MAXIMUM_STATEMENT_LENGTH=SQL_MAX_STATEMENT_LEN;
+const SQL_MAXIMUM_TABLES_IN_SELECT=SQL_MAX_TABLES_IN_SELECT;
+const SQL_MAXIMUM_USER_NAME_LENGTH=SQL_MAX_USER_NAME_LEN;
+
+const SQL_NC_HIGH=0;
+const SQL_NC_LOW=1;
+const SQL_NEED_DATA=99;
+const SQL_NO_NULLS=0;
+const SQL_NTS=-3;
+const LONG SQL_NTSL=-3;
+const SQL_NULL_COLLATION=85;
+const SQL_NULL_DATA=-1;
+const SQL_NULL_HDBC=0;
+const SQL_NULL_HENV=0;
+const SQL_NULL_HSTMT=0;
+const SQL_NULLABLE=1;
+const SQL_NULLABLE_UNKNOWN=2;
+const SQL_NUMERIC=2;
+const SQL_ORDER_BY_COLUMNS_IN_SELECT=90;
+const SQL_PC_PSEUDO=2;
+const SQL_PC_UNKNOWN=0;
+const SQL_REAL=7;
+const SQL_RESET_PARAMS=3;
+const SQL_ROLLBACK=1;
+const SQL_SCCO_LOCK=2;
+const SQL_SCCO_OPT_ROWVER=4;
+const SQL_SCCO_OPT_VALUES=8;
+const SQL_SCCO_READ_ONLY=1;
+const SQL_SCOPE_CURROW=0;
+const SQL_SCOPE_SESSION=2;
+const SQL_SCOPE_TRANSACTION=1;
+const SQL_SCROLL_CONCURRENCY=43;
+const SQL_SEARCH_PATTERN_ESCAPE=14;
+const SQL_SERVER_NAME=13;
+const SQL_SMALLINT=5;
+const SQL_SPECIAL_CHARACTERS=94;
+const SQL_STILL_EXECUTING=2;
+//MACRO #define SQL_SUCCEEDED(rc) (((rc)&(~1))==0)
+
+const SQL_SUCCESS=0;
+const SQL_SUCCESS_WITH_INFO=1;
+
+const SQL_TC_ALL=2;
+const SQL_TC_DDL_COMMIT=3;
+const SQL_TC_DDL_IGNORE=4;
+const SQL_TC_DML=1;
+const SQL_TC_NONE=0;
+
+
+const SQL_TXN_CAPABLE=46;
+const SQL_TXN_ISOLATION_OPTION=72;
+const SQL_TXN_READ_COMMITTED=2;
+const SQL_TXN_READ_UNCOMMITTED=1;
+const SQL_TXN_REPEATABLE_READ=4;
+const SQL_TXN_SERIALIZABLE=8;
+
+const SQL_TRANSACTION_CAPABLE=SQL_TXN_CAPABLE;
+const SQL_TRANSACTION_ISOLATION_OPTION=SQL_TXN_ISOLATION_OPTION;
+const SQL_TRANSACTION_READ_COMMITTED=SQL_TXN_READ_COMMITTED;
+const SQL_TRANSACTION_READ_UNCOMMITTED=SQL_TXN_READ_UNCOMMITTED;
+const SQL_TRANSACTION_REPEATABLE_READ=SQL_TXN_REPEATABLE_READ;
+const SQL_TRANSACTION_SERIALIZABLE=SQL_TXN_SERIALIZABLE;
+
+const SQL_UNBIND=2;
+const SQL_UNKNOWN_TYPE=0;
+const SQL_USER_NAME=47;
+const SQL_VARCHAR=12;
+
+static if (ODBCVER >= 0x0200) {
+	const SQL_AT_ADD_COLUMN  = 1;
+	const SQL_AT_DROP_COLUMN = 2;
+}
+
+static if (ODBCVER >= 0x0201) {
+	const SQL_OJ_LEFT               =  1;
+	const SQL_OJ_RIGHT              =  2;
+	const SQL_OJ_FULL               =  4;
+	const SQL_OJ_NESTED             =  8;
+	const SQL_OJ_NOT_ORDERED        = 16;
+	const SQL_OJ_INNER              = 32;
+	const SQL_OJ_ALL_COMPARISON_OPS = 64;
+}
+
+static if (ODBCVER >= 0x0300) {
+	const SQL_AM_CONNECTION=1;
+	const SQL_AM_NONE=0;
+	const SQL_AM_STATEMENT=2;
+	const SQL_API_SQLALLOCHANDLE=1001;
+	const SQL_API_SQLBINDPARAM=1002;
+	const SQL_API_SQLCLOSECURSOR=1003;
+	const SQL_API_SQLCOLATTRIBUTE=6;
+	const SQL_API_SQLCOPYDESC=1004;
+	const SQL_API_SQLENDTRAN=1005;
+	const SQL_API_SQLFETCHSCROLL=1021;
+	const SQL_API_SQLFREEHANDLE=1006;
+	const SQL_API_SQLGETCONNECTATTR=1007;
+	const SQL_API_SQLGETDESCFIELD=1008;
+	const SQL_API_SQLGETDESCREC=1009;
+	const SQL_API_SQLGETDIAGFIELD=1010;
+	const SQL_API_SQLGETDIAGREC=1011;
+	const SQL_API_SQLGETENVATTR=1012;
+	const SQL_API_SQLGETSTMTATTR=1014;
+	const SQL_API_SQLSETCONNECTATTR=1016;
+	const SQL_API_SQLSETDESCFIELD=1017;
+	const SQL_API_SQLSETDESCREC=1018;
+	const SQL_API_SQLSETENVATTR=1019;
+	const SQL_API_SQLSETSTMTATTR=1020;
+	const SQL_ARD_TYPE=-99;
+	const SQL_AT_ADD_CONSTRAINT=8;
+	const SQL_ATTR_APP_PARAM_DESC=10011;
+	const SQL_ATTR_APP_ROW_DESC=10010;
+	const SQL_ATTR_AUTO_IPD=10001;
+	const SQL_ATTR_CURSOR_SCROLLABLE=-1;
+	const SQL_ATTR_CURSOR_SENSITIVITY=-2;
+	const SQL_ATTR_IMP_PARAM_DESC=10013;
+	const SQL_ATTR_IMP_ROW_DESC=10012;
+	const SQL_ATTR_METADATA_ID=10014;
+	const SQL_ATTR_OUTPUT_NTS=10001;
+	const SQL_CATALOG_NAME=10003;
+	const SQL_CODE_DATE=1;
+	const SQL_CODE_TIME=2;
+	const SQL_CODE_TIMESTAMP=3;
+	const SQL_COLLATION_SEQ=10004;
+	const SQL_CURSOR_SENSITIVITY=10001;
+	const SQL_DATE_LEN=10;
+	const SQL_DATETIME=9;
+	const SQL_DEFAULT=99;
+
+	const SQL_DESC_ALLOC_AUTO=1;
+	const SQL_DESC_ALLOC_USER=2;
+	const SQL_DESC_ALLOC_TYPE=1099;
+	const SQL_DESC_COUNT=1001;
+	const SQL_DESC_TYPE=1002;
+	const SQL_DESC_LENGTH=1003;
+	const SQL_DESC_OCTET_LENGTH_PTR=1004;
+	const SQL_DESC_PRECISION=1005;
+	const SQL_DESC_SCALE=1006;
+	const SQL_DESC_DATETIME_INTERVAL_CODE=1007;
+	const SQL_DESC_NULLABLE=1008;
+	const SQL_DESC_INDICATOR_PTR=1009;
+	const SQL_DESC_DATA_PTR=1010;
+	const SQL_DESC_NAME=1011;
+	const SQL_DESC_UNNAMED=1012;
+	const SQL_DESC_OCTET_LENGTH=1013;
+
+	const SQL_DESCRIBE_PARAMETER=10002;
+
+	const SQL_DIAG_ALTER_DOMAIN=3;
+	const SQL_DIAG_ALTER_TABLE=4;
+	const SQL_DIAG_CALL=7;
+	const SQL_DIAG_CLASS_ORIGIN=8;
+	const SQL_DIAG_CONNECTION_NAME=10;
+	const SQL_DIAG_CREATE_ASSERTION=6;
+	const SQL_DIAG_CREATE_CHARACTER_SET=8;
+	const SQL_DIAG_CREATE_COLLATION=10;
+	const SQL_DIAG_CREATE_DOMAIN=23;
+	const SQL_DIAG_CREATE_INDEX=-1;
+	const SQL_DIAG_CREATE_SCHEMA=64;
+	const SQL_DIAG_CREATE_TABLE=77;
+	const SQL_DIAG_CREATE_TRANSLATION=79;
+	const SQL_DIAG_CREATE_VIEW=84;
+	const SQL_DIAG_DELETE_WHERE=19;
+	const SQL_DIAG_DROP_ASSERTION=24;
+	const SQL_DIAG_DROP_CHARACTER_SET=25;
+	const SQL_DIAG_DROP_COLLATION=26;
+	const SQL_DIAG_DROP_DOMAIN=27;
+	const SQL_DIAG_DROP_INDEX=(-2);
+	const SQL_DIAG_DROP_SCHEMA=31;
+	const SQL_DIAG_DROP_TABLE=32;
+	const SQL_DIAG_DROP_TRANSLATION=33;
+	const SQL_DIAG_DROP_VIEW=36;
+	const SQL_DIAG_DYNAMIC_DELETE_CURSOR=38;
+	const SQL_DIAG_DYNAMIC_FUNCTION=7;
+	const SQL_DIAG_DYNAMIC_FUNCTION_CODE=12;
+	const SQL_DIAG_DYNAMIC_UPDATE_CURSOR=81;
+	const SQL_DIAG_GRANT=48;
+	const SQL_DIAG_INSERT=50;
+	const SQL_DIAG_MESSAGE_TEXT=6;
+	const SQL_DIAG_NATIVE=5;
+	const SQL_DIAG_NUMBER=2;
+	const SQL_DIAG_RETURNCODE=1;
+	const SQL_DIAG_REVOKE=59;
+	const SQL_DIAG_ROW_COUNT=3;
+	const SQL_DIAG_SELECT_CURSOR=85;
+	const SQL_DIAG_SERVER_NAME=11;
+	const SQL_DIAG_SQLSTATE=4;
+	const SQL_DIAG_SUBCLASS_ORIGIN=9;
+	const SQL_DIAG_UNKNOWN_STATEMENT=0;
+	const SQL_DIAG_UPDATE_WHERE=82;
+
+	const SQL_FALSE=0;
+	const SQL_HANDLE_DBC=2;
+	const SQL_HANDLE_DESC=4;
+	const SQL_HANDLE_ENV=1;
+	const SQL_HANDLE_STMT=3;
+	const SQL_INSENSITIVE=1;
+	const SQL_MAX_CONCURRENT_ACTIVITIES=1;
+	const SQL_MAX_DRIVER_CONNECTIONS=0;
+	const SQL_MAX_IDENTIFIER_LEN=10005;
+	const SQL_MAXIMUM_CONCURRENT_ACTIVITIES=SQL_MAX_CONCURRENT_ACTIVITIES;
+	const SQL_MAXIMUM_DRIVER_CONNECTIONS=SQL_MAX_DRIVER_CONNECTIONS;
+	const SQL_MAXIMUM_IDENTIFIER_LENGTH=SQL_MAX_IDENTIFIER_LEN;
+	const SQL_NAMED=0;
+	const SQL_NO_DATA=100;
+	const SQL_NONSCROLLABLE=0;
+	const SQL_NULL_HANDLE=0L;
+	const SQL_NULL_HDESC=0;
+	const SQL_OJ_CAPABILITIES=115;
+	const SQL_OUTER_JOIN_CAPABILITIES=SQL_OJ_CAPABILITIES;
+	const SQL_PC_NON_PSEUDO=1;
+
+	const SQL_PRED_NONE=0;
+	const SQL_PRED_CHAR=1;
+	const SQL_PRED_BASIC=2;
+
+	const SQL_ROW_IDENTIFIER=1;
+	const SQL_SCROLLABLE=1;
+	const SQL_SENSITIVE=2;
+	const SQL_TIME_LEN=8;
+	const SQL_TIMESTAMP_LEN=19;
+	const SQL_TRUE=1;
+	const SQL_TYPE_DATE=91;
+	const SQL_TYPE_TIME=92;
+	const SQL_TYPE_TIMESTAMP=93;
+	const SQL_UNNAMED=1;
+	const SQL_UNSPECIFIED=0;
+	const SQL_XOPEN_CLI_YEAR=10000;
+}//#endif /* ODBCVER >= 0x0300 */
+
+extern (Windows) {
+	deprecated {
+		SQLRETURN SQLAllocConnect(SQLHENV, SQLHDBC*);
+		SQLRETURN SQLAllocEnv(SQLHENV*);
+		SQLRETURN SQLAllocStmt(SQLHDBC, SQLHSTMT*);
+		SQLRETURN SQLError(SQLHENV, SQLHDBC, SQLHSTMT, SQLCHAR*, SQLINTEGER*, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*);
+		SQLRETURN SQLFreeConnect(SQLHDBC);
+		SQLRETURN SQLFreeEnv(SQLHENV);
+		SQLRETURN SQLSetParam(SQLHSTMT, SQLUSMALLINT, SQLSMALLINT, SQLSMALLINT, SQLULEN, SQLSMALLINT, SQLPOINTER, SQLLEN*);
+		SQLRETURN SQLGetConnectOption(SQLHDBC, SQLUSMALLINT, SQLPOINTER);
+		SQLRETURN SQLGetStmtOption(SQLHSTMT, SQLUSMALLINT, SQLPOINTER);
+		SQLRETURN SQLSetConnectOption(SQLHDBC, SQLUSMALLINT, SQLULEN);
+		SQLRETURN SQLSetStmtOption(SQLHSTMT, SQLUSMALLINT, SQLROWCOUNT);
+	}
+	SQLRETURN SQLBindCol(SQLHSTMT, SQLUSMALLINT, SQLSMALLINT, SQLPOINTER, SQLLEN, SQLLEN*);
+	SQLRETURN SQLCancel(SQLHSTMT);
+	SQLRETURN SQLConnect(SQLHDBC, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT);
+	SQLRETURN SQLDescribeCol(SQLHSTMT, SQLUSMALLINT, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*, SQLSMALLINT*, SQLULEN*, SQLSMALLINT*, SQLSMALLINT*);
+	SQLRETURN SQLDisconnect(SQLHDBC);
+	SQLRETURN SQLExecDirect(SQLHSTMT, SQLCHAR*, SQLINTEGER);
+	SQLRETURN SQLExecute(SQLHSTMT);
+	SQLRETURN SQLFetch(SQLHSTMT);
+	SQLRETURN SQLFreeStmt(SQLHSTMT, SQLUSMALLINT);
+	SQLRETURN SQLGetCursorName(SQLHSTMT, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*);
+	SQLRETURN SQLNumResultCols(SQLHSTMT, SQLSMALLINT*);
+	SQLRETURN SQLPrepare(SQLHSTMT, SQLCHAR*, SQLINTEGER);
+	SQLRETURN SQLRowCount(SQLHSTMT, SQLLEN*);
+	SQLRETURN SQLSetCursorName(SQLHSTMT, SQLCHAR*, SQLSMALLINT);
+	SQLRETURN SQLTransact(SQLHENV, SQLHDBC, SQLUSMALLINT);
+	SQLRETURN SQLColumns(SQLHSTMT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT);
+	SQLRETURN SQLGetData(SQLHSTMT, SQLUSMALLINT, SQLSMALLINT, SQLPOINTER, SQLLEN, SQLLEN*);
+	SQLRETURN SQLGetFunctions(SQLHDBC, SQLUSMALLINT, SQLUSMALLINT*);
+	SQLRETURN SQLGetInfo(SQLHDBC, SQLUSMALLINT, SQLPOINTER, SQLSMALLINT, SQLSMALLINT*);
+	SQLRETURN SQLGetTypeInfo(SQLHSTMT, SQLSMALLINT);
+	SQLRETURN SQLParamData(SQLHSTMT, SQLPOINTER*);
+	SQLRETURN SQLPutData(SQLHSTMT, SQLPOINTER, SQLLEN);
+	SQLRETURN SQLSpecialColumns(SQLHSTMT, SQLUSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLUSMALLINT, SQLUSMALLINT);
+	SQLRETURN SQLStatistics(SQLHSTMT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLUSMALLINT, SQLUSMALLINT);
+	SQLRETURN SQLTables(SQLHSTMT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT);
+	SQLRETURN SQLDataSources(SQLHENV, SQLUSMALLINT, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*);
+
+	static if (ODBCVER >= 0x0300) {
+		SQLRETURN SQLAllocHandle(SQLSMALLINT, SQLHANDLE, SQLHANDLE*);
+		SQLRETURN SQLBindParam(SQLHSTMT, SQLUSMALLINT, SQLSMALLINT, SQLSMALLINT, SQLULEN, SQLSMALLINT, SQLPOINTER, SQLLEN*);
+		SQLRETURN SQLCloseCursor(SQLHSTMT);
+		SQLRETURN SQLColAttribute(SQLHSTMT, SQLUSMALLINT, SQLUSMALLINT, SQLPOINTER, SQLSMALLINT, SQLSMALLINT*, SQLPOINTER);
+		SQLRETURN SQLCopyDesc(SQLHDESC, SQLHDESC);
+		SQLRETURN SQLEndTran(SQLSMALLINT, SQLHANDLE, SQLSMALLINT);
+		SQLRETURN SQLFetchScroll(SQLHSTMT, SQLSMALLINT, SQLROWOFFSET);
+		SQLRETURN SQLFreeHandle(SQLSMALLINT, SQLHANDLE);
+		SQLRETURN SQLGetConnectAttr(SQLHDBC, SQLINTEGER, SQLPOINTER, SQLINTEGER, SQLINTEGER*);
+		SQLRETURN SQLGetDescField(SQLHDESC, SQLSMALLINT, SQLSMALLINT, SQLPOINTER, SQLINTEGER, SQLINTEGER*);
+		SQLRETURN SQLGetDescRec(SQLHDESC, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*,
+		  SQLSMALLINT*, SQLSMALLINT*, SQLLEN*, SQLSMALLINT*, SQLSMALLINT*, SQLSMALLINT*);
+		SQLRETURN SQLGetDiagField(SQLSMALLINT, SQLHANDLE, SQLSMALLINT, SQLSMALLINT, SQLPOINTER, SQLSMALLINT, SQLSMALLINT*);
+		SQLRETURN SQLGetDiagRec(SQLSMALLINT, SQLHANDLE, SQLSMALLINT, SQLCHAR*, SQLINTEGER*, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*);
+		SQLRETURN SQLGetEnvAttr(SQLHENV, SQLINTEGER, SQLPOINTER, SQLINTEGER, SQLINTEGER*);
+		SQLRETURN SQLGetStmtAttr(SQLHSTMT, SQLINTEGER, SQLPOINTER, SQLINTEGER, SQLINTEGER*);
+		SQLRETURN SQLSetConnectAttr(SQLHDBC, SQLINTEGER, SQLPOINTER, SQLINTEGER);
+		SQLRETURN SQLSetDescField(SQLHDESC, SQLSMALLINT, SQLSMALLINT, SQLPOINTER, SQLINTEGER);
+		SQLRETURN SQLSetDescRec(SQLHDESC, SQLSMALLINT, SQLSMALLINT, SQLSMALLINT, SQLLEN, SQLSMALLINT,
+			SQLSMALLINT, SQLPOINTER, SQLLEN*, SQLLEN*);
+		SQLRETURN SQLSetEnvAttr(SQLHENV, SQLINTEGER, SQLPOINTER, SQLINTEGER);
+		SQLRETURN SQLSetStmtAttr(SQLHSTMT, SQLINTEGER, SQLPOINTER, SQLINTEGER);
+	}/* (ODBCVER >= 0x0300) */
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/sqlext.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,1295 @@
+/***********************************************************************\
+*                                sqlext.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.sqlext;
+
+/* Conversion notes:
+   The MinGW file was a horrible mess. All of the #defines were sorted alphabetically,
+   which is crazy. This file needs a lot of work.
+   In MinGW, sqlext #includes sqlucode, but sqlucode #includes sqlext,
+   creating a circular dependency!
+*/
+
+public import win32.sql;
+private import win32.windef;
+
+const SQL_SPEC_MAJOR = 3;
+const SQL_SPEC_MINOR = 51;
+const char[] SQL_SPEC_STRING = "03.51";
+const SQL_ACCESS_MODE = 101;
+const SQL_ACTIVE_CONNECTIONS = 0;
+const SQL_ACTIVE_STATEMENTS  = 1;
+
+const SQL_DATE = 9;
+const SQL_TIME = 10;
+const SQL_SIGNED_OFFSET = -20;
+const SQL_TINYINT = -6;
+const SQL_TIMESTAMP = 11;
+const SQL_UNSIGNED_OFFSET = -22;
+
+const SQL_ADD = 4;
+const SQL_ALL_EXCEPT_LIKE = 2;
+
+const SQL_API_ALL_FUNCTIONS       =   0;
+const SQL_API_SQLCOLATTRIBUTES    =   6;
+const SQL_API_SQLDRIVERCONNECT    =  41;
+const SQL_API_SQLBROWSECONNECT    =  55;
+const SQL_API_SQLCOLUMNPRIVILEGES =  56;
+const SQL_API_SQLDESCRIBEPARAM    =  58;
+const SQL_API_SQLEXTENDEDFETCH    =  59;
+const SQL_API_SQLFOREIGNKEYS      =  60;
+const SQL_API_SQLMORERESULTS      =  61;
+const SQL_API_SQLNATIVESQL        =  62;
+const SQL_API_SQLNUMPARAMS        =  63;
+const SQL_API_SQLPARAMOPTIONS     =  64;
+const SQL_API_SQLPRIMARYKEYS      =  65;
+const SQL_API_SQLPROCEDURECOLUMNS =  66;
+const SQL_API_SQLPROCEDURES       =  67;
+const SQL_API_SQLSETPOS           =  68;
+const SQL_API_SQLSETSCROLLOPTIONS =  69;
+const SQL_API_SQLTABLEPRIVILEGES  =  70;
+const SQL_API_SQLDRIVERS          =  71;
+const SQL_API_SQLBINDPARAMETER    =  72;
+const SQL_API_LOADBYORDINAL       = 199;
+
+const SQL_ASYNC_ENABLE = 4;
+const SQL_ASYNC_ENABLE_OFF = 0UL;
+const SQL_ASYNC_ENABLE_ON = 1UL;
+const SQL_ASYNC_ENABLE_DEFAULT = SQL_ASYNC_ENABLE_OFF;
+
+const SQL_ATTR_CONNECTION_DEAD = 1209;
+const SQL_ATTR_READONLY = 0;
+const SQL_ATTR_READWRITE_UNKNOWN = 2;
+const SQL_ATTR_WRITE = 1;
+
+const SQL_AUTOCOMMIT = 102;
+const SQL_AUTOCOMMIT_OFF = 0UL;
+const SQL_AUTOCOMMIT_ON = 1UL;
+const SQL_AUTOCOMMIT_DEFAULT = SQL_AUTOCOMMIT_ON;
+const SQL_BEST_ROWID = 1;
+const SQL_BIGINT = -5;
+const SQL_BINARY = -2;
+const SQL_BIND_BY_COLUMN = 0UL;
+const SQL_BIND_TYPE = 5;
+const SQL_BIND_TYPE_DEFAULT = SQL_BIND_BY_COLUMN;
+const SQL_BIT = -7;
+
+const SQL_BOOKMARK_PERSISTENCE = 82;
+
+// for BOOKMARK_PERSISTENCE
+const SQL_BP_CLOSE       = 1;
+const SQL_BP_DELETE      = 2;
+const SQL_BP_DROP        = 4;
+const SQL_BP_TRANSACTION = 8;
+const SQL_BP_UPDATE      = 16;
+const SQL_BP_OTHER_HSTMT = 32;
+const SQL_BP_SCROLL      = 64;
+
+const SQL_C_BINARY    = SQL_BINARY;
+const SQL_C_BIT       = SQL_BIT;
+const SQL_C_CHAR      = SQL_CHAR;
+const SQL_C_DATE      = SQL_DATE;
+const SQL_C_DOUBLE    = SQL_DOUBLE;
+const SQL_C_FLOAT     = SQL_REAL;
+const SQL_C_LONG      = SQL_INTEGER;
+const SQL_C_SHORT     = SQL_SMALLINT;
+const SQL_C_SLONG     = SQL_C_LONG+SQL_SIGNED_OFFSET;
+const SQL_C_SSHORT    = SQL_C_SHORT+SQL_SIGNED_OFFSET;
+const SQL_C_STINYINT  = SQL_TINYINT+SQL_SIGNED_OFFSET;
+const SQL_C_TIME      = SQL_TIME;
+const SQL_C_TIMESTAMP = SQL_TIMESTAMP;
+const SQL_C_TINYINT   = SQL_TINYINT;
+const SQL_C_ULONG     = SQL_C_LONG+SQL_UNSIGNED_OFFSET;
+const SQL_C_USHORT    = SQL_C_SHORT+SQL_UNSIGNED_OFFSET;
+const SQL_C_UTINYINT  = SQL_TINYINT+SQL_UNSIGNED_OFFSET;
+const SQL_C_BOOKMARK  = SQL_C_ULONG;
+const SQL_C_DEFAULT   = 99;
+
+const SQL_CASCADE = 0;
+const SQL_CB_NON_NULL = 1;
+const SQL_CB_NULL = 0;
+deprecated {
+const SQL_CC_CLOSE = SQL_CB_CLOSE;/* deprecated */
+const SQL_CC_DELETE = SQL_CB_DELETE;/* deprecated */
+const SQL_CC_PRESERVE = SQL_CB_PRESERVE;/* deprecated */
+}
+const SQL_CD_FALSE = 0L;
+const SQL_CD_TRUE = 1L;
+
+const SQL_CN_ANY = 2;
+const SQL_CN_DIFFERENT = 1;
+const SQL_CN_NONE = 0;
+
+const SQL_COLUMN_ALIAS = 87;
+
+const SQL_COLUMN_COUNT = 0;
+const SQL_COLUMN_NAME = 1;
+const SQL_COLUMN_DISPLAY_SIZE = 6;
+const SQL_COLUMN_LABEL = 18;
+const SQL_COLUMN_LENGTH = 3;
+const SQL_COLUMN_MONEY = 9;
+const SQL_COLUMN_NULLABLE = 7;
+const SQL_COLUMN_OWNER_NAME = 16;
+const SQL_COLUMN_PRECISION = 4;
+const SQL_COLUMN_QUALIFIER_NAME = 17;
+const SQL_COLUMN_SCALE = 5;
+const SQL_COLUMN_UNSIGNED = 8;
+const SQL_COLUMN_UPDATABLE = 10;
+const SQL_COLUMN_AUTO_INCREMENT = 11;
+const SQL_COLUMN_CASE_SENSITIVE = 12;
+const SQL_COLUMN_SEARCHABLE = 13;
+const SQL_COLUMN_TYPE = 2;
+const SQL_COLUMN_TYPE_NAME = 14;
+const SQL_COLUMN_TABLE_NAME = 15;
+
+const SQL_CONCAT_NULL_BEHAVIOR = 22;
+
+const SQL_CONCUR_READ_ONLY = 1;
+const SQL_CONCUR_DEFAULT   = SQL_CONCUR_READ_ONLY;
+const SQL_CONCUR_LOCK      = 2;
+const SQL_CONCUR_ROWVER    = 3;
+const SQL_CONCUR_TIMESTAMP = SQL_CONCUR_ROWVER;/* deprecated */
+const SQL_CONCUR_VALUES    = 4;
+
+const SQL_CONCURRENCY = 7;
+const SQL_CONVERT_BIGINT = 53;
+const SQL_CONVERT_BINARY = 54;
+const SQL_CONVERT_BIT = 55;
+const SQL_CONVERT_CHAR = 56;
+const SQL_CONVERT_DATE = 57;
+const SQL_CONVERT_DECIMAL = 58;
+const SQL_CONVERT_DOUBLE = 59;
+const SQL_CONVERT_FLOAT = 60;
+const SQL_CONVERT_FUNCTIONS = 48;
+const SQL_CONVERT_INTEGER = 61;
+const SQL_CONVERT_LONGVARBINARY = 71;
+const SQL_CONVERT_LONGVARCHAR = 62;
+const SQL_CONVERT_NUMERIC = 63;
+const SQL_CONVERT_REAL = 64;
+const SQL_CONVERT_SMALLINT = 65;
+const SQL_CONVERT_TIME = 66;
+const SQL_CONVERT_TIMESTAMP = 67;
+const SQL_CONVERT_TINYINT = 68;
+const SQL_CONVERT_VARBINARY = 69;
+const SQL_CONVERT_VARCHAR = 70;
+const SQL_CORRELATION_NAME = 74;
+const SQL_CR_CLOSE = SQL_CB_CLOSE;/* deprecated */
+const SQL_CR_DELETE = SQL_CB_DELETE;/* deprecated */
+const SQL_CR_PRESERVE = SQL_CB_PRESERVE;/* deprecated */
+
+enum : ULONG {
+	SQL_CUR_USE_IF_NEEDED = 0,
+	SQL_CUR_USE_ODBC,
+	SQL_CUR_USE_DRIVER,
+	SQL_CUR_DEFAULT = SQL_CUR_USE_DRIVER
+}
+
+const SQL_CURRENT_QUALIFIER = 109;
+const SQL_CURSOR_DYNAMIC = 2UL;
+const SQL_CURSOR_FORWARD_ONLY = 0UL;
+const SQL_CURSOR_KEYSET_DRIVEN = 1UL;
+const SQL_CURSOR_ROLLBACK_BEHAVIOR = 24;
+const SQL_CURSOR_STATIC = 3UL;
+const SQL_CURSOR_TYPE = 6;
+const SQL_CURSOR_TYPE_DEFAULT = SQL_CURSOR_FORWARD_ONLY;
+
+const SQL_CV_CASCADED = 0x00000004L;
+const SQL_CV_CHECK_OPTION = 0x00000002L;
+const SQL_CV_CREATE_VIEW = 0x00000001L;
+const SQL_CV_LOCAL = 0x00000008L;
+const SQL_CVT_BIGINT = 0x00004000L;
+const SQL_CVT_BINARY = 0x00000400L;
+const SQL_CVT_BIT = 0x00001000L;
+const SQL_CVT_CHAR = 0x00000001L;
+const SQL_CVT_DATE = 0x00008000L;
+const SQL_CVT_DECIMAL = 0x00000004L;
+const SQL_CVT_DOUBLE = 0x00000080L;
+const SQL_CVT_FLOAT = 0x00000020L;
+const SQL_CVT_INTEGER = 0x00000008L;
+const SQL_CVT_LONGVARBINARY = 0x00040000L;
+const SQL_CVT_LONGVARCHAR = 0x00000200L;
+const SQL_CVT_NUMERIC = 0x00000002L;
+const SQL_CVT_REAL = 0x00000040L;
+const SQL_CVT_SMALLINT = 0x00000010L;
+const SQL_CVT_TIME = 0x00010000L;
+const SQL_CVT_TIMESTAMP = 0x00020000L;
+const SQL_CVT_TINYINT = 0x00002000L;
+const SQL_CVT_VARBINARY = 0x00000800L;
+const SQL_CVT_VARCHAR = 0x00000100L;
+const SQL_DATABASE_NAME = 16;/* deprecated */
+
+const SQL_DEFAULT_PARAM = -5;
+const SQL_DELETE = 3;
+
+const SQL_DRIVER_COMPLETE = 1;
+const SQL_DRIVER_COMPLETE_REQUIRED = 3;
+const SQL_DRIVER_HDBC = 3;
+const SQL_DRIVER_HENV = 4;
+const SQL_DRIVER_HLIB = 76;
+const SQL_DRIVER_HSTMT = 5;
+const SQL_DRIVER_NAME = 6;
+const SQL_DRIVER_NOPROMPT = 0;
+const SQL_DRIVER_ODBC_VER = 77;
+const SQL_DRIVER_PROMPT = 2;
+const SQL_DRIVER_VER = 7;
+
+const SQL_DTC_ENLIST_EXPENSIVE = 1;
+const SQL_DTC_UNENLIST_EXPENSIVE = 2;
+const SQL_DTC_TRANSITION_COST = 1750;
+const SQL_ENSURE = 1;
+const SQL_ENTIRE_ROWSET = 0;
+const SQL_EXPRESSIONS_IN_ORDERBY = 27;
+const SQL_FD_FETCH_BOOKMARK = 128;
+const SQL_FD_FETCH_PREV = SQL_FD_FETCH_PRIOR;/* deprecated */
+const SQL_FD_FETCH_RESUME = 64;
+const SQL_FETCH_BOOKMARK = 8;
+const SQL_FETCH_PREV = SQL_FETCH_PRIOR;/* deprecated */
+const SQL_FETCH_RESUME = 7;/* deprecated */
+
+const SQL_FILE_NOT_SUPPORTED = 0x0000;
+const SQL_FILE_TABLE = 0x0001;
+const SQL_FILE_QUALIFIER = 0x0002;
+const SQL_FILE_CATALOG = SQL_FILE_QUALIFIER;
+const SQL_FILE_USAGE = 84;
+
+const SQL_FN_CVT_CONVERT = 0x00000001L;
+const SQL_FN_NUM_ABS = 0x00000001L;
+const SQL_FN_NUM_ACOS = 0x00000002L;
+const SQL_FN_NUM_ASIN = 0x00000004L;
+const SQL_FN_NUM_ATAN = 0x00000008L;
+const SQL_FN_NUM_ATAN2 = 0x00000010L;
+const SQL_FN_NUM_CEILING = 0x00000020L;
+const SQL_FN_NUM_COS = 0x00000040L;
+const SQL_FN_NUM_COT = 0x00000080L;
+const SQL_FN_NUM_DEGREES = 0x00040000L;
+const SQL_FN_NUM_EXP = 0x00000100L;
+const SQL_FN_NUM_FLOOR = 0x00000200L;
+const SQL_FN_NUM_LOG = 0x00000400L;
+const SQL_FN_NUM_LOG10 = 0x00080000L;
+const SQL_FN_NUM_MOD = 0x00000800L;
+const SQL_FN_NUM_PI = 0x00010000L;
+const SQL_FN_NUM_POWER = 0x00100000L;
+const SQL_FN_NUM_RADIANS = 0x00200000L;
+const SQL_FN_NUM_RAND = 0x00020000L;
+const SQL_FN_NUM_ROUND = 0x00400000L;
+const SQL_FN_NUM_SIGN = 0x00001000L;
+const SQL_FN_NUM_SIN = 0x00002000L;
+const SQL_FN_NUM_SQRT = 0x00004000L;
+const SQL_FN_NUM_TAN = 0x00008000L;
+const SQL_FN_NUM_TRUNCATE = 0x00800000L;
+const SQL_FN_STR_ASCII = 0x00002000L;
+const SQL_FN_STR_CHAR = 0x00004000L;
+const SQL_FN_STR_CONCAT = 0x00000001L;
+const SQL_FN_STR_DIFFERENCE = 0x00008000L;
+const SQL_FN_STR_INSERT = 0x00000002L;
+const SQL_FN_STR_LCASE = 0x00000040L;
+const SQL_FN_STR_LEFT = 0x00000004L;
+const SQL_FN_STR_LENGTH = 0x00000010L;
+const SQL_FN_STR_LOCATE = 0x00000020L;
+const SQL_FN_STR_LOCATE_2 = 0x00010000L;
+const SQL_FN_STR_LTRIM = 0x00000008L;
+const SQL_FN_STR_REPEAT = 0x00000080L;
+const SQL_FN_STR_REPLACE = 0x00000100L;
+const SQL_FN_STR_RIGHT = 0x00000200L;
+const SQL_FN_STR_RTRIM = 0x00000400L;
+const SQL_FN_STR_SOUNDEX = 0x00020000L;
+const SQL_FN_STR_SPACE = 0x00040000L;
+const SQL_FN_STR_SUBSTRING = 0x00000800L;
+const SQL_FN_STR_UCASE = 0x00001000L;
+const SQL_FN_SYS_DBNAME = 0x00000002L;
+const SQL_FN_SYS_IFNULL = 0x00000004L;
+const SQL_FN_SYS_USERNAME = 0x00000001L;
+const SQL_FN_TD_CURDATE = 0x00000002L;
+const SQL_FN_TD_CURTIME = 0x00000200L;
+const SQL_FN_TD_DAYNAME = 0x00008000L;
+const SQL_FN_TD_DAYOFMONTH = 0x00000004L;
+const SQL_FN_TD_DAYOFWEEK = 0x00000008L;
+const SQL_FN_TD_DAYOFYEAR = 0x00000010L;
+const SQL_FN_TD_HOUR = 0x00000400L;
+const SQL_FN_TD_MINUTE = 0x00000800L;
+const SQL_FN_TD_MONTH = 0x00000020L;
+const SQL_FN_TD_MONTHNAME = 0x00010000L;
+const SQL_FN_TD_NOW = 0x00000001L;
+const SQL_FN_TD_QUARTER = 0x00000040L;
+const SQL_FN_TD_SECOND = 0x00001000L;
+const SQL_FN_TD_TIMESTAMPADD = 0x00002000L;
+const SQL_FN_TD_TIMESTAMPDIFF = 0x00004000L;
+const SQL_FN_TD_WEEK = 0x00000080L;
+const SQL_FN_TD_YEAR = 0x00000100L;
+const SQL_FN_TSI_DAY = 0x00000010L;
+const SQL_FN_TSI_FRAC_SECOND = 0x00000001L;
+const SQL_FN_TSI_HOUR = 0x00000008L;
+const SQL_FN_TSI_MINUTE = 0x00000004L;
+const SQL_FN_TSI_MONTH = 0x00000040L;
+const SQL_FN_TSI_QUARTER = 0x00000080L;
+const SQL_FN_TSI_SECOND = 0x00000002L;
+const SQL_FN_TSI_WEEK = 0x00000020L;
+const SQL_FN_TSI_YEAR = 0x00000100L;
+const SQL_GB_GROUP_BY_CONTAINS_SELECT = 2;
+const SQL_GB_GROUP_BY_EQUALS_SELECT = 1;
+const SQL_GB_NO_RELATION = 3;
+const SQL_GB_NOT_SUPPORTED = 0;
+const SQL_GD_BLOCK = 4;
+const SQL_GD_BOUND = 8;
+const SQL_GET_BOOKMARK = 13;
+const SQL_GROUP_BY = 88;
+const SQL_IGNORE = -6;
+const SQL_INFO_FIRST = 0;
+const SQL_KEYSET_SIZE = 8;
+const SQL_KEYSET_SIZE_DEFAULT = 0UL;
+const SQL_KEYWORDS = 89;
+const SQL_LCK_EXCLUSIVE = 2;
+const SQL_LCK_NO_CHANGE = 1;
+const SQL_LCK_UNLOCK = 4;
+
+const SQL_LEN_BINARY_ATTR_OFFSET  = -100;
+const SQL_LEN_DATA_AT_EXEC_OFFSET = -100;
+//MACRO #define SQL_LEN_BINARY_ATTR(length) (-(length)+SQL_LEN_BINARY_ATTR_OFFSET)
+//MACRO #define SQL_LEN_DATA_AT_EXEC(length) (-(length)+SQL_LEN_DATA_AT_EXEC_OFFSET)
+
+const SQL_LIKE_ESCAPE_CLAUSE = 113;
+const SQL_LIKE_ONLY = 1;
+const SQL_LOCK_EXCLUSIVE = 1;
+const SQL_LOCK_NO_CHANGE = 0;
+const SQL_LOCK_TYPES = 78;
+const SQL_LOCK_UNLOCK = 2;
+const SQL_LOGIN_TIMEOUT = 103;
+const SQL_LOGIN_TIMEOUT_DEFAULT = 15UL;
+const SQL_LONGVARBINARY = -4;
+const SQL_LONGVARCHAR = -1;
+const SQL_MAX_BINARY_LITERAL_LEN = 112;
+const SQL_MAX_CHAR_LITERAL_LEN = 108;
+const SQL_MAX_DSN_LENGTH = 32;
+const SQL_MAX_LENGTH = 3;
+const SQL_MAX_LENGTH_DEFAULT = 0UL;
+const SQL_MAX_OPTION_STRING_LENGTH = 256;
+const SQL_MAX_OWNER_NAME_LEN = 32;
+const SQL_MAX_PROCEDURE_NAME_LEN = 33;
+const SQL_MAX_QUALIFIER_NAME_LEN = 34;
+const SQL_MAX_ROW_SIZE_INCLUDES_LONG = 103;
+const SQL_MAX_ROWS = 1;
+const SQL_MAX_ROWS_DEFAULT = 0UL;
+
+const SQL_MODE_READ_WRITE = 0UL;
+const SQL_MODE_READ_ONLY = 1UL;
+const SQL_MODE_DEFAULT = SQL_MODE_READ_WRITE;
+
+const SQL_MULT_RESULT_SETS = 36;
+const SQL_MULTIPLE_ACTIVE_TXN = 37;
+const SQL_NC_END = 0x0004;
+const SQL_NC_START = 0x0002;
+const SQL_NEED_LONG_DATA_LEN = 111;
+const SQL_NNC_NON_NULL = 0x0001;
+const SQL_NNC_NULL = 0x0000;
+const SQL_NO_TOTAL = -4;
+const SQL_NON_NULLABLE_COLUMNS = 75;
+
+const SQL_NOSCAN_OFF = 0UL;
+const SQL_NOSCAN_ON = 1UL;
+const SQL_NOSCAN = 2;
+const SQL_NOSCAN_DEFAULT = SQL_NOSCAN_OFF;
+
+const SQL_NUMERIC_FUNCTIONS = 49;
+const SQL_OAC_LEVEL1 = 0x0001;
+const SQL_OAC_LEVEL2 = 0x0002;
+const SQL_OAC_NONE = 0x0000;
+const SQL_ODBC_API_CONFORMANCE = 9;
+const SQL_ODBC_CURSORS = 110;
+const SQL_ODBC_SAG_CLI_CONFORMANCE = 12;
+const SQL_ODBC_SQL_CONFORMANCE = 15;
+const SQL_ODBC_SQL_OPT_IEF = 73;
+const SQL_ODBC_VER = 10;
+const SQL_OPT_TRACE = 104;
+
+const SQL_OPT_TRACE_FILE_DEFAULT = "\\SQL.LOG";
+const SQL_OPT_TRACE_OFF = 0UL;
+const SQL_OPT_TRACE_DEFAULT = SQL_OPT_TRACE_OFF;
+const SQL_OPT_TRACE_ON = 1UL;
+
+const SQL_OPT_TRACEFILE = 105;
+const SQL_OSC_CORE = 1;
+const SQL_OSC_EXTENDED = 2;
+const SQL_OSC_MINIMUM = 0;
+const SQL_OSCC_COMPLIANT = 1;
+const SQL_OSCC_NOT_COMPLIANT = 0;
+const SQL_OU_DML_STATEMENTS = 1;
+const SQL_OU_INDEX_DEFINITION = 8;
+const SQL_OU_PRIVILEGE_DEFINITION = 16;
+const SQL_OU_PROCEDURE_INVOCATION = 2;
+const SQL_OU_TABLE_DEFINITION = 4;
+const SQL_OUTER_JOINS = 38;
+const SQL_OWNER_TERM = 39;
+const SQL_OWNER_USAGE = 91;
+const SQL_PACKET_SIZE = 112;
+const SQL_PARAM_INPUT = 1;
+const SQL_PARAM_INPUT_OUTPUT = 2;
+const SQL_PARAM_OUTPUT = 4;
+const SQL_PARAM_TYPE_DEFAULT = SQL_PARAM_INPUT_OUTPUT;
+const SQL_PARAM_TYPE_UNKNOWN = 0;
+const SQL_PC_NOT_PSEUDO = 1;
+const SQL_POS_ADD = 16;
+const SQL_POS_DELETE = 8;
+const SQL_POS_OPERATIONS = 79;
+const SQL_POS_POSITION = 1;
+const SQL_POS_REFRESH = 2;
+const SQL_POS_UPDATE = 4;
+const SQL_POSITION = 0;
+const SQL_POSITIONED_STATEMENTS = 80;
+const SQL_PROCEDURE_TERM = 40;
+const SQL_PROCEDURES = 21;
+const SQL_PS_POSITIONED_DELETE = 1;
+const SQL_PS_POSITIONED_UPDATE = 2;
+const SQL_PS_SELECT_FOR_UPDATE = 4;
+const SQL_PT_FUNCTION = 2;
+const SQL_PT_PROCEDURE = 1;
+const SQL_PT_UNKNOWN = 0;
+const SQL_QL_END = 0x0002;
+const SQL_QL_START = 0x0001;
+const SQL_QU_DML_STATEMENTS = 1;
+const SQL_QU_INDEX_DEFINITION = 8;
+const SQL_QU_PRIVILEGE_DEFINITION = 16;
+const SQL_QU_PROCEDURE_INVOCATION = 2;
+const SQL_QU_TABLE_DEFINITION = 4;
+const SQL_QUALIFIER_LOCATION = 114;
+const SQL_QUALIFIER_NAME_SEPARATOR = 41;
+const SQL_QUALIFIER_TERM = 42;
+const SQL_QUALIFIER_USAGE = 92;
+const SQL_QUERY_TIMEOUT = 0;
+const SQL_QUERY_TIMEOUT_DEFAULT = 0UL;
+const SQL_QUICK = 0;
+const SQL_QUIET_MODE = 111;
+const SQL_QUOTED_IDENTIFIER_CASE = 93;
+
+const SQL_RD_OFF = 0UL;
+const SQL_RD_ON = 1UL;
+const SQL_RD_DEFAULT = SQL_RD_ON;
+
+const SQL_REFRESH = 1;
+const SQL_RESTRICT = 1;
+const SQL_RESULT_COL = 3;
+const SQL_RETRIEVE_DATA = 11;
+const SQL_RETURN_VALUE = 5;
+const SQL_ROW_ADDED = 4;
+const SQL_ROW_DELETED = 1;
+const SQL_ROW_ERROR = 5;
+const SQL_ROW_NOROW = 3;
+const SQL_ROW_NUMBER = 14;
+const SQL_ROW_SUCCESS = 0;
+const SQL_ROW_UPDATED = 2;
+const SQL_ROW_UPDATES = 11;
+const SQL_ROWSET_SIZE = 9;
+const SQL_ROWSET_SIZE_DEFAULT = 1UL;
+const SQL_ROWVER = 2;
+const SQL_SC_NON_UNIQUE = 0UL;
+const SQL_SC_TRY_UNIQUE = 1UL;
+const SQL_SC_UNIQUE = 2UL;
+const SQL_SCCO_OPT_TIMESTAMP = SQL_SCCO_OPT_ROWVER;/* deprecated */
+const SQL_SCROLL_DYNAMIC = -2L;/* deprecated */
+const SQL_SCROLL_FORWARD_ONLY = 0L;/* deprecated */
+const SQL_SCROLL_KEYSET_DRIVEN = -1L;/* deprecated */
+const SQL_SCROLL_OPTIONS = 44;
+const SQL_SCROLL_STATIC = -3L;/* deprecated */
+const SQL_SEARCHABLE = 3;
+const SQL_SET_NULL = 2;
+const SQL_SETPARAM_VALUE_MAX = -1L;
+const SQL_SETPOS_MAX_LOCK_VALUE = SQL_LOCK_UNLOCK;
+const SQL_SETPOS_MAX_OPTION_VALUE = SQL_ADD;
+const SQL_SIMULATE_CURSOR = 10;
+const SQL_SO_DYNAMIC = 4;
+const SQL_SO_FORWARD_ONLY = 1;
+const SQL_SO_KEYSET_DRIVEN = 2;
+const SQL_SO_MIXED = 8;
+const SQL_SO_STATIC = 16;
+const SQL_SQ_COMPARISON = 1;
+const SQL_SQ_CORRELATED_SUBQUERIES = 16;
+const SQL_SQ_EXISTS = 2;
+const SQL_SQ_IN = 4;
+const SQL_SQ_QUANTIFIED = 8;
+const SQL_SQLSTATE_SIZE = 5;
+const SQL_SS_ADDITIONS = 1;
+const SQL_SS_DELETIONS = 2;
+const SQL_SS_UPDATES = 4;
+const SQL_STATIC_SENSITIVITY = 83;
+const SQL_STRING_FUNCTIONS = 50;
+const SQL_SUBQUERIES = 95;
+const SQL_SYSTEM_FUNCTIONS = 51;
+const SQL_TABLE_STAT = 0;
+const SQL_TABLE_TERM = 45;
+const SQL_TIMEDATE_ADD_INTERVALS = 109;
+const SQL_TIMEDATE_DIFF_INTERVALS = 110;
+const SQL_TIMEDATE_FUNCTIONS = 52;
+const SQL_TRANSLATE_DLL = 106;
+const SQL_TRANSLATE_OPTION = 107;
+const SQL_TXN_ISOLATION = 108;
+const SQL_TXN_VERSIONING = 16;
+const SQL_TYPE_NULL = 0;
+const SQL_U_UNION = 1;
+const SQL_U_UNION_ALL = 2;
+
+const SQL_UB_OFF = 0UL;
+const SQL_UB_DEFAULT = SQL_UB_OFF;
+const SQL_UB_ON = 01UL;
+
+const SQL_UNION = 96;
+const SQL_UNSEARCHABLE = 0;
+const SQL_UPDATE = 2;
+const SQL_USE_BOOKMARKS = 12;
+const SQL_VARBINARY = -3;
+
+const SQL_COLATT_OPT_MAX = SQL_COLUMN_LABEL;
+const SQL_COLATT_OPT_MIN = SQL_COLUMN_COUNT;
+const SQL_PRED_SEARCHABLE = SQL_SEARCHABLE;
+
+//MACRO #define SQL_POSITION_TO(s, r) SQLSetPos(s, r, SQL_POSITION, SQL_LOCK_NO_CHANGE)
+
+//MACRO #define SQL_LOCK_RECORD(s, r, l) SQLSetPos(s, r, SQL_POSITION, l)
+
+//MACRO #define SQL_REFRESH_RECORD(s, r, l) SQLSetPos(s, r, SQL_REFRESH, l)
+
+//MACRO #define SQL_UPDATE_RECORD(s, r) SQLSetPos(s, r, SQL_UPDATE, SQL_LOCK_NO_CHANGE)
+
+//MACRO #define SQL_DELETE_RECORD(s, r) SQLSetPos(s, r, SQL_DELETE, SQL_LOCK_NO_CHANGE)
+
+//MACRO #define SQL_ADD_RECORD(s, r) SQLSetPos(s, r, SQL_ADD, SQL_LOCK_NO_CHANGE)
+
+
+static if (ODBCVER < 0x0300) {
+	const SQL_CONNECT_OPT_DRVR_START = 1000;
+	const SQL_CONN_OPT_MAX = SQL_PACKET_SIZE;
+	const SQL_CONN_OPT_MIN = SQL_ACCESS_MODE;
+	const SQL_STMT_OPT_MAX = SQL_ROW_NUMBER;
+	const SQL_STMT_OPT_MIN = SQL_QUERY_TIMEOUT;
+	const SQL_TYPE_DRIVER_START = SQL_INTERVAL_YEAR;
+	const SQL_TYPE_DRIVER_END = SQL_UNICODE_LONGVARCHAR;
+	const SQL_TYPE_MIN = SQL_BIT;
+	const SQL_TYPE_MAX = SQL_VARCHAR;
+}
+
+static if (ODBCVER < 0x0300) {
+	const SQL_NO_DATA_FOUND = 100;
+	const SQL_INTERVAL_YEAR = -80;
+	const SQL_INTERVAL_MONTH = -81;
+	const SQL_INTERVAL_YEAR_TO_MONTH = -82;
+	const SQL_INTERVAL_DAY = -83;
+	const SQL_INTERVAL_HOUR = -84;
+	const SQL_INTERVAL_MINUTE = -85;
+	const SQL_INTERVAL_SECOND = -86;
+	const SQL_INTERVAL_DAY_TO_HOUR = -87;
+	const SQL_INTERVAL_DAY_TO_MINUTE = -88;
+	const SQL_INTERVAL_DAY_TO_SECOND = -89;
+	const SQL_INTERVAL_HOUR_TO_MINUTE = -90;
+	const SQL_INTERVAL_HOUR_TO_SECOND = -91;
+	const SQL_INTERVAL_MINUTE_TO_SECOND = -92;
+} else {
+	const SQL_NO_DATA_FOUND = SQL_NO_DATA;
+	const SQL_CODE_YEAR = 1;
+	const SQL_CODE_MONTH = 2;
+	const SQL_CODE_DAY = 3;
+	const SQL_CODE_HOUR = 4;
+	const SQL_CODE_MINUTE = 5;
+	const SQL_CODE_SECOND = 6;
+	const SQL_CODE_YEAR_TO_MONTH = 7;
+	const SQL_CODE_DAY_TO_HOUR = 8;
+	const SQL_CODE_DAY_TO_MINUTE = 9;
+	const SQL_CODE_DAY_TO_SECOND = 10;
+	const SQL_CODE_HOUR_TO_MINUTE = 11;
+	const SQL_CODE_HOUR_TO_SECOND = 12;
+	const SQL_CODE_MINUTE_TO_SECOND = 13;
+	const SQL_INTERVAL_YEAR = 100 + SQL_CODE_YEAR;
+	const SQL_INTERVAL_MONTH = 100 + SQL_CODE_MONTH;
+	const SQL_INTERVAL_DAY = 100 + SQL_CODE_DAY;
+	const SQL_INTERVAL_HOUR = 100 + SQL_CODE_HOUR;
+	const SQL_INTERVAL_MINUTE = 100 + SQL_CODE_MINUTE;
+	const SQL_INTERVAL_SECOND = 100 + SQL_CODE_SECOND;
+	const SQL_INTERVAL_YEAR_TO_MONTH = 100 + SQL_CODE_YEAR_TO_MONTH;
+	const SQL_INTERVAL_DAY_TO_HOUR = 100 + SQL_CODE_DAY_TO_HOUR;
+	const SQL_INTERVAL_DAY_TO_MINUTE = 100 + SQL_CODE_DAY_TO_MINUTE;
+	const SQL_INTERVAL_DAY_TO_SECOND = 100 + SQL_CODE_DAY_TO_SECOND;
+	const SQL_INTERVAL_HOUR_TO_MINUTE = 100 + SQL_CODE_HOUR_TO_MINUTE;
+	const SQL_INTERVAL_HOUR_TO_SECOND = 100 + SQL_CODE_HOUR_TO_SECOND;
+	const SQL_INTERVAL_MINUTE_TO_SECOND = 100 + SQL_CODE_MINUTE_TO_SECOND;
+}//[Yes] #endif
+
+
+static if ((ODBCVER >= 0x0201) && (ODBCVER < 0x0300)) {
+	const SQL_OJ_CAPABILITIES = 65003;
+}
+
+static if (ODBCVER >= 0x0250) {
+	const SQL_NO_ACTION   = 3;
+	const SQL_SET_DEFAULT = 4;
+}
+
+static if (ODBCVER >= 0x0300) {
+	const SQL_ACTIVE_ENVIRONMENTS = 116;
+	const SQL_AD_ADD_CONSTRAINT_DEFERRABLE = 0x00000080L;
+	const SQL_AD_ADD_CONSTRAINT_INITIALLY_DEFERRED = 0x00000020L;
+	const SQL_AD_ADD_CONSTRAINT_INITIALLY_IMMEDIATE = 0x00000040L;
+	const SQL_AD_ADD_CONSTRAINT_NON_DEFERRABLE = 0x00000100L;
+	const SQL_AD_ADD_DOMAIN_CONSTRAINT = 0x00000002L;
+	const SQL_AD_ADD_DOMAIN_DEFAULT = 0x00000008L;
+	const SQL_AD_CONSTRAINT_NAME_DEFINITION = 0x00000001L;
+	const SQL_AD_DROP_DOMAIN_CONSTRAINT = 0x00000004L;
+	const SQL_AD_DROP_DOMAIN_DEFAULT = 0x00000010L;
+	const SQL_AF_ALL = 0x00000040L;
+	const SQL_AF_AVG = 0x00000001L;
+	const SQL_AF_COUNT = 0x00000002L;
+	const SQL_AF_DISTINCT = 0x00000020L;
+	const SQL_AF_MAX = 0x00000004L;
+	const SQL_AF_MIN = 0x00000008L;
+	const SQL_AF_SUM = 0x00000010L;
+	const SQL_AGGREGATE_FUNCTIONS = 169;
+	const SQL_ALL_CATALOGS = "%";
+	const SQL_ALL_SCHEMAS = "%";
+	const SQL_ALL_TABLE_TYPES = "%";
+	const SQL_ALTER_DOMAIN = 117;
+	const SQL_AM_CONNECTION = 1;
+	const SQL_AM_NONE = 0;
+	const SQL_AM_STATEMENT = 2;
+	const SQL_API_ODBC3_ALL_FUNCTIONS = 999;
+	const SQL_API_ODBC3_ALL_FUNCTIONS_SIZE = 250;
+	const SQL_API_SQLALLOCHANDLESTD = 73;
+	const SQL_API_SQLBULKOPERATIONS = 24;
+	const SQL_ASYNC_MODE = 10021;
+	const SQL_AT_ADD_COLUMN_COLLATION = 0x00000080L;
+	const SQL_AT_ADD_COLUMN_DEFAULT = 0x00000040L;
+	const SQL_AT_ADD_COLUMN_SINGLE = 0x00000020L;
+	const SQL_AT_ADD_TABLE_CONSTRAINT = 0x00001000L;
+	const SQL_AT_CONSTRAINT_DEFERRABLE = 0x00040000L;
+	const SQL_AT_CONSTRAINT_INITIALLY_DEFERRED = 0x00010000L;
+	const SQL_AT_CONSTRAINT_INITIALLY_IMMEDIATE = 0x00020000L;
+	const SQL_AT_CONSTRAINT_NAME_DEFINITION = 0x00008000L;
+	const SQL_AT_CONSTRAINT_NON_DEFERRABLE = 0x00080000L;
+	const SQL_AT_DROP_COLUMN_CASCADE = 0x00000400L;
+	const SQL_AT_DROP_COLUMN_DEFAULT = 0x00000200L;
+	const SQL_AT_DROP_COLUMN_RESTRICT = 0x00000800L;
+	const SQL_AT_DROP_TABLE_CONSTRAINT_CASCADE = 0x00002000L;
+	const SQL_AT_DROP_TABLE_CONSTRAINT_RESTRICT = 0x00004000L;
+	const SQL_AT_SET_COLUMN_DEFAULT = 0x00000100L;
+	const SQL_ATTR_ACCESS_MODE = SQL_ACCESS_MODE;
+	const SQL_ATTR_ASYNC_ENABLE = 4;
+	const SQL_ATTR_AUTOCOMMIT = SQL_AUTOCOMMIT;
+	const SQL_ATTR_CONCURRENCY = SQL_CONCURRENCY;
+	const SQL_ATTR_CONNECTION_POOLING = 201;
+	const SQL_ATTR_CONNECTION_TIMEOUT = 113;
+	const SQL_ATTR_CP_MATCH = 202;
+	const SQL_ATTR_CURRENT_CATALOG = SQL_CURRENT_QUALIFIER;
+	const SQL_ATTR_CURSOR_TYPE = SQL_CURSOR_TYPE;
+	const SQL_ATTR_DISCONNECT_BEHAVIOR = 114;
+	const SQL_ATTR_ENABLE_AUTO_IPD = 15;
+	const SQL_ATTR_ENLIST_IN_DTC = 1207;
+	const SQL_ATTR_ENLIST_IN_XA = 1208;
+	const SQL_ATTR_FETCH_BOOKMARK_PTR = 16;
+	const SQL_ATTR_KEYSET_SIZE = SQL_KEYSET_SIZE;
+	const SQL_ATTR_LOGIN_TIMEOUT = SQL_LOGIN_TIMEOUT;
+	const SQL_ATTR_MAX_LENGTH = SQL_MAX_LENGTH;
+	const SQL_ATTR_MAX_ROWS = SQL_MAX_ROWS;
+	const SQL_ATTR_NOSCAN = SQL_NOSCAN;
+	const SQL_ATTR_ODBC_CURSORS = SQL_ODBC_CURSORS;
+	const SQL_ATTR_ODBC_VERSION = 200;
+	const SQL_ATTR_PACKET_SIZE = SQL_PACKET_SIZE;
+	const SQL_ATTR_PARAM_BIND_OFFSET_PTR = 17;
+	const SQL_ATTR_PARAM_BIND_TYPE = 18;
+	const SQL_ATTR_PARAM_OPERATION_PTR = 19;
+	const SQL_ATTR_PARAM_STATUS_PTR = 20;
+	const SQL_ATTR_PARAMS_PROCESSED_PTR = 21;
+	const SQL_ATTR_PARAMSET_SIZE = 22;
+	const SQL_ATTR_QUERY_TIMEOUT = SQL_QUERY_TIMEOUT;
+	const SQL_ATTR_QUIET_MODE = SQL_QUIET_MODE;
+	const SQL_ATTR_RETRIEVE_DATA = SQL_RETRIEVE_DATA;
+	const SQL_ATTR_ROW_ARRAY_SIZE = 27;
+	const SQL_ATTR_ROW_BIND_OFFSET_PTR = 23;
+	const SQL_ATTR_ROW_BIND_TYPE = SQL_BIND_TYPE;
+	const SQL_ATTR_ROW_NUMBER = SQL_ROW_NUMBER;
+	const SQL_ATTR_ROW_OPERATION_PTR = 24;
+	const SQL_ATTR_ROW_STATUS_PTR = 25;
+	const SQL_ATTR_ROWS_FETCHED_PTR = 26;
+	const SQL_ATTR_SIMULATE_CURSOR = SQL_SIMULATE_CURSOR;
+	const SQL_ATTR_TRACE = SQL_OPT_TRACE;
+	const SQL_ATTR_TRACEFILE = SQL_OPT_TRACEFILE;
+	const SQL_ATTR_TRANSLATE_LIB = SQL_TRANSLATE_DLL;
+	const SQL_ATTR_TRANSLATE_OPTION = SQL_TRANSLATE_OPTION;
+	const SQL_ATTR_TXN_ISOLATION = SQL_TXN_ISOLATION;
+	const SQL_ATTR_USE_BOOKMARKS = SQL_USE_BOOKMARKS;
+	const SQL_BATCH_ROW_COUNT = 120;
+	const SQL_BATCH_SUPPORT = 121;
+	const SQL_BRC_EXPLICIT = 0x0000002;
+	const SQL_BRC_PROCEDURES = 0x0000001;
+	const SQL_BRC_ROLLED_UP = 0x0000004;
+	const SQL_BS_ROW_COUNT_EXPLICIT = 0x00000002L;
+	const SQL_BS_ROW_COUNT_PROC = 0x00000008L;
+	const SQL_BS_SELECT_EXPLICIT = 0x00000001L;
+	const SQL_BS_SELECT_PROC = 0x00000004L;
+	const SQL_C_INTERVAL_DAY = SQL_INTERVAL_DAY;
+	const SQL_C_INTERVAL_DAY_TO_HOUR = SQL_INTERVAL_DAY_TO_HOUR;
+	const SQL_C_INTERVAL_DAY_TO_MINUTE = SQL_INTERVAL_DAY_TO_MINUTE;
+	const SQL_C_INTERVAL_DAY_TO_SECOND = SQL_INTERVAL_DAY_TO_SECOND;
+	const SQL_C_INTERVAL_HOUR = SQL_INTERVAL_HOUR;
+	const SQL_C_INTERVAL_HOUR_TO_MINUTE = SQL_INTERVAL_HOUR_TO_MINUTE;
+	const SQL_C_INTERVAL_HOUR_TO_SECOND = SQL_INTERVAL_HOUR_TO_SECOND;
+	const SQL_C_INTERVAL_MINUTE = SQL_INTERVAL_MINUTE;
+	const SQL_C_INTERVAL_MINUTE_TO_SECOND = SQL_INTERVAL_MINUTE_TO_SECOND;
+	const SQL_C_INTERVAL_MONTH = SQL_INTERVAL_MONTH;
+	const SQL_C_INTERVAL_SECOND = SQL_INTERVAL_SECOND;
+	const SQL_C_INTERVAL_YEAR = SQL_INTERVAL_YEAR;
+	const SQL_C_INTERVAL_YEAR_TO_MONTH = SQL_INTERVAL_YEAR_TO_MONTH;
+	const SQL_C_NUMERIC = SQL_NUMERIC;
+	const SQL_C_SBIGINT = SQL_BIGINT+SQL_SIGNED_OFFSET;
+	const SQL_C_TYPE_DATE = SQL_TYPE_DATE;
+	const SQL_C_TYPE_TIME = SQL_TYPE_TIME;
+	const SQL_C_TYPE_TIMESTAMP = SQL_TYPE_TIMESTAMP;
+	const SQL_C_UBIGINT = SQL_BIGINT+SQL_UNSIGNED_OFFSET;
+	const SQL_C_VARBOOKMARK = SQL_C_BINARY;
+	const SQL_CA_CONSTRAINT_DEFERRABLE = 0x00000040L;
+	const SQL_CA_CONSTRAINT_INITIALLY_DEFERRED = 0x00000010L;
+	const SQL_CA_CONSTRAINT_INITIALLY_IMMEDIATE = 0x00000020L;
+	const SQL_CA_CONSTRAINT_NON_DEFERRABLE = 0x00000080L;
+	const SQL_CA_CREATE_ASSERTION = 0x00000001L;
+	const SQL_CA1_ABSOLUTE = 0x00000002L;
+	const SQL_CA1_BOOKMARK = 0x00000008L;
+	const SQL_CA1_BULK_ADD = 0x00010000L;
+	const SQL_CA1_BULK_DELETE_BY_BOOKMARK = 0x00040000L;
+	const SQL_CA1_BULK_FETCH_BY_BOOKMARK = 0x00080000L;
+	const SQL_CA1_BULK_UPDATE_BY_BOOKMARK = 0x00020000L;
+	const SQL_CA1_LOCK_EXCLUSIVE = 0x00000080L;
+	const SQL_CA1_LOCK_NO_CHANGE = 0x00000040L;
+	const SQL_CA1_LOCK_UNLOCK = 0x00000100L;
+	const SQL_CA1_NEXT = 0x00000001L;
+	const SQL_CA1_POS_DELETE = 0x00000800L;
+	const SQL_CA1_POS_POSITION = 0x00000200L;
+	const SQL_CA1_POS_REFRESH = 0x00001000L;
+	const SQL_CA1_POS_UPDATE = 0x00000400L;
+	const SQL_CA1_POSITIONED_DELETE = 0x00004000L;
+	const SQL_CA1_POSITIONED_UPDATE = 0x00002000L;
+	const SQL_CA1_RELATIVE = 0x00000004L;
+	const SQL_CA1_SELECT_FOR_UPDATE = 0x00008000L;
+	const SQL_CA2_CRC_APPROXIMATE = 0x00002000L;
+	const SQL_CA2_CRC_EXACT = 0x00001000L;
+	const SQL_CA2_LOCK_CONCURRENCY = 0x00000002L;
+
+	const SQL_CA2_MAX_ROWS_CATALOG = 0x00000800L;
+	const SQL_CA2_MAX_ROWS_DELETE  = 0x00000200L;
+	const SQL_CA2_MAX_ROWS_INSERT  = 0x00000100L;
+	const SQL_CA2_MAX_ROWS_SELECT  = 0x00000080L;
+	const SQL_CA2_MAX_ROWS_UPDATE  = 0x00000400L;
+	const SQL_CA2_MAX_ROWS_AFFECTS_ALL = SQL_CA2_MAX_ROWS_SELECT | SQL_CA2_MAX_ROWS_INSERT |
+		SQL_CA2_MAX_ROWS_DELETE | SQL_CA2_MAX_ROWS_UPDATE | SQL_CA2_MAX_ROWS_CATALOG;
+
+	const SQL_CA2_OPT_ROWVER_CONCURRENCY = 0x00000004L;
+	const SQL_CA2_OPT_VALUES_CONCURRENCY = 0x00000008L;
+	const SQL_CA2_READ_ONLY_CONCURRENCY = 0x00000001L;
+	const SQL_CA2_SENSITIVITY_ADDITIONS = 0x00000010L;
+	const SQL_CA2_SENSITIVITY_DELETIONS = 0x00000020L;
+	const SQL_CA2_SENSITIVITY_UPDATES = 0x00000040L;
+	const SQL_CA2_SIMULATE_NON_UNIQUE = 0x00004000L;
+	const SQL_CA2_SIMULATE_TRY_UNIQUE = 0x00008000L;
+	const SQL_CA2_SIMULATE_UNIQUE = 0x00010000L;
+	const SQL_CATALOG_LOCATION = SQL_QUALIFIER_LOCATION;
+	const SQL_CATALOG_NAME_SEPARATOR = SQL_QUALIFIER_NAME_SEPARATOR;
+	const SQL_CATALOG_TERM = SQL_QUALIFIER_TERM;
+	const SQL_CATALOG_USAGE = SQL_QUALIFIER_USAGE;
+	const SQL_CCOL_CREATE_COLLATION = 0x00000001L;
+	const SQL_CCS_COLLATE_CLAUSE = 0x00000002L;
+	const SQL_CCS_CREATE_CHARACTER_SET = 0x00000001L;
+	const SQL_CCS_LIMITED_COLLATION = 0x00000004L;
+	const SQL_CDO_COLLATION = 0x00000008L;
+	const SQL_CDO_CONSTRAINT = 0x00000004L;
+	const SQL_CDO_CONSTRAINT_DEFERRABLE = 0x00000080L;
+	const SQL_CDO_CONSTRAINT_INITIALLY_DEFERRED = 0x00000020L;
+	const SQL_CDO_CONSTRAINT_INITIALLY_IMMEDIATE = 0x00000040L;
+	const SQL_CDO_CONSTRAINT_NAME_DEFINITION = 0x00000010L;
+	const SQL_CDO_CONSTRAINT_NON_DEFERRABLE = 0x00000100L;
+	const SQL_CDO_CREATE_DOMAIN = 0x00000001L;
+	const SQL_CDO_DEFAULT = 0x00000002L;
+	const SQL_CL_END = SQL_QL_END;
+	const SQL_CL_START = SQL_QL_START;
+	const SQL_COL_PRED_BASIC = SQL_ALL_EXCEPT_LIKE;
+	const SQL_COL_PRED_CHAR = SQL_LIKE_ONLY;
+	const SQL_COLUMN_DRIVER_START = 1000;
+	const SQL_COLUMN_IGNORE = SQL_IGNORE;
+	const SQL_COLUMN_NUMBER_UNKNOWN = -2;
+	const SQL_CONVERT_GUID = 173;
+
+	const SQL_CONVERT_WCHAR               = 122;
+	const SQL_CONVERT_INTERVAL_DAY_TIME   = 123;
+	const SQL_CONVERT_INTERVAL_YEAR_MONTH = 124;
+	const SQL_CONVERT_WLONGVARCHAR        = 125;
+	const SQL_CONVERT_WVARCHAR            = 126;
+
+	const SQL_CREATE_ASSERTION     = 127;
+	const SQL_CREATE_CHARACTER_SET = 128;
+	const SQL_CREATE_COLLATION     = 129;
+	const SQL_CREATE_DOMAIN        = 130;
+	const SQL_CREATE_SCHEMA        = 131;
+	const SQL_CREATE_TABLE         = 132;
+	const SQL_CREATE_TRANSLATION   = 133;
+	const SQL_CREATE_VIEW          = 134;
+
+
+	const SQL_CP_OFF            = 0UL;
+	const SQL_CP_DEFAULT        = SQL_CP_OFF;
+	const SQL_CP_ONE_PER_DRIVER = 1UL;
+	const SQL_CP_ONE_PER_HENV   = 2UL;
+
+	const SQL_CP_STRICT_MATCH  = 0UL;
+	const SQL_CP_MATCH_DEFAULT = SQL_CP_STRICT_MATCH;
+	const SQL_CP_RELAXED_MATCH = 1UL;
+
+	const SQL_CS_CREATE_SCHEMA         = 0x00000001L;
+	const SQL_CS_AUTHORIZATION         = 0x00000002L;
+	const SQL_CS_DEFAULT_CHARACTER_SET = 0x00000004L;
+
+	const SQL_CT_COLUMN_COLLATION = 0x00000800L;
+	const SQL_CT_COLUMN_CONSTRAINT = 0x00000200L;
+	const SQL_CT_COLUMN_DEFAULT = 0x00000400L;
+	const SQL_CT_COMMIT_DELETE = 0x00000004L;
+	const SQL_CT_COMMIT_PRESERVE = 0x00000002L;
+	const SQL_CT_CONSTRAINT_DEFERRABLE = 0x00000080L;
+	const SQL_CT_CONSTRAINT_INITIALLY_DEFERRED = 0x00000020L;
+	const SQL_CT_CONSTRAINT_INITIALLY_IMMEDIATE = 0x00000040L;
+	const SQL_CT_CONSTRAINT_NAME_DEFINITION = 0x00002000L;
+	const SQL_CT_CONSTRAINT_NON_DEFERRABLE = 0x00000100L;
+	const SQL_CT_CREATE_TABLE = 0x00000001L;
+	const SQL_CT_GLOBAL_TEMPORARY = 0x00000008L;
+	const SQL_CT_LOCAL_TEMPORARY = 0x00000010L;
+	const SQL_CT_TABLE_CONSTRAINT = 0x00001000L;
+
+	const SQL_CTR_CREATE_TRANSLATION = 0x00000001L;
+
+	const SQL_CU_DML_STATEMENTS = SQL_QU_DML_STATEMENTS;
+	const SQL_CU_INDEX_DEFINITION = SQL_QU_INDEX_DEFINITION;
+	const SQL_CU_PRIVILEGE_DEFINITION = SQL_QU_PRIVILEGE_DEFINITION;
+	const SQL_CU_PROCEDURE_INVOCATION = SQL_QU_PROCEDURE_INVOCATION;
+	const SQL_CU_TABLE_DEFINITION = SQL_QU_TABLE_DEFINITION;
+
+	const SQL_CVT_INTERVAL_YEAR_MONTH = 0x00080000L;
+	const SQL_CVT_INTERVAL_DAY_TIME   = 0x00100000L;
+	const SQL_CVT_WCHAR               = 0x00200000L;
+	const SQL_CVT_WLONGVARCHAR        = 0x00400000L;
+	const SQL_CVT_WVARCHAR            = 0x00800000L;
+	const SQL_CVT_GUID                = 0x01000000L;
+
+	const SQL_DA_DROP_ASSERTION = 0x00000001L;
+	const SQL_DATETIME_LITERALS = 119;
+
+	const SQL_DB_DISCONNECT     = 1UL;
+	const SQL_DB_RETURN_TO_POOL = 0UL;
+	const SQL_DB_DEFAULT        = SQL_DB_RETURN_TO_POOL;
+
+	const SQL_DC_DROP_COLLATION = 0x00000001L;
+	const SQL_DCS_DROP_CHARACTER_SET = 0x00000001L;
+	const SQL_DD_CASCADE = 0x00000004L;
+	const SQL_DD_DROP_DOMAIN = 0x00000001L;
+	const SQL_DD_RESTRICT = 0x00000002L;
+	const SQL_DDL_INDEX = 170;
+	const SQL_DELETE_BY_BOOKMARK = 6;
+	const SQL_DESC_ARRAY_SIZE = 20;
+	const SQL_DESC_ARRAY_STATUS_PTR = 21;
+	const SQL_DESC_AUTO_UNIQUE_VALUE = SQL_COLUMN_AUTO_INCREMENT;
+	const SQL_DESC_BASE_COLUMN_NAME = 22;
+	const SQL_DESC_BASE_TABLE_NAME = 23;
+	const SQL_DESC_BIND_OFFSET_PTR = 24;
+	const SQL_DESC_BIND_TYPE = 25;
+	const SQL_DESC_CASE_SENSITIVE = SQL_COLUMN_CASE_SENSITIVE;
+	const SQL_DESC_CATALOG_NAME = SQL_COLUMN_QUALIFIER_NAME;
+	const SQL_DESC_CONCISE_TYPE = SQL_COLUMN_TYPE;
+	const SQL_DESC_DATETIME_INTERVAL_PRECISION = 26;
+	const SQL_DESC_DISPLAY_SIZE = SQL_COLUMN_DISPLAY_SIZE;
+	const SQL_DESC_FIXED_PREC_SCALE = SQL_COLUMN_MONEY;
+	const SQL_DESC_LABEL = SQL_COLUMN_LABEL;
+	const SQL_DESC_LITERAL_PREFIX = 27;
+	const SQL_DESC_LITERAL_SUFFIX = 28;
+	const SQL_DESC_LOCAL_TYPE_NAME = 29;
+	const SQL_DESC_MAXIMUM_SCALE = 30;
+	const SQL_DESC_MINIMUM_SCALE = 31;
+	const SQL_DESC_NUM_PREC_RADIX = 32;
+	const SQL_DESC_PARAMETER_TYPE = 33;
+	const SQL_DESC_ROWS_PROCESSED_PTR = 34;
+	const SQL_DESC_SCHEMA_NAME = SQL_COLUMN_OWNER_NAME;
+	const SQL_DESC_SEARCHABLE = SQL_COLUMN_SEARCHABLE;
+	const SQL_DESC_TABLE_NAME = SQL_COLUMN_TABLE_NAME;
+	const SQL_DESC_TYPE_NAME = SQL_COLUMN_TYPE_NAME;
+	const SQL_DESC_UNSIGNED = SQL_COLUMN_UNSIGNED;
+	const SQL_DESC_UPDATABLE = SQL_COLUMN_UPDATABLE;
+	const SQL_DI_CREATE_INDEX = 0x00000001L;
+	const SQL_DI_DROP_INDEX = 0x00000002L;
+
+	const SQL_DIAG_COLUMN_NUMBER = -1247;
+	const SQL_DIAG_ROW_NUMBER = -1248;
+	const SQL_DIAG_CURSOR_ROW_COUNT = -1249;
+
+	const SQL_DL_SQL92_DATE = 0x00000001L;
+	const SQL_DL_SQL92_INTERVAL_DAY = 0x00000020L;
+	const SQL_DL_SQL92_INTERVAL_DAY_TO_HOUR = 0x00000400L;
+	const SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTE = 0x00000800L;
+	const SQL_DL_SQL92_INTERVAL_DAY_TO_SECOND = 0x00001000L;
+	const SQL_DL_SQL92_INTERVAL_HOUR = 0x00000040L;
+	const SQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTE = 0x00002000L;
+	const SQL_DL_SQL92_INTERVAL_HOUR_TO_SECOND = 0x00004000L;
+	const SQL_DL_SQL92_INTERVAL_MINUTE = 0x00000080L;
+	const SQL_DL_SQL92_INTERVAL_MINUTE_TO_SECOND = 0x00008000L;
+	const SQL_DL_SQL92_INTERVAL_MONTH = 0x00000010L;
+	const SQL_DL_SQL92_INTERVAL_SECOND = 0x00000100L;
+	const SQL_DL_SQL92_INTERVAL_YEAR = 0x00000008L;
+	const SQL_DL_SQL92_INTERVAL_YEAR_TO_MONTH = 0x00000200L;
+	const SQL_DL_SQL92_TIME = 0x00000002L;
+	const SQL_DL_SQL92_TIMESTAMP = 0x00000004L;
+	const SQL_DM_VER = 171;
+	const SQL_DRIVER_HDESC = 135;
+	const SQL_DROP_ASSERTION = 136;
+	const SQL_DROP_CHARACTER_SET = 137;
+	const SQL_DROP_COLLATION = 138;
+	const SQL_DROP_DOMAIN = 139;
+	const SQL_DROP_SCHEMA = 140;
+	const SQL_DROP_TABLE = 141;
+	const SQL_DROP_TRANSLATION = 142;
+	const SQL_DROP_VIEW = 143;
+	const SQL_DS_CASCADE = 0x00000004L;
+	const SQL_DS_DROP_SCHEMA = 0x00000001L;
+	const SQL_DS_RESTRICT = 0x00000002L;
+	const SQL_DT_CASCADE = 0x00000004L;
+	const SQL_DT_DROP_TABLE = 0x00000001L;
+	const SQL_DT_RESTRICT = 0x00000002L;
+	const SQL_DTC_DONE = 0L;
+	const SQL_DTR_DROP_TRANSLATION = 0x00000001L;
+	const SQL_DV_CASCADE = 0x00000004L;
+	const SQL_DV_DROP_VIEW = 0x00000001L;
+	const SQL_DV_RESTRICT = 0x00000002L;
+	const SQL_DYNAMIC_CURSOR_ATTRIBUTES1 = 144;
+	const SQL_DYNAMIC_CURSOR_ATTRIBUTES2 = 145;
+	const SQL_EXT_API_LAST = SQL_API_SQLBINDPARAMETER;
+	const SQL_EXT_API_START = 40;
+	const SQL_FETCH_BY_BOOKMARK = 7;
+	const SQL_FETCH_FIRST_SYSTEM = 32;
+	const SQL_FETCH_FIRST_USER = 31;
+	const SQL_FN_CVT_CAST = 0x00000002L;
+	const SQL_FN_STR_BIT_LENGTH = 0x00080000L;
+	const SQL_FN_STR_CHAR_LENGTH = 0x00100000L;
+	const SQL_FN_STR_CHARACTER_LENGTH = 0x00200000L;
+	const SQL_FN_STR_OCTET_LENGTH = 0x00400000L;
+	const SQL_FN_STR_POSITION = 0x00800000L;
+	const SQL_FN_TD_CURRENT_DATE = 0x00020000L;
+	const SQL_FN_TD_CURRENT_TIME = 0x00040000L;
+	const SQL_FN_TD_CURRENT_TIMESTAMP = 0x00080000L;
+	const SQL_FN_TD_EXTRACT = 0x00100000L;
+	const SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1 = 146;
+	const SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2 = 147;
+	/* #define SQL_FUNC_EXISTS(exists, api)
+	   ((*(((UWORD*) (exists)) + ((api) >> 4)) & (1 << ((api) & 15)) ) ?
+	   SQL_TRUE : SQL_FALSE )
+	*/
+	const SQL_GB_COLLATE = 0x0004;
+	const SQL_HANDLE_SENV = 5;
+
+	const SQL_IK_NONE = 0;
+	const SQL_IK_ASC = 1;
+	const SQL_IK_DESC = 2;
+	const SQL_IK_ALL = SQL_IK_ASC | SQL_IK_DESC;
+
+	const SQL_INDEX_KEYWORDS = 148;
+	const SQL_INFO_DRIVER_START = 1000;
+	const SQL_INFO_LAST = SQL_QUALIFIER_LOCATION;
+	const SQL_INFO_SCHEMA_VIEWS = 149;
+	const SQL_INITIALLY_DEFERRED = 5;
+	const SQL_INITIALLY_IMMEDIATE = 6;
+	const SQL_INSERT_STATEMENT = 172;
+	const SQL_INTERVAL = 10;
+	const SQL_IS_INSERT_LITERALS = 0x00000001L;
+	const SQL_IS_INSERT_SEARCHED = 0x00000002L;
+	const SQL_IS_INTEGER = -6;
+	const SQL_IS_POINTER = -4;
+	const SQL_IS_SELECT_INTO = 0x00000004L;
+	const SQL_IS_SMALLINT = -8;
+	const SQL_IS_UINTEGER = -5;
+	const SQL_IS_USMALLINT = -7;
+	const SQL_ISV_ASSERTIONS = 0x00000001L;
+	const SQL_ISV_CHARACTER_SETS = 0x00000002L;
+	const SQL_ISV_CHECK_CONSTRAINTS = 0x00000004L;
+	const SQL_ISV_COLLATIONS = 0x00000008L;
+	const SQL_ISV_COLUMN_DOMAIN_USAGE = 0x00000010L;
+	const SQL_ISV_COLUMN_PRIVILEGES = 0x00000020L;
+	const SQL_ISV_COLUMNS = 0x00000040L;
+	const SQL_ISV_CONSTRAINT_COLUMN_USAGE = 0x00000080L;
+	const SQL_ISV_CONSTRAINT_TABLE_USAGE = 0x00000100L;
+	const SQL_ISV_DOMAIN_CONSTRAINTS = 0x00000200L;
+	const SQL_ISV_DOMAINS = 0x00000400L;
+	const SQL_ISV_KEY_COLUMN_USAGE = 0x00000800L;
+	const SQL_ISV_REFERENTIAL_CONSTRAINTS = 0x00001000L;
+	const SQL_ISV_SCHEMATA = 0x00002000L;
+	const SQL_ISV_SQL_LANGUAGES = 0x00004000L;
+	const SQL_ISV_TABLE_CONSTRAINTS = 0x00008000L;
+	const SQL_ISV_TABLE_PRIVILEGES = 0x00010000L;
+	const SQL_ISV_TABLES = 0x00020000L;
+	const SQL_ISV_TRANSLATIONS = 0x00040000L;
+	const SQL_ISV_USAGE_PRIVILEGES = 0x00080000L;
+	const SQL_ISV_VIEW_COLUMN_USAGE = 0x00100000L;
+	const SQL_ISV_VIEW_TABLE_USAGE = 0x00200000L;
+	const SQL_ISV_VIEWS = 0x00400000L;
+	const SQL_KEYSET_CURSOR_ATTRIBUTES1 = 150;
+	const SQL_KEYSET_CURSOR_ATTRIBUTES2 = 151;
+	const SQL_MAX_ASYNC_CONCURRENT_STATEMENTS = 10022;
+	const SQL_NO_COLUMN_NUMBER = -1;
+	const SQL_NO_ROW_NUMBER = -1;
+	const SQL_NOT_DEFERRABLE = 7;
+	const SQL_NUM_EXTENSIONS = SQL_EXT_API_LAST-SQL_EXT_API_START+1;
+	const SQL_NUM_FUNCTIONS = 23;
+	const SQL_ODBC_INTERFACE_CONFORMANCE = 152;
+
+	enum : ULONG {
+		SQL_OIC_CORE = 1,
+		SQL_OIC_LEVEL1,
+		SQL_OIC_LEVEL2
+	}
+	enum : ULONG {
+		SQL_OV_ODBC2 = 2,
+		SQL_OV_ODBC3 = 3
+	}
+
+	const ULONG
+		SQL_PARAM_BIND_BY_COLUMN = 0,
+		SQL_PARAM_BIND_TYPE_DEFAULT = SQL_PARAM_BIND_BY_COLUMN;
+
+	const SQL_PARAM_ARRAY_ROW_COUNTS = 153;
+	const SQL_PARAM_ARRAY_SELECTS = 154;
+	const SQL_PARAM_DIAG_UNAVAILABLE = 1;
+	const SQL_PARAM_ERROR = 5;
+	const SQL_PARAM_IGNORE = 1;
+	const SQL_PARAM_PROCEED = 0;
+	const SQL_PARAM_SUCCESS = 0;
+	const SQL_PARAM_SUCCESS_WITH_INFO = 6;
+	const SQL_PARAM_UNUSED = 7;
+
+	const SQL_PARC_BATCH = 1;
+	const SQL_PARC_NO_BATCH = 2;
+	const SQL_PAS_BATCH = 1;
+	const SQL_PAS_NO_BATCH = 2;
+	const SQL_PAS_NO_SELECT = 3;
+
+	const SQL_ROW_IGNORE = 1;
+	const SQL_ROW_NUMBER_UNKNOWN = -2;
+	const SQL_ROW_PROCEED = 0;
+	const SQL_ROW_SUCCESS_WITH_INFO = 6;
+
+	const SQL_SC_FIPS127_2_TRANSITIONAL = 0x00000002L;
+	const SQL_SC_SQL92_ENTRY = 0x00000001L;
+	const SQL_SC_SQL92_FULL = 0x00000008L;
+	const SQL_SC_SQL92_INTERMEDIATE = 0x00000004L;
+
+	const SQL_SCC_ISO92_CLI = 0x00000002L;
+	const SQL_SCC_XOPEN_CLI_VERSION1 = 0x00000001L;
+
+	const SQL_SCHEMA_TERM = SQL_OWNER_TERM;
+	const SQL_SCHEMA_USAGE = SQL_OWNER_USAGE;
+	const SQL_SDF_CURRENT_DATE = 0x00000001L;
+	const SQL_SDF_CURRENT_TIME = 0x00000002L;
+	const SQL_SDF_CURRENT_TIMESTAMP = 0x00000004L;
+	const SQL_SFKD_CASCADE = 0x00000001L;
+	const SQL_SFKD_NO_ACTION = 0x00000002L;
+	const SQL_SFKD_SET_DEFAULT = 0x00000004L;
+	const SQL_SFKD_SET_NULL = 0x00000008L;
+	const SQL_SFKU_CASCADE = 0x00000001L;
+	const SQL_SFKU_NO_ACTION = 0x00000002L;
+	const SQL_SFKU_SET_DEFAULT = 0x00000004L;
+	const SQL_SFKU_SET_NULL = 0x00000008L;
+	const SQL_SG_DELETE_TABLE = 0x00000020L;
+	const SQL_SG_INSERT_COLUMN = 0x00000080L;
+	const SQL_SG_INSERT_TABLE = 0x00000040L;
+	const SQL_SG_REFERENCES_COLUMN = 0x00000200L;
+	const SQL_SG_REFERENCES_TABLE = 0x00000100L;
+	const SQL_SG_SELECT_TABLE = 0x00000400L;
+	const SQL_SG_UPDATE_COLUMN = 0x00001000L;
+	const SQL_SG_UPDATE_TABLE = 0x00000800L;
+	const SQL_SG_USAGE_ON_CHARACTER_SET = 0x00000002L;
+	const SQL_SG_USAGE_ON_COLLATION = 0x00000004L;
+	const SQL_SG_USAGE_ON_DOMAIN = 0x00000001L;
+	const SQL_SG_USAGE_ON_TRANSLATION = 0x00000008L;
+	const SQL_SG_WITH_GRANT_OPTION = 0x00000010L;
+	const SQL_SNVF_BIT_LENGTH = 0x00000001L;
+	const SQL_SNVF_CHAR_LENGTH = 0x00000002L;
+	const SQL_SNVF_CHARACTER_LENGTH = 0x00000004L;
+	const SQL_SNVF_EXTRACT = 0x00000008L;
+	const SQL_SNVF_OCTET_LENGTH = 0x00000010L;
+	const SQL_SNVF_POSITION = 0x00000020L;
+	const SQL_SP_BETWEEN = 0x00000800L;
+	const SQL_SP_COMPARISON = 0x00001000L;
+	const SQL_SP_EXISTS = 0x00000001L;
+	const SQL_SP_IN = 0x00000400L;
+	const SQL_SP_ISNOTNULL = 0x00000002L;
+	const SQL_SP_ISNULL = 0x00000004L;
+	const SQL_SP_LIKE = 0x00000200L;
+	const SQL_SP_MATCH_FULL = 0x00000008L;
+	const SQL_SP_MATCH_PARTIAL = 0x00000010L;
+	const SQL_SP_MATCH_UNIQUE_FULL = 0x00000020L;
+	const SQL_SP_MATCH_UNIQUE_PARTIAL = 0x00000040L;
+	const SQL_SP_OVERLAPS = 0x00000080L;
+	const SQL_SP_QUANTIFIED_COMPARISON = 0x00002000L;
+	const SQL_SP_UNIQUE = 0x00000100L;
+	const SQL_SQL_CONFORMANCE = 118;
+	const SQL_SQL92_DATETIME_FUNCTIONS = 155;
+	const SQL_SQL92_FOREIGN_KEY_DELETE_RULE = 156;
+	const SQL_SQL92_FOREIGN_KEY_UPDATE_RULE = 157;
+	const SQL_SQL92_GRANT = 158;
+	const SQL_SQL92_NUMERIC_VALUE_FUNCTIONS = 159;
+	const SQL_SQL92_PREDICATES = 160;
+	const SQL_SQL92_RELATIONAL_JOIN_OPERATORS = 161;
+	const SQL_SQL92_REVOKE = 162;
+	const SQL_SQL92_ROW_VALUE_CONSTRUCTOR = 163;
+	const SQL_SQL92_STRING_FUNCTIONS = 164;
+	const SQL_SQL92_VALUE_EXPRESSIONS = 165;
+	const SQL_SR_CASCADE = 0x00000020L;
+	const SQL_SR_DELETE_TABLE = 0x00000080L;
+	const SQL_SR_GRANT_OPTION_FOR = 0x00000010L;
+	const SQL_SR_INSERT_COLUMN = 0x00000200L;
+	const SQL_SR_INSERT_TABLE = 0x00000100L;
+	const SQL_SR_REFERENCES_COLUMN = 0x00000800L;
+	const SQL_SR_REFERENCES_TABLE = 0x00000400L;
+	const SQL_SR_RESTRICT = 0x00000040L;
+	const SQL_SR_SELECT_TABLE = 0x00001000L;
+	const SQL_SR_UPDATE_COLUMN = 0x00004000L;
+	const SQL_SR_UPDATE_TABLE = 0x00002000L;
+	const SQL_SR_USAGE_ON_CHARACTER_SET = 0x00000002L;
+	const SQL_SR_USAGE_ON_COLLATION = 0x00000004L;
+	const SQL_SR_USAGE_ON_DOMAIN = 0x00000001L;
+	const SQL_SR_USAGE_ON_TRANSLATION = 0x00000008L;
+	const SQL_SRJO_CORRESPONDING_CLAUSE = 0x00000001L;
+	const SQL_SRJO_CROSS_JOIN = 0x00000002L;
+	const SQL_SRJO_EXCEPT_JOIN = 0x00000004L;
+	const SQL_SRJO_FULL_OUTER_JOIN = 0x00000008L;
+	const SQL_SRJO_INNER_JOIN = 0x00000010L;
+	const SQL_SRJO_INTERSECT_JOIN = 0x00000020L;
+	const SQL_SRJO_LEFT_OUTER_JOIN = 0x00000040L;
+	const SQL_SRJO_NATURAL_JOIN = 0x00000080L;
+	const SQL_SRJO_RIGHT_OUTER_JOIN = 0x00000100L;
+	const SQL_SRJO_UNION_JOIN = 0x00000200L;
+	const SQL_SRVC_DEFAULT = 0x00000004L;
+	const SQL_SRVC_NULL = 0x00000002L;
+	const SQL_SRVC_ROW_SUBQUERY = 0x00000008L;
+	const SQL_SRVC_VALUE_EXPRESSION = 0x00000001L;
+	const SQL_SSF_CONVERT = 0x00000001L;
+	const SQL_SSF_LOWER = 0x00000002L;
+	const SQL_SSF_SUBSTRING = 0x00000008L;
+	const SQL_SSF_TRANSLATE = 0x00000010L;
+	const SQL_SSF_TRIM_BOTH = 0x00000020L;
+	const SQL_SSF_TRIM_LEADING = 0x00000040L;
+	const SQL_SSF_TRIM_TRAILING = 0x00000080L;
+	const SQL_SSF_UPPER = 0x00000004L;
+	const SQL_STANDARD_CLI_CONFORMANCE = 166;
+	const SQL_STATIC_CURSOR_ATTRIBUTES1 = 167;
+	const SQL_STATIC_CURSOR_ATTRIBUTES2 = 168;
+	const SQL_SU_DML_STATEMENTS = SQL_OU_DML_STATEMENTS;
+	const SQL_SU_INDEX_DEFINITION = SQL_OU_INDEX_DEFINITION;
+	const SQL_SU_PRIVILEGE_DEFINITION = SQL_OU_PRIVILEGE_DEFINITION;
+	const SQL_SU_PROCEDURE_INVOCATION = SQL_OU_PROCEDURE_INVOCATION;
+	const SQL_SU_TABLE_DEFINITION = SQL_OU_TABLE_DEFINITION;
+	const SQL_SVE_CASE = 0x00000001L;
+	const SQL_SVE_CAST = 0x00000002L;
+	const SQL_SVE_COALESCE = 0x00000004L;
+	const SQL_SVE_NULLIF = 0x00000008L;
+	const SQL_UB_FIXED = SQL_UB_ON;
+	const SQL_UB_VARIABLE = 2UL;
+	const SQL_UNION_STATEMENT = SQL_UNION;
+	const SQL_UPDATE_BY_BOOKMARK = 5;
+	const SQL_US_UNION = SQL_U_UNION;
+	const SQL_US_UNION_ALL = SQL_U_UNION_ALL;
+}//[Yes] #endif /* ODBCVER >= 0x300 */
+static if (ODBCVER >= 0x0350) {
+	const SQL_DESC_ROWVER = 35;
+	const SQL_GUID = -11;
+	const SQL_C_GUID = SQL_GUID;
+	//#ifdef ODBC_STD
+	//#define SQLAllocHandle SQLAllocHandleStd
+	//#define SQLAllocEnv(p) SQLAllocHandleStd(SQL_HANDLE_ENV, SQL_NULL_HANDLE, p)
+	//#define SQL_YEAR SQL_CODE_YEAR
+	//#define SQL_MONTH SQL_CODE_MONTH
+	//#define SQL_DAY SQL_CODE_DAY
+	//#define SQL_HOUR SQL_CODE_HOUR
+	//#define SQL_MINUTE SQL_CODE_MINUTE
+	//#define SQL_SECOND SQL_CODE_SECOND
+	//#define SQL_YEAR_TO_MONTH SQL_CODE_YEAR_TO_MONTH
+	//#define SQL_DAY_TO_HOUR SQL_CODE_DAY_TO_HOUR
+	//#define SQL_DAY_TO_MINUTE SQL_CODE_DAY_TO_MINUTE
+	//#define SQL_DAY_TO_SECOND SQL_CODE_DAY_TO_SECOND
+	//#define SQL_HOUR_TO_MINUTE SQL_CODE_HOUR_TO_MINUTE
+	//#define SQL_HOUR_TO_SECOND SQL_CODE_HOUR_TO_SECOND
+	//#define SQL_MINUTE_TO_SECOND SQL_CODE_MINUTE_TO_SECOND
+	//#endif /* ODBC_STD */
+}//#endif /* ODBCVER >= 0x0350 */
+
+//static if (ODBCVER >= 0x0351) {
+const SQL_ATTR_ANSI_APP=115;
+const SQL_AA_TRUE=1L;
+const SQL_AA_FALSE=0L;
+//}//[Yes] #endif
+
+const TRACE_VERSION=1000;
+const TRACE_ON=1;
+
+const char [] SQL_ODBC_KEYWORDS =
+	"ABSOLUTE, ACTION, ADA, ADD, ALL, ALLOCATE, ALTER, AND, ANY, ARE, AS, "
+	~ "ASC, ASSERTION, AT, AUTHORIZATION, AVG, "
+	~ "BEGIN, BETWEEN, BIT, BIT_LENGTH, BOTH, BY, CASCADE, CASCADED, CASE, CAST, CATALOG, "
+	~ "CHAR, CHAR_LENGTH, CHARACTER, CHARACTER_LENGTH, CHECK, CLOSE, COALESCE, "
+	~ "COLLATE, COLLATION, COLUMN, COMMIT, CONNECT, CONNECTION, CONSTRAINT, "
+	~ "CONSTRAINTS, CONTINUE, CONVERT, CORRESPONDING, COUNT, CREATE, CROSS, CURRENT, "
+	~ "CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CURSOR, "
+	~ "DATE, DAY, DEALLOCATE, DEC, DECIMAL, DECLARE, DEFAULT, DEFERRABLE, "
+	~ "DEFERRED, DELETE, DESC, DESCRIBE, DESCRIPTOR, DIAGNOSTICS, DISCONNECT, "
+	~ "DISTINCT, DOMAIN, DOUBLE, DROP, "
+	~ "ELSE, END, END-EXEC, ESCAPE, EXCEPT, EXCEPTION, EXEC, EXECUTE, "
+	~ "EXISTS, EXTERNAL, EXTRACT, "
+	~ "FALSE, FETCH, FIRST, FLOAT, FOR, FOREIGN, FORTRAN, FOUND, FROM, FULL, "
+	~ "GET, GLOBAL, GO, GOTO, GRANT, GROUP, HAVING, HOUR, "
+	~ "IDENTITY, IMMEDIATE, IN, INCLUDE, INDEX, INDICATOR, INITIALLY, INNER, "
+	~ "INPUT, INSENSITIVE, INSERT, INT, INTEGER, INTERSECT, INTERVAL, INTO, IS, ISOLATION, "
+	~ "JOIN, KEY, LANGUAGE, LAST, LEADING, LEFT, LEVEL, LIKE, LOCAL, LOWER, "
+	~ "MATCH, MAX, MIN, MINUTE, MODULE, MONTH, "
+	~ "NAMES, NATIONAL, NATURAL, NCHAR, NEXT, NO, NONE, NOT, NULL, NULLIF, NUMERIC, "
+	~ "OCTET_LENGTH, OF, ON, ONLY, OPEN, OPTION, OR, ORDER, OUTER, OUTPUT, OVERLAPS, "
+	~ "PAD, PARTIAL, PASCAL, PLI, POSITION, PRECISION, PREPARE, PRESERVE, "
+	~ "PRIMARY, PRIOR, PRIVILEGES, PROCEDURE, PUBLIC, "
+	~ "READ, REAL, REFERENCES, RELATIVE, RESTRICT, REVOKE, RIGHT, ROLLBACK, ROWS"
+	~ "SCHEMA, SCROLL, SECOND, SECTION, SELECT, SESSION, SESSION_USER, SET, SIZE, "
+	~ "SMALLINT, SOME, SPACE, SQL, SQLCA, SQLCODE, SQLERROR, SQLSTATE, SQLWARNING, "
+	~ "SUBSTRING, SUM, SYSTEM_USER, "
+	~ "TABLE, TEMPORARY, THEN, TIME, TIMESTAMP, TIMEZONE_HOUR, TIMEZONE_MINUTE, "
+	~ "TO, TRAILING, TRANSACTION, TRANSLATE, TRANSLATION, TRIM, TRUE, "
+	~ "UNION, UNIQUE, UNKNOWN, UPDATE, UPPER, USAGE, USER, USING, "
+	~ "VALUE, VALUES, VARCHAR, VARYING, VIEW, WHEN, WHENEVER, WHERE, WITH, WORK, WRITE, "
+	~ "YEAR, ZONE";
+extern (Windows) {
+	SQLRETURN SQLDriverConnect(SQLHDBC, SQLHWND, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*, SQLUSMALLINT);
+	SQLRETURN SQLBrowseConnect(SQLHDBC, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*);
+	SQLRETURN SQLColumnPrivileges(SQLHSTMT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT);
+	SQLRETURN SQLColAttributes(SQLHSTMT, SQLUSMALLINT, SQLUSMALLINT, SQLPOINTER, SQLSMALLINT, SQLSMALLINT*, SQLLEN*);
+	SQLRETURN SQLDescribeParam(SQLHSTMT, SQLUSMALLINT, SQLSMALLINT*, SQLULEN*, SQLSMALLINT*, SQLSMALLINT*);
+	SQLRETURN SQLExtendedFetch(SQLHSTMT, SQLUSMALLINT, SQLINTEGER, SQLUINTEGER*, SQLUSMALLINT*);
+	SQLRETURN SQLForeignKeys(SQLHSTMT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT);
+	SQLRETURN SQLMoreResults(SQLHSTMT);
+	SQLRETURN SQLNativeSql(SQLHDBC, SQLCHAR*, SQLINTEGER, SQLCHAR*, SQLINTEGER, SQLINTEGER*);
+	SQLRETURN SQLNumParams(SQLHSTMT, SQLSMALLINT*);
+	SQLRETURN SQLParamOptions(SQLHSTMT, SQLUINTEGER, SQLUINTEGER*);
+	SQLRETURN SQLPrimaryKeys(SQLHSTMT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT);
+	SQLRETURN SQLProcedureColumns(SQLHSTMT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT);
+	SQLRETURN SQLProcedures(SQLHSTMT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT);
+	SQLRETURN SQLSetPos(SQLHSTMT, SQLUSMALLINT, SQLUSMALLINT, SQLUSMALLINT);
+	SQLRETURN SQLTablePrivileges(SQLHSTMT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT);
+	SQLRETURN SQLDrivers(SQLHENV, SQLUSMALLINT, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*);
+	SQLRETURN SQLBindParameter(SQLHSTMT, SQLUSMALLINT, SQLSMALLINT, SQLSMALLINT, SQLSMALLINT, SQLULEN, SQLSMALLINT, SQLPOINTER, SQLLEN, SQLLEN*);
+	SQLRETURN SQLSetScrollOptions(SQLHSTMT, SQLUSMALLINT, SQLLEN, SQLUSMALLINT);/* deprecated */
+	DWORD ODBCGetTryWaitValue();
+	BOOL ODBCSetTryWaitValue(DWORD);
+	RETCODE TraceOpenLogFile(LPWSTR, LPWSTR, DWORD);
+	RETCODE TraceCloseLogFile();
+	VOID TraceReturn(RETCODE, RETCODE);
+	DWORD TraceVersion();
+	//static if (ODBCVER >= 0x0300) {
+	SQLRETURN SQLBulkOperations(SQLHSTMT, SQLSMALLINT);
+	SQLRETURN SQLAllocHandleStd( SQLSMALLINT, SQLHANDLE, SQLHANDLE*);
+	//}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/sqltypes.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,142 @@
+/***********************************************************************\
+*                               sqltypes.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.sqltypes;
+
+/* Conversion notes:
+  It's assumed that ODBC >= 0x0300.
+*/
+
+private import win32.windef;
+private import win32.basetyps; // for GUID
+
+alias byte SCHAR, SQLSCHAR;
+alias int SDWORD, SLONG, SQLINTEGER;
+alias short SWORD, SSHORT, RETCODE, SQLSMALLINT;
+alias ULONG UDWORD;
+alias USHORT UWORD, SQLUSMALLINT;
+alias double SDOUBLE, LDOUBLE;
+alias float SFLOAT;
+alias PVOID PTR, HENV, HDBC, HSTMT, SQLPOINTER;
+alias UCHAR SQLCHAR;
+// #ifndef _WIN64
+alias UDWORD SQLUINTEGER;
+// #endif
+
+//static if (ODBCVER >= 0x0300) {
+typedef HANDLE SQLHANDLE;
+alias SQLHANDLE SQLHENV, SQLHDBC, SQLHSTMT, SQLHDESC;
+/*
+} else {
+alias void* SQLHENV;
+alias void* SQLHDBC;
+alias void* SQLHSTMT;
+}
+*/
+alias SQLSMALLINT SQLRETURN;
+alias HWND SQLHWND;
+alias ULONG BOOKMARK;
+
+alias SQLINTEGER SQLLEN, SQLROWOFFSET;
+alias SQLUINTEGER SQLROWCOUNT, SQLULEN;
+alias DWORD SQLTRANSID;
+alias SQLUSMALLINT SQLSETPOSIROW;
+alias wchar SQLWCHAR;
+
+version(Unicode) {
+	alias SQLWCHAR SQLTCHAR;
+} else {
+	alias SQLCHAR  SQLTCHAR;
+}
+//static if (ODBCVER >= 0x0300) {
+alias ubyte  SQLDATE, SQLDECIMAL;
+alias double SQLDOUBLE, SQLFLOAT;
+alias ubyte  SQLNUMERIC;
+alias float  SQLREAL;
+alias ubyte  SQLTIME, SQLTIMESTAMP, SQLVARCHAR;
+alias long   ODBCINT64, SQLBIGINT;
+alias ulong  SQLUBIGINT;
+//}
+
+struct DATE_STRUCT {
+	SQLSMALLINT year;
+	SQLUSMALLINT month;
+	SQLUSMALLINT day;
+}
+
+struct TIME_STRUCT {
+	SQLUSMALLINT hour;
+	SQLUSMALLINT minute;
+	SQLUSMALLINT second;
+}
+
+struct TIMESTAMP_STRUCT {
+	SQLSMALLINT year;
+	SQLUSMALLINT month;
+	SQLUSMALLINT day;
+	SQLUSMALLINT hour;
+	SQLUSMALLINT minute;
+	SQLUSMALLINT second;
+	SQLUINTEGER fraction;
+}
+
+//static if (ODBCVER >= 0x0300) {
+alias DATE_STRUCT SQL_DATE_STRUCT;
+alias TIME_STRUCT SQL_TIME_STRUCT;
+alias TIMESTAMP_STRUCT SQL_TIMESTAMP_STRUCT;
+
+enum SQLINTERVAL {
+	SQL_IS_YEAR = 1,
+	SQL_IS_MONTH,
+	SQL_IS_DAY,
+	SQL_IS_HOUR,
+	SQL_IS_MINUTE,
+	SQL_IS_SECOND,
+	SQL_IS_YEAR_TO_MONTH,
+	SQL_IS_DAY_TO_HOUR,
+	SQL_IS_DAY_TO_MINUTE,
+	SQL_IS_DAY_TO_SECOND,
+	SQL_IS_HOUR_TO_MINUTE,
+	SQL_IS_HOUR_TO_SECOND,
+	SQL_IS_MINUTE_TO_SECOND
+}
+
+struct SQL_YEAR_MONTH_STRUCT {
+	SQLUINTEGER year;
+	SQLUINTEGER month;
+}
+
+struct SQL_DAY_SECOND_STRUCT {
+	SQLUINTEGER day;
+	SQLUINTEGER hour;
+	SQLUINTEGER minute;
+	SQLUINTEGER second;
+	SQLUINTEGER fraction;
+}
+
+struct SQL_INTERVAL_STRUCT {
+	SQLINTERVAL interval_type;
+	SQLSMALLINT interval_sign;
+	union _intval {
+		SQL_YEAR_MONTH_STRUCT year_month;
+		SQL_DAY_SECOND_STRUCT day_second;
+	}
+	_intval intval;	
+}
+
+const SQL_MAX_NUMERIC_LEN = 16;
+
+struct SQL_NUMERIC_STRUCT {
+	SQLCHAR precision;
+	SQLSCHAR scale;
+	SQLCHAR sign;
+	SQLCHAR val[SQL_MAX_NUMERIC_LEN];
+}
+// } ODBCVER >= 0x0300
+alias GUID SQLGUID;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/sqlucode.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,156 @@
+/***********************************************************************\
+*                               sqlucode.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.sqlucode;
+
+private import win32.sqlext;
+
+const SQL_WCHAR        = -8;
+const SQL_WVARCHAR     = -9;
+const SQL_WLONGVARCHAR = -10;
+const SQL_C_WCHAR      = SQL_WCHAR;
+
+const SQL_SQLSTATE_SIZEW = 10;
+version(Unicode) {
+	const SQL_C_TCHAR = SQL_C_WCHAR;
+} else {
+	const SQL_C_TCHAR = SQL_C_CHAR;
+}
+
+// Moved from sqlext
+static if (ODBCVER <= 0x0300) {
+	const SQL_UNICODE             = -95;
+	const SQL_UNICODE_VARCHAR     = -96;
+	const SQL_UNICODE_LONGVARCHAR = -97;
+	const SQL_UNICODE_CHAR        = SQL_UNICODE;
+} else {
+	const SQL_UNICODE             = SQL_WCHAR;
+	const SQL_UNICODE_VARCHAR     = SQL_WVARCHAR;
+	const SQL_UNICODE_LONGVARCHAR = SQL_WLONGVARCHAR;
+	const SQL_UNICODE_CHAR        = SQL_WCHAR;
+}
+
+extern (Windows) {
+	SQLRETURN SQLBrowseConnectA(SQLHDBC, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*);
+	SQLRETURN SQLBrowseConnectW(SQLHDBC, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLSMALLINT*);
+	SQLRETURN SQLColAttributeA(SQLHSTMT, SQLSMALLINT, SQLSMALLINT, SQLPOINTER, SQLSMALLINT, SQLSMALLINT*, SQLPOINTER);
+	SQLRETURN SQLColAttributeW(SQLHSTMT, SQLUSMALLINT, SQLUSMALLINT, SQLPOINTER, SQLSMALLINT, SQLSMALLINT*, SQLPOINTER);
+	SQLRETURN SQLColAttributesA(SQLHSTMT, SQLUSMALLINT, SQLUSMALLINT, SQLPOINTER, SQLSMALLINT, SQLSMALLINT*, SQLLEN*);
+	SQLRETURN SQLColAttributesW(SQLHSTMT, SQLUSMALLINT, SQLUSMALLINT, SQLPOINTER, SQLSMALLINT, SQLSMALLINT*, SQLLEN*);
+	SQLRETURN SQLColumnPrivilegesA( SQLHSTMT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT , SQLCHAR*, SQLSMALLINT );
+	SQLRETURN SQLColumnPrivilegesW( SQLHSTMT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT );
+	SQLRETURN SQLColumnsA(SQLHSTMT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT , SQLCHAR*, SQLSMALLINT );
+	SQLRETURN SQLColumnsW(SQLHSTMT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT , SQLWCHAR*, SQLSMALLINT );
+	SQLRETURN SQLConnectA(SQLHDBC, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT);
+	SQLRETURN SQLConnectW(SQLHDBC, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT);
+	SQLRETURN SQLDataSourcesA(SQLHENV, SQLUSMALLINT, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*);
+	SQLRETURN SQLDataSourcesW(SQLHENV, SQLUSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLSMALLINT*, SQLWCHAR*, SQLSMALLINT, SQLSMALLINT*);
+	SQLRETURN SQLDescribeColA(SQLHSTMT, SQLUSMALLINT, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*, SQLSMALLINT*, SQLULEN*, SQLSMALLINT*, SQLSMALLINT*);
+	SQLRETURN SQLDescribeColW(SQLHSTMT, SQLUSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLSMALLINT*, SQLSMALLINT*, SQLULEN*, SQLSMALLINT*, SQLSMALLINT*);
+	SQLRETURN SQLDriverConnectA(SQLHDBC, SQLHWND, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*, SQLUSMALLINT);
+	SQLRETURN SQLDriverConnectW(SQLHDBC, SQLHWND, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLSMALLINT*, SQLUSMALLINT);
+	SQLRETURN SQLDriversA(SQLHENV, SQLUSMALLINT, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*);
+	SQLRETURN SQLDriversW(SQLHENV, SQLUSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLSMALLINT*, SQLWCHAR*, SQLSMALLINT, SQLSMALLINT*);
+	SQLRETURN SQLErrorA(SQLHENV, SQLHDBC, SQLHSTMT, SQLCHAR*, SQLINTEGER*, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*);
+	SQLRETURN SQLErrorW(SQLHENV, SQLHDBC, SQLHSTMT, SQLWCHAR*, SQLINTEGER*, SQLWCHAR*, SQLSMALLINT, SQLSMALLINT*);
+	SQLRETURN SQLExecDirectA(SQLHSTMT, SQLCHAR*, SQLINTEGER);
+	SQLRETURN SQLExecDirectW(SQLHSTMT, SQLWCHAR*, SQLINTEGER);
+	SQLRETURN SQLForeignKeysA(SQLHSTMT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT);
+	SQLRETURN SQLForeignKeysW(SQLHSTMT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT);
+	SQLRETURN SQLGetConnectAttrA(SQLHDBC, SQLINTEGER, SQLPOINTER, SQLINTEGER, SQLINTEGER*);
+	SQLRETURN SQLGetConnectAttrW(SQLHDBC, SQLINTEGER, SQLPOINTER, SQLINTEGER, SQLINTEGER*);
+	SQLRETURN SQLGetConnectOptionA(SQLHDBC, SQLUSMALLINT, SQLPOINTER);
+	SQLRETURN SQLGetConnectOptionW(SQLHDBC, SQLUSMALLINT, SQLPOINTER);
+	SQLRETURN SQLGetCursorNameA(SQLHSTMT, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*);
+	SQLRETURN SQLGetCursorNameW(SQLHSTMT, SQLWCHAR*, SQLSMALLINT, SQLSMALLINT*);
+	SQLRETURN SQLGetInfoA(SQLHDBC, SQLUSMALLINT, SQLPOINTER, SQLSMALLINT, SQLSMALLINT*);
+	SQLRETURN SQLGetInfoW(SQLHDBC, SQLUSMALLINT, SQLPOINTER, SQLSMALLINT, SQLSMALLINT*);
+	SQLRETURN SQLGetTypeInfoA(SQLHSTMT, SQLSMALLINT);
+	SQLRETURN SQLGetTypeInfoW(SQLHSTMT, SQLSMALLINT);
+	SQLRETURN SQLNativeSqlA(SQLHDBC, SQLCHAR*, SQLINTEGER, SQLCHAR*, SQLINTEGER, SQLINTEGER*);
+	SQLRETURN SQLNativeSqlW(SQLHDBC, SQLWCHAR*, SQLINTEGER, SQLWCHAR*, SQLINTEGER, SQLINTEGER*);
+	SQLRETURN SQLPrepareA(SQLHSTMT, SQLCHAR*, SQLINTEGER);
+	SQLRETURN SQLPrepareW(SQLHSTMT, SQLWCHAR*, SQLINTEGER);
+	SQLRETURN SQLPrimaryKeysA(SQLHSTMT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT );
+	SQLRETURN SQLPrimaryKeysW(SQLHSTMT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT);
+	SQLRETURN SQLProcedureColumnsA(SQLHSTMT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT);
+	SQLRETURN SQLProcedureColumnsW(SQLHSTMT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT);
+	SQLRETURN SQLProceduresA(SQLHSTMT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT);
+	SQLRETURN SQLProceduresW(SQLHSTMT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT);
+	SQLRETURN SQLSetConnectAttrA(SQLHDBC, SQLINTEGER, SQLPOINTER, SQLINTEGER);
+	SQLRETURN SQLSetConnectAttrW(SQLHDBC, SQLINTEGER, SQLPOINTER, SQLINTEGER);
+	SQLRETURN SQLSetConnectOptionA(SQLHDBC, SQLUSMALLINT, SQLULEN);
+	SQLRETURN SQLSetConnectOptionW(SQLHDBC, SQLUSMALLINT, SQLULEN);
+	SQLRETURN SQLSetCursorNameA(SQLHSTMT, SQLCHAR*, SQLSMALLINT);
+	SQLRETURN SQLSetCursorNameW(SQLHSTMT, SQLWCHAR*, SQLSMALLINT);
+	SQLRETURN SQLSpecialColumnsA(SQLHSTMT, SQLUSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT , SQLUSMALLINT, SQLUSMALLINT);
+	SQLRETURN SQLSpecialColumnsW(SQLHSTMT, SQLUSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT , SQLUSMALLINT, SQLUSMALLINT);
+	SQLRETURN SQLStatisticsA(SQLHSTMT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT , SQLUSMALLINT, SQLUSMALLINT);
+	SQLRETURN SQLStatisticsW(SQLHSTMT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT , SQLUSMALLINT, SQLUSMALLINT);
+	SQLRETURN SQLTablePrivilegesA(SQLHSTMT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT);
+	SQLRETURN SQLTablePrivilegesW(SQLHSTMT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT );
+	SQLRETURN SQLTablesA(SQLHSTMT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT);
+	SQLRETURN SQLTablesW(SQLHSTMT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT);
+	static if (ODBCVER >= 0x0300) {
+		SQLRETURN SQLGetDescFieldA(SQLHDESC, SQLSMALLINT, SQLSMALLINT, SQLPOINTER, SQLINTEGER, SQLINTEGER*);
+		SQLRETURN SQLGetDescFieldW(SQLHDESC, SQLSMALLINT, SQLSMALLINT, SQLPOINTER, SQLINTEGER, SQLINTEGER*);
+		SQLRETURN SQLSetDescFieldA(SQLHDESC, SQLSMALLINT, SQLSMALLINT, SQLPOINTER, SQLINTEGER);
+		SQLRETURN SQLSetDescFieldW(SQLHDESC, SQLSMALLINT, SQLSMALLINT, SQLPOINTER, SQLINTEGER);
+		SQLRETURN SQLGetDescRecA(SQLHDESC, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*, SQLSMALLINT*, SQLSMALLINT*, SQLLEN*, SQLSMALLINT*, SQLSMALLINT*, SQLSMALLINT*);
+		SQLRETURN SQLGetDescRecW(SQLHDESC, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLSMALLINT*, SQLSMALLINT*, SQLSMALLINT*, SQLLEN*, SQLSMALLINT*, SQLSMALLINT*, SQLSMALLINT*);
+		SQLRETURN SQLGetDiagFieldA(SQLSMALLINT, SQLHANDLE, SQLSMALLINT, SQLSMALLINT, SQLPOINTER, SQLSMALLINT, SQLSMALLINT*);
+		SQLRETURN SQLGetDiagFieldW(SQLSMALLINT, SQLHANDLE, SQLSMALLINT, SQLSMALLINT, SQLPOINTER, SQLSMALLINT, SQLSMALLINT*);
+		SQLRETURN SQLGetDiagRecA(SQLSMALLINT, SQLHANDLE, SQLSMALLINT, SQLCHAR*, SQLINTEGER*, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*);
+		SQLRETURN SQLGetDiagRecW(SQLSMALLINT, SQLHANDLE, SQLSMALLINT, SQLWCHAR*, SQLINTEGER*, SQLWCHAR*, SQLSMALLINT, SQLSMALLINT*);
+		SQLRETURN SQLGetStmtAttrA(SQLHSTMT, SQLINTEGER, SQLPOINTER, SQLINTEGER, SQLINTEGER*);
+		SQLRETURN SQLGetStmtAttrW(SQLHSTMT, SQLINTEGER, SQLPOINTER, SQLINTEGER, SQLINTEGER*);
+		SQLRETURN SQLSetStmtAttrA(SQLHSTMT, SQLINTEGER, SQLPOINTER, SQLINTEGER);
+		SQLRETURN SQLSetStmtAttrW(SQLHSTMT, SQLINTEGER, SQLPOINTER, SQLINTEGER);
+	} // #endif /* (ODBCVER >= 0x0300) */
+}
+
+version (Unicode) {
+	alias SQLBrowseConnectW SQLBrowseConnect;
+	alias SQLColAttributeW SQLColAttribute;
+	alias SQLColAttributesW SQLColAttributes;
+	alias SQLColumnPrivilegesW SQLColumnPrivileges;
+	alias SQLColumnsW SQLColumns;
+	alias SQLConnectW SQLConnect;
+	alias SQLDataSourcesW SQLDataSources;
+	alias SQLDescribeColW SQLDescribeCol;
+	alias SQLDriverConnectW SQLDriverConnect;
+	alias SQLDriversW SQLDrivers;
+	alias SQLErrorW SQLError;
+	alias SQLExecDirectW SQLExecDirect;
+	alias SQLForeignKeysW SQLForeignKeys;
+	alias SQLGetConnectAttrW SQLGetConnectAttr;
+	alias SQLGetConnectOptionW SQLGetConnectOption;
+	alias SQLGetCursorNameW SQLGetCursorName;
+	alias SQLGetDescFieldW SQLGetDescField;
+	alias SQLGetDescRecW SQLGetDescRec;
+	alias SQLGetDiagFieldW SQLGetDiagField;
+	alias SQLGetDiagRecW SQLGetDiagRec;
+	alias SQLGetInfoW SQLGetInfo;
+	alias SQLGetStmtAttrW SQLGetStmtAttr;
+	alias SQLGetTypeInfoW SQLGetTypeInfo;
+	alias SQLNativeSqlW SQLNativeSql;
+	alias SQLPrepareW SQLPrepare;
+	alias SQLPrimaryKeysW SQLPrimaryKeys;
+	alias SQLProcedureColumnsW SQLProcedureColumns;
+	alias SQLProceduresW SQLProcedures;
+	alias SQLSetConnectAttrW SQLSetConnectAttr;
+	alias SQLSetConnectOptionW SQLSetConnectOption;
+	alias SQLSetCursorNameW SQLSetCursorName;
+	alias SQLSetDescFieldW SQLSetDescField;
+	alias SQLSetStmtAttrW SQLSetStmtAttr;
+	alias SQLSpecialColumnsW SQLSpecialColumns;
+	alias SQLStatisticsW SQLStatistics;
+	alias SQLTablePrivilegesW SQLTablePrivileges;
+	alias SQLTablesW SQLTables;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/subauth.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,275 @@
+/***********************************************************************\
+*                               subauth.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.subauth;
+
+private import win32.ntdef, win32.windef;
+
+/+
+alias LONG NTSTATUS;
+alias NTSTATUS* PNTSTATUS;
++/
+
+enum : ULONG {
+	MSV1_0_PASSTHRU    = 1,
+	MSV1_0_GUEST_LOGON = 2
+}
+
+// USER_ALL_INFORMATION.WhichFields (Undocumented)
+const ULONG
+	MSV1_0_VALIDATION_LOGOFF_TIME  = 1,
+	MSV1_0_VALIDATION_KICKOFF_TIME = 2,
+	MSV1_0_VALIDATION_LOGON_SERVER = 4,
+	MSV1_0_VALIDATION_LOGON_DOMAIN = 8,
+	MSV1_0_VALIDATION_SESSION_KEY  = 16,
+	MSV1_0_VALIDATION_USER_FLAGS   = 32,
+	MSV1_0_VALIDATION_USER_ID      = 64;
+
+// ?ActionsPerformed? (Undocumented)
+const MSV1_0_SUBAUTH_ACCOUNT_DISABLED = 1;
+const MSV1_0_SUBAUTH_PASSWORD         = 2;
+const MSV1_0_SUBAUTH_WORKSTATIONS = 4;
+const MSV1_0_SUBAUTH_LOGON_HOURS = 8;
+const MSV1_0_SUBAUTH_ACCOUNT_EXPIRY = 16;
+const MSV1_0_SUBAUTH_PASSWORD_EXPIRY = 32;
+const MSV1_0_SUBAUTH_ACCOUNT_TYPE = 64;
+const MSV1_0_SUBAUTH_LOCKOUT = 128;
+
+const NEXT_FREE_ACCOUNT_CONTROL_BIT = 131072;
+
+const SAM_DAYS_PER_WEEK    = 7;
+const SAM_HOURS_PER_WEEK   = 168;
+const SAM_MINUTES_PER_WEEK = 10080;
+
+enum : NTSTATUS {
+	STATUS_SUCCESS                = 0,
+	STATUS_INVALID_INFO_CLASS     = 0xC0000003,
+	STATUS_NO_SUCH_USER           = 0xC0000064,
+	STATUS_WRONG_PASSWORD         = 0xC000006A,
+	STATUS_PASSWORD_RESTRICTION   = 0xC000006C,
+	STATUS_LOGON_FAILURE          = 0xC000006D,
+	STATUS_ACCOUNT_RESTRICTION    = 0xC000006E,
+	STATUS_INVALID_LOGON_HOURS    = 0xC000006F,
+	STATUS_INVALID_WORKSTATION    = 0xC0000070,
+	STATUS_PASSWORD_EXPIRED       = 0xC0000071,
+	STATUS_ACCOUNT_DISABLED       = 0xC0000072,
+	STATUS_INSUFFICIENT_RESOURCES = 0xC000009A,
+	STATUS_ACCOUNT_EXPIRED        = 0xC0000193,
+	STATUS_PASSWORD_MUST_CHANGE   = 0xC0000224,
+	STATUS_ACCOUNT_LOCKED_OUT     = 0xC0000234
+}
+
+// Note: undocumented in MSDN
+// USER_ALL_INFORMATION.UserAccountControl
+const ULONG
+	USER_ACCOUNT_DISABLED                = 1,
+	USER_HOME_DIRECTORY_REQUIRED         = 2,
+	USER_PASSWORD_NOT_REQUIRED           = 4,
+	USER_TEMP_DUPLICATE_ACCOUNT          = 8,
+	USER_NORMAL_ACCOUNT                  = 16,
+	USER_MNS_LOGON_ACCOUNT               = 32,
+	USER_INTERDOMAIN_TRUST_ACCOUNT       = 64,
+	USER_WORKSTATION_TRUST_ACCOUNT       = 128,
+	USER_SERVER_TRUST_ACCOUNT            = 256,
+	USER_DONT_EXPIRE_PASSWORD            = 512,
+	USER_ACCOUNT_AUTO_LOCKED             = 1024,
+	USER_ENCRYPTED_TEXT_PASSWORD_ALLOWED = 2048,
+	USER_SMARTCARD_REQUIRED              = 4096,
+	USER_TRUSTED_FOR_DELEGATION          = 8192,
+	USER_NOT_DELEGATED                   = 16384,
+	USER_USE_DES_KEY_ONLY                = 32768,
+	USER_DONT_REQUIRE_PREAUTH            = 65536,
+
+	USER_MACHINE_ACCOUNT_MASK            = 448,
+	USER_ACCOUNT_TYPE_MASK               = 472,
+	USER_ALL_PARAMETERS                  = 2097152;
+
+/+
+struct UNICODE_STRING {
+	USHORT Length;
+	USHORT MaximumLength;
+	PWSTR Buffer;
+}
+alias UNICODE_STRING* PUNICODE_STRING;
+
+struct STRING {
+	USHORT Length;
+	USHORT MaximumLength;
+	PCHAR Buffer;
+}
+alias STRING* PSTRING;
++/
+
+alias HANDLE SAM_HANDLE;
+alias HANDLE* PSAM_HANDLE;
+
+struct OLD_LARGE_INTEGER {
+	ULONG LowPart;
+	LONG HighPart;
+}
+alias OLD_LARGE_INTEGER* POLD_LARGE_INTEGER;
+
+enum NETLOGON_LOGON_INFO_CLASS {
+	NetlogonInteractiveInformation = 1,
+	NetlogonNetworkInformation,
+	NetlogonServiceInformation,
+	NetlogonGenericInformation,
+	NetlogonInteractiveTransitiveInformation,
+	NetlogonNetworkTransitiveInformation,
+	NetlogonServiceTransitiveInformation
+}
+
+
+const CYPHER_BLOCK_LENGTH = 8;
+const USER_SESSION_KEY_LENGTH = CYPHER_BLOCK_LENGTH * 2;
+const CLEAR_BLOCK_LENGTH = 8;
+
+struct CYPHER_BLOCK {
+	CHAR data[CYPHER_BLOCK_LENGTH];
+}
+alias CYPHER_BLOCK* PCYPHER_BLOCK;
+
+struct CLEAR_BLOCK {
+	CHAR data[CLEAR_BLOCK_LENGTH];
+}
+alias CLEAR_BLOCK* PCLEAR_BLOCK;
+
+struct LM_OWF_PASSWORD {
+	CYPHER_BLOCK data[2];
+}
+alias LM_OWF_PASSWORD* PLM_OWF_PASSWORD;
+
+struct USER_SESSION_KEY {
+	CYPHER_BLOCK data[2];
+}
+alias USER_SESSION_KEY* PUSER_SESSION_KEY;
+
+alias CLEAR_BLOCK LM_CHALLENGE;
+alias LM_CHALLENGE* PLM_CHALLENGE;
+
+alias LM_OWF_PASSWORD NT_OWF_PASSWORD;
+alias NT_OWF_PASSWORD* PNT_OWF_PASSWORD;
+alias LM_CHALLENGE NT_CHALLENGE;
+alias NT_CHALLENGE* PNT_CHALLENGE;
+
+struct LOGON_HOURS {
+	USHORT UnitsPerWeek;
+	PUCHAR LogonHours;
+}
+alias LOGON_HOURS* PLOGON_HOURS;
+
+struct SR_SECURITY_DESCRIPTOR {
+	ULONG Length;
+	PUCHAR SecurityDescriptor;
+}
+alias SR_SECURITY_DESCRIPTOR* PSR_SECURITY_DESCRIPTOR;
+
+align(4):
+struct USER_ALL_INFORMATION {
+	LARGE_INTEGER LastLogon;
+	LARGE_INTEGER LastLogoff;
+	LARGE_INTEGER PasswordLastSet;
+	LARGE_INTEGER AccountExpires;
+	LARGE_INTEGER PasswordCanChange;
+	LARGE_INTEGER PasswordMustChange;
+	UNICODE_STRING UserName;
+	UNICODE_STRING FullName;
+	UNICODE_STRING HomeDirectory;
+	UNICODE_STRING HomeDirectoryDrive;
+	UNICODE_STRING ScriptPath;
+	UNICODE_STRING ProfilePath;
+	UNICODE_STRING AdminComment;
+	UNICODE_STRING WorkStations;
+	UNICODE_STRING UserComment;
+	UNICODE_STRING Parameters;
+	UNICODE_STRING LmPassword;
+	UNICODE_STRING NtPassword;
+	UNICODE_STRING PrivateData;
+	SR_SECURITY_DESCRIPTOR SecurityDescriptor;
+	ULONG UserId;
+	ULONG PrimaryGroupId;
+	ULONG UserAccountControl;
+	ULONG WhichFields;
+	LOGON_HOURS LogonHours;
+	USHORT BadPasswordCount;
+	USHORT LogonCount;
+	USHORT CountryCode;
+	USHORT CodePage;
+	BOOLEAN LmPasswordPresent;
+	BOOLEAN NtPasswordPresent;
+	BOOLEAN PasswordExpired;
+	BOOLEAN PrivateDataSensitive;
+}
+alias USER_ALL_INFORMATION* PUSER_ALL_INFORMATION;
+align:
+
+struct MSV1_0_VALIDATION_INFO {
+	LARGE_INTEGER LogoffTime;
+	LARGE_INTEGER KickoffTime;
+	UNICODE_STRING LogonServer;
+	UNICODE_STRING LogonDomainName;
+	USER_SESSION_KEY SessionKey;
+	BOOLEAN Authoritative;
+	ULONG UserFlags;
+	ULONG WhichFields;
+	ULONG UserId;
+}
+alias MSV1_0_VALIDATION_INFO* PMSV1_0_VALIDATION_INFO;
+
+struct NETLOGON_LOGON_IDENTITY_INFO {
+	UNICODE_STRING LogonDomainName;
+	ULONG ParameterControl;
+	OLD_LARGE_INTEGER LogonId;
+	UNICODE_STRING UserName;
+	UNICODE_STRING Workstation;
+}
+alias NETLOGON_LOGON_IDENTITY_INFO* PNETLOGON_LOGON_IDENTITY_INFO;
+
+struct NETLOGON_INTERACTIVE_INFO {
+	NETLOGON_LOGON_IDENTITY_INFO Identity;
+	LM_OWF_PASSWORD LmOwfPassword;
+	NT_OWF_PASSWORD NtOwfPassword;
+}
+alias NETLOGON_INTERACTIVE_INFO* PNETLOGON_INTERACTIVE_INFO;
+
+struct NETLOGON_GENERIC_INFO {
+	NETLOGON_LOGON_IDENTITY_INFO Identity;
+	UNICODE_STRING PackageName;
+	ULONG DataLength;
+	PUCHAR LogonData;
+}
+alias NETLOGON_GENERIC_INFO* PNETLOGON_GENERIC_INFO;
+
+struct NETLOGON_NETWORK_INFO {
+	NETLOGON_LOGON_IDENTITY_INFO Identity;
+	LM_CHALLENGE LmChallenge;
+	STRING NtChallengeResponse;
+	STRING LmChallengeResponse;
+}
+alias NETLOGON_NETWORK_INFO* PNETLOGON_NETWORK_INFO;
+
+struct NETLOGON_SERVICE_INFO {
+	NETLOGON_LOGON_IDENTITY_INFO Identity;
+	LM_OWF_PASSWORD LmOwfPassword;
+	NT_OWF_PASSWORD NtOwfPassword;
+}
+alias NETLOGON_SERVICE_INFO* PNETLOGON_SERVICE_INFO;
+
+extern (Windows) {
+NTSTATUS Msv1_0SubAuthenticationRoutine(NETLOGON_LOGON_INFO_CLASS,PVOID,
+	ULONG,PUSER_ALL_INFORMATION,PULONG,PULONG,
+	PBOOLEAN,PLARGE_INTEGER,PLARGE_INTEGER);
+NTSTATUS Msv1_0SubAuthenticationFilter(NETLOGON_LOGON_INFO_CLASS,PVOID,
+	ULONG,PUSER_ALL_INFORMATION,PULONG,PULONG,
+	PBOOLEAN,PLARGE_INTEGER,PLARGE_INTEGER);
+NTSTATUS Msv1_0SubAuthenticationRoutineGeneric(PVOID,ULONG,PULONG,PVOID*);
+NTSTATUS Msv1_0SubAuthenticationRoutineEx(NETLOGON_LOGON_INFO_CLASS,PVOID,
+	ULONG,PUSER_ALL_INFORMATION,SAM_HANDLE,
+	PMSV1_0_VALIDATION_INFO,PULONG);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/testall.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,101 @@
+// Used only for testing -- imports all windows headers.
+module win32.testall;
+
+import win32.core;
+import win32.windows;
+import win32.commctrl;
+import win32.setupapi;
+
+import win32.directx.d3d9;
+import win32.directx.dxerr8;
+import win32.directx.dxerr9;
+import win32.oleacc;
+import win32.comcat;
+import win32.cpl;
+import win32.cplext;
+import win32.custcntl;
+import win32.oleacc;
+import win32.ocidl;
+import win32.olectl;
+import win32.oledlg;
+import win32.objsafe;
+import win32.ole;
+
+import win32.shldisp;
+import win32.shlobj;
+import win32.shlwapi;
+import win32.regstr;
+import win32.richole;
+import win32.tmschema;
+import win32.servprov;
+import win32.exdisp;
+import win32.exdispid;
+import win32.idispids;
+import win32.mshtml;
+
+import win32.lm;
+import win32.lmbrowsr;
+
+import win32.sql;
+import win32.sqlext;
+import win32.sqlucode;
+import win32.odbcinst;
+
+import win32.imagehlp;
+import win32.intshcut;
+import win32.iphlpapi;
+import win32.isguids;
+
+import win32.subauth;
+import win32.rasdlg;
+import win32.rassapi;
+
+import win32.mapi;
+import win32.mciavi;
+import win32.mcx;
+import win32.mgmtapi;
+
+import win32.nddeapi;
+import win32.msacm;
+import win32.nspapi;
+
+import win32.ntdef;
+import win32.ntldap;
+import win32.ntsecapi;
+
+import win32.pbt;
+import win32.powrprof;
+import win32.rapi;
+
+import win32.wininet;
+import win32.winioctl;
+import win32.winldap;
+
+import win32.dbt;
+
+import win32.rpcdce2;
+
+import win32.tlhelp32;
+
+
+version (WindowsVista) {
+	version = WINDOWS_XP_UP;
+} else version (Windows2003) {
+	version = WINDOWS_XP_UP;
+} else version (WindowsXP) {
+	version = WINDOWS_XP_UP;
+}
+
+version (WINDOWS_XP_UP) {
+	import win32.dhcpcsdk;
+	import win32.errorrep;
+	import win32.reason;
+	import win32.secext;
+	import win32.ntdll;
+} else version (WindowsNTonly) {
+	version (Windows2000) {
+		import win32.dhcpcsdk;
+		import win32.aclui;
+	}
+	import win32.ntdll;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/testcompile.bat	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,50 @@
+dmd -I.. -c testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=Windows98 testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=WindowsME testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=WindowsNTonly testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=Windows2000 testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=Windows98 -version=Windows2000 testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=WindowsME -version=Windows2000 testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=WindowsNTonly -version=Windows2000 testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=WindowsXP testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=Windows2003 testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=WindowsVista testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=Win32_Winsock1 testall.d
+@if errorlevel 1 goto abort
+@rem Do we really need to test version=Unicode under all combinations?
+dmd -I.. -c -version=Unicode testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=Unicode -version=Windows98 testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=Unicode -version=WindowsME testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=Unicode -version=WindowsNTonly testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=Unicode -version=Windows2000 testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=Unicode -version=Windows98 -version=Windows2000 testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=Unicode -version=WindowsME -version=Windows2000 testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=Unicode -version=WindowsNTonly -version=Windows2000 testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=Unicode -version=WindowsXP testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=Unicode -version=Windows2003 testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=Unicode -version=WindowsVista testall.d
+@if errorlevel 1 goto abort
+dmd -I.. -c -version=Unicode -version=Win32_Winsock1 testall.d
+del testall.obj
+:abort
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/tlhelp32.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,169 @@
+/***********************************************************************\
+*                               tlhelp32.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.tlhelp32;
+
+private import win32.windef;
+
+enum : uint {
+	HF32_DEFAULT = 1,
+	HF32_SHARED
+}
+
+enum : uint {
+	LF32_FIXED    = 0x1,
+	LF32_FREE     = 0x2,
+	LF32_MOVEABLE = 0x4
+}
+
+const MAX_MODULE_NAME32 = 255;
+
+enum : uint {
+	TH32CS_SNAPHEAPLIST = 0x1,
+	TH32CS_SNAPPROCESS  = 0x2,
+	TH32CS_SNAPTHREAD   = 0x4,
+	TH32CS_SNAPMODULE   = 0x8,
+	TH32CS_SNAPALL      = (TH32CS_SNAPHEAPLIST|TH32CS_SNAPPROCESS|TH32CS_SNAPTHREAD|TH32CS_SNAPMODULE),
+	TH32CS_INHERIT      = 0x80000000
+}
+
+struct HEAPLIST32 {
+	DWORD dwSize;
+	DWORD th32ProcessID;
+	DWORD th32HeapID;
+	DWORD dwFlags;
+} 
+alias HEAPLIST32* PHEAPLIST32;
+alias HEAPLIST32* LPHEAPLIST32;
+
+struct HEAPENTRY32 {
+	DWORD dwSize;
+	HANDLE hHandle;
+	DWORD dwAddress;
+	DWORD dwBlockSize;
+	DWORD dwFlags;
+	DWORD dwLockCount;
+	DWORD dwResvd;
+	DWORD th32ProcessID;
+	DWORD th32HeapID;
+}
+alias HEAPENTRY32* PHEAPENTRY32;
+alias HEAPENTRY32* LPHEAPENTRY32;
+
+struct PROCESSENTRY32W {
+	DWORD dwSize;
+	DWORD cntUsage;
+	DWORD th32ProcessID;
+	DWORD th32DefaultHeapID;
+	DWORD th32ModuleID;
+	DWORD cntThreads;
+	DWORD th32ParentProcessID;
+	LONG pcPriClassBase;
+	DWORD dwFlags;
+	WCHAR szExeFile[MAX_PATH];
+}
+alias PROCESSENTRY32W* PPROCESSENTRY32W;
+alias PROCESSENTRY32W* LPPROCESSENTRY32W;
+
+struct THREADENTRY32 {
+	DWORD dwSize;
+	DWORD cntUsage;
+	DWORD th32ThreadID;
+	DWORD th32OwnerProcessID;
+	LONG tpBasePri;
+	LONG tpDeltaPri;
+	DWORD dwFlags;
+}
+alias THREADENTRY32* PTHREADENTRY32;
+alias THREADENTRY32* LPTHREADENTRY32;
+
+struct MODULEENTRY32W {
+	DWORD dwSize;
+	DWORD th32ModuleID;
+	DWORD th32ProcessID;
+	DWORD GlblcntUsage;
+	DWORD ProccntUsage;
+	BYTE *modBaseAddr;
+	DWORD modBaseSize;
+	HMODULE hModule; 
+	WCHAR szModule[MAX_MODULE_NAME32 + 1];
+	WCHAR szExePath[MAX_PATH];
+}
+alias MODULEENTRY32W* PMODULEENTRY32W;
+alias MODULEENTRY32W* LPMODULEENTRY32W;
+
+version(Unicode) {
+	alias PROCESSENTRY32W PROCESSENTRY32;
+	alias PPROCESSENTRY32W PPROCESSENTRY32;
+	alias LPPROCESSENTRY32W LPPROCESSENTRY32;
+
+	alias MODULEENTRY32W MODULEENTRY32;
+	alias PMODULEENTRY32W PMODULEENTRY32;
+	alias LPMODULEENTRY32W LPMODULEENTRY32;
+} else {
+	struct PROCESSENTRY32 {
+		DWORD dwSize;
+		DWORD cntUsage;
+		DWORD th32ProcessID;
+		DWORD th32DefaultHeapID;
+		DWORD th32ModuleID;
+		DWORD cntThreads;
+		DWORD th32ParentProcessID;
+		LONG pcPriClassBase;
+		DWORD dwFlags;
+		CHAR  szExeFile[MAX_PATH];
+	}
+	alias PROCESSENTRY32* PPROCESSENTRY32;
+	alias PROCESSENTRY32* LPPROCESSENTRY32;
+
+	struct MODULEENTRY32 {
+		DWORD dwSize;
+		DWORD th32ModuleID;
+		DWORD th32ProcessID;
+		DWORD GlblcntUsage;
+		DWORD ProccntUsage;
+		BYTE *modBaseAddr;
+		DWORD modBaseSize;
+		HMODULE hModule;
+		char szModule[MAX_MODULE_NAME32 + 1];
+		char szExePath[MAX_PATH];
+	}
+	alias MODULEENTRY32* PMODULEENTRY32;
+	alias MODULEENTRY32* LPMODULEENTRY32;
+}
+
+
+extern(Windows) {
+	BOOL Heap32First(LPHEAPENTRY32,DWORD,DWORD);
+	BOOL Heap32ListFirst(HANDLE,LPHEAPLIST32);
+	BOOL Heap32ListNext(HANDLE,LPHEAPLIST32);
+	BOOL Heap32Next(LPHEAPENTRY32);
+	BOOL Thread32First(HANDLE,LPTHREADENTRY32);
+	BOOL Thread32Next(HANDLE,LPTHREADENTRY32);
+	BOOL Toolhelp32ReadProcessMemory(DWORD,LPCVOID,LPVOID,DWORD,LPDWORD);
+	HANDLE CreateToolhelp32Snapshot(DWORD,DWORD);
+	BOOL Module32FirstW(HANDLE,LPMODULEENTRY32W);
+	BOOL Module32NextW(HANDLE,LPMODULEENTRY32W);
+	BOOL Process32FirstW(HANDLE,LPPROCESSENTRY32W);
+	BOOL Process32NextW(HANDLE,LPPROCESSENTRY32W);
+}
+
+version(Unicode) {
+	alias Module32FirstW Module32First;
+	alias Module32NextW Module32Next;
+	alias Process32FirstW Process32First;
+	alias Process32NextW Process32Next;
+} else {
+	extern(Windows) {
+		BOOL Module32First(HANDLE,LPMODULEENTRY32);
+		BOOL Module32Next(HANDLE,LPMODULEENTRY32);
+		BOOL Process32First(HANDLE,LPPROCESSENTRY32);
+		BOOL Process32Next(HANDLE,LPPROCESSENTRY32);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/tmschema.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,758 @@
+/***********************************************************************\
+*                               tmschema.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.tmschema;
+
+/* BUTTON parts */
+enum {
+	BP_PUSHBUTTON = 1,
+	BP_RADIOBUTTON = 2,
+	BP_CHECKBOX = 3,
+	BP_GROUPBOX = 4,
+	BP_USERBUTTON = 5
+}
+
+enum {
+	CBS_UNCHECKEDNORMAL = 1,
+	CBS_UNCHECKEDHOT = 2,
+	CBS_UNCHECKEDPRESSED = 3,
+	CBS_UNCHECKEDDISABLED = 4,
+	CBS_CHECKEDNORMAL = 5,
+	CBS_CHECKEDHOT = 6,
+	CBS_CHECKEDPRESSED = 7,
+	CBS_CHECKEDDISABLED = 8,
+	CBS_MIXEDNORMAL = 9,
+	CBS_MIXEDHOT = 10,
+	CBS_MIXEDPRESSED = 11,
+	CBS_MIXEDDISABLED = 12
+}
+
+enum {
+	GBS_NORMAL = 1,
+	GBS_DISABLED = 2
+}
+
+enum {
+	PBS_NORMAL = 1,
+	PBS_HOT = 2,
+	PBS_PRESSED = 3,
+	PBS_DISABLED = 4,
+	PBS_DEFAULTED = 5
+}
+
+enum {
+	RBS_UNCHECKEDNORMAL = 1,
+	RBS_UNCHECKEDHOT = 2,
+	RBS_UNCHECKEDPRESSED = 3,
+	RBS_UNCHECKEDDISABLED = 4,
+	RBS_CHECKEDNORMAL = 5,
+	RBS_CHECKEDHOT = 6,
+	RBS_CHECKEDPRESSED = 7,
+	RBS_CHECKEDDISABLED = 8
+}
+
+/* CLOCK parts */
+enum {
+	CLP_TIME = 1
+}
+
+enum {
+	CLS_NORMAL = 1
+}
+
+/* COMBOBOX parts */
+enum {
+	CP_DROPDOWNBUTTON = 1
+}
+
+enum {
+	CBXS_NORMAL = 1,
+	CBXS_HOT = 2,
+	CBXS_PRESSED = 3,
+	CBXS_DISABLED = 4
+}
+
+/* EDIT parts */
+enum {
+	EP_EDITTEXT = 1,
+	EP_CARET = 2
+}
+
+enum {
+	ETS_NORMAL = 1,
+	ETS_HOT = 2,
+	ETS_SELECTED = 3,
+	ETS_DISABLED = 4,
+	ETS_FOCUSED = 5,
+	ETS_READONLY = 6,
+	ETS_ASSIST = 7
+}
+/* EXPLORERBAR parts */
+enum {
+	EBP_HEADERBACKGROUND = 1,
+	EBP_HEADERCLOSE = 2,
+	EBP_HEADERPIN = 3,
+	EBP_IEBARMENU = 4,
+	EBP_NORMALGROUPBACKGROUND = 5,
+	EBP_NORMALGROUPCOLLAPSE = 6,
+	EBP_NORMALGROUPEXPAND = 7,
+	EBP_NORMALGROUPHEAD = 8,
+	EBP_SPECIALGROUPBACKGROUND = 9,
+	EBP_SPECIALGROUPCOLLAPSE = 10,
+	EBP_SPECIALGROUPEXPAND = 11,
+	EBP_SPECIALGROUPHEAD = 12
+}
+
+enum {
+	EBHC_NORMAL = 1,
+	EBHC_HOT = 2,
+	EBHC_PRESSED = 3
+}
+
+enum {
+	EBHP_NORMAL = 1,
+	EBHP_HOT = 2,
+	EBHP_PRESSED = 3,
+	EBHP_SELECTEDNORMAL = 4,
+	EBHP_SELECTEDHOT = 5,
+	EBHP_SELECTEDPRESSED = 6
+}
+
+enum {
+	EBM_NORMAL = 1,
+	EBM_HOT = 2,
+	EBM_PRESSED = 3
+}
+
+enum {
+	EBNGC_NORMAL = 1,
+	EBNGC_HOT = 2,
+	EBNGC_PRESSED = 3
+}
+
+enum {
+	EBNGE_NORMAL = 1,
+	EBNGE_HOT = 2,
+	EBNGE_PRESSED = 3
+}
+
+enum {
+	EBSGC_NORMAL = 1,
+	EBSGC_HOT = 2,
+	EBSGC_PRESSED = 3
+}
+
+enum {
+	EBSGE_NORMAL = 1,
+	EBSGE_HOT = 2,
+	EBSGE_PRESSED = 3
+}
+
+/* HEADER parts */
+enum {
+	HP_HEADERITEM = 1,
+	HP_HEADERITEMLEFT = 2,
+	HP_HEADERITEMRIGHT = 3,
+	HP_HEADERSORTARROW = 4
+}
+
+enum {
+	HIS_NORMAL = 1,
+	HIS_HOT = 2,
+	HIS_PRESSED = 3
+}
+
+enum {
+	HILS_NORMAL = 1,
+	HILS_HOT = 2,
+	HILS_PRESSED = 3
+}
+
+enum {
+	HIRS_NORMAL = 1,
+	HIRS_HOT = 2,
+	HIRS_PRESSED = 3
+}
+
+enum {
+	HSAS_SORTEDUP = 1,
+	HSAS_SORTEDDOWN = 2
+}
+
+/* LISTVIEW parts */
+enum {
+	LVP_LISTITEM = 1,
+	LVP_LISTGROUP = 2,
+	LVP_LISTDETAIL = 3,
+	LVP_LISTSORTEDDETAIL = 4,
+	LVP_EMPTYTEXT = 5
+}
+
+enum {
+	LIS_NORMAL = 1,
+	LIS_HOT = 2,
+	LIS_SELECTED = 3,
+	LIS_DISABLED = 4,
+	LIS_SELECTEDNOTFOCUS = 5
+}
+
+/* MENU parts */
+enum {
+	MP_MENUITEM = 1,
+	MP_MENUDROPDOWN = 2,
+	MP_MENUBARITEM = 3,
+	MP_MENUBARDROPDOWN = 4,
+	MP_CHEVRON = 5,
+	MP_SEPARATOR = 6
+}
+
+enum {
+	MS_NORMAL = 1,
+	MS_SELECTED = 2,
+	MS_DEMOTED = 3
+}
+/* MENUBAND parts */
+enum {
+	MDP_NEWAPPBUTTON = 1,
+	MDP_SEPERATOR = 2
+}
+
+enum {
+	MDS_NORMAL = 1,
+	MDS_HOT = 2,
+	MDS_PRESSED = 3,
+	MDS_DISABLED = 4,
+	MDS_CHECKED = 5,
+	MDS_HOTCHECKED = 6
+}
+
+/* PAGE parts */
+enum {
+	PGRP_UP = 1,
+	PGRP_DOWN = 2,
+	PGRP_UPHORZ = 3,
+	PGRP_DOWNHORZ = 4
+}
+
+enum {
+	DNS_NORMAL = 1,
+	DNS_HOT = 2,
+	DNS_PRESSED = 3,
+	DNS_DISABLED = 4
+}
+
+enum {
+	DNHZS_NORMAL = 1,
+	DNHZS_HOT = 2,
+	DNHZS_PRESSED = 3,
+	DNHZS_DISABLED = 4
+}
+
+enum {
+	UPS_NORMAL = 1,
+	UPS_HOT = 2,
+	UPS_PRESSED = 3,
+	UPS_DISABLED = 4
+}
+
+enum {
+	UPHZS_NORMAL = 1,
+	UPHZS_HOT = 2,
+	UPHZS_PRESSED = 3,
+	UPHZS_DISABLED = 4
+}
+
+/* PROGRESS parts */
+enum {
+	PP_BAR = 1,
+	PP_BARVERT = 2,
+	PP_CHUNK = 3,
+	PP_CHUNKVERT = 4
+}
+
+/* REBAR parts */
+enum {
+	RP_GRIPPER = 1,
+	RP_GRIPPERVERT = 2,
+	RP_BAND = 3,
+	RP_CHEVRON = 4,
+	RP_CHEVRONVERT = 5
+}
+
+enum {
+	CHEVS_NORMAL = 1,
+	CHEVS_HOT = 2,
+	CHEVS_PRESSED = 3
+}
+
+/* SCROLLBAR parts */
+enum {
+	SBP_ARROWBTN = 1,
+	SBP_THUMBBTNHORZ = 2,
+	SBP_THUMBBTNVERT = 3,
+	SBP_LOWERTRACKHORZ = 4,
+	SBP_UPPERTRACKHORZ = 5,
+	SBP_LOWERTRACKVERT = 6,
+	SBP_UPPERTRACKVERT = 7,
+	SBP_GRIPPERHORZ = 8,
+	SBP_GRIPPERVERT = 9,
+	SBP_SIZEBOX = 10
+}
+
+enum {
+	ABS_UPNORMAL = 1,
+	ABS_UPHOT = 2,
+	ABS_UPPRESSED = 3,
+	ABS_UPDISABLED = 4,
+	ABS_DOWNNORMAL = 5,
+	ABS_DOWNHOT = 6,
+	ABS_DOWNPRESSED = 7,
+	ABS_DOWNDISABLED = 8,
+	ABS_LEFTNORMAL = 9,
+	ABS_LEFTHOT = 10,
+	ABS_LEFTPRESSED = 11,
+	ABS_LEFTDISABLED = 12,
+	ABS_RIGHTNORMAL = 13,
+	ABS_RIGHTHOT = 14,
+	ABS_RIGHTPRESSED = 15,
+	ABS_RIGHTDISABLED = 16
+}
+
+enum {
+	SCRBS_NORMAL = 1,
+	SCRBS_HOT = 2,
+	SCRBS_PRESSED = 3,
+	SCRBS_DISABLED = 4
+}
+
+enum {
+	SZB_RIGHTALIGN = 1,
+	SZB_LEFTALIGN = 2
+}
+
+/* SPIN parts */
+enum {
+	SPNP_UP = 1,
+	SPNP_DOWN = 2,
+	SPNP_UPHORZ = 3,
+	SPNP_DOWNHORZ = 4
+}
+
+/* STARTPANEL parts */
+enum {
+	SPP_USERPANE = 1,
+	SPP_MOREPROGRAMS = 2,
+	SPP_MOREPROGRAMSARROW = 3,
+	SPP_PROGLIST = 4,
+	SPP_PROGLISTSEPARATOR = 5,
+	SPP_PLACESLIST = 6,
+	SPP_PLACESLISTSEPARATOR = 7,
+	SPP_LOGOFF = 8,
+	SPP_LOGOFFBUTTONS = 9,
+	SPP_USERPICTURE = 10,
+	SPP_PREVIEW = 11
+}
+
+enum {
+	SPLS_NORMAL = 1,
+	SPLS_HOT = 2,
+	SPLS_PRESSED = 3
+}
+
+enum {
+	SPS_NORMAL = 1,
+	SPS_HOT = 2,
+	SPS_PRESSED = 3
+}
+
+/* STATUS parts */
+enum {
+	SP_PANE = 1,
+	SP_GRIPPERPANE = 2,
+	SP_GRIPPER = 3
+}
+
+/* TAB parts */
+enum {
+	TABP_TABITEM = 1,
+	TABP_TABITEMLEFTEDGE = 2,
+	TABP_TABITEMRIGHTEDGE = 3,
+	TABP_TABITEMBOTHEDGE = 4,
+	TABP_TOPTABITEM = 5,
+	TABP_TOPTABITEMLEFTEDGE = 6,
+	TABP_TOPTABITEMRIGHTEDGE = 7,
+	TABP_TOPTABITEMBOTHEDGE = 8,
+	TABP_PANE = 9,
+	TABP_BODY = 10
+}
+
+enum {
+	TIS_NORMAL = 1,
+	TIS_HOT = 2,
+	TIS_SELECTED = 3,
+	TIS_DISABLED = 4,
+	TIS_FOCUSED = 5
+}
+
+enum {
+	TIBES_NORMAL = 1,
+	TIBES_HOT = 2,
+	TIBES_SELECTED = 3,
+	TIBES_DISABLED = 4,
+	TIBES_FOCUSED = 5
+}
+
+enum {
+	TILES_NORMAL = 1,
+	TILES_HOT = 2,
+	TILES_SELECTED = 3,
+	TILES_DISABLED = 4,
+	TILES_FOCUSED = 5
+}
+
+enum {
+	TIRES_NORMAL = 1,
+	TIRES_HOT = 2,
+	TIRES_SELECTED = 3,
+	TIRES_DISABLED = 4,
+	TIRES_FOCUSED = 5
+}
+
+enum {
+	TTIS_NORMAL = 1,
+	TTIS_HOT = 2,
+	TTIS_SELECTED = 3,
+	TTIS_DISABLED = 4,
+	TTIS_FOCUSED = 5
+}
+
+enum {
+	TTIBES_NORMAL = 1,
+	TTIBES_HOT = 2,
+	TTIBES_SELECTED = 3,
+	TTIBES_DISABLED = 4,
+	TTIBES_FOCUSED = 5
+}
+
+enum {
+	TTILES_NORMAL = 1,
+	TTILES_HOT = 2,
+	TTILES_SELECTED = 3,
+	TTILES_DISABLED = 4,
+	TTILES_FOCUSED = 5
+}
+
+enum {
+	TTIRES_NORMAL = 1,
+	TTIRES_HOT = 2,
+	TTIRES_SELECTED = 3,
+	TTIRES_DISABLED = 4,
+	TTIRES_FOCUSED = 5
+}
+
+/* TASKBAND parts */
+enum {
+	TDP_GROUPCOUNT = 1,
+	TDP_FLASHBUTTON = 2,
+	TDP_FLASHBUTTONGROUPMENU = 3
+}
+
+/* TASKBAR parts */
+enum {
+	TBP_BACKGROUNDBOTTOM = 1,
+	TBP_BACKGROUNDRIGHT = 2,
+	TBP_BACKGROUNDTOP = 3,
+	TBP_BACKGROUNDLEFT = 4,
+	TBP_SIZINGBARBOTTOM = 5,
+	TBP_SIZINGBARRIGHT = 6,
+	TBP_SIZINGBARTOP = 7,
+	TBP_SIZINGBARLEFT = 8
+}
+
+/* TOOLBAR parts */
+enum {
+	TP_BUTTON = 1,
+	TP_DROPDOWNBUTTON = 2,
+	TP_SPLITBUTTON = 3,
+	TP_SPLITBUTTONDROPDOWN = 4,
+	TP_SEPARATOR = 5,
+	TP_SEPARATORVERT = 6
+}
+
+enum {
+	TS_NORMAL = 1,
+	TS_HOT = 2,
+	TS_PRESSED = 3,
+	TS_DISABLED = 4,
+	TS_CHECKED = 5,
+	TS_HOTCHECKED = 6
+}
+
+/* TOOLTIP parts */
+enum {
+	TTP_STANDARD = 1,
+	TTP_STANDARDTITLE = 2,
+	TTP_BALLOON = 3,
+	TTP_BALLOONTITLE = 4,
+	TTP_CLOSE = 5
+}
+
+enum {
+	TTBS_NORMAL = 1,
+	TTBS_LINK = 2
+}
+
+enum {
+	TTCS_NORMAL = 1,
+	TTCS_HOT = 2,
+	TTCS_PRESSED = 3
+}
+
+enum {
+	TTSS_NORMAL = 1,
+	TTSS_LINK = 2
+}
+
+/* TRACKBAR parts */
+enum {
+	TKP_TRACK = 1,
+	TKP_TRACKVERT = 2,
+	TKP_THUMB = 3,
+	TKP_THUMBBOTTOM = 4,
+	TKP_THUMBTOP = 5,
+	TKP_THUMBVERT = 6,
+	TKP_THUMBLEFT = 7,
+	TKP_THUMBRIGHT = 8,
+	TKP_TICS = 9,
+	TKP_TICSVERT = 10
+}
+
+enum {
+	TUS_NORMAL = 1,
+	TUS_HOT = 2,
+	TUS_PRESSED = 3,
+	TUS_FOCUSED = 4,
+	TUS_DISABLED = 5
+}
+
+enum {
+	TUBS_NORMAL = 1,
+	TUBS_HOT = 2,
+	TUBS_PRESSED = 3,
+	TUBS_FOCUSED = 4,
+	TUBS_DISABLED = 5
+}
+
+enum {
+	TUVLS_NORMAL = 1,
+	TUVLS_HOT = 2,
+	TUVLS_PRESSED = 3,
+	TUVLS_FOCUSED = 4,
+	TUVLS_DISABLED = 5
+}
+
+enum {
+	TUVRS_NORMAL = 1,
+	TUVRS_HOT = 2,
+	TUVRS_PRESSED = 3,
+	TUVRS_FOCUSED = 4,
+	TUVRS_DISABLED = 5
+}
+
+enum {
+	TUTS_NORMAL = 1,
+	TUTS_HOT = 2,
+	TUTS_PRESSED = 3,
+	TUTS_FOCUSED = 4,
+	TUTS_DISABLED = 5
+}
+
+enum {
+	TUVS_NORMAL = 1,
+	TUVS_HOT = 2,
+	TUVS_PRESSED = 3,
+	TUVS_FOCUSED = 4,
+	TUVS_DISABLED = 5
+}
+
+enum {
+	TSS_NORMAL = 1
+}
+
+enum {
+	TSVS_NORMAL = 1
+}
+
+enum {
+	TRS_NORMAL = 1
+}
+
+enum {
+	TRVS_NORMAL = 1
+}
+
+/* TRAYNOTIFY parts */
+enum {
+	TNP_BACKGROUND = 1,
+	TNP_ANIMBACKGROUND = 2
+}
+
+/* TREEVIEW parts */
+enum {
+	TVP_TREEITEM = 1,
+	TVP_GLYPH = 2,
+	TVP_BRANCH = 3
+}
+
+enum {
+	GLPS_CLOSED = 1,
+	GLPS_OPENED = 2
+}
+
+enum {
+	TREIS_NORMAL = 1,
+	TREIS_HOT = 2,
+	TREIS_SELECTED = 3,
+	TREIS_DISABLED = 4,
+	TREIS_SELECTEDNOTFOCUS = 5
+}
+
+/* WINDOW parts */
+enum {
+	WP_CAPTION = 1,
+	WP_SMALLCAPTION = 2,
+	WP_MINCAPTION = 3,
+	WP_SMALLMINCAPTION = 4,
+	WP_MAXCAPTION = 5,
+	WP_SMALLMAXCAPTION = 6,
+	WP_FRAMELEFT = 7,
+	WP_FRAMERIGHT = 8,
+	WP_FRAMEBOTTOM = 9,
+	WP_SMALLFRAMELEFT = 10,
+	WP_SMALLFRAMERIGHT = 11,
+	WP_SMALLFRAMEBOTTOM = 12,
+	WP_SYSBUTTON = 13,
+	WP_MDISYSBUTTON = 14,
+	WP_MINBUTTON = 15,
+	WP_MDIMINBUTTON = 16,
+	WP_MAXBUTTON = 17,
+	WP_CLOSEBUTTON = 18,
+	WP_SMALLCLOSEBUTTON = 19,
+	WP_MDICLOSEBUTTON = 20,
+	WP_RESTOREBUTTON = 21,
+	WP_MDIRESTOREBUTTON = 22,
+	WP_HELPBUTTON = 23,
+	WP_MDIHELPBUTTON = 24,
+	WP_HORZSCROLL = 25,
+	WP_HORZTHUMB = 26,
+	WP_VERTSCROLL = 27,
+	WP_VERTTHUMB = 28,
+	WP_DIALOG = 29,
+	WP_CAPTIONSIZINGTEMPLATE = 30,
+	WP_SMALLCAPTIONSIZINGTEMPLATE = 31,
+	WP_FRAMELEFTSIZINGTEMPLATE = 32,
+	WP_SMALLFRAMELEFTSIZINGTEMPLATE = 33,
+	WP_FRAMERIGHTSIZINGTEMPLATE = 34,
+	WP_SMALLFRAMERIGHTSIZINGTEMPLATE = 35,
+	WP_FRAMEBOTTOMSIZINGTEMPLATE = 36,
+	WP_SMALLFRAMEBOTTOMSIZINGTEMPLATE = 37
+}
+
+enum {
+	CS_ACTIVE = 1,
+	CS_INACTIVE = 2,
+	CS_DISABLED = 3
+}
+
+enum {
+	CBS_NORMAL = 1,
+	CBS_HOT = 2,
+	CBS_PUSHED = 3,
+	CBS_DISABLED = 4
+}
+
+enum {
+	FS_ACTIVE = 1,
+	FS_INACTIVE = 2
+}
+
+enum {
+	HBS_NORMAL = 1,
+	HBS_HOT = 2,
+	HBS_PUSHED = 3,
+	HBS_DISABLED = 4
+}
+
+enum {
+	HSS_NORMAL = 1,
+	HSS_HOT = 2,
+	HSS_PUSHED = 3,
+	HSS_DISABLED = 4
+}
+
+enum {
+	HTS_NORMAL = 1,
+	HTS_HOT = 2,
+	HTS_PUSHED = 3,
+	HTS_DISABLED = 4
+}
+
+enum {
+	MAXBS_NORMAL = 1,
+	MAXBS_HOT = 2,
+	MAXBS_PUSHED = 3,
+	MAXBS_DISABLED = 4
+}
+
+enum {
+	MXCS_ACTIVE = 1,
+	MXCS_INACTIVE = 2,
+	MXCS_DISABLED = 3
+}
+
+enum {
+	MINBS_NORMAL = 1,
+	MINBS_HOT = 2,
+	MINBS_PUSHED = 3,
+	MINBS_DISABLED = 4
+}
+
+enum {
+	RBS_NORMAL = 1,
+	RBS_HOT = 2,
+	RBS_PUSHED = 3,
+	RBS_DISABLED = 4
+}
+
+enum {
+	SBS_NORMAL = 1,
+	SBS_HOT = 2,
+	SBS_PUSHED = 3,
+	SBS_DISABLED = 4
+}
+
+enum {
+	MNCS_ACTIVE = 1,
+	MNCS_INACTIVE = 2,
+	MNCS_DISABLED = 3
+}
+
+enum {
+	VSS_NORMAL = 1,
+	VSS_HOT = 2,
+	VSS_PUSHED = 3,
+	VSS_DISABLED = 4
+}
+
+enum {
+	VTS_NORMAL = 1,
+	VTS_HOT = 2,
+	VTS_PUSHED = 3,
+	VTS_DISABLED = 4
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/unknwn.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,55 @@
+/***********************************************************************\
+*                                unknwn.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.unknwn;
+
+import win32.objfwd, win32.windef, win32.wtypes;
+private import win32.basetyps;
+
+extern (Windows) {
+	void* MIDL_user_allocate(size_t);
+	void MIDL_user_free(void*);
+}
+
+
+extern (Windows) {
+
+	interface IUnknown {
+		HRESULT QueryInterface(IID* riid, void** pvObject);
+		ULONG AddRef();
+		ULONG Release();
+	}
+
+	alias IUnknown LPUNKNOWN;
+
+	interface IClassFactory : IUnknown {
+		HRESULT CreateInstance(IUnknown UnkOuter, IID* riid, void** pvObject);
+		HRESULT LockServer(BOOL fLock);
+	}
+	alias IClassFactory LPCLASSFACTORY;
+
+	/+
+	// These do not seem to be necessary (or desirable) for D.
+	HRESULT IUnknown_QueryInterface_Proxy(IUnknown*,REFIID,void**);
+	ULONG IUnknown_AddRef_Proxy(IUnknown*);
+	ULONG IUnknown_Release_Proxy(IUnknown*);
+	HRESULT IClassFactory_RemoteCreateInstance_Proxy(IClassFactory*,REFIID,IUnknown**);
+	HRESULT IClassFactory_RemoteLockServer_Proxy(IClassFactory*,BOOL);
+	HRESULT IClassFactory_CreateInstance_Proxy(IClassFactory*,IUnknown*,REFIID,void**);
+	HRESULT IClassFactory_CreateInstance_Stub(IClassFactory*,REFIID,IUnknown**);
+	HRESULT IClassFactory_LockServer_Proxy(IClassFactory*,BOOL);
+	HRESULT IClassFactory_LockServer_Stub(IClassFactory*,BOOL);
+
+	void IUnknown_QueryInterface_Stub(LPRPCSTUBBUFFER,LPRPCCHANNELBUFFER,PRPC_MESSAGE,PDWORD);
+	void IUnknown_AddRef_Stub(LPRPCSTUBBUFFER,LPRPCCHANNELBUFFER,PRPC_MESSAGE,PDWORD);
+	void IUnknown_Release_Stub(LPRPCSTUBBUFFER,LPRPCCHANNELBUFFER,PRPC_MESSAGE,PDWORD);
+	void IClassFactory_RemoteCreateInstance_Stub(LPRPCSTUBBUFFER,LPRPCCHANNELBUFFER,PRPC_MESSAGE,PDWORD);
+	void IClassFactory_RemoteLockServer_Stub(LPRPCSTUBBUFFER,LPRPCCHANNELBUFFER,PRPC_MESSAGE,PDWORD);
+	+/
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/usp10.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,334 @@
+/* USP - Unicode Complex Script processor
+ * http://msdn2.microsoft.com/library/ms776488 */
+
+
+module win32.usp10;
+import win32.windows;
+
+
+
+/* Uniscribe Enumeration Types
+ * http://msdn2.microsoft.com/library/ms776518 */
+
+enum : WORD {
+	SCRIPT_UNDEFINED = 0,
+}
+
+enum : DWORD {
+	SGCM_RTL = 0x00000001,
+}
+
+enum : DWORD {
+	SSA_PASSWORD        = 0x00000001,
+	SSA_TAB             = 0x00000002,
+	SSA_CLIP            = 0x00000004,
+	SSA_FIT             = 0x00000008,
+	SSA_DZWG            = 0x00000010,
+	SSA_FALLBACK        = 0x00000020,
+	SSA_BREAK           = 0x00000040,
+	SSA_GLYPHS          = 0x00000080,
+	SSA_RTL             = 0x00000100,
+	SSA_GCP             = 0x00000200,
+	SSA_HOTKEY          = 0x00000400,
+	SSA_METAFILE        = 0x00000800,
+	SSA_LINK            = 0x00001000,
+	SSA_HIDEHOTKEY      = 0x00002000,
+	SSA_HOTKEYONLY      = 0x00002400,
+	SSA_FULLMEASURE     = 0x04000000,
+	SSA_LPKANSIFALLBACK = 0x08000000,
+	SSA_PIDX            = 0x10000000,
+	SSA_LAYOUTRTL       = 0x20000000,
+	SSA_DONTGLYPH       = 0x40000000,
+	SSA_NOKASHIDA       = 0x80000000,
+}
+
+enum : DWORD {
+	SIC_COMPLEX    = 1,
+	SIC_ASCIIDIGIT = 2,
+	SIC_NEUTRAL    = 4,
+}
+
+enum : DWORD {
+	SCRIPT_DIGITSUBSTITUTE_CONTEXT,
+	SCRIPT_DIGITSUBSTITUTE_NONE,
+	SCRIPT_DIGITSUBSTITUTE_NATIONAL,
+	SCRIPT_DIGITSUBSTITUTE_TRADITIONAL,
+}
+
+enum SCRIPT_JUSTIFY : WORD {
+    SCRIPT_JUSTIFY_NONE,
+    SCRIPT_JUSTIFY_ARABIC_BLANK,
+    SCRIPT_JUSTIFY_CHARACTER,
+    SCRIPT_JUSTIFY_RESERVED1,
+    SCRIPT_JUSTIFY_BLANK,
+    SCRIPT_JUSTIFY_RESERVED2,
+    SCRIPT_JUSTIFY_RESERVED3,
+    SCRIPT_JUSTIFY_ARABIC_NORMAL,
+    SCRIPT_JUSTIFY_ARABIC_KASHIDA,
+    SCRIPT_JUSTIFY_ARABIC_ALEF,
+    SCRIPT_JUSTIFY_ARABIC_HA,
+    SCRIPT_JUSTIFY_ARABIC_RA,
+    SCRIPT_JUSTIFY_ARABIC_BA,
+    SCRIPT_JUSTIFY_ARABIC_BARA,
+    SCRIPT_JUSTIFY_ARABIC_SEEN,
+    SCRIPT_JUSTIFY_ARABIC_SEEN_M,
+}
+
+
+
+/* Uniscribe Structures
+ * http://msdn2.microsoft.com/library/ms776479 */
+
+alias void* SCRIPT_CACHE;
+alias void* SCRIPT_STRING_ANALYSIS;
+
+extern (C)
+{
+	struct SCRIPT_CONTROL
+	{
+		private DWORD _bitfield;
+		DWORD uDefaultLanguage()             { return (_bitfield >> 0) & 0xFFFF; }
+		DWORD uDefaultLanguage(DWORD val)    { _bitfield = cast(DWORD)((_bitfield & 0xFFFFFFFFFFFF0000) | (val << 0)); return val; }
+		DWORD fContextDigits()               { return (_bitfield >> 16) & 0x1; }
+		DWORD fContextDigits(DWORD val)      { _bitfield = cast(DWORD)((_bitfield & 0xFFFFFFFFFFFEFFFF) | (val << 16)); return val; }
+		DWORD fInvertPreBoundDir()           { return (_bitfield >> 17) & 0x1; }
+		DWORD fInvertPreBoundDir(DWORD val)  { _bitfield = cast(DWORD)((_bitfield & 0xFFFFFFFFFFFDFFFF) | (val << 17)); return val; }
+		DWORD fInvertPostBoundDir()          { return (_bitfield >> 18) & 0x1; }
+		DWORD fInvertPostBoundDir(DWORD val) { _bitfield = cast(DWORD)((_bitfield & 0xFFFFFFFFFFFBFFFF) | (val << 18)); return val; }
+		DWORD fLinkStringBefore()            { return (_bitfield >> 19) & 0x1; }
+		DWORD fLinkStringBefore(DWORD val)   { _bitfield = cast(DWORD)((_bitfield & 0xFFFFFFFFFFF7FFFF) | (val << 19)); return val; }
+		DWORD fLinkStringAfter()             { return (_bitfield >> 20) & 0x1; }
+		DWORD fLinkStringAfter(DWORD val)    { _bitfield = cast(DWORD)((_bitfield & 0xFFFFFFFFFFEFFFFF) | (val << 20)); return val; }
+		DWORD fNeutralOverride()             { return (_bitfield >> 21) & 0x1; }
+		DWORD fNeutralOverride(DWORD val)    { _bitfield = cast(DWORD)((_bitfield & 0xFFFFFFFFFFDFFFFF) | (val << 21)); return val; }
+		DWORD fNumericOverride()             { return (_bitfield >> 22) & 0x1; }
+		DWORD fNumericOverride(DWORD val)    { _bitfield = cast(DWORD)((_bitfield & 0xFFFFFFFFFFBFFFFF) | (val << 22)); return val; }
+		DWORD fLegacyBidiClass()             { return (_bitfield >> 23) & 0x1; }
+		DWORD fLegacyBidiClass(DWORD val)    { _bitfield = cast(DWORD)((_bitfield & 0xFFFFFFFFFF7FFFFF) | (val << 23)); return val; }
+		DWORD fReserved()                    { return (_bitfield >> 24) & 0xFF; }
+		DWORD fReserved(DWORD val)           { _bitfield = cast(DWORD)((_bitfield & 0xFFFFFFFF00FFFFFF) | (val << 24)); return val; }
+	}
+
+	struct SCRIPT_STATE
+	{
+		private WORD _bitfield;
+		WORD uBidiLevel()                 { return cast(WORD)((_bitfield >> 0) & 0x1F); }
+		WORD uBidiLevel(WORD val)         { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFFE0) | (val << 0)); return val; }
+		WORD fOverrideDirection()         { return cast(WORD)((_bitfield >> 5) & 0x1); }
+		WORD fOverrideDirection(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFFDF) | (val << 5)); return val; }
+		WORD fInhibitSymSwap()            { return cast(WORD)((_bitfield >> 6) & 0x1); }
+		WORD fInhibitSymSwap(WORD val)    { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFFBF) | (val << 6)); return val; }
+		WORD fCharShape()                 { return cast(WORD)((_bitfield >> 7) & 0x1); }
+		WORD fCharShape(WORD val)         { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFF7F) | (val << 7)); return val; }
+		WORD fDigitSubstitute()           { return cast(WORD)((_bitfield >> 8) & 0x1); }
+		WORD fDigitSubstitute(WORD val)   { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFEFF) | (val << 8)); return val; }
+		WORD fInhibitLigate()             { return cast(WORD)((_bitfield >> 9) & 0x1); }
+		WORD fInhibitLigate(WORD val)     { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFDFF) | (val << 9)); return val; }
+		WORD fDisplayZWG()                { return cast(WORD)((_bitfield >> 10) & 0x1); }
+		WORD fDisplayZWG(WORD val)        { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFBFF) | (val << 10)); return val; }
+		WORD fArabicNumContext()          { return cast(WORD)((_bitfield >> 11) & 0x1); }
+		WORD fArabicNumContext(WORD val)  { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFF7FF) | (val << 11)); return val; }
+		WORD fGcpClusters()               { return cast(WORD)((_bitfield >> 12) & 0x1); }
+		WORD fGcpClusters(WORD val)       { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFEFFF) | (val << 12)); return val; }
+		WORD fReserved()                  { return cast(WORD)((_bitfield >> 13) & 0x1); }
+		WORD fReserved(WORD val)          { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFDFFF) | (val << 13)); return val; }
+		WORD fEngineReserved()            { return cast(WORD)((_bitfield >> 14) & 0x3); }
+		WORD fEngineReserved(WORD val)    { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFF3FFF) | (val << 14)); return val; }
+	}
+
+
+	struct SCRIPT_ANALYSIS
+	{
+		private WORD _bitfield;
+		WORD eScript()               { return cast(WORD)((_bitfield >> 0) & 0x3FF); }
+		WORD eScript(WORD val)       { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFC00) | (val << 0)); return val; }
+		WORD fRTL()                  { return cast(WORD)((_bitfield >> 10) & 0x1); }
+		WORD fRTL(WORD val)          { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFBFF) | (val << 10)); return val; }
+		WORD fLayoutRTL()            { return cast(WORD)((_bitfield >> 11) & 0x1); }
+		WORD fLayoutRTL(WORD val)    { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFF7FF) | (val << 11)); return val; }
+		WORD fLinkBefore()           { return cast(WORD)((_bitfield >> 12) & 0x1); }
+		WORD fLinkBefore(WORD val)   { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFEFFF) | (val << 12)); return val; }
+		WORD fLinkAfter()            { return cast(WORD)((_bitfield >> 13) & 0x1); }
+		WORD fLinkAfter(WORD val)    { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFDFFF) | (val << 13)); return val; }
+		WORD fLogicalOrder()         { return cast(WORD)((_bitfield >> 14) & 0x1); }
+		WORD fLogicalOrder(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFBFFF) | (val << 14)); return val; }
+		WORD fNoGlyphIndex()         { return cast(WORD)((_bitfield >> 15) & 0x1); }
+		WORD fNoGlyphIndex(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFF7FFF) | (val << 15)); return val; }
+		SCRIPT_STATE s;
+	}
+
+
+	struct SCRIPT_ITEM
+	{
+		int iCharPos;
+		SCRIPT_ANALYSIS a;
+	}
+
+	struct SCRIPT_VISATTR
+	{
+		private WORD _bitfield;
+		WORD uJustification()         { return cast(WORD)((_bitfield >> 0) & 0xF); }
+		WORD uJustification(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFFF0) | (val << 0)); return val; }
+		WORD fClusterStart()          { return cast(WORD)((_bitfield >> 4) & 0x1); }
+		WORD fClusterStart(WORD val)  { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFFEF) | (val << 4)); return val; }
+		WORD fDiacritic()             { return cast(WORD)((_bitfield >> 5) & 0x1); }
+		WORD fDiacritic(WORD val)     { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFFDF) | (val << 5)); return val; }
+		WORD fZeroWidth()             { return cast(WORD)((_bitfield >> 6) & 0x1); }
+		WORD fZeroWidth(WORD val)     { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFFBF) | (val << 6)); return val; }
+		WORD fReserved()              { return cast(WORD)((_bitfield >> 7) & 0x1); }
+		WORD fReserved(WORD val)      { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFFFF7F) | (val << 7)); return val; }
+		WORD fShapeReserved()         { return cast(WORD)((_bitfield >> 8) & 0xFF); }
+		WORD fShapeReserved(WORD val) { _bitfield = cast(WORD)((_bitfield & 0xFFFFFFFFFFFF00FF) | (val << 8)); return val; }
+	}
+
+	struct GOFFSET
+	{
+		LONG du;
+		LONG dv;
+	}
+
+	struct SCRIPT_LOGATTR
+	{
+		BYTE _bitfield;
+		BYTE fSoftBreak()          { return cast(BYTE)((_bitfield >> 0) & 0x1); }
+		BYTE fSoftBreak(BYTE val)  { _bitfield = cast(BYTE)((_bitfield & 0xFFFFFFFFFFFFFFFE) | (val << 0)); return val; }
+		BYTE fWhiteSpace()         { return cast(BYTE)((_bitfield >> 1) & 0x1); }
+		BYTE fWhiteSpace(BYTE val) { _bitfield = cast(BYTE)((_bitfield & 0xFFFFFFFFFFFFFFFD) | (val << 1)); return val; }
+		BYTE fCharStop()           { return cast(BYTE)((_bitfield >> 2) & 0x1); }
+		BYTE fCharStop(BYTE val)   { _bitfield = cast(BYTE)((_bitfield & 0xFFFFFFFFFFFFFFFB) | (val << 2)); return val; }
+		BYTE fWordStop()           { return cast(BYTE)((_bitfield >> 3) & 0x1); }
+		BYTE fWordStop(BYTE val)   { _bitfield = cast(BYTE)((_bitfield & 0xFFFFFFFFFFFFFFF7) | (val << 3)); return val; }
+		BYTE fInvalid()            { return cast(BYTE)((_bitfield >> 4) & 0x1); }
+		BYTE fInvalid(BYTE val)    { _bitfield = cast(BYTE)((_bitfield & 0xFFFFFFFFFFFFFFEF) | (val << 4)); return val; }
+		BYTE fReserved()           { return cast(BYTE)((_bitfield >> 5) & 0x7); }
+		BYTE fReserved(BYTE val)   { _bitfield = cast(BYTE)((_bitfield & 0xFFFFFFFFFFFFFF1F) | (val << 5)); return val; }
+	}
+
+	struct SCRIPT_PROPERTIES
+	{
+		private DWORD _bitfield1;
+		DWORD langid()                          { return (_bitfield1 >> 0) & 0xFFFF; }
+		DWORD langid(DWORD val)                 { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFFFFFF0000) | (val << 0)); return val; }
+		DWORD fNumeric()                        { return (_bitfield1 >> 16) & 0x1; }
+		DWORD fNumeric(DWORD val)               { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFFFFFEFFFF) | (val << 16)); return val; }
+		DWORD fComplex()                        { return (_bitfield1 >> 17) & 0x1; }
+		DWORD fComplex(DWORD val)               { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFFFFFDFFFF) | (val << 17)); return val; }
+		DWORD fNeedsWordBreaking()              { return (_bitfield1 >> 18) & 0x1; }
+		DWORD fNeedsWordBreaking(DWORD val)     { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFFFFFBFFFF) | (val << 18)); return val; }
+		DWORD fNeedsCaretInfo()                 { return (_bitfield1 >> 19) & 0x1; }
+		DWORD fNeedsCaretInfo(DWORD val)        { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFFFFF7FFFF) | (val << 19)); return val; }
+		DWORD bCharSet()                        { return (_bitfield1 >> 20) & 0xFF; }
+		DWORD bCharSet(DWORD val)               { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFFF00FFFFF) | (val << 20)); return val; }
+		DWORD fControl()                        { return (_bitfield1 >> 28) & 0x1; }
+		DWORD fControl(DWORD val)               { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFFEFFFFFFF) | (val << 28)); return val; }
+		DWORD fPrivateUseArea()                 { return (_bitfield1 >> 29) & 0x1; }
+		DWORD fPrivateUseArea(DWORD val)        { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFFDFFFFFFF) | (val << 29)); return val; }
+		DWORD fNeedsCharacterJustify()          { return (_bitfield1 >> 30) & 0x1; }
+		DWORD fNeedsCharacterJustify(DWORD val) { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFFBFFFFFFF) | (val << 30)); return val; }
+		DWORD fInvalidGlyph()                   { return (_bitfield1 >> 31) & 0x1; }
+		DWORD fInvalidGlyph(DWORD val)          { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFF7FFFFFFF) | (val << 31)); return val; }
+		private DWORD _bitfield2;
+		DWORD fInvalidLogAttr()                 { return (_bitfield2 >> 0) & 0x1; }
+		DWORD fInvalidLogAttr(DWORD val)        { _bitfield2 = cast(DWORD)((_bitfield2 & 0xFFFFFFFFFFFFFFFE) | (val << 0)); return val; }
+		DWORD fCDM()                            { return (_bitfield2 >> 1) & 0x1; }
+		DWORD fCDM(DWORD val)                   { _bitfield2 = cast(DWORD)((_bitfield2 & 0xFFFFFFFFFFFFFFFD) | (val << 1)); return val; }
+		DWORD fAmbiguousCharSet()               { return (_bitfield2 >> 2) & 0x1; }
+		DWORD fAmbiguousCharSet(DWORD val)      { _bitfield2 = cast(DWORD)((_bitfield2 & 0xFFFFFFFFFFFFFFFB) | (val << 2)); return val; }
+		DWORD fClusterSizeVaries()              { return (_bitfield2 >> 3) & 0x1; }
+		DWORD fClusterSizeVaries(DWORD val)     { _bitfield2 = cast(DWORD)((_bitfield2 & 0xFFFFFFFFFFFFFFF7) | (val << 3)); return val; }
+		DWORD fRejectInvalid()                  { return (_bitfield2 >> 4) & 0x1; }
+		DWORD fRejectInvalid(DWORD val)         { _bitfield2 = cast(DWORD)((_bitfield2 & 0xFFFFFFFFFFFFFFEF) | (val << 4)); return val; }
+	}
+
+	struct SCRIPT_FONTPROPERTIES
+	{
+		int cBytes = SCRIPT_FONTPROPERTIES.sizeof;
+		WORD wgBlank;
+		WORD wgDefault;
+		WORD wgInvalid;
+		WORD wgKashida;
+		int iKashidaWidth;
+	}
+
+	struct SCRIPT_TABDEF
+	{
+		int cTabStops;
+		int iScale;
+		int* pTabStops;
+		int iTabOrigin;
+	}
+
+	struct SCRIPT_DIGITSUBSTITUTE
+	{
+		private DWORD _bitfield1;
+		DWORD NationalDigitLanguage()             { return (_bitfield1 >> 0) & 0xFFFF; }
+		DWORD NationalDigitLanguage(DWORD val)    { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFFFFFF0000) | (val << 0)); return val; }
+		DWORD TraditionalDigitLanguage()          { return (_bitfield1 >> 16) & 0xFFFF; }
+		DWORD TraditionalDigitLanguage(DWORD val) { _bitfield1 = cast(DWORD)((_bitfield1 & 0xFFFFFFFF0000FFFF) | (val << 16)); return val; }
+		private DWORD _bitfield2;
+		DWORD DigitSubstitute()                   { return (_bitfield2 >> 0) & 0xFF; }
+		DWORD DigitSubstitute(DWORD val)          { _bitfield2 = cast(DWORD)((_bitfield2 & 0xFFFFFFFFFFFFFF00) | (val << 0)); return val; }
+		DWORD dwReserved;
+	}
+
+	/* TODO: Windows Vista fearured structs
+	OPENTYPE_FEATURE_RECORD
+	OPENTYPE_TAG
+	SCRIPT_CHARPROP
+	SCRIPT_GLYPHPROP
+	TEXTRANGE_PROPERTIES
+	*/
+}
+
+
+/* Uniscribe Functions 
+ * http://msdn2.microsoft.com/library/ms776469 */
+extern (Windows)
+{
+	HRESULT ScriptFreeCache(SCRIPT_CACHE*);
+	HRESULT ScriptItemize(WCHAR*, int, int, SCRIPT_CONTROL*, SCRIPT_STATE*, SCRIPT_ITEM*, int*);
+	HRESULT ScriptLayout(int, BYTE*, int*, int*);
+	HRESULT ScriptShape(HDC, SCRIPT_CACHE*, WCHAR*, int, int, SCRIPT_ANALYSIS*, WORD*, WORD*, SCRIPT_VISATTR*, int*);
+	HRESULT ScriptPlace(HDC, SCRIPT_CACHE*, WORD*, int, SCRIPT_VISATTR*, SCRIPT_ANALYSIS*, int*, GOFFSET*, ABC*);
+	HRESULT ScriptTextOut(HDC, SCRIPT_CACHE*, int, int, UINT, RECT*, SCRIPT_ANALYSIS*, WCHAR*, int, WORD*, int, int*, int*, GOFFSET*);
+	HRESULT ScriptJustify(SCRIPT_VISATTR*, int*, int, int, int, int*);
+	HRESULT ScriptBreak(WCHAR*, int, SCRIPT_ANALYSIS*, SCRIPT_LOGATTR*);
+	HRESULT ScriptCPtoX(int, BOOL, int, int, WORD*, SCRIPT_VISATTR*, int*, SCRIPT_ANALYSIS*, int*);
+	HRESULT ScriptXtoCP(int, int, int, WORD*, SCRIPT_VISATTR*, int*, SCRIPT_ANALYSIS*, int*, int*);
+	HRESULT ScriptGetLogicalWidths(SCRIPT_ANALYSIS*, int, int, int*, WORD*, SCRIPT_VISATTR*, int*);
+	HRESULT ScriptApplyLogicalWidth(int*, int, int, WORD*, SCRIPT_VISATTR*, int*, SCRIPT_ANALYSIS*, ABC*, int*);
+	HRESULT ScriptGetCMap(HDC, SCRIPT_CACHE*, WCHAR*, int, DWORD, WORD*);
+	HRESULT ScriptGetGlyphABCWidth(HDC, SCRIPT_CACHE*, WORD, ABC*);
+	HRESULT ScriptGetProperties(SCRIPT_PROPERTIES***, int*);
+	HRESULT ScriptGetFontProperties(HDC, SCRIPT_CACHE*, SCRIPT_FONTPROPERTIES*);
+	HRESULT ScriptCacheGetHeight(HDC, SCRIPT_CACHE*, int*);
+	HRESULT ScriptIsComplex(WCHAR*, int, DWORD);
+	HRESULT ScriptRecordDigitSubstitution(LCID, SCRIPT_DIGITSUBSTITUTE*);
+	HRESULT ScriptApplyDigitSubstitution(SCRIPT_DIGITSUBSTITUTE*, SCRIPT_CONTROL*, SCRIPT_STATE*);
+
+	/* ScriptString Functions
+	 * http://msdn2.microsoft.com/library/ms776485 */
+	HRESULT ScriptStringAnalyse(HDC, void*, int, int, int, DWORD, int, SCRIPT_CONTROL*, SCRIPT_STATE*, int*, SCRIPT_TABDEF*, BYTE*, SCRIPT_STRING_ANALYSIS*);
+	HRESULT ScriptStringFree(SCRIPT_STRING_ANALYSIS*);
+	SIZE* ScriptString_pSize(SCRIPT_STRING_ANALYSIS);
+	int* ScriptString_pcOutChars(SCRIPT_STRING_ANALYSIS);
+	SCRIPT_LOGATTR* ScriptString_pLogAttr(SCRIPT_STRING_ANALYSIS);
+	HRESULT ScriptStringGetOrder(SCRIPT_STRING_ANALYSIS, UINT*);
+	HRESULT ScriptStringCPtoX(SCRIPT_STRING_ANALYSIS, int, BOOL, int*);
+	HRESULT ScriptStringXtoCP(SCRIPT_STRING_ANALYSIS, int, int*, int*);
+	HRESULT ScriptStringGetLogicalWidths(SCRIPT_STRING_ANALYSIS, int*);
+	HRESULT ScriptStringValidate(SCRIPT_STRING_ANALYSIS);
+	HRESULT ScriptStringOut(SCRIPT_STRING_ANALYSIS, int, int, UINT, RECT*, int, int, BOOL);
+
+	/* TODO: Windows Vista fearured functions
+	ScriptGetFontAlternateGlyphs()
+	ScriptGetFontFeatureTags()
+	ScriptGetFontLanguageTags()
+	ScriptGetFontScriptTags()
+	ScriptItemizeOpenType()
+	ScriptPlaceOpenType()
+	ScriptPositionSingleGlyph()
+	ScriptShapeOpenType()
+	ScriptSubstituteSingleGlyph()
+	*/
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/uuid.di	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,4069 @@
+module win32.uuid;
+
+import win32.basetyps;
+
+export
+extern(C) {
+ const IID _DBBMKGUID = {0xF6304BB0, 0xD188, 0x11CD, [0xAD, 0x48, 0x00, 0xAA, 0x00, 0x3C, 0x9C, 0xB6]};
+ const IID _DBCIDGUID = {0xFE284700, 0xD188, 0x11CD, [0xAD, 0x48, 0x00, 0xAA, 0x00, 0x3C, 0x9C, 0xB6]};
+ const IID _GUID_NAMEONLY = {0xE8BF1170, 0xD188, 0x11CD, [0xAD, 0x48, 0x00, 0xAA, 0x00, 0x3C, 0x9C, 0xB6]};
+ const IID ARRAYID_PathProperties = {0x7ECBBA04, 0x2D97, 0x11CF, [0xA2, 0x29, 0x00, 0xAA, 0x00, 0x3D, 0x73, 0x52]};
+ const IID BFID_GRAY_16 = {0xF9D6BC00, 0x449C, 0x11D0, [0x91, 0x8C, 0x00, 0xAA, 0x00, 0x6C, 0x1A, 0x01]};
+ const IID BFID_GRAY_8 = {0xD93DE910, 0x449C, 0x11D0, [0x91, 0x8C, 0x00, 0xAA, 0x00, 0x6C, 0x1A, 0x01]};
+ const IID BFID_MONOCHROME = {0xE436EB78, 0x524F, 0x11CE, [0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70]};
+ const IID BFID_RGB_24 = {0xE436EB7D, 0x524F, 0x11CE, [0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70]};
+ const IID BFID_RGB_32 = {0xE436EB7E, 0x524F, 0x11CE, [0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70]};
+ const IID BFID_RGB_4 = {0xE436EB79, 0x524F, 0x11CE, [0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70]};
+ const IID BFID_RGB_555 = {0xE436EB7C, 0x524F, 0x11CE, [0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70]};
+ const IID BFID_RGB_565 = {0xE436EB7B, 0x524F, 0x11CE, [0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70]};
+ const IID BFID_RGB_8 = {0xE436EB7A, 0x524F, 0x11CE, [0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70]};
+ const IID BFID_RGBA_32 = {0x773C9AC0, 0x3274, 0x11D0, [0xB7, 0x24, 0x00, 0xAA, 0x00, 0x6C, 0x1A, 0x01]};
+ const IID BHID_LinkTargetItem = {0x3981E228, 0xF559, 0x11D3, [0x8E, 0x3A, 0x00, 0xC0, 0x4F, 0x68, 0x37, 0xD5]};
+ const IID BHID_SFObject = {0x3981E224, 0xF559, 0x11D3, [0x8E, 0x3A, 0x00, 0xC0, 0x4F, 0x68, 0x37, 0xD5]};
+ const IID BHID_SFUIObject = {0x3981E225, 0xF559, 0x11D3, [0x8E, 0x3A, 0x00, 0xC0, 0x4F, 0x68, 0x37, 0xD5]};
+ const IID BHID_SFViewObject = {0x3981E226, 0xF559, 0x11D3, [0x8E, 0x3A, 0x00, 0xC0, 0x4F, 0x68, 0x37, 0xD5]};
+ const IID BHID_Storage = {0x3981E227, 0xF559, 0x11D3, [0x8E, 0x3A, 0x00, 0xC0, 0x4F, 0x68, 0x37, 0xD5]};
+ const IID BHID_StorageEnum = {0x4621A4E3, 0xF0D6, 0x4773, [0x8A, 0x9C, 0x46, 0xE7, 0x7B, 0x17, 0x48, 0x40]};
+ const IID BHID_Stream = {0x1CEBB3AB, 0x7C10, 0x499A, [0xA4, 0x17, 0x92, 0xCA, 0x16, 0xC4, 0xCB, 0x83]};
+ const IID CATID_BrowsableShellExt = {0x00021490, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CATID_BrowseInPlace = {0x00021491, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CATID_ClusCfgCapabilities = {0x4653EEC4, 0x2788, 0x4EBD, [0xA8, 0x31, 0x7E, 0x0D, 0x9F, 0x82, 0xD6, 0xE7]};
+ const IID CATID_ClusCfgMemberSetChangeListener = {0x8A43EAD4, 0x10F1, 0x440D, [0x8D, 0xAA, 0x1F, 0xE3, 0x8D, 0x16, 0x98, 0xCD]};
+ const IID CATID_ClusCfgResourceTypes = {0x7C4CAE52, 0xCAC9, 0x499D, [0x82, 0xC6, 0xBC, 0x6A, 0x21, 0x77, 0xE5, 0x56]};
+ const IID CATID_ClusCfgStartupListeners = {0xDF406DB4, 0x7872, 0x4A99, [0xBB, 0x3C, 0x14, 0xA9, 0xC3, 0x39, 0x33, 0xD1]};
+ const IID CATID_CommBand = {0x00021494, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CATID_Control = {0x40FC6ED4, 0x2438, 0x11CF, [0xA3, 0xDB, 0x08, 0x00, 0x36, 0xF1, 0x25, 0x02]};
+ const IID CATID_DesignTimeUIActivatableControl = {0xF2BB56D1, 0xDB07, 0x11D1, [0xAA, 0x6B, 0x00, 0x60, 0x97, 0xDB, 0x95, 0x39]};
+ const IID CATID_DeskBand = {0x00021492, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CATID_DocObject = {0x40FC6ED8, 0x2438, 0x11CF, [0xA3, 0xDB, 0x08, 0x00, 0x36, 0xF1, 0x25, 0x02]};
+ const IID CATID_EnumClusCfgManagedResources = {0x02A34F88, 0xD31A, 0x4688, [0xBD, 0xDD, 0x38, 0xA7, 0x39, 0xE4, 0xF8, 0x9B]};
+ const IID CATID_InfoBand = {0x00021493, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CATID_Insertable = {0x40FC6ED3, 0x2438, 0x11CF, [0xA3, 0xDB, 0x08, 0x00, 0x36, 0xF1, 0x25, 0x02]};
+ const IID CATID_InternetAware = {0x0DE86A58, 0x2BAA, 0x11CF, [0xA2, 0x29, 0x00, 0xAA, 0x00, 0x3D, 0x73, 0x52]};
+ const IID CATID_IsShortcut = {0x40FC6ED6, 0x2438, 0x11CF, [0xA3, 0xDB, 0x08, 0x00, 0x36, 0xF1, 0x25, 0x02]};
+ const IID CATID_MARSHALER = {0x00000003, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CATID_NeverShowExt = {0x40FC6ED7, 0x2438, 0x11CF, [0xA3, 0xDB, 0x08, 0x00, 0x36, 0xF1, 0x25, 0x02]};
+ const IID CATID_PersistsToFile = {0x0DE86A56, 0x2BAA, 0x11CF, [0xA2, 0x29, 0x00, 0xAA, 0x00, 0x3D, 0x73, 0x52]};
+ const IID CATID_PersistsToMemory = {0x0DE86A55, 0x2BAA, 0x11CF, [0xA2, 0x29, 0x00, 0xAA, 0x00, 0x3D, 0x73, 0x52]};
+ const IID CATID_PersistsToMoniker = {0x0DE86A51, 0x2BAA, 0x11CF, [0xA2, 0x29, 0x00, 0xAA, 0x00, 0x3D, 0x73, 0x52]};
+ const IID CATID_PersistsToPropertyBag = {0x0DE86A57, 0x2BAA, 0x11CF, [0xA2, 0x29, 0x00, 0xAA, 0x00, 0x3D, 0x73, 0x52]};
+ const IID CATID_PersistsToStorage = {0x0DE86A52, 0x2BAA, 0x11CF, [0xA2, 0x29, 0x00, 0xAA, 0x00, 0x3D, 0x73, 0x52]};
+ const IID CATID_PersistsToStream = {0x0DE86A54, 0x2BAA, 0x11CF, [0xA2, 0x29, 0x00, 0xAA, 0x00, 0x3D, 0x73, 0x52]};
+ const IID CATID_PersistsToStreamInit = {0x0DE86A53, 0x2BAA, 0x11CF, [0xA2, 0x29, 0x00, 0xAA, 0x00, 0x3D, 0x73, 0x52]};
+ const IID CATID_Printable = {0x40FC6ED9, 0x2438, 0x11CF, [0xA3, 0xDB, 0x08, 0x00, 0x36, 0xF1, 0x25, 0x02]};
+ const IID CATID_Programmable = {0x40FC6ED5, 0x2438, 0x11CF, [0xA3, 0xDB, 0x08, 0x00, 0x36, 0xF1, 0x25, 0x02]};
+ const IID CATID_RequiresDataPathHost = {0x0DE86A50, 0x2BAA, 0x11CF, [0xA2, 0x29, 0x00, 0xAA, 0x00, 0x3D, 0x73, 0x52]};
+ const IID CATID_SafeForInitializing = {0x7DD95802, 0x9882, 0x11CF, [0x9F, 0xA9, 0x00, 0xAA, 0x00, 0x6C, 0x42, 0xC4]};
+ const IID CATID_SafeForScripting = {0x7DD95801, 0x9882, 0x11CF, [0x9F, 0xA9, 0x00, 0xAA, 0x00, 0x6C, 0x42, 0xC4]};
+ const IID CGID_DocHostCommandHandler = {0xF38BC242, 0xB950, 0x11D1, [0x89, 0x18, 0x00, 0xC0, 0x4F, 0xC2, 0xC8, 0x36]};
+ const IID CGID_DownloadHost = {0xE0608728, 0xAE4C, 0x11D1, [0xBA, 0x40, 0x00, 0xC0, 0x4F, 0xB9, 0x2D, 0x79]};
+ const IID CGID_Explorer = {0x000214D0, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CGID_ExplorerBarDoc = {0x000214D3, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CGID_InternetExplorer = {0xEB7EED00, 0xF74D, 0x11D2, [0xBB, 0x7F, 0x00, 0x10, 0x4B, 0x35, 0xE7, 0xF9]};
+ const IID CGID_MSHTML = {0xDE4BA900, 0x59CA, 0x11CF, [0x95, 0x92, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID CGID_ShellDocView = {0x000214D1, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CGID_ShellServiceObject = {0x000214D2, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CGID_ShortCut = {0x93A68750, 0x951A, 0x11D1, [0x94, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]};
+ const IID CLSID_1 = {0xD34F1813, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_2 = {0xD34F1814, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_3 = {0xD34F1815, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_4 = {0xD34F1816, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_5 = {0xD34F1817, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_6 = {0xD34F1818, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_7 = {0xD34F1819, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_8 = {0xD34F181A, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_9 = {0xD34F181B, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_a = {0xD34F181C, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_AboutProtocol = {0x3050F406, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_AccessControlEntry = {0xB75AC000, 0x9BDD, 0x11D0, [0x85, 0x2C, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID CLSID_AccessControlList = {0xB85EA052, 0x9BDD, 0x11D0, [0x85, 0x2C, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID CLSID_AccountDiscovery = {0x3DAB30ED, 0x8132, 0x40BF, [0xA8, 0xBA, 0x7B, 0x50, 0x57, 0xF0, 0xCD, 0x10]};
+ const IID CLSID_ACLCustomMRU = {0x6935DB93, 0x21E8, 0x4CCC, [0xBE, 0xB9, 0x9F, 0xE3, 0xC7, 0x7A, 0x29, 0x7A]};
+ const IID CLSID_ACLHistory = {0x00BB2764, 0x6A77, 0x11D0, [0xA5, 0x35, 0x00, 0xC0, 0x4F, 0xD7, 0xD0, 0x62]};
+ const IID CLSID_ACListISF = {0x03C036F1, 0xA186, 0x11D0, [0x82, 0x4A, 0x00, 0xAA, 0x00, 0x5B, 0x43, 0x83]};
+ const IID CLSID_ACLMRU = {0x6756A641, 0xDE71, 0x11D0, [0x83, 0x1B, 0x00, 0xAA, 0x00, 0x5B, 0x43, 0x83]};
+ const IID CLSID_ACLMulti = {0x00BB2765, 0x6A77, 0x11D0, [0xA5, 0x35, 0x00, 0xC0, 0x4F, 0xD7, 0xD0, 0x62]};
+ const IID CLSID_ActiveDesktop = {0x75048700, 0xEF1F, 0x11D0, [0x98, 0x88, 0x00, 0x60, 0x97, 0xDE, 0xAC, 0xF9]};
+ const IID CLSID_AdapterInfo = {0x6F9942C9, 0xC1B1, 0x4AB5, [0x93, 0xDA, 0x60, 0x58, 0x99, 0x1D, 0xC8, 0xF3]};
+ const IID CLSID_AddrControl = {0x00000348, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_AddressBarParser = {0xE0E11A09, 0x5CB8, 0x4B6C, [0x83, 0x32, 0xE0, 0x07, 0x20, 0xA1, 0x68, 0xF2]};
+ const IID CLSID_ADsDSOObject = {0x549365D0, 0xEC26, 0x11CF, [0x83, 0x10, 0x00, 0xAA, 0x00, 0xB5, 0x05, 0xDB]};
+ const IID CLSID_ADsSecurityUtility = {0xF270C64A, 0xFFB8, 0x4AE4, [0x85, 0xFE, 0x3A, 0x75, 0xE5, 0x34, 0x79, 0x66]};
+ const IID CLSID_ADSystemInfo = {0x50B6327F, 0xAFD1, 0x11D2, [0x9C, 0xB9, 0x00, 0x00, 0xF8, 0x7A, 0x36, 0x9E]};
+ const IID CLSID_AlgSetup = {0x27D0BCCC, 0x344D, 0x4287, [0xAF, 0x37, 0x0C, 0x72, 0xC1, 0x61, 0xC1, 0x4C]};
+ const IID CLSID_AllClasses = {0x00000330, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_AlphabeticalCategorizer = {0x3C2654C6, 0x7372, 0x4F6B, [0xB3, 0x10, 0x55, 0xD6, 0x12, 0x8F, 0x49, 0xD2]};
+ const IID CLSID_AnchorClick = {0x13D5413C, 0x33B9, 0x11D2, [0x95, 0xA7, 0x00, 0xC0, 0x4F, 0x8E, 0xCB, 0x02]};
+ const IID CLSID_AnimationComposerFactory = {0x332B2A56, 0xF86C, 0x47E7, [0x86, 0x02, 0xFC, 0x42, 0xAC, 0x8B, 0x99, 0x20]};
+ const IID CLSID_AnimationComposerSiteFactory = {0x16911A65, 0xD41D, 0x4431, [0x87, 0xF7, 0xE7, 0x57, 0xF4, 0xD0, 0x3B, 0xD8]};
+ const IID CLSID_ApplicationGatewayServices = {0xF8ADE1D3, 0x49DF, 0x4B75, [0x90, 0x05, 0xEF, 0x95, 0x08, 0xE6, 0xA3, 0x37]};
+ const IID CLSID_AutoComplete = {0x00BB2763, 0x6A77, 0x11D0, [0xA5, 0x35, 0x00, 0xC0, 0x4F, 0xD7, 0xD0, 0x62]};
+ const IID CLSID_AutoDiscoveryProvider = {0xC4F3D5BF, 0x4809, 0x44E3, [0x84, 0xA4, 0x36, 0x8B, 0x6B, 0x33, 0xB0, 0xB4]};
+ const IID CLSID_AutoplayForSlideShow = {0x00E7B358, 0xF65B, 0x4DCF, [0x83, 0xDF, 0xCD, 0x02, 0x6B, 0x94, 0xBF, 0xD4]};
+ const IID CLSID_b = {0xD34F181D, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_BackgroundCopyManager = {0x4991D34B, 0x80A1, 0x4291, [0x83, 0xB6, 0x33, 0x28, 0x36, 0x6B, 0x90, 0x97]};
+ const IID CLSID_BackgroundCopyManager1_5 = {0xF087771F, 0xD74F, 0x4C1A, [0xBB, 0x8A, 0xE1, 0x6A, 0xCA, 0x91, 0x24, 0xEA]};
+ const IID CLSID_BackgroundCopyQMgr = {0x69AD4AEE, 0x51BE, 0x439B, [0xA9, 0x2C, 0x86, 0xAE, 0x49, 0x0E, 0x8B, 0x30]};
+ const IID CLSID_BackLink = {0xFCBF906F, 0x4080, 0x11D1, [0xA3, 0xAC, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID CLSID_BasicImageEffects = {0x16B280C8, 0xEE70, 0x11D1, [0x90, 0x66, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID CLSID_BasicImageEffectsPP = {0x16B280C9, 0xEE70, 0x11D1, [0x90, 0x66, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID CLSID_BlockFormats = {0x3050F831, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_BridgeTerminal = {0x8EBAE7A3, 0x8943, 0x11D1, [0x96, 0xB8, 0x00, 0xC0, 0x4F, 0xB6, 0xE8, 0x66]};
+ const IID CLSID_c = {0xD34F181E, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_CAccPropServices = {0xB5F8350B, 0x0548, 0x48B1, [0xA6, 0xEE, 0x88, 0xBD, 0x00, 0xB4, 0xA5, 0xE7]};
+ const IID CLSID_CActiveIMM = {0x4955DD33, 0xB159, 0x11D0, [0x8F, 0xCF, 0x00, 0xAA, 0x00, 0x6B, 0xCC, 0x59]};
+ const IID CLSID_CAnchorBrowsePropertyPage = {0x3050F3BB, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CaseIgnoreList = {0x15F88A55, 0x4680, 0x11D1, [0xA3, 0xB4, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID CLSID_CCheckBox = {0x3050F686, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CColorPropPage = {0x0BE35201, 0x8F91, 0x11CE, [0x9D, 0xE3, 0x00, 0xAA, 0x00, 0x4B, 0xB8, 0x51]};
+ const IID CLSID_CCombobox = {0x3050F678, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CDBurn = {0xFBEB8A05, 0xBEEE, 0x4442, [0x80, 0x4E, 0x40, 0x9D, 0x6C, 0x45, 0x15, 0xE9]};
+ const IID CLSID_CDebugDocumentHelper = {0x83B8BCA6, 0x687C, 0x11D0, [0xA4, 0x05, 0x00, 0xAA, 0x00, 0x60, 0x27, 0x5C]};
+ const IID CLSID_CDeviceRect = {0x3050F6D4, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CDirect3DRM = {0x4516EC41, 0x8F20, 0x11D0, [0x9B, 0x6D, 0x00, 0x00, 0xC0, 0x78, 0x1B, 0xC3]};
+ const IID CLSID_CDirect3DRMAnimation = {0x4FA35698, 0x623F, 0x11CF, [0xAC, 0x4A, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID CLSID_CDirect3DRMAnimationSet = {0x4FA35699, 0x623F, 0x11CF, [0xAC, 0x4A, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID CLSID_CDirect3DRMClippedVisual = {0x5434E72D, 0x6D66, 0x11D1, [0xBB, 0x0B, 0x00, 0x00, 0xF8, 0x75, 0x86, 0x5A]};
+ const IID CLSID_CDirect3DRMDevice = {0x4FA3568E, 0x623F, 0x11CF, [0xAC, 0x4A, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID CLSID_CDirect3DRMFace = {0x4FA35693, 0x623F, 0x11CF, [0xAC, 0x4A, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID CLSID_CDirect3DRMFrame = {0x4FA35690, 0x623F, 0x11CF, [0xAC, 0x4A, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID CLSID_CDirect3DRMFrameInterpolator = {0x0DE9EAA2, 0x3B84, 0x11D0, [0x9B, 0x6D, 0x00, 0x00, 0xC0, 0x78, 0x1B, 0xC3]};
+ const IID CLSID_CDirect3DRMLight = {0x4FA35694, 0x623F, 0x11CF, [0xAC, 0x4A, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID CLSID_CDirect3DRMLightInterpolator = {0x0DE9EAA6, 0x3B84, 0x11D0, [0x9B, 0x6D, 0x00, 0x00, 0xC0, 0x78, 0x1B, 0xC3]};
+ const IID CLSID_CDirect3DRMMaterial = {0x4FA35697, 0x623F, 0x11CF, [0xAC, 0x4A, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID CLSID_CDirect3DRMMaterialInterpolato = {0x0DE9EAA7, 0x3B84, 0x11D0, [0x9B, 0x6D, 0x00, 0x00, 0xC0, 0x78, 0x1B, 0xC3]};
+ const IID CLSID_CDirect3DRMMesh = {0x4FA35691, 0x623F, 0x11CF, [0xAC, 0x4A, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID CLSID_CDirect3DRMMeshBuilder = {0x4FA35692, 0x623F, 0x11CF, [0xAC, 0x4A, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID CLSID_CDirect3DRMMeshInterpolator = {0x0DE9EAA3, 0x3B84, 0x11D0, [0x9B, 0x6D, 0x00, 0x00, 0xC0, 0x78, 0x1B, 0xC3]};
+ const IID CLSID_CDirect3DRMProgressiveMesh = {0x4516EC40, 0x8F20, 0x11D0, [0x9B, 0x6D, 0x00, 0x00, 0xC0, 0x78, 0x1B, 0xC3]};
+ const IID CLSID_CDirect3DRMShadow = {0x4FA3569B, 0x623F, 0x11CF, [0xAC, 0x4A, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID CLSID_CDirect3DRMTexture = {0x4FA35695, 0x623F, 0x11CF, [0xAC, 0x4A, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID CLSID_CDirect3DRMTextureInterpolator = {0x0DE9EAA8, 0x3B84, 0x11D0, [0x9B, 0x6D, 0x00, 0x00, 0xC0, 0x78, 0x1B, 0xC3]};
+ const IID CLSID_CDirect3DRMUserVisual = {0x4FA3569A, 0x623F, 0x11CF, [0xAC, 0x4A, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID CLSID_CDirect3DRMViewport = {0x4FA3568F, 0x623F, 0x11CF, [0xAC, 0x4A, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID CLSID_CDirect3DRMViewportInterpolato = {0x0DE9EAA1, 0x3B84, 0x11D0, [0x9B, 0x6D, 0x00, 0x00, 0xC0, 0x78, 0x1B, 0xC3]};
+ const IID CLSID_CDirect3DRMWrap = {0x4FA35696, 0x623F, 0x11CF, [0xAC, 0x4A, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID CLSID_CDirectXFile = {0x4516EC43, 0x8F20, 0x11D0, [0x9B, 0x6D, 0x00, 0x00, 0xC0, 0x78, 0x1B, 0xC3]};
+ const IID CLSID_CDLAgent = {0x7D559C10, 0x9FE9, 0x11D0, [0x93, 0xF7, 0x00, 0xAA, 0x00, 0x59, 0xCE, 0x02]};
+ const IID CLSID_CdlProtocol = {0x3DD53D40, 0x7B8B, 0x11D0, [0xB0, 0x13, 0x00, 0xAA, 0x00, 0x59, 0xCE, 0x02]};
+ const IID CLSID_CDocBrowsePropertyPage = {0x3050F3B4, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CDownloadBehavior = {0x3050F5BE, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CEnroll = {0x43F8F289, 0x7A20, 0x11D0, [0x8F, 0x06, 0x00, 0xC0, 0x4F, 0xC2, 0x95, 0xE1]};
+ const IID CLSID_CEventObj = {0x3050F48A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CFontPropPage = {0x0BE35200, 0x8F91, 0x11CE, [0x9D, 0xE3, 0x00, 0xAA, 0x00, 0x4B, 0xB8, 0x51]};
+ const IID CLSID_CFSIconOverlayManager = {0x63B51F81, 0xC868, 0x11D0, [0x99, 0x9C, 0x00, 0xC0, 0x4F, 0xD6, 0x55, 0xE1]};
+ const IID CLSID_ChannelAgent = {0xE3A8BDE6, 0xABCE, 0x11D0, [0xBC, 0x4B, 0x00, 0xC0, 0x4F, 0xD9, 0x29, 0xDB]};
+ const IID CLSID_ChannelMgr = {0xB3CDAE90, 0xD170, 0x11D0, [0x80, 0x2B, 0x00, 0xC0, 0x4F, 0xD7, 0x5D, 0x13]};
+ const IID CLSID_CHeaderFooter = {0x3050F6CD, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CHtmlArea = {0x3050F64F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CIEOptionElement = {0x3050F698, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CIESelectElement = {0x3050F688, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CImageBrowsePropertyPage = {0x3050F3B3, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_ClassInstallFilter = {0x32B533BB, 0xEDAE, 0x11D0, [0xBD, 0x5A, 0x00, 0xAA, 0x00, 0xB9, 0x2A, 0xF1]};
+ const IID CLSID_CLayoutRect = {0x3050F664, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_ClientCaps = {0x7E8BC44E, 0xAEFF, 0x11D1, [0x89, 0xC2, 0x00, 0xC0, 0x4F, 0xB6, 0xBF, 0xC4]};
+ const IID CLSID_ClusAppWiz = {0x24F97150, 0x6689, 0x11D1, [0x9A, 0xA7, 0x00, 0xC0, 0x4F, 0xB9, 0x3A, 0x80]};
+ const IID CLSID_ClusCfgAsyncEvictCleanup = {0x08F35A72, 0xD7C4, 0x42F4, [0xBC, 0x81, 0x51, 0x88, 0xE1, 0x9D, 0xFA, 0x39]};
+ const IID CLSID_ClusCfgEvictCleanup = {0x32152BE9, 0xDE8C, 0x4D0F, [0x81, 0xB0, 0xBC, 0xE5, 0xD1, 0x1E, 0xCB, 0x00]};
+ const IID CLSID_ClusCfgResTypeGenScript = {0xD513C4F4, 0x1D34, 0x44A3, [0x83, 0xD4, 0x81, 0x26, 0x51, 0xDB, 0x89, 0x18]};
+ const IID CLSID_ClusCfgResTypeMajorityNodeSet = {0xB6870B44, 0x0BDF, 0x4B46, [0xAC, 0x1F, 0x6C, 0x69, 0x1B, 0x62, 0x2E, 0xDF]};
+ const IID CLSID_ClusCfgResTypeServices = {0x6A370489, 0xBB52, 0x4727, [0xB7, 0x40, 0x08, 0xF4, 0x94, 0x16, 0x34, 0x78]};
+ const IID CLSID_ClusCfgStartupNotify = {0x105EEEB6, 0x32FD, 0x4EA9, [0x89, 0x12, 0x84, 0x3A, 0x7F, 0xF3, 0xCA, 0x2D]};
+ const IID CLSID_ClusCfgWizard = {0x1919C4FE, 0x6F46, 0x4027, [0x97, 0x7D, 0x0E, 0xF1, 0xC8, 0xF2, 0x63, 0x72]};
+ const IID CLSID_ClusterConfigurationType = {0xBF3768C2, 0xE0E5, 0x448F, [0x95, 0x2B, 0x25, 0xD4, 0x33, 0x2D, 0xEF, 0xA3]};
+ const IID CLSID_CMimeTypes = {0x3050F3FE, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CMLangConvertCharset = {0xD66D6F99, 0xCDAA, 0x11D0, [0xB8, 0x22, 0x00, 0xC0, 0x4F, 0xC9, 0xB3, 0x1F]};
+ const IID CLSID_CMLangString = {0xC04D65CF, 0xB70D, 0x11D0, [0xB1, 0x88, 0x00, 0xAA, 0x00, 0x38, 0xC9, 0x69]};
+ const IID CLSID_CMultiLanguage = {0x275C23E2, 0x3747, 0x11D0, [0x9F, 0xEA, 0x00, 0xAA, 0x00, 0x3F, 0x86, 0x46]};
+ const IID CLSID_CNetCfg = {0x5B035261, 0x40F9, 0x11D1, [0xAA, 0xEC, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID CLSID_CoDitherToRGB8 = {0xA860CE50, 0x3910, 0x11D0, [0x86, 0xFC, 0x00, 0xA0, 0xC9, 0x13, 0xF7, 0x50]};
+ const IID CLSID_CoMapMIMEToCLSID = {0x30C3B080, 0x30FB, 0x11D0, [0xB7, 0x24, 0x00, 0xAA, 0x00, 0x6C, 0x1A, 0x01]};
+ const IID CLSID_ComBinding = {0x00000328, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_CommonQuery = {0x83BC5EC0, 0x6F2A, 0x11D0, [0xA1, 0xC4, 0x00, 0xAA, 0x00, 0xC1, 0x6E, 0x65]};
+ const IID CLSID_CompositePP = {0x25B33660, 0xFD83, 0x11D1, [0x8A, 0xDE, 0x44, 0x45, 0x53, 0x54, 0x00, 0x01]};
+ const IID CLSID_ConnectionCommonUi = {0x7007ACD1, 0x3202, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID CLSID_ConnectionManager = {0xBA126AD1, 0x2166, 0x11D1, [0xB1, 0xD0, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID CLSID_ConnectionManager2 = {0xBA126AE5, 0x2166, 0x11D1, [0xB1, 0xD0, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID CLSID_ControlPanel = {0x21EC2020, 0x3AEA, 0x1069, [0xA2, 0xDD, 0x08, 0x00, 0x2B, 0x30, 0x30, 0x9D]};
+ const IID CLSID_ConvertVBX = {0xFB8F0822, 0x0164, 0x101B, [0x84, 0xED, 0x08, 0x00, 0x2B, 0x2E, 0xC7, 0x13]};
+ const IID CLSID_ConvolvePP = {0x25B33661, 0xFD83, 0x11D1, [0x8A, 0xDE, 0x44, 0x45, 0x53, 0x54, 0x00, 0x01]};
+ const IID CLSID_COpsProfile = {0x3050F402, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CoSniffStream = {0x6A01FDA0, 0x30DF, 0x11D0, [0xB7, 0x24, 0x00, 0xAA, 0x00, 0x6C, 0x1A, 0x01]};
+ const IID CLSID_CPersistDataPeer = {0x3050F487, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CPersistHistory = {0x3050F4C8, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CPersistShortcut = {0x3050F4C6, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CPersistSnapshot = {0x3050F4C9, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CPersistUserData = {0x3050F48E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CPicturePropPage = {0x0BE35202, 0x8F91, 0x11CE, [0x9D, 0xE3, 0x00, 0xAA, 0x00, 0x4B, 0xB8, 0x51]};
+ const IID CLSID_CPlugins = {0x3050F3FF, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CRadioButton = {0x3050F69C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CrBarn = {0xC3BDF740, 0x0B58, 0x11D2, [0xA4, 0x84, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID CLSID_CrBarnPP = {0xFCAD7436, 0xF151, 0x4110, [0xB9, 0x7E, 0x32, 0xBD, 0x60, 0x7F, 0xBD, 0xB8]};
+ const IID CLSID_CrBlindPP = {0x213052C1, 0x100D, 0x11D2, [0x8B, 0x82, 0x00, 0xA0, 0xC9, 0x3C, 0x09, 0xB2]};
+ const IID CLSID_CrBlinds = {0x00C429C0, 0x0BA9, 0x11D2, [0xA4, 0x84, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID CLSID_CrBlur = {0x7312498D, 0xE87A, 0x11D1, [0x81, 0xE0, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID CLSID_CrBlurPP = {0x623E287E, 0xFC0E, 0x11D1, [0x9A, 0x77, 0x00, 0x00, 0xF8, 0x75, 0x6A, 0x10]};
+ const IID CLSID_CrEmboss = {0xF515306D, 0x0156, 0x11D2, [0x81, 0xEA, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID CLSID_CrEngrave = {0xF515306E, 0x0156, 0x11D2, [0x81, 0xEA, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID CLSID_CrInset = {0x93073C40, 0x0BA5, 0x11D2, [0xA4, 0x84, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID CLSID_CrIris = {0x3F69F351, 0x0379, 0x11D2, [0xA4, 0x84, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID CLSID_CrIrisPP = {0x80DE22C4, 0x0F44, 0x11D2, [0x8B, 0x82, 0x00, 0xA0, 0xC9, 0x3C, 0x09, 0xB2]};
+ const IID CLSID_CrRadialWipe = {0x424B71AF, 0x0695, 0x11D2, [0xA4, 0x84, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID CLSID_CrRadialWipePP = {0x33D932E0, 0x0F48, 0x11D2, [0x8B, 0x82, 0x00, 0xA0, 0xC9, 0x3C, 0x09, 0xB2]};
+ const IID CLSID_CrSlide = {0x810E402F, 0x056B, 0x11D2, [0xA4, 0x84, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID CLSID_CrSlidePP = {0xCC8CEDE1, 0x1003, 0x11D2, [0x8B, 0x82, 0x00, 0xA0, 0xC9, 0x3C, 0x09, 0xB2]};
+ const IID CLSID_CrSpiral = {0xACA97E00, 0x0C7D, 0x11D2, [0xA4, 0x84, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID CLSID_CrSpiralPP = {0xC6A4FE81, 0x1022, 0x11D2, [0x8B, 0x82, 0x00, 0xA0, 0xC9, 0x3C, 0x09, 0xB2]};
+ const IID CLSID_CrStretch = {0x7658F2A2, 0x0A83, 0x11D2, [0xA4, 0x84, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID CLSID_CrStretchPP = {0x15FB95E0, 0x0F77, 0x11D2, [0x8B, 0x82, 0x00, 0xA0, 0xC9, 0x3C, 0x09, 0xB2]};
+ const IID CLSID_CrWheel = {0x5AE1DAE0, 0x1461, 0x11D2, [0xA4, 0x84, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID CLSID_CrWheelPP = {0xFA9F6180, 0x1464, 0x11D2, [0xA4, 0x84, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID CLSID_CrZigzag = {0xE6E73D20, 0x0C8A, 0x11D2, [0xA4, 0x84, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID CLSID_CrZigzagPP = {0x1559A3C1, 0x102B, 0x11D2, [0x8B, 0x82, 0x00, 0xA0, 0xC9, 0x3C, 0x09, 0xB2]};
+ const IID CLSID_CScriptErrorList = {0xEFD01300, 0x160F, 0x11D2, [0xBB, 0x2E, 0x00, 0x80, 0x5F, 0xF7, 0xEF, 0xCA]};
+ const IID CLSID_CScrollBar = {0x3050F68A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CSliderBar = {0x3050F68E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CSpinButton = {0x3050F68C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CTemplatePrinter = {0x3050F6B3, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_CUrlHistory = {0x3C374A40, 0xBAE4, 0x11CF, [0xBF, 0x7D, 0x00, 0xAA, 0x00, 0x69, 0x46, 0xEE]};
+ const IID CLSID_CURLSearchHook = {0xCFBFAE00, 0x17A6, 0x11D0, [0x99, 0xCB, 0x00, 0xC0, 0x4F, 0xD6, 0x44, 0x97]};
+ const IID CLSID_CurrentUserClasses = {0x00000332, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_CUtilityButton = {0x3050F6B0, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_d = {0xD34F181F, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_DAArray = {0x9CDE7340, 0x3C20, 0x11D0, [0xA3, 0x30, 0x00, 0xAA, 0x00, 0xB9, 0x2C, 0x03]};
+ const IID CLSID_DABbox2 = {0x50B4791E, 0x4731, 0x11D0, [0x89, 0x12, 0x00, 0xC0, 0x4F, 0xC2, 0xA0, 0xCA]};
+ const IID CLSID_DABbox3 = {0x4A933703, 0xE36F, 0x11D0, [0x9B, 0x99, 0x00, 0xC0, 0x4F, 0xC2, 0xF5, 0x1D]};
+ const IID CLSID_DABehavior = {0xC46C1BF2, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID CLSID_DABoolean = {0x25B0F91D, 0xD23D, 0x11D0, [0x9B, 0x85, 0x00, 0xC0, 0x4F, 0xC2, 0xF5, 0x1D]};
+ const IID CLSID_DACamera = {0xC46C1BD9, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID CLSID_DAColor = {0xC46C1BC9, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID CLSID_DADashStyle = {0x9CADDC0C, 0xAD56, 0x11D1, [0x9F, 0xF8, 0x00, 0xC0, 0x4F, 0xA3, 0x21, 0x95]};
+ const IID CLSID_DAEndStyle = {0xFC54BEAB, 0x5B12, 0x11D1, [0x8E, 0x7B, 0x00, 0xC0, 0x4F, 0xC2, 0x9D, 0x46]};
+ const IID CLSID_DAEvent = {0x3E2487C4, 0x8709, 0x11D0, [0xB1, 0x77, 0x00, 0xC0, 0x4F, 0xC2, 0xA0, 0xCA]};
+ const IID CLSID_DAFontStyle = {0x3F3DA01A, 0x4705, 0x11D0, [0x87, 0x10, 0x00, 0xC0, 0x4F, 0xC2, 0x9D, 0x46]};
+ const IID CLSID_DAGeometry = {0xC46C1BDB, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID CLSID_DAImage = {0xC46C1BCB, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID CLSID_DAImportationResult = {0x283807B3, 0x2C60, 0x11D0, [0xA3, 0x1D, 0x00, 0xAA, 0x00, 0xB9, 0x2C, 0x03]};
+ const IID CLSID_DAJoinStyle = {0xFC54BEAA, 0x5B12, 0x11D1, [0x8E, 0x7B, 0x00, 0xC0, 0x4F, 0xC2, 0x9D, 0x46]};
+ const IID CLSID_DALineStyle = {0x283807B8, 0x2C60, 0x11D0, [0xA3, 0x1D, 0x00, 0xAA, 0x00, 0xB9, 0x2C, 0x03]};
+ const IID CLSID_DAMatte = {0xC46C1BC3, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID CLSID_DAMicrophone = {0xC46C1BE3, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID CLSID_DAMontage = {0xC46C1BD7, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID CLSID_DANumber = {0xC46C1BC7, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID CLSID_DAPair = {0xBC0BFD34, 0xD21D, 0x11D0, [0x93, 0x85, 0x00, 0xC0, 0x4F, 0xB6, 0xBD, 0x36]};
+ const IID CLSID_DAPath2 = {0xC46C1BCF, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID CLSID_DAPickableResult = {0x34F681D0, 0x3640, 0x11CF, [0x92, 0x94, 0x00, 0xAA, 0x00, 0xB8, 0xA7, 0x33]};
+ const IID CLSID_DAPoint2 = {0xC46C1BD5, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID CLSID_DAPoint3 = {0xC46C1BE5, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID CLSID_DarwinAppPublisher = {0xCFCCC7A0, 0xA282, 0x11D1, [0x90, 0x82, 0x00, 0x60, 0x08, 0x05, 0x93, 0x82]};
+ const IID CLSID_DASound = {0xC46C1BD1, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID CLSID_DAStatics = {0xC46C1BF3, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID CLSID_DAString = {0xC46C1BD3, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID CLSID_DataChannel = {0xBBB36F15, 0x408D, 0x4056, [0x8C, 0x27, 0x92, 0x08, 0x43, 0xD4, 0x0B, 0xE5]};
+ const IID CLSID_DATransform2 = {0xC46C1BDF, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID CLSID_DATransform3 = {0xC46C1BC5, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID CLSID_DATuple = {0x283807B7, 0x2C60, 0x11D0, [0xA3, 0x1D, 0x00, 0xAA, 0x00, 0xB9, 0x2C, 0x03]};
+ const IID CLSID_DAUserData = {0x283807B4, 0x2C60, 0x11D0, [0xA3, 0x1D, 0x00, 0xAA, 0x00, 0xB9, 0x2C, 0x03]};
+ const IID CLSID_DAVector2 = {0xC46C1BE1, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID CLSID_DAVector3 = {0xC46C1BC0, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID CLSID_DAView = {0x960D8EFF, 0xE494, 0x11D1, [0xAB, 0x75, 0x00, 0xC0, 0x4F, 0xD9, 0x2B, 0x6B]};
+ const IID CLSID_DAViewerControl = {0xC46C1BEB, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID CLSID_DAViewerControlWindowed = {0xC46C1BF1, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID CLSID_DCOMAccessControl = {0x0000031D, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_DebugHelper = {0x0BFCC060, 0x8C1D, 0x11D0, [0xAC, 0xCD, 0x00, 0xAA, 0x00, 0x60, 0x27, 0x5C]};
+ const IID CLSID_DeCompMimeFilter = {0x8F6B0360, 0xB80D, 0x11D0, [0xA9, 0xB3, 0x00, 0x60, 0x97, 0x94, 0x23, 0x11]};
+ const IID CLSID_DefaultDebugSessionProvider = {0x834128A2, 0x51F4, 0x11D0, [0x8F, 0x20, 0x00, 0x80, 0x5F, 0x2C, 0xD0, 0x64]};
+ const IID CLSID_DirectDraw = {0xD7B70EE0, 0x4340, 0x11CF, [0xB0, 0x63, 0x00, 0x20, 0xAF, 0xC2, 0xCD, 0x35]};
+ const IID CLSID_DirectDrawClipper = {0x593817A0, 0x7DB3, 0x11CF, [0xA2, 0xDE, 0x00, 0xAA, 0x00, 0xB9, 0x33, 0x56]};
+ const IID CLSID_DirectDrawFactory2 = {0xB9DC4790, 0x4AF1, 0x11D1, [0x8C, 0x4C, 0x00, 0xC0, 0x4F, 0xD9, 0x30, 0xC5]};
+ const IID CLSID_DirectInput = {0x25E609E0, 0xB259, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID CLSID_DirectInputDevice = {0x25E609E1, 0xB259, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID CLSID_DirectMusic = {0x636B9F10, 0x0C7D, 0x11D1, [0x95, 0xB2, 0x00, 0x20, 0xAF, 0xDC, 0x74, 0x21]};
+ const IID CLSID_DirectMusicBand = {0x79BA9E00, 0xB6EE, 0x11D1, [0x86, 0xBE, 0x00, 0xC0, 0x4F, 0xBF, 0x8F, 0xEF]};
+ const IID CLSID_DirectMusicBandTrack = {0xD2AC2894, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID CLSID_DirectMusicChordMap = {0xD2AC288F, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID CLSID_DirectMusicChordMapTrack = {0xD2AC2896, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID CLSID_DirectMusicChordTrack = {0xD2AC288B, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID CLSID_DirectMusicCollection = {0x480FF4B0, 0x28B2, 0x11D1, [0xBE, 0xF7, 0x00, 0xC0, 0x4F, 0xBF, 0x8F, 0xEF]};
+ const IID CLSID_DirectMusicCommandTrack = {0xD2AC288C, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID CLSID_DirectMusicComposer = {0xD2AC2890, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID CLSID_DirectMusicGraph = {0xD2AC2884, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID CLSID_DirectMusicLoader = {0xD2AC2892, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID CLSID_DirectMusicMotifTrack = {0xD2AC288E, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID CLSID_DirectMusicMuteTrack = {0xD2AC2898, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID CLSID_DirectMusicPerformance = {0xD2AC2881, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID CLSID_DirectMusicSegment = {0xD2AC2882, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID CLSID_DirectMusicSegmentState = {0xD2AC2883, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID CLSID_DirectMusicSeqTrack = {0xD2AC2886, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID CLSID_DirectMusicSignPostTrack = {0xF17E8672, 0xC3B4, 0x11D1, [0x87, 0x0B, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID CLSID_DirectMusicStyle = {0xD2AC288A, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID CLSID_DirectMusicStyleTrack = {0xD2AC288D, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID CLSID_DirectMusicSynth = {0x58C2B4D0, 0x46E7, 0x11D1, [0x89, 0xAC, 0x00, 0xA0, 0xC9, 0x05, 0x41, 0x29]};
+ const IID CLSID_DirectMusicSysExTrack = {0xD2AC2887, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID CLSID_DirectMusicTempoTrack = {0xD2AC2885, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID CLSID_DirectMusicTimeSigTrack = {0xD2AC2888, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID CLSID_DirectPlay = {0xD1EB6D20, 0x8923, 0x11D0, [0x9D, 0x97, 0x00, 0xA0, 0xC9, 0x0A, 0x43, 0xCB]};
+ const IID CLSID_DirectPlayLobby = {0x2FE8F810, 0xB2A5, 0x11D0, [0xA7, 0x87, 0x00, 0x00, 0xF8, 0x03, 0xAB, 0xFC]};
+ const IID CLSID_DirectSound = {0x47D4D946, 0x62E8, 0x11CF, [0x93, 0xBC, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID CLSID_DirectSoundCapture = {0xB0210780, 0x89CD, 0x11D0, [0xAF, 0x08, 0x00, 0xA0, 0xC9, 0x25, 0xCD, 0x16]};
+ const IID CLSID_DispatchMapper = {0xE9225296, 0xC759, 0x11D1, [0xA0, 0x2B, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID CLSID_DNWithBinary = {0x7E99C0A3, 0xF935, 0x11D2, [0xBA, 0x96, 0x00, 0xC0, 0x4F, 0xB6, 0xD0, 0xD1]};
+ const IID CLSID_DNWithString = {0x334857CC, 0xF934, 0x11D2, [0xBA, 0x96, 0x00, 0xC0, 0x4F, 0xB6, 0xD0, 0xD1]};
+ const IID CLSID_DocFileColumnProvider = {0x24F14F01, 0x7B1C, 0x11D1, [0x83, 0x8F, 0x00, 0x00, 0xF8, 0x04, 0x61, 0xCF]};
+ const IID CLSID_DocHostUIHandler = {0x7057E952, 0xBD1B, 0x11D1, [0x89, 0x19, 0x00, 0xC0, 0x4F, 0xC2, 0xC8, 0x36]};
+ const IID CLSID_DOMChildrenCollection = {0x3050F5AA, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_DOMDocument = {0x2933BF90, 0x7B36, 0x11D2, [0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60]};
+ const IID CLSID_DOMFreeThreadedDocument = {0x2933BF91, 0x7B36, 0x11D2, [0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60]};
+ const IID CLSID_DragDropHelper = {0x4657278A, 0x411B, 0x11D2, [0x83, 0x9A, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0]};
+ const IID CLSID_DriveSizeCategorizer = {0x94357B53, 0xCA29, 0x4B78, [0x83, 0xAE, 0xE8, 0xFE, 0x74, 0x09, 0x13, 0x4F]};
+ const IID CLSID_DriveTypeCategorizer = {0xB0A8F3CF, 0x4333, 0x4BAB, [0x88, 0x73, 0x1C, 0xCB, 0x1C, 0xAD, 0xA4, 0x8B]};
+ const IID CLSID_DsDisplaySpecifier = {0x1AB4A8C0, 0x6A0B, 0x11D2, [0xAD, 0x49, 0x00, 0xC0, 0x4F, 0xA3, 0x1A, 0x86]};
+ const IID CLSID_DsDomainTreeBrowser = {0x1698790A, 0xE2B4, 0x11D0, [0xB0, 0xB1, 0x00, 0xC0, 0x4F, 0xD8, 0xDC, 0xA6]};
+ const IID CLSID_DsFindAdvanced = {0x83EE3FE3, 0x57D9, 0x11D0, [0xB9, 0x32, 0x00, 0xA0, 0x24, 0xAB, 0x2D, 0xBB]};
+ const IID CLSID_DsFindComputer = {0x16006700, 0x87AD, 0x11D0, [0x91, 0x40, 0x00, 0xAA, 0x00, 0xC1, 0x6E, 0x65]};
+ const IID CLSID_DsFindContainer = {0xC1B3CBF2, 0x886A, 0x11D0, [0x91, 0x40, 0x00, 0xAA, 0x00, 0xC1, 0x6E, 0x65]};
+ const IID CLSID_DsFindDomainController = {0x538C7B7E, 0xD25E, 0x11D0, [0x97, 0x42, 0x00, 0xA0, 0xC9, 0x06, 0xAF, 0x45]};
+ const IID CLSID_DsFindFrsMembers = {0x94CE4B18, 0xB3D3, 0x11D1, [0xB9, 0xB4, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0xB0]};
+ const IID CLSID_DsFindObjects = {0x83EE3FE1, 0x57D9, 0x11D0, [0xB9, 0x32, 0x00, 0xA0, 0x24, 0xAB, 0x2D, 0xBB]};
+ const IID CLSID_DsFindPeople = {0x83EE3FE2, 0x57D9, 0x11D0, [0xB9, 0x32, 0x00, 0xA0, 0x24, 0xAB, 0x2D, 0xBB]};
+ const IID CLSID_DsFindPrinter = {0xB577F070, 0x7EE2, 0x11D0, [0x91, 0x3F, 0x00, 0xAA, 0x00, 0xC1, 0x6E, 0x65]};
+ const IID CLSID_DsFindVolume = {0xC1B3CBF1, 0x886A, 0x11D0, [0x91, 0x40, 0x00, 0xAA, 0x00, 0xC1, 0x6E, 0x65]};
+ const IID CLSID_DsFolderProperties = {0x9E51E0D0, 0x6E0F, 0x11D2, [0x96, 0x01, 0x00, 0xC0, 0x4F, 0xA3, 0x1A, 0x86]};
+ const IID CLSID_DsPropertyPages = {0x0D45D530, 0x764B, 0x11D0, [0xA1, 0xCA, 0x00, 0xAA, 0x00, 0xC1, 0x6E, 0x65]};
+ const IID CLSID_DsQuery = {0x8A23E65E, 0x31C2, 0x11D0, [0x89, 0x1C, 0x00, 0xA0, 0x24, 0xAB, 0x2D, 0xBB]};
+ const IID CLSID_DWbemClassObject = {0x64AB3751, 0x12BC, 0x11D1, [0x9E, 0x61, 0x00, 0xC0, 0x4F, 0xC3, 0x24, 0xA8]};
+ const IID CLSID_DWbemContext = {0x752FF212, 0xF7B7, 0x11D0, [0x9E, 0x4D, 0x00, 0xC0, 0x4F, 0xC3, 0x24, 0xA8]};
+ const IID CLSID_DWbemLocator = {0xCB7CA032, 0xF729, 0x11D0, [0x9E, 0x4D, 0x00, 0xC0, 0x4F, 0xC3, 0x24, 0xA8]};
+ const IID CLSID_DX2D = {0x473AA80B, 0x4577, 0x11D1, [0x81, 0xA8, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID CLSID_DXFade = {0x16B280C5, 0xEE70, 0x11D1, [0x90, 0x66, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID CLSID_DXGradient = {0xC6365470, 0xF667, 0x11D1, [0x90, 0x67, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID CLSID_DXLUTBuilder = {0x1E54333B, 0x2A00, 0x11D1, [0x81, 0x98, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID CLSID_DXRasterizer = {0x8652CE55, 0x9E80, 0x11D1, [0x90, 0x53, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID CLSID_DXSurface = {0x0E890F83, 0x5F79, 0x11D1, [0x90, 0x43, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID CLSID_DXSurfaceModifier = {0x3E669F1D, 0x9C23, 0x11D1, [0x90, 0x53, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID CLSID_DXTAlpha = {0xADC6CB82, 0x424C, 0x11D2, [0x95, 0x2A, 0x00, 0xC0, 0x4F, 0xA3, 0x4F, 0x05]};
+ const IID CLSID_DXTAlphaImageLoader = {0x0C7EFBDE, 0x0303, 0x4C6F, [0xA4, 0xF7, 0x31, 0xFA, 0x2B, 0xE5, 0xE3, 0x97]};
+ const IID CLSID_DXTAlphaImageLoaderPP = {0x8C80CE2D, 0x850D, 0x47DA, [0x8E, 0xCD, 0x55, 0x02, 0x35, 0x62, 0xD1, 0x67]};
+ const IID CLSID_DXTAlphaPP = {0xD687A7E0, 0x4BA4, 0x11D2, [0x8A, 0xDE, 0x00, 0xA0, 0xC9, 0x8E, 0x65, 0x27]};
+ const IID CLSID_DXTaskManager = {0x4CB26C03, 0xFF93, 0x11D0, [0x81, 0x7E, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID CLSID_DXTBarn = {0xEC9BA17D, 0x60B5, 0x462B, [0xA6, 0xD8, 0x14, 0xB8, 0x90, 0x57, 0xE2, 0x2A]};
+ const IID CLSID_DXTBlinds = {0x9A4A4A51, 0xFB3A, 0x4F4B, [0x9B, 0x57, 0xA2, 0x91, 0x2A, 0x28, 0x97, 0x69]};
+ const IID CLSID_DXTCheckerBoard = {0xB3EE7802, 0x8224, 0x4787, [0xA1, 0xEA, 0xF0, 0xDE, 0x16, 0xDE, 0xAB, 0xD3]};
+ const IID CLSID_DXTCheckerBoardPP = {0xCBF47525, 0x98D2, 0x45EA, [0xB8, 0x43, 0xFD, 0x21, 0x3D, 0x93, 0x2B, 0x10]};
+ const IID CLSID_DXTChroma = {0x421516C1, 0x3CF8, 0x11D2, [0x95, 0x2A, 0x00, 0xC0, 0x4F, 0xA3, 0x4F, 0x05]};
+ const IID CLSID_DXTChromaPP = {0xEC7E0760, 0x4C76, 0x11D2, [0x8A, 0xDE, 0x00, 0xA0, 0xC9, 0x8E, 0x65, 0x27]};
+ const IID CLSID_DXTComposite = {0x9A43A844, 0x0831, 0x11D1, [0x81, 0x7F, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID CLSID_DXTConvolution = {0x2BC0EF29, 0xE6BA, 0x11D1, [0x81, 0xDD, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID CLSID_DXTDropShadow = {0xADC6CB86, 0x424C, 0x11D2, [0x95, 0x2A, 0x00, 0xC0, 0x4F, 0xA3, 0x4F, 0x05]};
+ const IID CLSID_DXTDropShadowPP = {0xEC7E0761, 0x4C76, 0x11D2, [0x8A, 0xDE, 0x00, 0xA0, 0xC9, 0x8E, 0x65, 0x27]};
+ const IID CLSID_DXTFilter = {0x385A91BC, 0x1E8A, 0x4E4A, [0xA7, 0xA6, 0xF4, 0xFC, 0x1E, 0x6C, 0xA1, 0xBD]};
+ const IID CLSID_DXTFilterBehavior = {0x649EEC1E, 0xB579, 0x4E8C, [0xBB, 0x3B, 0x49, 0x97, 0xF8, 0x42, 0x65, 0x36]};
+ const IID CLSID_DXTFilterCollection = {0xA7EE7F34, 0x3BD1, 0x427F, [0x92, 0x31, 0xF9, 0x41, 0xE9, 0xB7, 0xE1, 0xFE]};
+ const IID CLSID_DXTFilterFactory = {0x81397204, 0xF51A, 0x4571, [0x8D, 0x7B, 0xDC, 0x03, 0x05, 0x21, 0xAA, 0xBD]};
+ const IID CLSID_DXTGlow = {0x9F8E6421, 0x3D9B, 0x11D2, [0x95, 0x2A, 0x00, 0xC0, 0x4F, 0xA3, 0x4F, 0x05]};
+ const IID CLSID_DXTGlowPP = {0xEC7E0764, 0x4C76, 0x11D2, [0x8A, 0xDE, 0x00, 0xA0, 0xC9, 0x8E, 0x65, 0x27]};
+ const IID CLSID_DXTGradientD = {0x623E2882, 0xFC0E, 0x11D1, [0x9A, 0x77, 0x00, 0x00, 0xF8, 0x75, 0x6A, 0x10]};
+ const IID CLSID_DXTGradientWipe = {0xB96F67A2, 0x30C2, 0x47E8, [0xBD, 0x85, 0x70, 0xA2, 0xC9, 0x48, 0xB5, 0x0F]};
+ const IID CLSID_DXTICMFilter = {0xA1BFB370, 0x5A9F, 0x4429, [0xBB, 0x72, 0xB1, 0x3E, 0x2F, 0xEA, 0xED, 0xEF]};
+ const IID CLSID_DXTICMFilterPP = {0x1958FB12, 0x31E6, 0x47E5, [0xAA, 0x49, 0xB2, 0x3D, 0x12, 0xC8, 0x53, 0xE6]};
+ const IID CLSID_DXTInset = {0x76F363F2, 0x7E9F, 0x4ED7, [0xA6, 0xA7, 0xEE, 0x30, 0x35, 0x1B, 0x66, 0x28]};
+ const IID CLSID_DXTIris = {0x049F2CE6, 0xD996, 0x4721, [0x89, 0x7A, 0xDB, 0x15, 0xCE, 0x9E, 0xB7, 0x3D]};
+ const IID CLSID_DXTLabel = {0x54702535, 0x2606, 0x11D1, [0x99, 0x9C, 0x00, 0x00, 0xF8, 0x75, 0x6A, 0x10]};
+ const IID CLSID_DXTLight = {0xF9EFBEC2, 0x4302, 0x11D2, [0x95, 0x2A, 0x00, 0xC0, 0x4F, 0xA3, 0x4F, 0x05]};
+ const IID CLSID_DXTLightPP = {0x694AF25F, 0x124D, 0x11D3, [0x91, 0xD5, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID CLSID_DXTMaskFilter = {0x3A04D93B, 0x1EDD, 0x4F3F, [0xA3, 0x75, 0xA0, 0x3E, 0xC1, 0x95, 0x72, 0xC4]};
+ const IID CLSID_DXTMatrix = {0x4ABF5A06, 0x5568, 0x4834, [0xBE, 0xE3, 0x32, 0x7A, 0x6D, 0x95, 0xA6, 0x85]};
+ const IID CLSID_DXTMatrixPP = {0xC591103A, 0xB3A8, 0x4D47, [0xA3, 0xF7, 0x2A, 0xEE, 0xE4, 0xB8, 0x01, 0x3F]};
+ const IID CLSID_DXTMetaBurnFilm = {0x107045D1, 0x06E0, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID CLSID_DXTMetaCenterPeel = {0xAA0D4D0C, 0x06A3, 0x11D2, [0x8F, 0x98, 0x00, 0xC0, 0x4F, 0xB9, 0x2E, 0xB7]};
+ const IID CLSID_DXTMetaColorFade = {0x2A54C908, 0x07AA, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID CLSID_DXTMetaFlowMotion = {0x2A54C90B, 0x07AA, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID CLSID_DXTMetaGriddler = {0x2A54C911, 0x07AA, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID CLSID_DXTMetaGriddler2 = {0x2A54C913, 0x07AA, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID CLSID_DXTMetaJaws = {0x2A54C904, 0x07AA, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID CLSID_DXTMetaLightWipe = {0x107045C8, 0x06E0, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID CLSID_DXTMetaLiquid = {0xAA0D4D0A, 0x06A3, 0x11D2, [0x8F, 0x98, 0x00, 0xC0, 0x4F, 0xB9, 0x2E, 0xB7]};
+ const IID CLSID_DXTMetaPageTurn = {0xAA0D4D08, 0x06A3, 0x11D2, [0x8F, 0x98, 0x00, 0xC0, 0x4F, 0xB9, 0x2E, 0xB7]};
+ const IID CLSID_DXTMetaPeelPiece = {0xAA0D4D10, 0x06A3, 0x11D2, [0x8F, 0x98, 0x00, 0xC0, 0x4F, 0xB9, 0x2E, 0xB7]};
+ const IID CLSID_DXTMetaPeelSmall = {0xAA0D4D0E, 0x06A3, 0x11D2, [0x8F, 0x98, 0x00, 0xC0, 0x4F, 0xB9, 0x2E, 0xB7]};
+ const IID CLSID_DXTMetaPeelSplit = {0xAA0D4D12, 0x06A3, 0x11D2, [0x8F, 0x98, 0x00, 0xC0, 0x4F, 0xB9, 0x2E, 0xB7]};
+ const IID CLSID_DXTMetaRadialScaleWipe = {0x107045CA, 0x06E0, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID CLSID_DXTMetaRipple = {0xAA0D4D03, 0x06A3, 0x11D2, [0x8F, 0x98, 0x00, 0xC0, 0x4F, 0xB9, 0x2E, 0xB7]};
+ const IID CLSID_DXTMetaRoll = {0x9C61F46E, 0x0530, 0x11D2, [0x8F, 0x98, 0x00, 0xC0, 0x4F, 0xB9, 0x2E, 0xB7]};
+ const IID CLSID_DXTMetaThreshold = {0x2A54C915, 0x07AA, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID CLSID_DXTMetaTwister = {0x107045CF, 0x06E0, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID CLSID_DXTMetaVacuum = {0x2A54C90D, 0x07AA, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID CLSID_DXTMetaWater = {0x107045C5, 0x06E0, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID CLSID_DXTMetaWhiteOut = {0x107045CC, 0x06E0, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID CLSID_DXTMetaWormHole = {0x0E6AE022, 0x0C83, 0x11D2, [0x8C, 0xD4, 0x00, 0x10, 0x4B, 0xC7, 0x5D, 0x9A]};
+ const IID CLSID_DXTMotionBlur = {0xDD13DE77, 0xD3BA, 0x42D4, [0xB5, 0xC6, 0x77, 0x45, 0xFA, 0x4E, 0x2D, 0x4B]};
+ const IID CLSID_DXTMotionBlurPP = {0x926433E1, 0x7F8F, 0x4BC6, [0xBE, 0xC4, 0x8C, 0x12, 0x6C, 0x6B, 0x7D, 0xC4]};
+ const IID CLSID_DXTRadialWipe = {0x164484A9, 0x35D9, 0x4FB7, [0x9F, 0xAB, 0x48, 0x27, 0x3B, 0x96, 0xAA, 0x1D]};
+ const IID CLSID_DXTRandomBars = {0x2E7700B7, 0x27C4, 0x437F, [0x9F, 0xBF, 0x1E, 0x8B, 0xE2, 0x81, 0x75, 0x66]};
+ const IID CLSID_DXTRandomBarsPP = {0xE3E6AE11, 0x7FDC, 0x40C4, [0xAF, 0xBF, 0x1D, 0xCE, 0xA8, 0x28, 0x62, 0xCC]};
+ const IID CLSID_DXTRandomDissolve = {0xF7F4A1B6, 0x8E87, 0x452F, [0xA2, 0xD7, 0x30, 0x77, 0xF5, 0x08, 0xDB, 0xC0]};
+ const IID CLSID_DXTransformFactory = {0xD1FE6762, 0xFC48, 0x11D0, [0x88, 0x3A, 0x3C, 0x8B, 0x00, 0xC1, 0x00, 0x00]};
+ const IID CLSID_DXTRedirect = {0x42B07B28, 0x2280, 0x4937, [0xB0, 0x35, 0x02, 0x93, 0xFB, 0x81, 0x27, 0x81]};
+ const IID CLSID_DXTRevealTrans = {0xE31E87C4, 0x86EA, 0x4940, [0x9B, 0x8A, 0x5B, 0xD5, 0xD1, 0x79, 0xA7, 0x37]};
+ const IID CLSID_DXTScale = {0x555278E2, 0x05DB, 0x11D1, [0x88, 0x3A, 0x3C, 0x8B, 0x00, 0xC1, 0x00, 0x00]};
+ const IID CLSID_DXTShadow = {0xE71B4063, 0x3E59, 0x11D2, [0x95, 0x2A, 0x00, 0xC0, 0x4F, 0xA3, 0x4F, 0x05]};
+ const IID CLSID_DXTShadowPP = {0xEC7E0765, 0x4C76, 0x11D2, [0x8A, 0xDE, 0x00, 0xA0, 0xC9, 0x8E, 0x65, 0x27]};
+ const IID CLSID_DXTSlide = {0xD1C5A1E7, 0xCC47, 0x4E32, [0xBD, 0xD2, 0x4B, 0x3C, 0x5F, 0xC5, 0x0A, 0xF5]};
+ const IID CLSID_DXTSpiral = {0x4A03DCB9, 0x6E17, 0x4A39, [0x88, 0x45, 0x4E, 0xE7, 0xDC, 0x53, 0x31, 0xA5]};
+ const IID CLSID_DXTStretch = {0xF088DE73, 0xBDD0, 0x4E3C, [0x81, 0xF8, 0x6D, 0x32, 0xF4, 0xFE, 0x9D, 0x28]};
+ const IID CLSID_DXTStrips = {0x63A4B1FC, 0x259A, 0x4A5B, [0x81, 0x29, 0xA8, 0x3B, 0x8C, 0x9E, 0x6F, 0x4F]};
+ const IID CLSID_DXTStripsPP = {0xFEC0B7EE, 0x7AEC, 0x4067, [0x9E, 0xE1, 0xFA, 0xCF, 0xB7, 0xCE, 0x9A, 0xF9]};
+ const IID CLSID_DXTWave = {0xADC6CB88, 0x424C, 0x11D2, [0x95, 0x2A, 0x00, 0xC0, 0x4F, 0xA3, 0x4F, 0x05]};
+ const IID CLSID_DXTWavePP = {0xF12456C0, 0x4C9E, 0x11D2, [0x8A, 0xDE, 0x00, 0xA0, 0xC9, 0x8E, 0x65, 0x27]};
+ const IID CLSID_DXTWipe = {0xAF279B30, 0x86EB, 0x11D1, [0x81, 0xBF, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID CLSID_DXTWipePP = {0x7FFE4D08, 0xFBFD, 0x11D1, [0x9A, 0x77, 0x00, 0x00, 0xF8, 0x75, 0x6A, 0x10]};
+ const IID CLSID_DXTZigzag = {0x23E26328, 0x3928, 0x40F2, [0x95, 0xE5, 0x93, 0xCA, 0xD6, 0x90, 0x16, 0xEB]};
+ const IID CLSID_EAPOLManager = {0xBA126AE4, 0x2166, 0x11D1, [0xB1, 0xD0, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID CLSID_Email = {0x8F92A857, 0x478E, 0x11D1, [0xA3, 0xB4, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID CLSID_EnumAdapterInfo = {0x6F9942CA, 0xC1B1, 0x4AB5, [0x93, 0xDA, 0x60, 0x58, 0x99, 0x1D, 0xC8, 0xF3]};
+ const IID CLSID_EVENTQUEUE = {0x6E0FF466, 0x339E, 0x11D1, [0xBE, 0x5B, 0x00, 0xC0, 0x4F, 0xC9, 0xE2, 0xBB]};
+ const IID CLSID_EXTENDEDERRORINFO = {0xC8B522CF, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID CLSID_FadePP = {0x16B280C6, 0xEE70, 0x11D1, [0x90, 0x66, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID CLSID_FaxNumber = {0xA5062215, 0x4681, 0x11D1, [0xA3, 0xB4, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID CLSID_FilePlaybackTerminal = {0x0CB9914C, 0x79CD, 0x47DC, [0xAD, 0xB0, 0x32, 0x7F, 0x47, 0xCE, 0xFB, 0x20]};
+ const IID CLSID_FileProtocol = {0x79EAC9E7, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID CLSID_FileRecordingTerminal = {0x521F3D06, 0xC3D0, 0x4511, [0x86, 0x17, 0x86, 0xB9, 0xA7, 0x83, 0xDA, 0x77]};
+ const IID CLSID_FileRecordingTrack = {0xBF14A2E4, 0xE88B, 0x4EF5, [0x97, 0x40, 0x5A, 0xC5, 0xD0, 0x22, 0xF8, 0xC9]};
+ const IID CLSID_FileSearchBand = {0xC4EE31F3, 0x4768, 0x11D2, [0xBE, 0x5C, 0x00, 0xA0, 0xC9, 0xA8, 0x3D, 0xA1]};
+ const IID CLSID_FileSysColumnProvider = {0x0D2E74C4, 0x3C34, 0x11D2, [0xA2, 0x7E, 0x00, 0xC0, 0x4F, 0xC3, 0x08, 0x71]};
+ const IID CLSID_FileTerminal = {0xAAF578F1, 0xDC70, 0x11D0, [0x8E, 0xD3, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID CLSID_FolderShortcut = {0x0AFACED1, 0xE828, 0x11D1, [0x91, 0x87, 0xB5, 0x32, 0xF1, 0xE9, 0x57, 0x5D]};
+ const IID CLSID_FolderViewHost = {0x20B1CB23, 0x6968, 0x4EB9, [0xB7, 0xD4, 0xA6, 0x6D, 0x00, 0xD0, 0x7C, 0xEE]};
+ const IID CLSID_FontNames = {0x3050F83A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_FramesCollection = {0x3050F7F6, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_FreeSpaceCategorizer = {0xB5607793, 0x24AC, 0x44C7, [0x82, 0xE2, 0x83, 0x17, 0x26, 0xAA, 0x6C, 0xB7]};
+ const IID CLSID_FtpProtocol = {0x79EAC9E3, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID CLSID_GblComponentCategoriesMgr = {0x0002E006, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_GLOBAL_BROADCAST = {0xD34F1810, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_GopherProtocol = {0x79EAC9E4, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID CLSID_GradientPP = {0x623E2880, 0xFC0E, 0x11D1, [0x9A, 0x77, 0x00, 0x00, 0xF8, 0x75, 0x6A, 0x10]};
+ const IID CLSID_HandsetTerminal = {0xAAF578EB, 0xDC70, 0x11D0, [0x8E, 0xD3, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID CLSID_HeadsetTerminal = {0xAAF578ED, 0xDC70, 0x11D0, [0x8E, 0xD3, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID CLSID_HNetCfgMgr = {0x46C166AA, 0x3108, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID CLSID_Hold = {0xB3AD3E13, 0x4080, 0x11D1, [0xA3, 0xAC, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID CLSID_HomeNetAutoConfigService = {0x9A8EA3B5, 0x572E, 0x4CB3, [0x9E, 0xB9, 0xEC, 0x68, 0x9A, 0xC5, 0x75, 0xAE]};
+ const IID CLSID_HomePage = {0x766BF2AE, 0xD650, 0x11D1, [0x98, 0x11, 0x00, 0xC0, 0x4F, 0xC3, 0x1D, 0x2E]};
+ const IID CLSID_HostDialogHelper = {0x429AF92C, 0xA51F, 0x11D2, [0x86, 0x1E, 0x00, 0xC0, 0x4F, 0xA3, 0x5C, 0x89]};
+ const IID CLSID_HTADocument = {0x3050F5C8, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTCAttachBehavior = {0x3050F5F5, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTCDefaultDispatch = {0x3050F4FC, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTCDescBehavior = {0x3050F5DD, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTCEventBehavior = {0x3050F4FE, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTCMethodBehavior = {0x3050F630, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTCPropertyBehavior = {0x3050F5DE, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLAnchorElement = {0x3050F248, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLAppBehavior = {0x3050F5CB, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLApplication = {0x3050F4D8, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLAreaElement = {0x3050F283, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLAreasCollection = {0x3050F4CA, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLAttributeCollection = {0x3050F4CC, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLBaseElement = {0x3050F276, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLBaseFontElement = {0x3050F282, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLBGsound = {0x3050F370, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLBlockElement = {0x3050F281, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLBody = {0x3050F24A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLBRElement = {0x3050F280, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLButtonElement = {0x3050F2C6, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLCommentElement = {0x3050F317, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLCurrentStyle = {0x3050F3DC, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLDDElement = {0x3050F27F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLDefaults = {0x3050F6C8, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLDialog = {0x3050F28A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLDivElement = {0x3050F27E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLDivPosition = {0x3050F249, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HtmlDlgSafeHelper = {0x3050F819, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLDListElement = {0x3050F27D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLDocument = {0x25336920, 0x03F9, 0x11CF, [0x8F, 0xD0, 0x00, 0xAA, 0x00, 0x68, 0x6F, 0x13]};
+ const IID CLSID_HTMLDOMAttribute = {0x3050F4B2, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLDOMImplementation = {0x3050F80E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLDOMTextNode = {0x3050F4BA, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLDTElement = {0x3050F27C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLElementCollection = {0x3050F4CB, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLEmbed = {0x3050F25D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLFieldSetElement = {0x3050F3E8, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLFontElement = {0x3050F27B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLFormElement = {0x3050F251, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLFrameBase = {0x3050F312, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLFrameElement = {0x3050F314, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLFrameSetSite = {0x3050F31A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLGenericElement = {0x3050F4B8, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLHeadElement = {0x3050F493, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLHeaderElement = {0x3050F27A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLHistory = {0xFECEAAA3, 0x8405, 0x11CF, [0x8B, 0xA1, 0x00, 0xAA, 0x00, 0x47, 0x6D, 0xA6]};
+ const IID CLSID_HTMLHRElement = {0x3050F252, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLHtmlElement = {0x3050F491, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLIFrame = {0x3050F316, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLImageElementFactory = {0x3050F38F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLImg = {0x3050F241, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLInputButtonElement = {0x3050F2B4, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLInputElement = {0x3050F5D8, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLInputFileElement = {0x3050F2AE, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLInputImage = {0x3050F2C4, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLInputTextElement = {0x3050F2AB, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLIsIndexElement = {0x3050F278, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLLabelElement = {0x3050F32B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLLegendElement = {0x3050F3E9, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLLIElement = {0x3050F273, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLLinkElement = {0x3050F277, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLListElement = {0x3050F272, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLLoadOptions = {0x18845040, 0x0FA5, 0x11D1, [0xBA, 0x19, 0x00, 0xC0, 0x4F, 0xD9, 0x12, 0xD0]};
+ const IID CLSID_HTMLLocation = {0x163BB1E1, 0x6E00, 0x11CF, [0x83, 0x7A, 0x48, 0xDC, 0x04, 0xC1, 0x00, 0x00]};
+ const IID CLSID_HTMLMapElement = {0x3050F271, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLMarqueeElement = {0x3050F2B9, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLMetaElement = {0x3050F275, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLNamespace = {0x3050F6BC, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLNamespaceCollection = {0x3050F6B9, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLNavigator = {0xFECEAAA6, 0x8405, 0x11CF, [0x8B, 0xA1, 0x00, 0xAA, 0x00, 0x47, 0x6D, 0xA6]};
+ const IID CLSID_HTMLNextIdElement = {0x3050F279, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLNoShowElement = {0x3050F38B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLObjectElement = {0x3050F24E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLOListElement = {0x3050F270, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLOptionButtonElement = {0x3050F2BE, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLOptionElement = {0x3050F24D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLOptionElementFactory = {0x3050F38D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLParaElement = {0x3050F26F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLParamElement = {0x3050F83E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLPhraseElement = {0x3050F26E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLPluginDocument = {0x25336921, 0x03F9, 0x11CF, [0x8F, 0xD0, 0x00, 0xAA, 0x00, 0x68, 0x6F, 0x13]};
+ const IID CLSID_HTMLPopup = {0x3050F667, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLRenderStyle = {0x3050F6AA, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLRichtextElement = {0x3050F2DF, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLRuleStyle = {0x3050F3D0, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLScreen = {0x3050F35D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLScriptElement = {0x3050F28C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLSelectElement = {0x3050F245, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLSpanElement = {0x3050F3F5, 0x98B4, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLSpanFlow = {0x3050F3E6, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLStyle = {0x3050F285, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLStyleElement = {0x3050F37D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLStyleFontFace = {0x3050F3D4, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLStyleSheet = {0x3050F2E4, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLStyleSheetPage = {0x3050F7EF, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLStyleSheetPagesCollection = {0x3050F7F1, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLStyleSheetRule = {0x3050F3CE, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLStyleSheetRulesCollection = {0x3050F3CD, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLStyleSheetsCollection = {0x3050F37F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLTable = {0x3050F26B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLTableCaption = {0x3050F2EC, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLTableCell = {0x3050F246, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLTableCol = {0x3050F26C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLTableRow = {0x3050F26D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLTableSection = {0x3050F2E9, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLTextAreaElement = {0x3050F2AC, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLTextElement = {0x3050F26A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLTitleElement = {0x3050F284, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLUListElement = {0x3050F269, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLUnknownElement = {0x3050F268, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLUrnCollection = {0x3050F580, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HTMLWindow2 = {0xD48A6EC6, 0x6A4A, 0x11CF, [0x94, 0xA7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID CLSID_HTMLWindowProxy = {0x3050F391, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_HttpProtocol = {0x79EAC9E2, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID CLSID_HttpSProtocol = {0x79EAC9E5, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID CLSID_HWShellExecute = {0xFFB8655F, 0x81B9, 0x4FCE, [0xB8, 0x9C, 0x9A, 0x6B, 0xA7, 0x6D, 0x13, 0xE7]};
+ const IID CLSID_IActiveXSafetyProvider = {0xAAF8C6CE, 0xF972, 0x11D0, [0x97, 0xEB, 0x00, 0xAA, 0x00, 0x61, 0x53, 0x33]};
+ const IID CLSID_IImageDecodeFilter = {0x607FD4E8, 0x0A03, 0x11D1, [0xAB, 0x1D, 0x00, 0xC0, 0x4F, 0xC9, 0xB3, 0x04]};
+ const IID CLSID_IImgCtx = {0x3050F3D6, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_ImageList = {0x7C476BA2, 0x02B1, 0x48F4, [0x80, 0x48, 0xB2, 0x46, 0x19, 0xDD, 0xC0, 0x58]};
+ const IID CLSID_ImageProperties = {0x7AB770C7, 0x0E23, 0x4D7A, [0x8A, 0xA2, 0x19, 0xBF, 0xAD, 0x47, 0x98, 0x29]};
+ const IID CLSID_InProcFreeMarshaler = {0x0000033A, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_IntDitherer = {0x05F6FE1A, 0xECEF, 0x11D0, [0xAA, 0xE7, 0x00, 0xC0, 0x4F, 0xC9, 0xB3, 0x04]};
+ const IID CLSID_IntelliForms = {0x613AB92E, 0x16BF, 0x11D2, [0xBC, 0xA5, 0x00, 0xC0, 0x4F, 0xD9, 0x29, 0xDB]};
+ const IID CLSID_Internet = {0x871C5380, 0x42A0, 0x1069, [0xA2, 0xEA, 0x08, 0x00, 0x2B, 0x30, 0x30, 0x9D]};
+ const IID CLSID_InternetButtons = {0x1E796980, 0x9CC5, 0x11D1, [0xA8, 0x3F, 0x00, 0xC0, 0x4F, 0xC9, 0x9D, 0x61]};
+ const IID CLSID_InternetConnectionBeaconServic = {0x04DF613A, 0x5610, 0x11D4, [0x9E, 0xC8, 0x00, 0xB0, 0xD0, 0x22, 0xDD, 0x1F]};
+ const IID CLSID_InternetExplorer = {0x0002DF01, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_InternetPrintOrdering = {0xADD36AA8, 0x751A, 0x4579, [0xA2, 0x66, 0xD6, 0x6F, 0x52, 0x02, 0xCC, 0xBB]};
+ const IID CLSID_InternetSecurityManager = {0x7B8A2D94, 0x0AC9, 0x11D1, [0x89, 0x6C, 0x00, 0xC0, 0x4F, 0xB6, 0xBF, 0xC4]};
+ const IID CLSID_InternetShortcut = {0xFBF23B40, 0xE3F0, 0x101B, [0x84, 0x88, 0x00, 0xAA, 0x00, 0x3E, 0x56, 0xF8]};
+ const IID CLSID_InternetZoneManager = {0x7B8A2D95, 0x0AC9, 0x11D1, [0x89, 0x6C, 0x00, 0xC0, 0x4F, 0xB6, 0xBF, 0xC4]};
+ const IID CLSID_LanConnectionManager = {0xBA126AD3, 0x2166, 0x11D1, [0xB1, 0xD0, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID CLSID_LargeInteger = {0x927971F5, 0x0939, 0x11D1, [0x8B, 0xE1, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID CLSID_LDAPConnectionObject = {0x7DA2A9C4, 0x0C46, 0x43BD, [0xB0, 0x4E, 0xD9, 0x2B, 0x1B, 0xE2, 0x7C, 0x45]};
+ const IID CLSID_LDAPObject = {0x05709878, 0x5195, 0x466C, [0x9E, 0x64, 0x48, 0x7C, 0xE3, 0xCA, 0x20, 0xBF]};
+ const IID CLSID_LinkColumnProvider = {0x24F14F02, 0x7B1C, 0x11D1, [0x83, 0x8F, 0x00, 0x00, 0xF8, 0x04, 0x61, 0xCF]};
+ const IID CLSID_LocalMachineClasses = {0x00000331, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_LogManager = {0x8FDA8FA4, 0x8763, 0x479F, [0xB9, 0xB1, 0x22, 0x02, 0xB2, 0x80, 0xD2, 0x93]};
+ const IID CLSID_LUTBuilderPP = {0x25B33662, 0xFD83, 0x11D1, [0x8A, 0xDE, 0x44, 0x45, 0x53, 0x54, 0x00, 0x01]};
+ const IID CLSID_MachineDebugManager = {0x0C0A3666, 0x30C9, 0x11D0, [0x8F, 0x20, 0x00, 0x80, 0x5F, 0x2C, 0xD0, 0x64]};
+ const IID CLSID_MailAutoDiscovery = {0x008FD5DD, 0x6DBB, 0x48E3, [0x99, 0x1B, 0x2D, 0x3E, 0xD6, 0x58, 0x51, 0x6A]};
+ const IID CLSID_MailProtocolADEntry = {0x61A5D6F3, 0xC131, 0x4C35, [0xBF, 0x40, 0x90, 0xA5, 0x0F, 0x21, 0x41, 0x22]};
+ const IID CLSID_ManualResetEvent = {0x0000032C, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_McastAddressAllocation = {0xDF0DAEF2, 0xA289, 0x11D1, [0x86, 0x97, 0x00, 0x60, 0x08, 0xB0, 0xE5, 0xD2]};
+ const IID CLSID_MediaStreamTerminal = {0xE2F7AEF7, 0x4971, 0x11D1, [0xA6, 0x71, 0x00, 0x60, 0x97, 0xC9, 0xA2, 0xE8]};
+ const IID CLSID_MergedCategorizer = {0x8E827C11, 0x33E7, 0x4BC1, [0xB2, 0x42, 0x8C, 0xD9, 0xA1, 0xC2, 0xB3, 0x04]};
+ const IID CLSID_MHTMLDocument = {0x3050F3D9, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_MicrophoneTerminal = {0xAAF578EF, 0xDC70, 0x11D0, [0x8E, 0xD3, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID CLSID_MicrosoftDS = {0xFE1290F0, 0xCFBD, 0x11CF, [0xA3, 0x30, 0x00, 0xAA, 0x00, 0xC1, 0x6E, 0x65]};
+ const IID CLSID_MigrationWizardAuto = {0x67331D85, 0xBE17, 0x42F6, [0x8D, 0x3F, 0x47, 0xB8, 0xE8, 0xB2, 0x66, 0x37]};
+ const IID CLSID_MkProtocol = {0x79EAC9E6, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID CLSID_MofCompiler = {0x6DAF9757, 0x2E37, 0x11D2, [0xAE, 0xC9, 0x00, 0xC0, 0x4F, 0xB6, 0x88, 0x20]};
+ const IID CLSID_MountedVolume = {0x12518493, 0x00B2, 0x11D2, [0x9F, 0xA5, 0x9E, 0x34, 0x20, 0x52, 0x41, 0x53]};
+ const IID CLSID_MSBurnEngineObj = {0x520CCA67, 0x51A5, 0x11D3, [0x91, 0x44, 0x00, 0x10, 0x4B, 0xA1, 0x1C, 0x5E]};
+ const IID CLSID_MSDATT = {0xC8B522CE, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID CLSID_MSDAVTM = {0x0C733A8E, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID CLSID_MSDiscMasterObj = {0x520CCA63, 0x51A5, 0x11D3, [0x91, 0x44, 0x00, 0x10, 0x4B, 0xA1, 0x1C, 0x5E]};
+ const IID CLSID_MSDiscRecorderObj = {0x520CCA61, 0x51A5, 0x11D3, [0x91, 0x44, 0x00, 0x10, 0x4B, 0xA1, 0x1C, 0x5E]};
+ const IID CLSID_MSDiscStashObj = {0x520CCA65, 0x51A5, 0x11D3, [0x91, 0x44, 0x00, 0x10, 0x4B, 0xA1, 0x1C, 0x5E]};
+ const IID CLSID_MSEnumDiscRecordersObj = {0x8A03567A, 0x63CB, 0x4BA8, [0xBA, 0xF6, 0x52, 0x11, 0x98, 0x16, 0xD1, 0xEF]};
+ const IID CLSID_MSOButtons = {0x178F34B8, 0xA282, 0x11D2, [0x86, 0xC5, 0x00, 0xC0, 0x4F, 0x8E, 0xEA, 0x99]};
+ const IID CLSID_MyComputer = {0x20D04FE0, 0x3AEA, 0x1069, [0xA2, 0xD8, 0x08, 0x00, 0x2B, 0x30, 0x30, 0x9D]};
+ const IID CLSID_MyDocuments = {0x450D8FBA, 0xAD25, 0x11D0, [0x98, 0xA8, 0x08, 0x00, 0x36, 0x1B, 0x11, 0x03]};
+ const IID CLSID_NameTranslate = {0x274FAE1F, 0x3626, 0x11D1, [0xA3, 0xA4, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID CLSID_NetAddress = {0xB0B71247, 0x4080, 0x11D1, [0xA3, 0xAC, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID CLSID_NetConnectionHNetUtil = {0xBA126AE3, 0x2166, 0x11D1, [0xB1, 0xD0, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID CLSID_NetConnectionUiUtilities = {0x7007ACD3, 0x3202, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID CLSID_NetCrawler = {0x601AC3DC, 0x786A, 0x4EB0, [0xBF, 0x40, 0xEE, 0x35, 0x21, 0xE7, 0x0B, 0xFB]};
+ const IID CLSID_NetSharingManager = {0x5C63C1AD, 0x3956, 0x4FF8, [0x84, 0x86, 0x40, 0x03, 0x47, 0x58, 0x31, 0x5B]};
+ const IID CLSID_NetworkDomain = {0x46E06680, 0x4BF0, 0x11D1, [0x83, 0xEE, 0x00, 0xA0, 0xC9, 0x0D, 0xC8, 0x49]};
+ const IID CLSID_NetworkPlaces = {0x208D2C60, 0x3AEA, 0x1069, [0xA2, 0xD7, 0x08, 0x00, 0x2B, 0x30, 0x30, 0x9D]};
+ const IID CLSID_NetworkServer = {0xC0542A90, 0x4BF0, 0x11D1, [0x83, 0xEE, 0x00, 0xA0, 0xC9, 0x0D, 0xC8, 0x49]};
+ const IID CLSID_NetworkShare = {0x54A754C0, 0x4BF0, 0x11D1, [0x83, 0xEE, 0x00, 0xA0, 0xC9, 0x0D, 0xC8, 0x49]};
+ const IID CLSID_NetworkType = {0xD4F3D51B, 0x1755, 0x4953, [0x9C, 0x8B, 0x24, 0x95, 0xAB, 0xE5, 0xE0, 0x7E]};
+ const IID CLSID_NodeType = {0x1AAA3D11, 0x4792, 0x44E4, [0x9D, 0x49, 0x78, 0xFE, 0xD3, 0x69, 0x1A, 0x14]};
+ const IID CLSID_NotificaitonTest1 = {0xC733E501, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_NotificaitonTest2 = {0xC733E502, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_NotificaitonTest3 = {0xC733E503, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_NotificaitonTest4 = {0xC733E504, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_NotificationManager = {0xE1813DD0, 0xAADA, 0x4738, [0xB5, 0xFF, 0x96, 0xB4, 0x18, 0x9C, 0x50, 0x19]};
+ const IID CLSID_ObjectManager = {0x955661BD, 0xCCA2, 0x4EAC, [0x91, 0xD0, 0xA0, 0x39, 0x6A, 0x28, 0xAE, 0xFD]};
+ const IID CLSID_OctetList = {0x1241400F, 0x4680, 0x11D1, [0xA3, 0xB4, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID CLSID_OldHTMLDocument = {0xD48A6EC9, 0x6A4A, 0x11CF, [0x94, 0xA7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID CLSID_OldHTMLFormElement = {0x0D04D285, 0x6BEC, 0x11CF, [0x8B, 0x97, 0x00, 0xAA, 0x00, 0x47, 0x6D, 0xA6]};
+ const IID CLSID_OLEDB_CONVERSIONLIBRARY = {0xC8B522D1, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID CLSID_OLEDB_ENUMERATOR = {0xC8B522D0, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID CLSID_OLEDB_ROWPOSITIONLIBRARY = {0x2048EEE6, 0x7FA2, 0x11D0, [0x9E, 0x6A, 0x00, 0xA0, 0xC9, 0x13, 0x8C, 0x29]};
+ const IID CLSID_PassportClientServices = {0x2D2307C8, 0x7DB4, 0x40D6, [0x91, 0x00, 0xD5, 0x2A, 0xF4, 0xF9, 0x7A, 0x5B]};
+ const IID CLSID_Path = {0xB2538919, 0x4080, 0x11D1, [0xA3, 0xAC, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID CLSID_Pathname = {0x080D0D78, 0xF421, 0x11D0, [0xA3, 0x6E, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID CLSID_PeerFactory = {0x3050F4CF, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_PendingProxyConnection = {0xD8A68E5E, 0x2B37, 0x426C, [0xA3, 0x29, 0xC1, 0x17, 0xC1, 0x4C, 0x42, 0x9E]};
+ const IID CLSID_PersistentDataChannel = {0xBC9B54AB, 0x7883, 0x4C13, [0x90, 0x9F, 0x03, 0x3D, 0x03, 0x26, 0x79, 0x90]};
+ const IID CLSID_PersistPropset = {0xFB8F0821, 0x0164, 0x101B, [0x84, 0xED, 0x08, 0x00, 0x2B, 0x2E, 0xC7, 0x13]};
+ const IID CLSID_Picture_Dib = {0x00000316, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_Picture_EnhMetafile = {0x00000319, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_Picture_Metafile = {0x00000315, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_Pixelate = {0x4CCEA634, 0xFBE0, 0x11D1, [0x90, 0x6A, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID CLSID_PixelatePP = {0x4CCEA635, 0xFBE0, 0x11D1, [0x90, 0x6A, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID CLSID_PluggableSuperclassRegistratio = {0xBB918E32, 0x2A5C, 0x4986, [0xAB, 0x40, 0x16, 0x86, 0xA0, 0x34, 0x39, 0x0A]};
+ const IID CLSID_PluggableTerminalRegistration = {0x45234E3E, 0x61CC, 0x4311, [0xA3, 0xAB, 0x24, 0x80, 0x82, 0x55, 0x44, 0x82]};
+ const IID CLSID_PostAgent = {0xD8BD2030, 0x6FC9, 0x11D0, [0x86, 0x4F, 0x00, 0xAA, 0x00, 0x68, 0x09, 0xD9]};
+ const IID CLSID_PostalAddress = {0x0A75AFCD, 0x4680, 0x11D1, [0xA3, 0xB4, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID CLSID_PrimaryControlChannel = {0x3CEB5509, 0xC1CD, 0x432F, [0x9D, 0x8F, 0x65, 0xD1, 0xE2, 0x86, 0xAA, 0x80]};
+ const IID CLSID_Printers = {0x2227A280, 0x3AEA, 0x1069, [0xA2, 0xDE, 0x08, 0x00, 0x2B, 0x30, 0x30, 0x9D]};
+ const IID CLSID_PROCESS_BROADCAST = {0xD34F1811, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_ProcessDebugManager = {0x78A51822, 0x51F4, 0x11D0, [0x8F, 0x20, 0x00, 0x80, 0x5F, 0x2C, 0xD0, 0x64]};
+ const IID CLSID_ProgressDialog = {0xF8383852, 0xFCD3, 0x11D1, [0xA6, 0xB9, 0x00, 0x60, 0x97, 0xDF, 0x5B, 0xD4]};
+ const IID CLSID_PropertiesUI = {0xD912F8CF, 0x0396, 0x4915, [0x88, 0x4E, 0xFB, 0x42, 0x5D, 0x32, 0x94, 0x3B]};
+ const IID CLSID_PropertyEntry = {0x72D3EDC2, 0xA4C4, 0x11D0, [0x85, 0x33, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID CLSID_PropertyValue = {0x7B9E38B0, 0xA97C, 0x11D0, [0x85, 0x34, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID CLSID_PSBindCtx = {0x00000312, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_PSClassObject = {0x0000030E, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_PSClientSite = {0x0000030D, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_PSDragDrop = {0x00000311, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_PSEnumerators = {0x00000313, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_PseudoSink = {0xE002E4F0, 0xE6EA, 0x11D2, [0x9C, 0xB3, 0x00, 0x10, 0x5A, 0x1F, 0x48, 0x01]};
+ const IID CLSID_PSGenObject = {0x0000030C, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_PSInPlaceActive = {0x0000030F, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_PSInPlaceFrame = {0x00000310, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_PSUrlMonProxy = {0x79EAC9F1, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID CLSID_PublishDropTarget = {0xCC6EEFFB, 0x43F6, 0x46C5, [0x96, 0x19, 0x51, 0xD5, 0x71, 0x96, 0x7F, 0x7D]};
+ const IID CLSID_PublishingWizard = {0x6B33163C, 0x76A5, 0x4B6C, [0xBF, 0x21, 0x45, 0xDE, 0x9C, 0xD5, 0x03, 0xA1]};
+ const IID CLSID_QueryAssociations = {0xA07034FD, 0x6CAA, 0x4954, [0xAC, 0x3F, 0x97, 0xA2, 0x72, 0x16, 0xF9, 0x8A]};
+ const IID CLSID_QueryCancelAutoPlay = {0x331F1768, 0x05A9, 0x4DDD, [0xB8, 0x6E, 0xDA, 0xE3, 0x4D, 0xDC, 0x99, 0x8A]};
+ const IID CLSID_RecycleBin = {0x645FF040, 0x5081, 0x101B, [0x9F, 0x08, 0x00, 0xAA, 0x00, 0x2F, 0x95, 0x4E]};
+ const IID CLSID_RemoteUnknownPSFactory = {0x00000340, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_Rendezvous = {0xF1029E5B, 0xCB5B, 0x11D0, [0x8D, 0x59, 0x00, 0xC0, 0x4F, 0xD9, 0x1A, 0xC0]};
+ const IID CLSID_ReplicaPointer = {0xF5D1BADF, 0x4080, 0x11D1, [0xA3, 0xAC, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID CLSID_Request = {0x6BC096B1, 0x0CE6, 0x11D1, [0xBA, 0xAE, 0x00, 0xC0, 0x4F, 0xC2, 0xE2, 0x0D]};
+ const IID CLSID_RequestMakeCall = {0xAC48FFE0, 0xF8C4, 0x11D1, [0xA0, 0x30, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID CLSID_ResProtocol = {0x3050F3BC, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_RTCClient = {0x7A42EA29, 0xA2B7, 0x40C4, [0xB0, 0x91, 0xF6, 0xF0, 0x24, 0xAA, 0x89, 0xBE]};
+ const IID CLSID_Scriptlet = {0xAE24FDAE, 0x03C6, 0x11D1, [0x8B, 0x76, 0x00, 0x80, 0xC7, 0x44, 0xF3, 0x89]};
+ const IID CLSID_SdoMachine = {0xE9218AE7, 0x9E91, 0x11D1, [0xBF, 0x60, 0x00, 0x80, 0xC7, 0x84, 0x6B, 0xC0]};
+ const IID CLSID_SdpConferenceBlob = {0x9B2719DD, 0xB696, 0x11D0, [0xA4, 0x89, 0x00, 0xC0, 0x4F, 0xD9, 0x1A, 0xC0]};
+ const IID CLSID_SearchAssistantOC = {0xB45FF030, 0x4447, 0x11D2, [0x85, 0xDE, 0x00, 0xC0, 0x4F, 0xA3, 0x5C, 0x89]};
+ const IID CLSID_SearchCommand = {0xB005E690, 0x678D, 0x11D1, [0xB7, 0x58, 0x00, 0xA0, 0xC9, 0x05, 0x64, 0xFE]};
+ const IID CLSID_SecondaryControlChannel = {0x7B3181A0, 0xC92F, 0x4567, [0xB0, 0xFA, 0xCD, 0x9A, 0x10, 0xEC, 0xD7, 0xD1]};
+ const IID CLSID_SecurityDescriptor = {0xB958F73C, 0x9BDD, 0x11D0, [0x85, 0x2C, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID CLSID_SENS = {0xD597CAFE, 0x5B9F, 0x11D1, [0x8D, 0xD2, 0x00, 0xAA, 0x00, 0x4A, 0xBD, 0x5E]};
+ const IID CLSID_ServiceManager = {0xABD0388A, 0xDEC1, 0x44F3, [0x98, 0xE1, 0x8D, 0x5C, 0xC8, 0x0B, 0x97, 0xEB]};
+ const IID CLSID_SharingApplicationDefinition = {0x46C166B0, 0x3108, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID CLSID_SharingConfiguration = {0x46C166B1, 0x3108, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID CLSID_SharingManagerEnumApplicationDe = {0x46C166AE, 0x3108, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID CLSID_SharingManagerEnumPortMapping = {0x46C166AF, 0x3108, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID CLSID_SharingManagerEnumPrivateConnec = {0x46C166AD, 0x3108, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID CLSID_SharingManagerEnumPublicConnect = {0x46C166AC, 0x3108, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID CLSID_Shell = {0x13709620, 0xC279, 0x11CE, [0xA4, 0x9E, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID CLSID_ShellBrowserWindow = {0xC08AFD90, 0xF2A1, 0x11D1, [0x84, 0x55, 0x00, 0xA0, 0xC9, 0x1F, 0x38, 0x80]};
+ const IID CLSID_ShellDesktop = {0x00021400, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_ShellDispatchInproc = {0x0A89A860, 0xD7B1, 0x11CE, [0x83, 0x50, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID CLSID_ShellFolderItem = {0x2FE352EA, 0xFD1F, 0x11D2, [0xB1, 0xF4, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x3E]};
+ const IID CLSID_ShellFolderView = {0x62112AA1, 0xEBE4, 0x11CF, [0xA5, 0xFB, 0x00, 0x20, 0xAF, 0xE7, 0x29, 0x2D]};
+ const IID CLSID_ShellFolderViewOC = {0x9BA05971, 0xF6A8, 0x11CF, [0xA4, 0x42, 0x00, 0xA0, 0xC9, 0x0A, 0x8F, 0x39]};
+ const IID CLSID_ShellFSFolder = {0xF3364BA0, 0x65B9, 0x11CE, [0xA9, 0xBA, 0x00, 0xAA, 0x00, 0x4A, 0xE8, 0x37]};
+ const IID CLSID_ShellImageDataFactory = {0x66E4E4FB, 0xF385, 0x4DD0, [0x8D, 0x74, 0xA2, 0xEF, 0xD1, 0xBC, 0x61, 0x78]};
+ const IID CLSID_ShellLink = {0x00021401, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_ShellLinkObject = {0x11219420, 0x1768, 0x11D1, [0x95, 0xBE, 0x00, 0x60, 0x97, 0x97, 0xEA, 0x4F]};
+ const IID CLSID_ShellLocalMachine = {0x60664CAF, 0xAF0D, 0x0005, [0xA3, 0x00, 0x5C, 0x7D, 0x25, 0xFF, 0x22, 0xA0]};
+ const IID CLSID_ShellLogonEnumUsers = {0x60664CAF, 0xAF0D, 0x0004, [0xA3, 0x00, 0x5C, 0x7D, 0x25, 0xFF, 0x22, 0xA0]};
+ const IID CLSID_ShellLogonStatusHost = {0x60664CAF, 0xAF0D, 0x0007, [0xA3, 0x00, 0x5C, 0x7D, 0x25, 0xFF, 0x22, 0xA0]};
+ const IID CLSID_ShellLogonUser = {0x60664CAF, 0xAF0D, 0x0003, [0xA3, 0x00, 0x5C, 0x7D, 0x25, 0xFF, 0x22, 0xA0]};
+ const IID CLSID_ShellNameSpace = {0x55136805, 0xB2DE, 0x11D1, [0xB9, 0xF2, 0x00, 0xA0, 0xC9, 0x8B, 0xC5, 0x47]};
+ const IID CLSID_ShellUIHelper = {0x64AB4BB7, 0x111E, 0x11D1, [0x8F, 0x79, 0x00, 0xC0, 0x4F, 0xC2, 0xFB, 0xE1]};
+ const IID CLSID_ShellWindows = {0x9BA05972, 0xF6A8, 0x11CF, [0xA4, 0x42, 0x00, 0xA0, 0xC9, 0x0A, 0x8F, 0x39]};
+ const IID CLSID_SizeCategorizer = {0x55D7B852, 0xF6D1, 0x42F2, [0xAA, 0x75, 0x87, 0x28, 0xA1, 0xB2, 0xD2, 0x64]};
+ const IID CLSID_SoftDistExt = {0xB15B8DC0, 0xC7E1, 0x11D0, [0x86, 0x80, 0x00, 0xAA, 0x00, 0xBD, 0xCB, 0x71]};
+ const IID CLSID_SpeakerphoneTerminal = {0xAAF578EE, 0xDC70, 0x11D0, [0x8E, 0xD3, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID CLSID_SpeakersTerminal = {0xAAF578F0, 0xDC70, 0x11D0, [0x8E, 0xD3, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID CLSID_SpeechUIServer = {0x1443904B, 0x34E4, 0x40F6, [0xB3, 0x0F, 0x6B, 0xEB, 0x81, 0x26, 0x7B, 0x80]};
+ const IID CLSID_StaticDib = {0x00000316, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_StaticMetafile = {0x00000315, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_StdAsyncActManager = {0x00000329, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_StdComponentCategoriesMgr = {0x0002E005, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_StdEncodingFilterFac = {0x54C37CD0, 0xD944, 0x11D0, [0xA9, 0xF4, 0x00, 0x60, 0x97, 0x94, 0x23, 0x11]};
+ const IID CLSID_StdEvent = {0x0000032B, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_StdFont = {0x0BE35203, 0x8F91, 0x11CE, [0x9D, 0xE3, 0x00, 0xAA, 0x00, 0x4B, 0xB8, 0x51]};
+ const IID CLSID_StdGlobalInterfaceTable = {0x00000323, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_StdHlink = {0x79EAC9D0, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID CLSID_StdHlinkBrowseContext = {0x79EAC9D1, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID CLSID_StdMarshal = {0x00000017, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_StdNotificationMgr = {0xC733E4AF, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_StdPicture = {0x0BE35204, 0x8F91, 0x11CE, [0x9D, 0xE3, 0x00, 0xAA, 0x00, 0x4B, 0xB8, 0x51]};
+ const IID CLSID_StdURLMoniker = {0x79EAC9E0, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID CLSID_StdURLProtocol = {0x79EAC9E1, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID CLSID_StgFolder = {0xE773F1AF, 0x3A65, 0x4866, [0x85, 0x7D, 0x84, 0x6F, 0xC9, 0xC4, 0x59, 0x8A]};
+ const IID CLSID_StockColorPage = {0x7EBDAAE1, 0x8120, 0x11CF, [0x89, 0x9F, 0x00, 0xAA, 0x00, 0x68, 0x8B, 0x10]};
+ const IID CLSID_StockFontPage = {0x7EBDAAE0, 0x8120, 0x11CF, [0x89, 0x9F, 0x00, 0xAA, 0x00, 0x68, 0x8B, 0x10]};
+ const IID CLSID_StockPicturePage = {0x7EBDAAE2, 0x8120, 0x11CF, [0x89, 0x9F, 0x00, 0xAA, 0x00, 0x68, 0x8B, 0x10]};
+ const IID CLSID_SubscriptionMgr = {0xABBE31D0, 0x6DAE, 0x11D0, [0xBE, 0xCA, 0x00, 0xC0, 0x4F, 0xD9, 0x40, 0xBE]};
+ const IID CLSID_SubscriptionThrottler = {0x1E9B00E5, 0x9846, 0x11D1, [0xA1, 0xEE, 0x00, 0xC0, 0x4F, 0xC2, 0xFB, 0xE1]};
+ const IID CLSID_SWbemDateTime = {0x47DFBE54, 0xCF76, 0x11D3, [0xB3, 0x8F, 0x00, 0x10, 0x5A, 0x1F, 0x47, 0x3A]};
+ const IID CLSID_SWbemEventSource = {0x04B83D58, 0x21AE, 0x11D2, [0x8B, 0x33, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID CLSID_SWbemLastError = {0xC2FEEEAC, 0xCFCD, 0x11D1, [0x8B, 0x05, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID CLSID_SWbemLocator = {0x76A64158, 0xCB41, 0x11D1, [0x8B, 0x02, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID CLSID_SWbemMethod = {0x04B83D5B, 0x21AE, 0x11D2, [0x8B, 0x33, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID CLSID_SWbemMethodSet = {0x04B83D5A, 0x21AE, 0x11D2, [0x8B, 0x33, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID CLSID_SWbemNamedValue = {0x04B83D60, 0x21AE, 0x11D2, [0x8B, 0x33, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID CLSID_SWbemNamedValueSet = {0x9AED384E, 0xCE8B, 0x11D1, [0x8B, 0x05, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID CLSID_SWbemObject = {0x04B83D62, 0x21AE, 0x11D2, [0x8B, 0x33, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID CLSID_SWbemObjectEx = {0xD6BDAFB2, 0x9435, 0x491F, [0xBB, 0x87, 0x6A, 0xA0, 0xF0, 0xBC, 0x31, 0xA2]};
+ const IID CLSID_SWbemObjectPath = {0x5791BC26, 0xCE9C, 0x11D1, [0x97, 0xBF, 0x00, 0x00, 0xF8, 0x1E, 0x84, 0x9C]};
+ const IID CLSID_SWbemObjectSet = {0x04B83D61, 0x21AE, 0x11D2, [0x8B, 0x33, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID CLSID_SWbemPrivilege = {0x26EE67BC, 0x5804, 0x11D2, [0x8B, 0x4A, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID CLSID_SWbemPrivilegeSet = {0x26EE67BE, 0x5804, 0x11D2, [0x8B, 0x4A, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID CLSID_SWbemProperty = {0x04B83D5D, 0x21AE, 0x11D2, [0x8B, 0x33, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID CLSID_SWbemPropertySet = {0x04B83D5C, 0x21AE, 0x11D2, [0x8B, 0x33, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID CLSID_SWbemQualifier = {0x04B83D5F, 0x21AE, 0x11D2, [0x8B, 0x33, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID CLSID_SWbemQualifierSet = {0x04B83D5E, 0x21AE, 0x11D2, [0x8B, 0x33, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID CLSID_SWbemRefreshableItem = {0x8C6854BC, 0xDE4B, 0x11D3, [0xB3, 0x90, 0x00, 0x10, 0x5A, 0x1F, 0x47, 0x3A]};
+ const IID CLSID_SWbemRefresher = {0xD269BF5C, 0xD9C1, 0x11D3, [0xB3, 0x8F, 0x00, 0x10, 0x5A, 0x1F, 0x47, 0x3A]};
+ const IID CLSID_SWbemSecurity = {0xB54D66E9, 0x2287, 0x11D2, [0x8B, 0x33, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID CLSID_SWbemServices = {0x04B83D63, 0x21AE, 0x11D2, [0x8B, 0x33, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID CLSID_SWbemServicesEx = {0x62E522DC, 0x8CF3, 0x40A8, [0x8B, 0x2E, 0x37, 0xD5, 0x95, 0x65, 0x1E, 0x40]};
+ const IID CLSID_SWbemSink = {0x75718C9A, 0xF029, 0x11D1, [0xA1, 0xAC, 0x00, 0xC0, 0x4F, 0xB6, 0xC2, 0x23]};
+ const IID CLSID_SynchronizeContainer = {0x0000032D, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID CLSID_SyncMgr = {0x6295DF27, 0x35EE, 0x11D1, [0x87, 0x07, 0x00, 0xC0, 0x4F, 0xD9, 0x33, 0x27]};
+ const IID CLSID_TAPI = {0x21D6D48E, 0xA88B, 0x11D0, [0x83, 0xDD, 0x00, 0xAA, 0x00, 0x3C, 0xCA, 0xBD]};
+ const IID CLSID_TaskbarList = {0x56FDF344, 0xFD6D, 0x11D0, [0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90]};
+ const IID CLSID_TaskManager = {0xC0F615A7, 0xF874, 0x4521, [0x87, 0x91, 0xED, 0x3B, 0x84, 0x01, 0x7E, 0xF7]};
+ const IID CLSID_TerminalManager = {0x7170F2E0, 0x9BE3, 0x11D0, [0xA0, 0x09, 0x00, 0xAA, 0x00, 0xB6, 0x05, 0xA4]};
+ const IID CLSID_THREAD_BROADCAST = {0xD34F1812, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_ThreadDialogProcParam = {0x3050F5EB, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID CLSID_ThumbnailFCNHandler = {0xCEFC65D8, 0x66D8, 0x11D1, [0x8D, 0x8C, 0x00, 0x00, 0xF8, 0x04, 0xB0, 0x57]};
+ const IID CLSID_ThumbnailUpdater = {0xA3C63918, 0x889D, 0x11D1, [0x83, 0xE9, 0x00, 0xC0, 0x4F, 0xC2, 0xC6, 0xD4]};
+ const IID CLSID_TIME = {0xE32EF57B, 0x7FDE, 0x4765, [0x9B, 0xC5, 0xA1, 0xBA, 0x97, 0x05, 0xC4, 0x4E]};
+ const IID CLSID_TIMEAnimation = {0xF99D135A, 0xC07C, 0x449E, [0x96, 0x5C, 0x7D, 0xBB, 0x7C, 0x55, 0x4A, 0x51]};
+ const IID CLSID_TimeCategorizer = {0x3BB4118F, 0xDDFD, 0x4D30, [0xA3, 0x48, 0x9F, 0xB5, 0xD6, 0xBF, 0x1A, 0xFE]};
+ const IID CLSID_TIMEColorAnimation = {0x62F75052, 0xF3EC, 0x4A64, [0x84, 0xFB, 0xAB, 0x18, 0xE0, 0x74, 0x6E, 0xD8]};
+ const IID CLSID_TIMEFactory = {0x17237A20, 0x3ADB, 0x48EC, [0xB1, 0x82, 0x35, 0x29, 0x1F, 0x11, 0x57, 0x90]};
+ const IID CLSID_TIMEFilterAnimation = {0xC54515D0, 0xF2E5, 0x4BDD, [0xAA, 0x86, 0x1E, 0x4F, 0x23, 0xE4, 0x80, 0xE7]};
+ const IID CLSID_TIMEMotionAnimation = {0x0019A09D, 0x1A81, 0x41C5, [0x89, 0xEC, 0xD9, 0xE7, 0x37, 0x81, 0x13, 0x03]};
+ const IID CLSID_TIMESetAnimation = {0xBA91CE53, 0xBAEB, 0x4F05, [0x86, 0x1C, 0x0A, 0x2A, 0x09, 0x34, 0xF8, 0x2E]};
+ const IID CLSID_Timestamp = {0xB2BED2EB, 0x4080, 0x11D1, [0xA3, 0xAC, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID CLSID_ToolbarExtButtons = {0x2CE4B5D8, 0xA28F, 0x11D2, [0x86, 0xC5, 0x00, 0xC0, 0x4F, 0x8E, 0xEA, 0x99]};
+ const IID CLSID_TrackFile = {0x8790C947, 0xA30B, 0x11D0, [0x8C, 0xAB, 0x00, 0xC0, 0x4F, 0xD9, 0x0F, 0x85]};
+ const IID CLSID_TrkForceOwnership = {0xA2531F45, 0xC67D, 0x11D0, [0x8C, 0xB1, 0x00, 0xC0, 0x4F, 0xD9, 0x0F, 0x85]};
+ const IID CLSID_TrkRestoreNotify = {0xD0056F6C, 0xE2A0, 0x11D0, [0xB1, 0xC2, 0x00, 0xC0, 0x4F, 0xB9, 0x38, 0x6D]};
+ const IID CLSID_TrkRestoreParser = {0x755939E4, 0xE381, 0x11D0, [0xB1, 0xC5, 0x00, 0xC0, 0x4F, 0xB9, 0x38, 0x6D]};
+ const IID CLSID_TypedName = {0xB33143CB, 0x4080, 0x11D1, [0xA3, 0xAC, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID CLSID_UmiLDAPQueryObject = {0xCD5D4D76, 0xA818, 0x4F95, [0xB9, 0x58, 0x79, 0x70, 0xFD, 0x94, 0x12, 0xCA]};
+ const IID CLSID_UnsecuredApartment = {0x49BD2028, 0x1523, 0x11D1, [0xAD, 0x79, 0x00, 0xC0, 0x4F, 0xD8, 0xFD, 0xFF]};
+ const IID CLSID_UPnPDescriptionDocument = {0x1D8A9B47, 0x3A28, 0x4CE2, [0x8A, 0x4B, 0xBD, 0x34, 0xE4, 0x5B, 0xCE, 0xEB]};
+ const IID CLSID_UPnPDevice = {0xA32552C5, 0xBA61, 0x457A, [0xB5, 0x9A, 0xA2, 0x56, 0x1E, 0x12, 0x5E, 0x33]};
+ const IID CLSID_UPnPDeviceFinder = {0xE2085F28, 0xFEB7, 0x404A, [0xB8, 0xE7, 0xE6, 0x59, 0xBD, 0xEA, 0xAA, 0x02]};
+ const IID CLSID_UPnPDeviceHostICSSupport = {0x797A9BB1, 0x9E49, 0x4E63, [0xAF, 0xE1, 0x1B, 0x45, 0xB9, 0xDC, 0x81, 0x62]};
+ const IID CLSID_UPnPDeviceHostSetup = {0xB4609411, 0xC81C, 0x4CCE, [0x8C, 0x76, 0xC6, 0xB5, 0x0C, 0x94, 0x02, 0xC6]};
+ const IID CLSID_UPnPDevices = {0xB9E84FFD, 0xAD3C, 0x40A4, [0xB8, 0x35, 0x08, 0x82, 0xEB, 0xCB, 0xAA, 0xA8]};
+ const IID CLSID_UPnPNAT = {0xAE1E00AA, 0x3FD5, 0x403C, [0x8A, 0x27, 0x2B, 0xBD, 0xC3, 0x0C, 0xD0, 0xE1]};
+ const IID CLSID_UPnPRegistrar = {0x204810B9, 0x73B2, 0x11D4, [0xBF, 0x42, 0x00, 0xB0, 0xD0, 0x11, 0x8B, 0x56]};
+ const IID CLSID_UPnPService = {0xC624BA95, 0xFBCB, 0x4409, [0x8C, 0x03, 0x8C, 0xCE, 0xEC, 0x53, 0x3E, 0xF1]};
+ const IID CLSID_UPnPServices = {0xC0BC4B4A, 0xA406, 0x4EFC, [0x93, 0x2F, 0xB8, 0x54, 0x6B, 0x81, 0x00, 0xCC]};
+ const IID CLSID_UrlMkBindCtx = {0x79EAC9F2, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID CLSID_UserEventTimer = {0x864A1288, 0x354C, 0x4D19, [0x9D, 0x68, 0xC2, 0x74, 0x2B, 0xB1, 0x49, 0x97]};
+ const IID CLSID_UserEventTimerCallback = {0x15FFFD13, 0x5140, 0x41B8, [0xB8, 0x9A, 0xC8, 0xD5, 0x75, 0x9C, 0xD2, 0xB2]};
+ const IID CLSID_UserNotification = {0x0010890E, 0x8789, 0x413C, [0xAD, 0xBC, 0x48, 0xF5, 0xB5, 0x11, 0xB3, 0xAF]};
+ const IID CLSID_VideoInputTerminal = {0xAAF578EC, 0xDC70, 0x11D0, [0x8E, 0xD3, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID CLSID_VideoWindowTerm = {0xF7438990, 0xD6EB, 0x11D0, [0x82, 0xA6, 0x00, 0xAA, 0x00, 0xB5, 0xCA, 0x1B]};
+ const IID CLSID_VirusScan = {0xE88E5DE0, 0xBD3E, 0x11CF, [0xAA, 0xFA, 0x00, 0xAA, 0x00, 0xB6, 0x01, 0x5C]};
+ const IID CLSID_WbemAdministrativeLocator = {0xCB8555CC, 0x9128, 0x11D1, [0xAD, 0x9B, 0x00, 0xC0, 0x4F, 0xD8, 0xFD, 0xFF]};
+ const IID CLSID_WbemAuthenticatedLocator = {0xCD184336, 0x9128, 0x11D1, [0xAD, 0x9B, 0x00, 0xC0, 0x4F, 0xD8, 0xFD, 0xFF]};
+ const IID CLSID_WbemBackupRestore = {0xC49E32C6, 0xBC8B, 0x11D2, [0x85, 0xD4, 0x00, 0x10, 0x5A, 0x1F, 0x83, 0x04]};
+ const IID CLSID_WbemClassObject = {0x9A653086, 0x174F, 0x11D2, [0xB5, 0xF9, 0x00, 0x10, 0x4B, 0x70, 0x3E, 0xFD]};
+ const IID CLSID_WbemContext = {0x674B6698, 0xEE92, 0x11D0, [0xAD, 0x71, 0x00, 0xC0, 0x4F, 0xD8, 0xFD, 0xFF]};
+ const IID CLSID_WbemDCOMTransport = {0xF7CE2E13, 0x8C90, 0x11D1, [0x9E, 0x7B, 0x00, 0xC0, 0x4F, 0xC3, 0x24, 0xA8]};
+ const IID CLSID_WbemDecoupledBasicEventProvide = {0xF5F75737, 0x2843, 0x4F22, [0x93, 0x3D, 0xC7, 0x6A, 0x97, 0xCD, 0xA6, 0x2F]};
+ const IID CLSID_WbemDecoupledRegistrar = {0x4CFC7932, 0x0F9D, 0x4BEF, [0x9C, 0x32, 0x8E, 0xA2, 0xA6, 0xB5, 0x6F, 0xCB]};
+ const IID CLSID_WbemDefPath = {0xCF4CC405, 0xE2C5, 0x4DDD, [0xB3, 0xCE, 0x5E, 0x75, 0x82, 0xD8, 0xC9, 0xFA]};
+ const IID CLSID_WbemLevel1Login = {0x8BC3F05E, 0xD86B, 0x11D0, [0xA0, 0x75, 0x00, 0xC0, 0x4F, 0xB6, 0x88, 0x20]};
+ const IID CLSID_WbemLocalAddrRes = {0xA1044801, 0x8F7E, 0x11D1, [0x9E, 0x7C, 0x00, 0xC0, 0x4F, 0xC3, 0x24, 0xA8]};
+ const IID CLSID_WbemLocator = {0x4590F811, 0x1D3A, 0x11D0, [0x89, 0x1F, 0x00, 0xAA, 0x00, 0x4B, 0x2E, 0x24]};
+ const IID CLSID_WbemObjectTextSrc = {0x8D1C559D, 0x84F0, 0x4BB3, [0xA7, 0xD5, 0x56, 0xA7, 0x43, 0x5A, 0x9B, 0xA6]};
+ const IID CLSID_WbemQuery = {0xEAC8A024, 0x21E2, 0x4523, [0xAD, 0x73, 0xA7, 0x1A, 0x0A, 0xA2, 0xF5, 0x6A]};
+ const IID CLSID_WbemRefresher = {0xC71566F2, 0x561E, 0x11D1, [0xAD, 0x87, 0x00, 0xC0, 0x4F, 0xD8, 0xFD, 0xFF]};
+ const IID CLSID_WbemStatusCodeText = {0xEB87E1BD, 0x3233, 0x11D2, [0xAE, 0xC9, 0x00, 0xC0, 0x4F, 0xB6, 0x88, 0x20]};
+ const IID CLSID_WbemUnauthenticatedLocator = {0x443E7B79, 0xDE31, 0x11D2, [0xB3, 0x40, 0x00, 0x10, 0x4B, 0xCC, 0x4B, 0x4A]};
+ const IID CLSID_WbemUninitializedClassObject = {0x7A0227F6, 0x7108, 0x11D1, [0xAD, 0x90, 0x00, 0xC0, 0x4F, 0xD8, 0xFD, 0xFF]};
+ const IID CLSID_WebBrowser = {0x8856F961, 0x340A, 0x11D0, [0xA9, 0x6B, 0x00, 0xC0, 0x4F, 0xD7, 0x05, 0xA2]};
+ const IID CLSID_WebBrowser_V1 = {0xEAB22AC3, 0x30C1, 0x11CF, [0xA7, 0xEB, 0x00, 0x00, 0xC0, 0x5B, 0xAE, 0x0B]};
+ const IID CLSID_WebCheck = {0xE6FB5E20, 0xDE35, 0x11CF, [0x9C, 0x87, 0x00, 0xAA, 0x00, 0x51, 0x27, 0xED]};
+ const IID CLSID_WebCheckDefaultProcess = {0xC733E4B0, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID CLSID_WebCheckOfflineSync = {0x7FC0B86E, 0x5FA7, 0x11D1, [0xBC, 0x7C, 0x00, 0xC0, 0x4F, 0xD9, 0x29, 0xDB]};
+ const IID CLSID_WebCrawlerAgent = {0x08165EA0, 0xE946, 0x11CF, [0x9C, 0x87, 0x00, 0xAA, 0x00, 0x51, 0x27, 0xED]};
+ const IID CLSID_WebViewFolderContents = {0x1820FED0, 0x473E, 0x11D0, [0xA9, 0x6C, 0x00, 0xC0, 0x4F, 0xD7, 0x05, 0xA2]};
+ const IID CLSID_WebWizardHost = {0xC827F149, 0x55C1, 0x4D28, [0x93, 0x5E, 0x57, 0xE4, 0x7C, 0xAE, 0xD9, 0x73]};
+ const IID CLSID_wfolders = {0xBAE31F9A, 0x1B81, 0x11D2, [0xA9, 0x7A, 0x00, 0xC0, 0x4F, 0x8E, 0xCB, 0x02]};
+ const IID CLSID_WinNTConnectionObject = {0x7992C6EB, 0xD142, 0x4332, [0x83, 0x1E, 0x31, 0x54, 0xC5, 0x0A, 0x83, 0x16]};
+ const IID CLSID_WinNTObject = {0xB8324185, 0x4050, 0x4220, [0x98, 0x0A, 0xAB, 0x14, 0x62, 0x3E, 0x06, 0x3A]};
+ const IID CLSID_WinNTSystemInfo = {0x66182EC4, 0xAFD1, 0x11D2, [0x9C, 0xB9, 0x00, 0x00, 0xF8, 0x7A, 0x36, 0x9E]};
+ const IID CLSID_WMIExtension = {0xF0975AFE, 0x5C7F, 0x11D2, [0x8B, 0x74, 0x00, 0x10, 0x4B, 0x2A, 0xFB, 0x41]};
+ const IID CLSID_XMLDocument = {0xCFC399AF, 0xD876, 0x11D0, [0x9C, 0x10, 0x00, 0xC0, 0x4F, 0xC9, 0x9C, 0x8E]};
+ const IID CLSID_XMLDSOControl = {0x550DDA30, 0x0541, 0x11D2, [0x9C, 0xA9, 0x00, 0x60, 0xB0, 0xEC, 0x3D, 0x39]};
+ const IID CLSID_XMLHTTPRequest = {0xED8C108E, 0x4349, 0x11D2, [0x91, 0xA4, 0x00, 0xC0, 0x4F, 0x79, 0x69, 0xE8]};
+ const IID CLSID_XMLParser = {0xD2423620, 0x51A0, 0x11D2, [0x9C, 0xAF, 0x00, 0x60, 0xB0, 0xEC, 0x3D, 0x39]};
+ const IID DB_PROPERTY_AUTOMATICUPDATE = {0xC8B52209, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DB_PROPERTY_BTREE = {0xC8B52201, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DB_PROPERTY_CHECK_OPTION = {0xC8B5220B, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DB_PROPERTY_CLUSTERED = {0xC8B521FF, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DB_PROPERTY_CONSTRAINT_CHECK_DEFERRE = {0xC8B521F0, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DB_PROPERTY_DISALLOWNULL = {0xC8B52205, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DB_PROPERTY_DROP_CASCADE = {0xC8B521F3, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DB_PROPERTY_EXPLICITUPDATE = {0xC8B5220A, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DB_PROPERTY_FILLFACTOR = {0xC8B52203, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DB_PROPERTY_HASH = {0xC8B52202, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DB_PROPERTY_IGNOREANYNULL = {0xC8B52207, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DB_PROPERTY_IGNORENULL = {0xC8B52206, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DB_PROPERTY_INITIALSIZE = {0xC8B52204, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DB_PROPERTY_NONCLUSTERED = {0xC8B52200, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DB_PROPERTY_ON_COMMIT_PRESERVE_ROWS = {0xC8B52230, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DB_PROPERTY_PRIMARY = {0xC8B521FC, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DB_PROPERTY_SORTBOOKMARKS = {0xC8B52208, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DB_PROPERTY_UNIQUE = {0xC8B521F5, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBCOL_SELFCOLUMNS = {0xC8B52231, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBCOL_SPECIALCOL = {0xC8B52232, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBGUID_COMMAND = {0xC8B522F8, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBGUID_CONTAINEROBJECT = {0xC8B522FB, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBGUID_DBSQL = {0xC8B521FB, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBGUID_DEFAULT = {0xC8B521FB, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBGUID_DSO = {0xC8B522F4, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBGUID_HISTOGRAM_ROWSET = {0xC8B52300, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBGUID_LDAPDialect = {0xEFF65380, 0x9C98, 0x11CF, [0xB9, 0x63, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBGUID_LIKE_DOS = {0xC8B521F7, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBGUID_LIKE_MAPI = {0xC8B521F9, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBGUID_LIKE_OFS = {0xC8B521F8, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBGUID_LIKE_SQL = {0xC8B521F6, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBGUID_MDX = {0xA07CCCD0, 0x8148, 0x11D0, [0x87, 0xBB, 0x00, 0xC0, 0x4F, 0xC3, 0x39, 0x42]};
+ const IID DBGUID_ROW = {0xC8B522F7, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBGUID_ROWSET = {0xC8B522F6, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBGUID_SESSION = {0xC8B522F5, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBGUID_SQL = {0xC8B522D7, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBGUID_STREAM = {0xC8B522F9, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBOBJECT_CHARACTERSET = {0xC8B522ED, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBOBJECT_COLLATION = {0xC8B522EA, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBOBJECT_COLUMN = {0xC8B522E4, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBOBJECT_DATABASE = {0xC8B522E5, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBOBJECT_DOMAIN = {0xC8B522E9, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBOBJECT_PROCEDURE = {0xC8B522E6, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBOBJECT_SCHEMA = {0xC8B522E8, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBOBJECT_SCHEMAROWSET = {0xC8B522EC, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBOBJECT_TABLE = {0xC8B522E2, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBOBJECT_TRANSLATION = {0xC8B522EE, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBOBJECT_TRUSTEE = {0xC8B522EB, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBOBJECT_VIEW = {0xC8B522E7, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_ADSIBIND = {0x6DA66DC8, 0xB7E8, 0x11D2, [0x9D, 0x60, 0x00, 0xC0, 0x4F, 0x68, 0x93, 0x45]};
+ const IID DBPROPSET_ADSISEARCH = {0xCFCFC928, 0x9AA2, 0x11D0, [0xA7, 0x9A, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0xA8]};
+ const IID DBPROPSET_COLUMN = {0xC8B522B9, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_COLUMNALL = {0xC8B522F0, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_CONSTRAINTALL = {0xC8B522FA, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_DATASOURCE = {0xC8B522BA, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_DATASOURCEALL = {0xC8B522C0, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_DATASOURCEINFO = {0xC8B522BB, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_DATASOURCEINFOALL = {0xC8B522C1, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_DBINIT = {0xC8B522BC, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_DBINITALL = {0xC8B522CA, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_INDEX = {0xC8B522BD, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_INDEXALL = {0xC8B522F1, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_PROPERTIESINERROR = {0xC8B522D4, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_ROWSET = {0xC8B522BE, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_ROWSETALL = {0xC8B522C2, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_SESSION = {0xC8B522C6, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_SESSIONALL = {0xC8B522C7, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_STREAM = {0xC8B522FD, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_STREAMALL = {0xC8B522FE, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_TABLE = {0xC8B522BF, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_TABLEALL = {0xC8B522F2, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_TRUSTEE = {0xC8B522E1, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_TRUSTEEALL = {0xC8B522F3, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_VIEW = {0xC8B522DF, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBPROPSET_VIEWALL = {0xC8B522FC, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_ASSERTIONS = {0xC8B52210, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_CATALOGS = {0xC8B52211, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_CHARACTER_SETS = {0xC8B52212, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_CHECK_CONSTRAINTS = {0xC8B52215, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_CHECK_CONSTRAINTS_BY_TABLE = {0xC8B52301, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_COLLATIONS = {0xC8B52213, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_COLUMN_DOMAIN_USAGE = {0xC8B5221B, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_COLUMN_PRIVILEGES = {0xC8B52221, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_COLUMNS = {0xC8B52214, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_CONSTRAINT_COLUMN_USAGE = {0xC8B52216, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_CONSTRAINT_TABLE_USAGE = {0xC8B52217, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_FOREIGN_KEYS = {0xC8B522C4, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_INDEXES = {0xC8B5221E, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_KEY_COLUMN_USAGE = {0xC8B52218, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_PRIMARY_KEYS = {0xC8B522C5, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_PROCEDURE_COLUMNS = {0xC8B522C9, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_PROCEDURE_PARAMETERS = {0xC8B522B8, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_PROCEDURES = {0xC8B52224, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_PROVIDER_TYPES = {0xC8B5222C, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_REFERENTIAL_CONSTRAINTS = {0xC8B52219, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_SCHEMATA = {0xC8B52225, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_SQL_LANGUAGES = {0xC8B52226, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_STATISTICS = {0xC8B52227, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_TABLE_CONSTRAINTS = {0xC8B5221A, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_TABLE_PRIVILEGES = {0xC8B52222, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_TABLE_STATISTICS = {0xC8B522FF, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_TABLES = {0xC8B52229, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_TABLES_INFO = {0xC8B522E0, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_TRANSLATIONS = {0xC8B5222A, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_TRUSTEE = {0xC8B522EF, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_USAGE_PRIVILEGES = {0xC8B52223, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_VIEW_COLUMN_USAGE = {0xC8B5222E, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_VIEW_TABLE_USAGE = {0xC8B5222F, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DBSCHEMA_VIEWS = {0xC8B5222D, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID DDVPTYPE_BROOKTREE = {0x1352A560, 0xDA61, 0x11CF, [0x9B, 0x06, 0x00, 0xA0, 0xC9, 0x03, 0xA3, 0xB8]};
+ const IID DDVPTYPE_CCIR656 = {0xFCA326A0, 0xDA60, 0x11CF, [0x9B, 0x06, 0x00, 0xA0, 0xC9, 0x03, 0xA3, 0xB8]};
+ const IID DDVPTYPE_E_HREFH_VREFL = {0x92783220, 0xDA60, 0x11CF, [0x9B, 0x06, 0x00, 0xA0, 0xC9, 0x03, 0xA3, 0xB8]};
+ const IID DDVPTYPE_E_HREFL_VREFL = {0xE09C77E0, 0xDA60, 0x11CF, [0x9B, 0x06, 0x00, 0xA0, 0xC9, 0x03, 0xA3, 0xB8]};
+ const IID DDVPTYPE_PHILIPS = {0x332CF160, 0xDA61, 0x11CF, [0x9B, 0x06, 0x00, 0xA0, 0xC9, 0x03, 0xA3, 0xB8]};
+ const IID DIID__SearchAssistantEvents = {0x1611FDDA, 0x445B, 0x11D2, [0x85, 0xDE, 0x00, 0xC0, 0x4F, 0xA3, 0x5C, 0x89]};
+ const IID DIID_DispCEventObj = {0x3050F558, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispDOMChildrenCollection = {0x3050F577, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTCAttachBehavior = {0x3050F583, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTCDefaultDispatch = {0x3050F573, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTCDescBehavior = {0x3050F57E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTCEventBehavior = {0x3050F574, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTCMethodBehavior = {0x3050F587, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTCPropertyBehavior = {0x3050F57F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLAnchorElement = {0x3050F502, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLAppBehavior = {0x3050F57C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLAreaElement = {0x3050F503, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLAreasCollection = {0x3050F56A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLAttributeCollection = {0x3050F56C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLBaseElement = {0x3050F518, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLBaseFontElement = {0x3050F504, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLBGsound = {0x3050F53C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLBlockElement = {0x3050F506, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLBody = {0x3050F507, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLBRElement = {0x3050F53A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLButtonElement = {0x3050F51F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLCommentElement = {0x3050F50A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLCurrentStyle = {0x3050F557, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLDDElement = {0x3050F50B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLDefaults = {0x3050F58C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLDivElement = {0x3050F50C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLDivPosition = {0x3050F50F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLDListElement = {0x3050F53B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLDocument = {0x3050F55F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLDOMAttribute = {0x3050F564, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLDOMImplementation = {0x3050F58F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLDOMTextNode = {0x3050F565, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLDTElement = {0x3050F50D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLElementCollection = {0x3050F56B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLEmbed = {0x3050F52E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLFieldSetElement = {0x3050F545, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLFontElement = {0x3050F512, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLFormElement = {0x3050F510, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLFrameBase = {0x3050F541, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLFrameElement = {0x3050F513, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLFrameSetSite = {0x3050F514, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLGenericElement = {0x3050F563, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLHeadElement = {0x3050F561, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLHeaderElement = {0x3050F515, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLHRElement = {0x3050F53D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLHtmlElement = {0x3050F560, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLIFrame = {0x3050F51B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLImg = {0x3050F51C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLInputElement = {0x3050F57D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLIsIndexElement = {0x3050F519, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLLabelElement = {0x3050F522, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLLegendElement = {0x3050F546, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLLIElement = {0x3050F523, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLLinkElement = {0x3050F524, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLListElement = {0x3050F525, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLMapElement = {0x3050F526, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLMarqueeElement = {0x3050F527, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLMetaElement = {0x3050F517, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLNextIdElement = {0x3050F51A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLNoShowElement = {0x3050F528, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLObjectElement = {0x3050F529, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLOListElement = {0x3050F52A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLOptionElement = {0x3050F52B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLParaElement = {0x3050F52C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLParamElement = {0x3050F590, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLPhraseElement = {0x3050F52D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLPopup = {0x3050F589, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLRenderStyle = {0x3050F58B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLRichtextElement = {0x3050F54D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLRuleStyle = {0x3050F55C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLScreen = {0x3050F591, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLScriptElement = {0x3050F530, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLSelectElement = {0x3050F531, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLSpanElement = {0x3050F548, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLSpanFlow = {0x3050F544, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLStyle = {0x3050F55A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLStyleElement = {0x3050F511, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLStyleSheet = {0x3050F58D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLTable = {0x3050F532, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLTableCaption = {0x3050F508, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLTableCell = {0x3050F536, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLTableCol = {0x3050F533, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLTableRow = {0x3050F535, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLTableSection = {0x3050F534, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLTextAreaElement = {0x3050F521, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLTextElement = {0x3050F537, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLTitleElement = {0x3050F516, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLUListElement = {0x3050F538, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLUnknownElement = {0x3050F539, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLWindow2 = {0x3050F55D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispHTMLWindowProxy = {0x3050F55E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispIHTMLInputButtonElement = {0x3050F51E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispIHTMLInputFileElement = {0x3050F542, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispIHTMLInputImage = {0x3050F51D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispIHTMLInputTextElement = {0x3050F520, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DispIHTMLOptionButtonElement = {0x3050F509, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_DMigrationWizardAutoEvents = {0xD2AC137D, 0xA6D8, 0x43B6, [0x98, 0x79, 0xEA, 0x34, 0xB6, 0x7E, 0x18, 0x80]};
+ const IID DIID_DSearchCommandEvents = {0x60890160, 0x69F0, 0x11D1, [0xB7, 0x58, 0x00, 0xA0, 0xC9, 0x05, 0x64, 0xFE]};
+ const IID DIID_DShellFolderViewEvents = {0x62112AA2, 0xEBE4, 0x11CF, [0xA5, 0xFB, 0x00, 0x20, 0xAF, 0xE7, 0x29, 0x2D]};
+ const IID DIID_DShellNameSpaceEvents = {0x55136806, 0xB2DE, 0x11D1, [0xB9, 0xF2, 0x00, 0xA0, 0xC9, 0x8B, 0xC5, 0x47]};
+ const IID DIID_DShellWindowsEvents = {0xFE4106E0, 0x399A, 0x11D0, [0xA4, 0x8C, 0x00, 0xA0, 0xC9, 0x0A, 0x8F, 0x39]};
+ const IID DIID_DWebBridgeEvents = {0xA6D897FF, 0x0A95, 0x11D1, [0xB0, 0xBA, 0x00, 0x60, 0x08, 0x16, 0x6E, 0x11]};
+ const IID DIID_DWebBrowserEvents = {0xEAB22AC2, 0x30C1, 0x11CF, [0xA7, 0xEB, 0x00, 0x00, 0xC0, 0x5B, 0xAE, 0x0B]};
+ const IID DIID_DWebBrowserEvents2 = {0x34A715A0, 0x6587, 0x11D0, [0x92, 0x4A, 0x00, 0x20, 0xAF, 0xC7, 0xAC, 0x4D]};
+ const IID DIID_HTMLAnchorEvents = {0x3050F29D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLAnchorEvents2 = {0x3050F610, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLAreaEvents = {0x3050F366, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLAreaEvents2 = {0x3050F611, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLButtonElementEvents = {0x3050F2B3, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLButtonElementEvents2 = {0x3050F617, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLControlElementEvents = {0x3050F4EA, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLControlElementEvents2 = {0x3050F612, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLDocumentEvents = {0x3050F260, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLDocumentEvents2 = {0x3050F613, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLElementEvents = {0x3050F33C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLElementEvents2 = {0x3050F60F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLFormElementEvents = {0x3050F364, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLFormElementEvents2 = {0x3050F614, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLFrameSiteEvents = {0x3050F800, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLFrameSiteEvents2 = {0x3050F7FF, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLImgEvents = {0x3050F25B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLImgEvents2 = {0x3050F616, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLInputFileElementEvents = {0x3050F2AF, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLInputFileElementEvents2 = {0x3050F61A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLInputImageEvents = {0x3050F2C3, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLInputImageEvents2 = {0x3050F61B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLInputTextElementEvents = {0x3050F2A7, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLInputTextElementEvents2 = {0x3050F618, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLLabelEvents = {0x3050F329, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLLabelEvents2 = {0x3050F61C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLLinkElementEvents = {0x3050F3CC, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLLinkElementEvents2 = {0x3050F61D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLMapEvents = {0x3050F3BA, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLMapEvents2 = {0x3050F61E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLMarqueeElementEvents = {0x3050F2B8, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLMarqueeElementEvents2 = {0x3050F61F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLNamespaceEvents = {0x3050F6BD, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLObjectElementEvents = {0x3050F3C4, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLObjectElementEvents2 = {0x3050F620, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLOptionButtonElementEvents = {0x3050F2BD, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLOptionButtonElementEvents2 = {0x3050F619, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLPersistEvents = {0x3050F4C7, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLScriptEvents = {0x3050F3E2, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLScriptEvents2 = {0x3050F621, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLSelectElementEvents = {0x3050F302, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLSelectElementEvents2 = {0x3050F622, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLStyleElementEvents = {0x3050F3CB, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLStyleElementEvents2 = {0x3050F615, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLTableEvents = {0x3050F407, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLTableEvents2 = {0x3050F623, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLTextContainerEvents = {0x1FF6AA72, 0x5842, 0x11CF, [0xA7, 0x07, 0x00, 0xAA, 0x00, 0xC0, 0x09, 0x8D]};
+ const IID DIID_HTMLTextContainerEvents2 = {0x3050F624, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_HTMLWindowEvents = {0x96A0A4E0, 0xD062, 0x11CF, [0x94, 0xB6, 0x00, 0xAA, 0x00, 0x60, 0x27, 0x5C]};
+ const IID DIID_HTMLWindowEvents2 = {0x3050F625, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_IRTCDispatchEventNotification = {0x176DDFBE, 0xFEC0, 0x4D55, [0xBC, 0x87, 0x84, 0xCF, 0xF1, 0xEF, 0x7F, 0x91]};
+ const IID DIID_ISWbemSinkEvents = {0x75718CA0, 0xF029, 0x11D1, [0xA1, 0xAC, 0x00, 0xC0, 0x4F, 0xB6, 0xC2, 0x23]};
+ const IID DIID_ITTAPIDispatchEventNotification = {0x9F34325B, 0x7E62, 0x11D2, [0x94, 0x57, 0x00, 0xC0, 0x4F, 0x8E, 0xC8, 0x88]};
+ const IID DIID_LayoutRectEvents = {0x3050F674, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID DIID_XMLDOMDocumentEvents = {0x3EFAA427, 0x272F, 0x11D2, [0x83, 0x6F, 0x00, 0x00, 0xF8, 0x7A, 0x77, 0x82]};
+ const IID DPAID_ComPort = {0xF2F0CE00, 0xE0AF, 0x11CF, [0x9C, 0x4E, 0x00, 0xA0, 0xC9, 0x05, 0x42, 0x5E]};
+ const IID DPAID_INet = {0xC4A54DA0, 0xE0AF, 0x11CF, [0x9C, 0x4E, 0x00, 0xA0, 0xC9, 0x05, 0x42, 0x5E]};
+ const IID DPAID_INetPort = {0xE4524541, 0x8EA5, 0x11D1, [0x8A, 0x96, 0x00, 0x60, 0x97, 0xB0, 0x14, 0x11]};
+ const IID DPAID_INetW = {0xE63232A0, 0x9DBF, 0x11D0, [0x9C, 0xC1, 0x00, 0xA0, 0xC9, 0x05, 0x42, 0x5E]};
+ const IID DPAID_LobbyProvider = {0x59B95640, 0x9667, 0x11D0, [0xA7, 0x7D, 0x00, 0x00, 0xF8, 0x03, 0xAB, 0xFC]};
+ const IID DPAID_Modem = {0xF6DCC200, 0xA2FE, 0x11D0, [0x9C, 0x4F, 0x00, 0xA0, 0xC9, 0x05, 0x42, 0x5E]};
+ const IID DPAID_ModemW = {0x01FD92E0, 0xA2FF, 0x11D0, [0x9C, 0x4F, 0x00, 0xA0, 0xC9, 0x05, 0x42, 0x5E]};
+ const IID DPAID_Phone = {0x78EC89A0, 0xE0AF, 0x11CF, [0x9C, 0x4E, 0x00, 0xA0, 0xC9, 0x05, 0x42, 0x5E]};
+ const IID DPAID_PhoneW = {0xBA5A7A70, 0x9DBF, 0x11D0, [0x9C, 0xC1, 0x00, 0xA0, 0xC9, 0x05, 0x42, 0x5E]};
+ const IID DPAID_ServiceProvider = {0x07D916C0, 0xE0AF, 0x11CF, [0x9C, 0x4E, 0x00, 0xA0, 0xC9, 0x05, 0x42, 0x5E]};
+ const IID DPAID_TotalSize = {0x1318F560, 0x912C, 0x11D0, [0x9D, 0xAA, 0x00, 0xA0, 0xC9, 0x0A, 0x43, 0xCB]};
+ const IID DPLPROPERTY_LobbyGuid = {0xF56920A0, 0xD218, 0x11D0, [0xBA, 0x39, 0x00, 0xC0, 0x4F, 0xD7, 0xED, 0x67]};
+ const IID DPLPROPERTY_MessagesSupported = {0x762CCDA1, 0xD916, 0x11D0, [0xBA, 0x39, 0x00, 0xC0, 0x4F, 0xD7, 0xED, 0x67]};
+ const IID DPLPROPERTY_PlayerGuid = {0xB4319322, 0xD20D, 0x11D0, [0xBA, 0x39, 0x00, 0xC0, 0x4F, 0xD7, 0xED, 0x67]};
+ const IID DPLPROPERTY_PlayerScore = {0x48784000, 0xD219, 0x11D0, [0xBA, 0x39, 0x00, 0xC0, 0x4F, 0xD7, 0xED, 0x67]};
+ const IID DPSPGUID_IPX = {0x685BC400, 0x9D2C, 0x11CF, [0xA9, 0xCD, 0x00, 0xAA, 0x00, 0x68, 0x86, 0xE3]};
+ const IID DPSPGUID_MODEM = {0x44EAA760, 0xCB68, 0x11CF, [0x9C, 0x4E, 0x00, 0xA0, 0xC9, 0x05, 0x42, 0x5E]};
+ const IID DPSPGUID_SERIAL = {0x0F1D6860, 0x88D9, 0x11CF, [0x9C, 0x4E, 0x00, 0xA0, 0xC9, 0x05, 0x42, 0x5E]};
+ const IID DPSPGUID_TCPIP = {0x36E95EE0, 0x8577, 0x11CF, [0x96, 0x0C, 0x00, 0x80, 0xC7, 0x53, 0x4E, 0x82]};
+ const IID DS3DALG_HRTF_FULL = {0xC2413340, 0x1C1B, 0x11D2, [0x94, 0xF5, 0x00, 0xC0, 0x4F, 0xC2, 0x8A, 0xCA]};
+ const IID DS3DALG_HRTF_LIGHT = {0xC2413342, 0x1C1B, 0x11D2, [0x94, 0xF5, 0x00, 0xC0, 0x4F, 0xC2, 0x8A, 0xCA]};
+ const IID DS3DALG_NO_VIRTUALIZATION = {0xC241333F, 0x1C1B, 0x11D2, [0x94, 0xF5, 0x00, 0xC0, 0x4F, 0xC2, 0x8A, 0xCA]};
+ const IID FLAGID_Internet = {0x96300DA0, 0x2BAB, 0x11CF, [0xA2, 0x29, 0x00, 0xAA, 0x00, 0x3D, 0x73, 0x52]};
+ const IID FMTID_AudioSummaryInformation = {0x64440490, 0x4C8B, 0x11D1, [0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03]};
+ const IID FMTID_Briefcase = {0x328D8B21, 0x7729, 0x4BFC, [0x95, 0x4C, 0x90, 0x2B, 0x32, 0x9D, 0x56, 0xB0]};
+ const IID FMTID_DiscardableInformation = {0xD725EBB0, 0xC9B8, 0x11D1, [0x89, 0xBC, 0x00, 0x00, 0xF8, 0x04, 0xB0, 0x57]};
+ const IID FMTID_Displaced = {0x9B174B33, 0x40FF, 0x11D2, [0xA2, 0x7E, 0x00, 0xC0, 0x4F, 0xC3, 0x08, 0x71]};
+ const IID FMTID_DocSummaryInformation = {0xD5CDD502, 0x2E9C, 0x101B, [0x93, 0x97, 0x08, 0x00, 0x2B, 0x2C, 0xF9, 0xAE]};
+ const IID FMTID_DRM = {0xAEAC19E4, 0x89AE, 0x4508, [0xB9, 0xB7, 0xBB, 0x86, 0x7A, 0xBE, 0xE2, 0xED]};
+ const IID FMTID_ImageProperties = {0x14B81DA1, 0x0135, 0x4D31, [0x96, 0xD9, 0x6C, 0xBF, 0xC9, 0x67, 0x1A, 0x99]};
+ const IID FMTID_ImageSummaryInformation = {0x6444048F, 0x4C8B, 0x11D1, [0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03]};
+ const IID FMTID_InternetSite = {0x000214A1, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID FMTID_Intshcut = {0x000214A0, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID FMTID_MediaFileSummaryInformation = {0x64440492, 0x4C8B, 0x11D1, [0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03]};
+ const IID FMTID_Misc = {0x9B174B34, 0x40FF, 0x11D2, [0xA2, 0x7E, 0x00, 0xC0, 0x4F, 0xC3, 0x08, 0x71]};
+ const IID FMTID_MUSIC = {0x56A3372E, 0xCE9C, 0x11D2, [0x9F, 0x0E, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6]};
+ const IID FMTID_PropertyBag = {0x20001801, 0x5DE6, 0x11D1, [0x8E, 0x38, 0x00, 0xC0, 0x4F, 0xB9, 0x38, 0x6D]};
+ const IID FMTID_Query = {0x49691C90, 0x7E17, 0x101A, [0xA9, 0x1C, 0x08, 0x00, 0x2B, 0x2E, 0xCD, 0xA9]};
+ const IID FMTID_ShellDetails = {0x28636AA6, 0x953D, 0x11D2, [0xB5, 0xD6, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0]};
+ const IID FMTID_Storage = {0xB725F130, 0x47EF, 0x101A, [0xA5, 0xF1, 0x02, 0x60, 0x8C, 0x9E, 0xEB, 0xAC]};
+ const IID FMTID_SummaryInformation = {0xF29F85E0, 0x4FF9, 0x1068, [0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9]};
+ const IID FMTID_UserDefinedProperties = {0xD5CDD505, 0x2E9C, 0x101B, [0x93, 0x97, 0x08, 0x00, 0x2B, 0x2C, 0xF9, 0xAE]};
+ const IID FMTID_VideoSummaryInformation = {0x64440491, 0x4C8B, 0x11D1, [0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03]};
+ const IID FMTID_Volume = {0x9B174B35, 0x40FF, 0x11D2, [0xA2, 0x7E, 0x00, 0xC0, 0x4F, 0xC3, 0x08, 0x71]};
+ const IID FMTID_WebView = {0xF2275480, 0xF782, 0x4291, [0xBD, 0x94, 0xF1, 0x36, 0x93, 0x51, 0x3A, 0xEC]};
+ const IID GUID_ACPI_CMOS_INTERFACE_STANDARD = {0x3A8D0384, 0x6505, 0x40CA, [0xBC, 0x39, 0x56, 0xC1, 0x5F, 0x8C, 0x5F, 0xED]};
+ const IID GUID_ACPI_INTERFACE_STANDARD = {0xB091A08A, 0xBA97, 0x11D0, [0xBD, 0x14, 0x00, 0xAA, 0x00, 0xB7, 0xB3, 0x2A]};
+ const IID GUID_ACPI_PORT_RANGES_INTERFACE_STAND = {0xF14F609B, 0xCBBD, 0x4957, [0xA6, 0x74, 0xBC, 0x00, 0x21, 0x3F, 0x1C, 0x97]};
+ const IID GUID_ACPI_REGS_INTERFACE_STANDARD = {0x06141966, 0x7245, 0x6369, [0x46, 0x2E, 0x4E, 0x65, 0x6C, 0x73, 0x6F, 0x6E]};
+ const IID GUID_ARBITER_INTERFACE_STANDARD = {0xE644F185, 0x8C0E, 0x11D0, [0xBE, 0xCF, 0x08, 0x00, 0x2B, 0xE2, 0x09, 0x2F]};
+ const IID GUID_BUS_INTERFACE_STANDARD = {0x496B8280, 0x6F25, 0x11D0, [0xBE, 0xAF, 0x08, 0x00, 0x2B, 0xE2, 0x09, 0x2F]};
+ const IID GUID_BUS_TYPE_1394 = {0xF74E73EB, 0x9AC5, 0x45EB, [0xBE, 0x4D, 0x77, 0x2C, 0xC7, 0x1D, 0xDF, 0xB3]};
+ const IID GUID_BUS_TYPE_AVC = {0xC06FF265, 0xAE09, 0x48F0, [0x81, 0x2C, 0x16, 0x75, 0x3D, 0x7C, 0xBA, 0x83]};
+ const IID GUID_BUS_TYPE_DOT4PRT = {0x441EE001, 0x4342, 0x11D5, [0xA1, 0x84, 0x00, 0xC0, 0x4F, 0x60, 0x52, 0x4D]};
+ const IID GUID_BUS_TYPE_EISA = {0xDDC35509, 0xF3FC, 0x11D0, [0xA5, 0x37, 0x00, 0x00, 0xF8, 0x75, 0x3E, 0xD1]};
+ const IID GUID_BUS_TYPE_HID = {0xEEAF37D0, 0x1963, 0x47C4, [0xAA, 0x48, 0x72, 0x47, 0x6D, 0xB7, 0xCF, 0x49]};
+ const IID GUID_BUS_TYPE_INTERNAL = {0x1530EA73, 0x086B, 0x11D1, [0xA0, 0x9F, 0x00, 0xC0, 0x4F, 0xC3, 0x40, 0xB1]};
+ const IID GUID_BUS_TYPE_IRDA = {0x7AE17DC1, 0xC944, 0x44D6, [0x88, 0x1F, 0x4C, 0x2E, 0x61, 0x05, 0x3B, 0xC1]};
+ const IID GUID_BUS_TYPE_ISAPNP = {0xE676F854, 0xD87D, 0x11D0, [0x92, 0xB2, 0x00, 0xA0, 0xC9, 0x05, 0x5F, 0xC5]};
+ const IID GUID_BUS_TYPE_LPTENUM = {0xC4CA1000, 0x2DDC, 0x11D5, [0xA1, 0x7A, 0x00, 0xC0, 0x4F, 0x60, 0x52, 0x4D]};
+ const IID GUID_BUS_TYPE_MCA = {0x1C75997A, 0xDC33, 0x11D0, [0x92, 0xB2, 0x00, 0xA0, 0xC9, 0x05, 0x5F, 0xC5]};
+ const IID GUID_BUS_TYPE_PCI = {0xC8EBDFB0, 0xB510, 0x11D0, [0x80, 0xE5, 0x00, 0xA0, 0xC9, 0x25, 0x42, 0xE3]};
+ const IID GUID_BUS_TYPE_PCMCIA = {0x09343630, 0xAF9F, 0x11D0, [0x92, 0xE9, 0x00, 0x00, 0xF8, 0x1E, 0x1B, 0x30]};
+ const IID GUID_BUS_TYPE_SERENUM = {0x77114A87, 0x8944, 0x11D1, [0xBD, 0x90, 0x00, 0xA0, 0xC9, 0x06, 0xBE, 0x2D]};
+ const IID GUID_BUS_TYPE_USB = {0x9D7DEBBC, 0xC85D, 0x11D1, [0x9E, 0xB4, 0x00, 0x60, 0x08, 0xC3, 0xA1, 0x9A]};
+ const IID GUID_BUS_TYPE_USBPRINT = {0x441EE000, 0x4342, 0x11D5, [0xA1, 0x84, 0x00, 0xC0, 0x4F, 0x60, 0x52, 0x4D]};
+ const IID GUID_Button = {0xA36D02F0, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID GUID_CHECKVALUEEXCLUSIVE = {0x6650430C, 0xBE0F, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID GUID_ChordParam = {0xD2AC289E, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_Clear_All_Bands = {0xD2AC28AB, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_COLOR = {0x66504301, 0xBE0F, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID GUID_ColorControlCallbacks = {0xEFD60CC2, 0x49E7, 0x11D0, [0x88, 0x9D, 0x00, 0xAA, 0x00, 0xBB, 0xB7, 0x6A]};
+ const IID GUID_CommandParam = {0xD2AC289D, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_CommandParam2 = {0x28F97EF7, 0x9538, 0x11D2, [0x97, 0xA9, 0x00, 0xC0, 0x4F, 0xA3, 0x6E, 0x58]};
+ const IID GUID_ConnectToDLSCollection = {0x1DB1AE6B, 0xE92E, 0x11D1, [0xA8, 0xC5, 0x00, 0xC0, 0x4F, 0xA3, 0x72, 0x6E]};
+ const IID GUID_ConstantForce = {0x13541C20, 0x8E33, 0x11D0, [0x9A, 0xD0, 0x00, 0xA0, 0xC9, 0xA0, 0x6E, 0x35]};
+ const IID GUID_CustomForce = {0x13541C2B, 0x8E33, 0x11D0, [0x9A, 0xD0, 0x00, 0xA0, 0xC9, 0xA0, 0x6E, 0x35]};
+ const IID GUID_D3DCallbacks2 = {0x0BA584E1, 0x70B6, 0x11D0, [0x88, 0x9D, 0x00, 0xAA, 0x00, 0xBB, 0xB7, 0x6A]};
+ const IID GUID_D3DCallbacks3 = {0xDDF41230, 0xEC0A, 0x11D0, [0xA9, 0xB6, 0x00, 0xAA, 0x00, 0xC0, 0x99, 0x3E]};
+ const IID GUID_D3DExtendedCaps = {0x7DE41F80, 0x9D93, 0x11D0, [0x89, 0xAB, 0x00, 0xA0, 0xC9, 0x05, 0x41, 0x29]};
+ const IID GUID_D3DParseUnknownCommandCallback = {0x2E04FFA0, 0x98E4, 0x11D1, [0x8C, 0xE1, 0x00, 0xA0, 0xC9, 0x06, 0x29, 0xA8]};
+ const IID GUID_Damper = {0x13541C28, 0x8E33, 0x11D0, [0x9A, 0xD0, 0x00, 0xA0, 0xC9, 0xA0, 0x6E, 0x35]};
+ const IID GUID_DDMoreCaps = {0x880BAF30, 0xB030, 0x11D0, [0x8E, 0xA7, 0x00, 0x60, 0x97, 0x97, 0xEA, 0x5B]};
+ const IID GUID_DDMoreSurfaceCaps = {0x3B8A0466, 0xF269, 0x11D1, [0x88, 0x0B, 0x00, 0xC0, 0x4F, 0xD9, 0x30, 0xC5]};
+ const IID GUID_DDStereoMode = {0xF828169C, 0xA8E8, 0x11D2, [0xA1, 0xF2, 0x00, 0xA0, 0xC9, 0x83, 0xEA, 0xF6]};
+ const IID GUID_DefaultGMCollection = {0xF17E8673, 0xC3B4, 0x11D1, [0x87, 0x0B, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_DEVCLASS_1394 = {0x6BDD1FC1, 0x810F, 0x11D0, [0xBE, 0xC7, 0x08, 0x00, 0x2B, 0xE2, 0x09, 0x2F]};
+ const IID GUID_DEVCLASS_1394DEBUG = {0x66F250D6, 0x7801, 0x4A64, [0xB1, 0x39, 0xEE, 0xA8, 0x0A, 0x45, 0x0B, 0x24]};
+ const IID GUID_DEVCLASS_61883 = {0x7EBEFBC0, 0x3200, 0x11D2, [0xB4, 0xC2, 0x00, 0xA0, 0xC9, 0x69, 0x7D, 0x07]};
+ const IID GUID_DEVCLASS_ADAPTER = {0x4D36E964, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_APMSUPPORT = {0xD45B1C18, 0xC8FA, 0x11D1, [0x9F, 0x77, 0x00, 0x00, 0xF8, 0x05, 0xF5, 0x30]};
+ const IID GUID_DEVCLASS_AVC = {0xC06FF265, 0xAE09, 0x48F0, [0x81, 0x2C, 0x16, 0x75, 0x3D, 0x7C, 0xBA, 0x83]};
+ const IID GUID_DEVCLASS_BATTERY = {0x72631E54, 0x78A4, 0x11D0, [0xBC, 0xF7, 0x00, 0xAA, 0x00, 0xB7, 0xB3, 0x2A]};
+ const IID GUID_DEVCLASS_BLUETOOTH = {0xE0CBF06C, 0xCD8B, 0x4647, [0xBB, 0x8A, 0x26, 0x3B, 0x43, 0xF0, 0xF9, 0x74]};
+ const IID GUID_DEVCLASS_CDROM = {0x4D36E965, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_COMPUTER = {0x4D36E966, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_DECODER = {0x6BDD1FC2, 0x810F, 0x11D0, [0xBE, 0xC7, 0x08, 0x00, 0x2B, 0xE2, 0x09, 0x2F]};
+ const IID GUID_DEVCLASS_DISKDRIVE = {0x4D36E967, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_DISPLAY = {0x4D36E968, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_DOT4 = {0x48721B56, 0x6795, 0x11D2, [0xB1, 0xA8, 0x00, 0x80, 0xC7, 0x2E, 0x74, 0xA2]};
+ const IID GUID_DEVCLASS_DOT4PRINT = {0x49CE6AC8, 0x6F86, 0x11D2, [0xB1, 0xE5, 0x00, 0x80, 0xC7, 0x2E, 0x74, 0xA2]};
+ const IID GUID_DEVCLASS_ENUM1394 = {0xC459DF55, 0xDB08, 0x11D1, [0xB0, 0x09, 0x00, 0xA0, 0xC9, 0x08, 0x1F, 0xF6]};
+ const IID GUID_DEVCLASS_FDC = {0x4D36E969, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_FLOPPYDISK = {0x4D36E980, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_FSFILTER_ACTIVITYMONIT = {0xB86DFF51, 0xA31E, 0x4BAC, [0xB3, 0xCF, 0xE8, 0xCF, 0xE7, 0x5C, 0x9F, 0xC2]};
+ const IID GUID_DEVCLASS_FSFILTER_ANTIVIRUS = {0xB1D1A169, 0xC54F, 0x4379, [0x81, 0xDB, 0xBE, 0xE7, 0xD8, 0x8D, 0x74, 0x54]};
+ const IID GUID_DEVCLASS_FSFILTER_CFSMETADATASER = {0xCDCF0939, 0xB75B, 0x4630, [0xBF, 0x76, 0x80, 0xF7, 0xBA, 0x65, 0x58, 0x84]};
+ const IID GUID_DEVCLASS_FSFILTER_COMPRESSION = {0xF3586BAF, 0xB5AA, 0x49B5, [0x8D, 0x6C, 0x05, 0x69, 0x28, 0x4C, 0x63, 0x9F]};
+ const IID GUID_DEVCLASS_FSFILTER_CONTENTSCREEN = {0x3E3F0674, 0xC83C, 0x4558, [0xBB, 0x26, 0x98, 0x20, 0xE1, 0xEB, 0xA5, 0xC5]};
+ const IID GUID_DEVCLASS_FSFILTER_CONTINUOUSBACK = {0x71AA14F8, 0x6FAD, 0x4622, [0xAD, 0x77, 0x92, 0xBB, 0x9D, 0x7E, 0x69, 0x47]};
+ const IID GUID_DEVCLASS_FSFILTER_COPYPROTECTIO = {0x89786FF1, 0x9C12, 0x402F, [0x9C, 0x9E, 0x17, 0x75, 0x3C, 0x7F, 0x43, 0x75]};
+ const IID GUID_DEVCLASS_FSFILTER_ENCRYPTION = {0xA0A701C0, 0xA511, 0x42FF, [0xAA, 0x6C, 0x06, 0xDC, 0x03, 0x95, 0x57, 0x6F]};
+ const IID GUID_DEVCLASS_FSFILTER_HSM = {0xD546500A, 0x2AEB, 0x45F6, [0x94, 0x82, 0xF4, 0xB1, 0x79, 0x9C, 0x31, 0x77]};
+ const IID GUID_DEVCLASS_FSFILTER_INFRASTRUCTUR = {0xE55FA6F9, 0x128C, 0x4D04, [0xAB, 0xAB, 0x63, 0x0C, 0x74, 0xB1, 0x45, 0x3A]};
+ const IID GUID_DEVCLASS_FSFILTER_OPENFILEBACKU = {0xF8ECAFA6, 0x66D1, 0x41A5, [0x89, 0x9B, 0x66, 0x58, 0x5D, 0x72, 0x16, 0xB7]};
+ const IID GUID_DEVCLASS_FSFILTER_PHYSICALQUOTAM = {0x6A0A8E78, 0xBBA6, 0x4FC4, [0xA7, 0x09, 0x1E, 0x33, 0xCD, 0x09, 0xD6, 0x7E]};
+ const IID GUID_DEVCLASS_FSFILTER_QUOTAMANAGEME = {0x8503C911, 0xA6C7, 0x4919, [0x8F, 0x79, 0x50, 0x28, 0xF5, 0x86, 0x6B, 0x0C]};
+ const IID GUID_DEVCLASS_FSFILTER_REPLICATION = {0x48D3EBC4, 0x4CF8, 0x48FF, [0xB8, 0x69, 0x9C, 0x68, 0xAD, 0x42, 0xEB, 0x9F]};
+ const IID GUID_DEVCLASS_FSFILTER_SECURITYENHANC = {0xD02BC3DA, 0x0C8E, 0x4945, [0x9B, 0xD5, 0xF1, 0x88, 0x3C, 0x22, 0x6C, 0x8C]};
+ const IID GUID_DEVCLASS_FSFILTER_SYSTEM = {0x5D1B9AAA, 0x01E2, 0x46AF, [0x84, 0x9F, 0x27, 0x2B, 0x3F, 0x32, 0x4C, 0x46]};
+ const IID GUID_DEVCLASS_FSFILTER_SYSTEMRECOVER = {0x2DB15374, 0x706E, 0x4131, [0xA0, 0xC7, 0xD7, 0xC7, 0x8E, 0xB0, 0x28, 0x9A]};
+ const IID GUID_DEVCLASS_FSFILTER_UNDELETE = {0xFE8F1572, 0xC67A, 0x48C0, [0xBB, 0xAC, 0x0B, 0x5C, 0x6D, 0x66, 0xCA, 0xFB]};
+ const IID GUID_DEVCLASS_GPS = {0x6BDD1FC3, 0x810F, 0x11D0, [0xBE, 0xC7, 0x08, 0x00, 0x2B, 0xE2, 0x09, 0x2F]};
+ const IID GUID_DEVCLASS_HDC = {0x4D36E96A, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_HIDCLASS = {0x745A17A0, 0x74D3, 0x11D0, [0xB6, 0xFE, 0x00, 0xA0, 0xC9, 0x0F, 0x57, 0xDA]};
+ const IID GUID_DEVCLASS_IMAGE = {0x6BDD1FC6, 0x810F, 0x11D0, [0xBE, 0xC7, 0x08, 0x00, 0x2B, 0xE2, 0x09, 0x2F]};
+ const IID GUID_DEVCLASS_INFRARED = {0x6BDD1FC5, 0x810F, 0x11D0, [0xBE, 0xC7, 0x08, 0x00, 0x2B, 0xE2, 0x09, 0x2F]};
+ const IID GUID_DEVCLASS_KEYBOARD = {0x4D36E96B, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_LEGACYDRIVER = {0x8ECC055D, 0x047F, 0x11D1, [0xA5, 0x37, 0x00, 0x00, 0xF8, 0x75, 0x3E, 0xD1]};
+ const IID GUID_DEVCLASS_MEDIA = {0x4D36E96C, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_MEDIUM_CHANGER = {0xCE5939AE, 0xEBDE, 0x11D0, [0xB1, 0x81, 0x00, 0x00, 0xF8, 0x75, 0x3E, 0xC4]};
+ const IID GUID_DEVCLASS_MODEM = {0x4D36E96D, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_MONITOR = {0x4D36E96E, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_MOUSE = {0x4D36E96F, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_MTD = {0x4D36E970, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_MULTIFUNCTION = {0x4D36E971, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_MULTIPORTSERIAL = {0x50906CB8, 0xBA12, 0x11D1, [0xBF, 0x5D, 0x00, 0x00, 0xF8, 0x05, 0xF5, 0x30]};
+ const IID GUID_DEVCLASS_NET = {0x4D36E972, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_NETCLIENT = {0x4D36E973, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_NETSERVICE = {0x4D36E974, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_NETTRANS = {0x4D36E975, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_NODRIVER = {0x4D36E976, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_PCMCIA = {0x4D36E977, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_PNPPRINTERS = {0x4658EE7E, 0xF050, 0x11D1, [0xB6, 0xBD, 0x00, 0xC0, 0x4F, 0xA3, 0x72, 0xA7]};
+ const IID GUID_DEVCLASS_PORTS = {0x4D36E978, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_PRINTER = {0x4D36E979, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_PRINTERUPGRADE = {0x4D36E97A, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_PROCESSOR = {0x50127DC3, 0x0F36, 0x415E, [0xA6, 0xCC, 0x4C, 0xB3, 0xBE, 0x91, 0x0B, 0x65]};
+ const IID GUID_DEVCLASS_SBP2 = {0xD48179BE, 0xEC20, 0x11D1, [0xB6, 0xB8, 0x00, 0xC0, 0x4F, 0xA3, 0x72, 0xA7]};
+ const IID GUID_DEVCLASS_SCSIADAPTER = {0x4D36E97B, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_SMARTCARDREADER = {0x50DD5230, 0xBA8A, 0x11D1, [0xBF, 0x5D, 0x00, 0x00, 0xF8, 0x05, 0xF5, 0x30]};
+ const IID GUID_DEVCLASS_SOUND = {0x4D36E97C, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_SYSTEM = {0x4D36E97D, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_TAPEDRIVE = {0x6D807884, 0x7D21, 0x11CF, [0x80, 0x1C, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_UNKNOWN = {0x4D36E97E, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVCLASS_USB = {0x36FC9E60, 0xC465, 0x11CF, [0x80, 0x56, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID GUID_DEVCLASS_VOLUME = {0x71A27CDD, 0x812A, 0x11D0, [0xBE, 0xC7, 0x08, 0x00, 0x2B, 0xE2, 0x09, 0x2F]};
+ const IID GUID_DEVCLASS_VOLUMESNAPSHOT = {0x533C5B84, 0xEC70, 0x11D2, [0x95, 0x05, 0x00, 0xC0, 0x4F, 0x79, 0xDE, 0xAF]};
+ const IID GUID_DEVCLASS_WCEUSBS = {0x25DBCE51, 0x6C8F, 0x4A72, [0x8A, 0x6D, 0xB5, 0x4C, 0x2B, 0x4F, 0xC8, 0x35]};
+ const IID GUID_DEVICE_INTERFACE_ARRIVAL = {0xCB3A4004, 0x46F0, 0x11D0, [0xB0, 0x8F, 0x00, 0x60, 0x97, 0x13, 0x05, 0x3F]};
+ const IID GUID_DEVICE_INTERFACE_REMOVAL = {0xCB3A4005, 0x46F0, 0x11D0, [0xB0, 0x8F, 0x00, 0x60, 0x97, 0x13, 0x05, 0x3F]};
+ const IID GUID_DEVINTERFACE_CDCHANGER = {0x53F56312, 0xB6BF, 0x11D0, [0x94, 0xF2, 0x00, 0xA0, 0xC9, 0x1E, 0xFB, 0x8B]};
+ const IID GUID_DEVINTERFACE_CDROM = {0x53F56308, 0xB6BF, 0x11D0, [0x94, 0xF2, 0x00, 0xA0, 0xC9, 0x1E, 0xFB, 0x8B]};
+ const IID GUID_DEVINTERFACE_COMPORT = {0x86E0D1E0, 0x8089, 0x11D0, [0x9C, 0xE4, 0x08, 0x00, 0x3E, 0x30, 0x1F, 0x73]};
+ const IID GUID_DEVINTERFACE_DISK = {0x53F56307, 0xB6BF, 0x11D0, [0x94, 0xF2, 0x00, 0xA0, 0xC9, 0x1E, 0xFB, 0x8B]};
+ const IID GUID_DEVINTERFACE_FLOPPY = {0x53F56311, 0xB6BF, 0x11D0, [0x94, 0xF2, 0x00, 0xA0, 0xC9, 0x1E, 0xFB, 0x8B]};
+ const IID GUID_DEVINTERFACE_MEDIUMCHANGER = {0x53F56310, 0xB6BF, 0x11D0, [0x94, 0xF2, 0x00, 0xA0, 0xC9, 0x1E, 0xFB, 0x8B]};
+ const IID GUID_DEVINTERFACE_PARTITION = {0x53F5630A, 0xB6BF, 0x11D0, [0x94, 0xF2, 0x00, 0xA0, 0xC9, 0x1E, 0xFB, 0x8B]};
+ const IID GUID_DEVINTERFACE_SERENUM_BUS_ENUMERA = {0x4D36E978, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_DEVINTERFACE_STORAGEPORT = {0x2ACCFE60, 0xC130, 0x11D2, [0xB0, 0x82, 0x00, 0xA0, 0xC9, 0x1E, 0xFB, 0x8B]};
+ const IID GUID_DEVINTERFACE_TAPE = {0x53F5630B, 0xB6BF, 0x11D0, [0x94, 0xF2, 0x00, 0xA0, 0xC9, 0x1E, 0xFB, 0x8B]};
+ const IID GUID_DEVINTERFACE_VOLUME = {0x53F5630D, 0xB6BF, 0x11D0, [0x94, 0xF2, 0x00, 0xA0, 0xC9, 0x1E, 0xFB, 0x8B]};
+ const IID GUID_DEVINTERFACE_WRITEONCEDISK = {0x53F5630C, 0xB6BF, 0x11D0, [0x94, 0xF2, 0x00, 0xA0, 0xC9, 0x1E, 0xFB, 0x8B]};
+ const IID GUID_DirectDrawPaletteStream = {0x730C7FFC, 0x5347, 0x11D1, [0x8C, 0x4D, 0x00, 0xC0, 0x4F, 0xD9, 0x30, 0xC5]};
+ const IID GUID_DirectDrawSurfaceStream = {0xE043BC46, 0x5317, 0x11D1, [0x8C, 0x4D, 0x00, 0xC0, 0x4F, 0xD9, 0x30, 0xC5]};
+ const IID GUID_DirectMusicAllTypes = {0xD2AC2893, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_Disable_Auto_Download = {0xD2AC28AA, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_DisableTempo = {0x45FC707D, 0x1DB4, 0x11D2, [0xBC, 0xAC, 0x00, 0xA0, 0xC9, 0x22, 0xE6, 0xEB]};
+ const IID GUID_DisableTimeSig = {0x45FC707B, 0x1DB4, 0x11D2, [0xBC, 0xAC, 0x00, 0xA0, 0xC9, 0x22, 0xE6, 0xEB]};
+ const IID GUID_DMUS_PROP_DLS1 = {0x178F2F27, 0xC364, 0x11D1, [0xA7, 0x60, 0x00, 0x00, 0xF8, 0x75, 0xAC, 0x12]};
+ const IID GUID_DMUS_PROP_DLS2 = {0xF14599E5, 0x4689, 0x11D2, [0xAF, 0xA6, 0x00, 0xAA, 0x00, 0x24, 0xD8, 0xB6]};
+ const IID GUID_DMUS_PROP_Effects = {0xCDA8D611, 0x684A, 0x11D2, [0x87, 0x1E, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_DMUS_PROP_GM_Hardware = {0x178F2F24, 0xC364, 0x11D1, [0xA7, 0x60, 0x00, 0x00, 0xF8, 0x75, 0xAC, 0x12]};
+ const IID GUID_DMUS_PROP_GS_Capable = {0x6496ABA2, 0x61B0, 0x11D2, [0xAF, 0xA6, 0x00, 0xAA, 0x00, 0x24, 0xD8, 0xB6]};
+ const IID GUID_DMUS_PROP_GS_Hardware = {0x178F2F25, 0xC364, 0x11D1, [0xA7, 0x60, 0x00, 0x00, 0xF8, 0x75, 0xAC, 0x12]};
+ const IID GUID_DMUS_PROP_INSTRUMENT2 = {0x865FD372, 0x9F67, 0x11D2, [0x87, 0x2A, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_DMUS_PROP_LegacyCaps = {0xCFA7CDC2, 0x00A1, 0x11D2, [0xAA, 0xD5, 0x00, 0x00, 0xF8, 0x75, 0xAC, 0x12]};
+ const IID GUID_DMUS_PROP_MemorySize = {0x178F2F28, 0xC364, 0x11D1, [0xA7, 0x60, 0x00, 0x00, 0xF8, 0x75, 0xAC, 0x12]};
+ const IID GUID_DMUS_PROP_SampleMemorySize = {0x178F2F28, 0xC364, 0x11D1, [0xA7, 0x60, 0x00, 0x00, 0xF8, 0x75, 0xAC, 0x12]};
+ const IID GUID_DMUS_PROP_SamplePlaybackRate = {0x2A91F713, 0xA4BF, 0x11D2, [0xBB, 0xDF, 0x00, 0x60, 0x08, 0x33, 0xDB, 0xD8]};
+ const IID GUID_DMUS_PROP_SynthSink_DSOUND = {0x0AA97844, 0xC877, 0x11D1, [0x87, 0x0C, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_DMUS_PROP_SynthSink_WAVE = {0x0AA97845, 0xC877, 0x11D1, [0x87, 0x0C, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_DMUS_PROP_Volume = {0xFEDFAE25, 0xE46E, 0x11D1, [0xAA, 0xCE, 0x00, 0x00, 0xF8, 0x75, 0xAC, 0x12]};
+ const IID GUID_DMUS_PROP_WavesReverb = {0x04CB5622, 0x32E5, 0x11D2, [0xAF, 0xA6, 0x00, 0xAA, 0x00, 0x24, 0xD8, 0xB6]};
+ const IID GUID_DMUS_PROP_WriteLatency = {0x268A0FA0, 0x60F2, 0x11D2, [0xAF, 0xA6, 0x00, 0xAA, 0x00, 0x24, 0xD8, 0xB6]};
+ const IID GUID_DMUS_PROP_WritePeriod = {0x268A0FA1, 0x60F2, 0x11D2, [0xAF, 0xA6, 0x00, 0xAA, 0x00, 0x24, 0xD8, 0xB6]};
+ const IID GUID_DMUS_PROP_XG_Capable = {0x6496ABA1, 0x61B0, 0x11D2, [0xAF, 0xA6, 0x00, 0xAA, 0x00, 0x24, 0xD8, 0xB6]};
+ const IID GUID_DMUS_PROP_XG_Hardware = {0x178F2F26, 0xC364, 0x11D1, [0xA7, 0x60, 0x00, 0x00, 0xF8, 0x75, 0xAC, 0x12]};
+ const IID GUID_Download = {0xD2AC28A7, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_Enable_Auto_Download = {0xD2AC28A9, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_EnableTempo = {0x45FC707E, 0x1DB4, 0x11D2, [0xBC, 0xAC, 0x00, 0xA0, 0xC9, 0x22, 0xE6, 0xEB]};
+ const IID GUID_EnableTimeSig = {0x45FC707C, 0x1DB4, 0x11D2, [0xBC, 0xAC, 0x00, 0xA0, 0xC9, 0x22, 0xE6, 0xEB]};
+ const IID GUID_FONTBOLD = {0x6650430F, 0xBE0F, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID GUID_FONTITALIC = {0x66504310, 0xBE0F, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID GUID_FONTNAME = {0x6650430D, 0xBE0F, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID GUID_FONTSIZE = {0x6650430E, 0xBE0F, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID GUID_FONTSTRIKETHROUGH = {0x66504312, 0xBE0F, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID GUID_FONTUNDERSCORE = {0x66504311, 0xBE0F, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID GUID_Friction = {0x13541C2A, 0x8E33, 0x11D0, [0x9A, 0xD0, 0x00, 0xA0, 0xC9, 0xA0, 0x6E, 0x35]};
+ const IID GUID_HANDLE = {0x66504313, 0xBE0F, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID GUID_HasPathProperties = {0x0002DE81, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID GUID_HIDClass = {0x745A17A0, 0x74D3, 0x11D0, [0xB6, 0xFE, 0x00, 0xA0, 0xC9, 0x0F, 0x57, 0xDA]};
+ const IID GUID_HIMETRIC = {0x66504300, 0xBE0F, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID GUID_HWPROFILE_CHANGE_CANCELLED = {0xCB3A4002, 0x46F0, 0x11D0, [0xB0, 0x8F, 0x00, 0x60, 0x97, 0x13, 0x05, 0x3F]};
+ const IID GUID_HWPROFILE_CHANGE_COMPLETE = {0xCB3A4003, 0x46F0, 0x11D0, [0xB0, 0x8F, 0x00, 0x60, 0x97, 0x13, 0x05, 0x3F]};
+ const IID GUID_HWPROFILE_QUERY_CHANGE = {0xCB3A4001, 0x46F0, 0x11D0, [0xB0, 0x8F, 0x00, 0x60, 0x97, 0x13, 0x05, 0x3F]};
+ const IID GUID_IDirectMusicBand = {0xD2AC28AC, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_IDirectMusicChordMap = {0xD2AC28AD, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_IDirectMusicStyle = {0xD2AC28A1, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_Inertia = {0x13541C29, 0x8E33, 0x11D0, [0x9A, 0xD0, 0x00, 0xA0, 0xC9, 0xA0, 0x6E, 0x35]};
+ const IID GUID_INT_ROUTE_INTERFACE_STANDARD = {0x70941BF4, 0x0073, 0x11D1, [0xA0, 0x9E, 0x00, 0xC0, 0x4F, 0xC3, 0x40, 0xB1]};
+ const IID GUID_Joystick = {0x6F1D2B70, 0xD5A0, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID GUID_KernelCallbacks = {0x80863800, 0x6B06, 0x11D0, [0x9B, 0x06, 0x00, 0xA0, 0xC9, 0x03, 0xA3, 0xB8]};
+ const IID GUID_KernelCaps = {0xFFAA7540, 0x7AA8, 0x11D0, [0x9B, 0x06, 0x00, 0xA0, 0xC9, 0x03, 0xA3, 0xB8]};
+ const IID GUID_Key = {0x55728220, 0xD33C, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID GUID_KeyboardClass = {0x4D36E96B, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_LEGACY_DEVICE_DETECTION_STANDAR = {0x50FEB0DE, 0x596A, 0x11D2, [0xA5, 0xB8, 0x00, 0x00, 0xF8, 0x1A, 0x46, 0x19]};
+ const IID GUID_MediaClass = {0x4D36E96C, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_MF_ENUMERATION_INTERFACE = {0xAEB895F0, 0x5586, 0x11D1, [0x8D, 0x84, 0x00, 0xA0, 0xC9, 0x06, 0xB2, 0x44]};
+ const IID GUID_Miscellaneous2Callbacks = {0x406B2F00, 0x3E5A, 0x11D1, [0xB6, 0x40, 0x00, 0xAA, 0x00, 0xA1, 0xF9, 0x6A]};
+ const IID GUID_MiscellaneousCallbacks = {0xEFD60CC0, 0x49E7, 0x11D0, [0x88, 0x9D, 0x00, 0xAA, 0x00, 0xBB, 0xB7, 0x6A]};
+ const IID GUID_MotionCompCallbacks = {0xB1122B40, 0x5DA5, 0x11D1, [0x8F, 0xCF, 0x00, 0xC0, 0x4F, 0xC2, 0x9B, 0x4E]};
+ const IID GUID_MouseClass = {0x4D36E96F, 0xE325, 0x11CE, [0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18]};
+ const IID GUID_MuteParam = {0xD2AC28AF, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_NDIS_802_11_ADD_WEP = {0x4307BFF0, 0x2129, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_AUTHENTICATION_MODE = {0x43920A24, 0x2129, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_BASIC_RATES = {0x4A198516, 0x2068, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_BSSID = {0x2504B6C2, 0x1FA5, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_BSSID_LIST = {0x69526F9A, 0x2062, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_BSSID_LIST_SCAN = {0x0D9E01E1, 0xBA70, 0x11D4, [0xB6, 0x75, 0x00, 0x20, 0x48, 0x57, 0x03, 0x37]};
+ const IID GUID_NDIS_802_11_CONFIGURATION = {0x4A4DF982, 0x2068, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_DESIRED_RATES = {0x452EE08E, 0x2536, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_DISASSOCIATE = {0x43671F40, 0x2129, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_FRAGMENTATION_THRESH = {0x69AAA7C4, 0x2062, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_INFRASTRUCTURE_MODE = {0x697D5A7E, 0x2062, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_NETWORK_TYPE_IN_USE = {0x857E2326, 0x2041, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_NETWORK_TYPES_SUPPOR = {0x8531D6E6, 0x2041, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_NUMBER_OF_ANTENNAS = {0x01779336, 0x2064, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_POWER_MODE = {0x85BE837C, 0x2041, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_PRIVACY_FILTER = {0x6733C4E9, 0x4792, 0x11D4, [0x97, 0xF1, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_REMOVE_WEP = {0x433C345C, 0x2129, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_RSSI = {0x1507DB16, 0x2053, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_RSSI_TRIGGER = {0x155689B8, 0x2053, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_RTS_THRESHOLD = {0x0134D07E, 0x2064, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_RX_ANTENNA_SELECTED = {0x01AC07A2, 0x2064, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_SSID = {0x7D2A90EA, 0x2041, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_STATISTICS = {0x42BB73B0, 0x2129, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_SUPPORTED_RATES = {0x49DB8722, 0x2068, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_TX_ANTENNA_SELECTED = {0x01DBB74A, 0x2064, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_TX_POWER_LEVEL = {0x11E6BA76, 0x2053, 0x11D4, [0x97, 0xEB, 0x00, 0xC0, 0x4F, 0x79, 0xC4, 0x03]};
+ const IID GUID_NDIS_802_11_WEP_STATUS = {0xB027A21F, 0x3CFA, 0x4125, [0x80, 0x0B, 0x3F, 0x7A, 0x18, 0xFD, 0xDC, 0xDC]};
+ const IID GUID_NDIS_802_3_CURRENT_ADDRESS = {0x44795700, 0xA61B, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_802_3_MAC_OPTIONS = {0x44795703, 0xA61B, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_802_3_MAXIMUM_LIST_SIZE = {0x44795702, 0xA61B, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_802_3_MULTICAST_LIST = {0x44795701, 0xA61B, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_802_3_PERMANENT_ADDRESS = {0x447956FF, 0xA61B, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_802_3_RCV_ERROR_ALIGNMENT = {0x44795704, 0xA61B, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_802_3_XMIT_MORE_COLLISIONS = {0x44795706, 0xA61B, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_802_3_XMIT_ONE_COLLISION = {0x44795705, 0xA61B, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_802_5_CURRENT_ADDRESS = {0x44795708, 0xA61B, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_802_5_CURRENT_FUNCTIONAL = {0x44795709, 0xA61B, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_802_5_CURRENT_GROUP = {0x4479570A, 0xA61B, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_802_5_CURRENT_RING_STATE = {0xACF14032, 0xA61C, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_802_5_CURRENT_RING_STATUS = {0x890A36EC, 0xA61C, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_802_5_LAST_OPEN_STATUS = {0x4479570B, 0xA61B, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_802_5_LINE_ERRORS = {0xACF14033, 0xA61C, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_802_5_LOST_FRAMES = {0xACF14034, 0xA61C, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_802_5_PERMANENT_ADDRESS = {0x44795707, 0xA61B, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_ATM_HW_CURRENT_ADDRESS = {0x791AD1A1, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_ATM_MAX_AAL0_PACKET_SIZE = {0x791AD1A5, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_ATM_MAX_AAL1_PACKET_SIZE = {0x791AD1A6, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_ATM_MAX_AAL34_PACKET_SIZE = {0x791AD1A7, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_ATM_MAX_AAL5_PACKET_SIZE = {0x791AD191, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_ATM_MAX_ACTIVE_VCI_BITS = {0x791AD1A3, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_ATM_MAX_ACTIVE_VCS = {0x791AD1A2, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_ATM_MAX_ACTIVE_VPI_BITS = {0x791AD1A4, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_ATM_RCV_CELLS_DROPPED = {0x0A21480C, 0xE35F, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_ATM_RCV_CELLS_OK = {0x0A21480A, 0xE35F, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_ATM_SUPPORTED_AAL_TYPES = {0x791AD1A0, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_ATM_SUPPORTED_SERVICE_CATEG = {0x791AD19F, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_ATM_SUPPORTED_VC_RATES = {0x791AD19E, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_ATM_XMIT_CELLS_OK = {0x0A21480B, 0xE35F, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_ENUMERATE_ADAPTER = {0x981F2D7F, 0xB1F3, 0x11D0, [0x8D, 0xD7, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_ENUMERATE_VC = {0x981F2D82, 0xB1F3, 0x11D0, [0x8D, 0xD7, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_FDDI_ATTACHMENT_TYPE = {0xACF1403D, 0xA61C, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_FDDI_DOWNSTREAM_NODE_LONG = {0xACF1403F, 0xA61C, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_FDDI_FRAME_ERRORS = {0xACF14040, 0xA61C, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_FDDI_FRAMES_LOST = {0xACF14041, 0xA61C, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_FDDI_LCONNECTION_STATE = {0xACF14045, 0xA61C, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_FDDI_LCT_FAILURES = {0xACF14043, 0xA61C, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_FDDI_LEM_REJECTS = {0xACF14044, 0xA61C, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_FDDI_LONG_CURRENT_ADDR = {0xACF14036, 0xA61C, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_FDDI_LONG_MAX_LIST_SIZE = {0xACF14038, 0xA61C, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_FDDI_LONG_MULTICAST_LIST = {0xACF14037, 0xA61C, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_FDDI_LONG_PERMANENT_ADDR = {0xACF14035, 0xA61C, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_FDDI_RING_MGT_STATE = {0xACF14042, 0xA61C, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_FDDI_SHORT_CURRENT_ADDR = {0xACF1403A, 0xA61C, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_FDDI_SHORT_MAX_LIST_SIZE = {0xACF1403C, 0xA61C, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_FDDI_SHORT_MULTICAST_LIST = {0xACF1403B, 0xA61C, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_FDDI_SHORT_PERMANENT_ADDR = {0xACF14039, 0xA61C, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_FDDI_UPSTREAM_NODE_LONG = {0xACF1403E, 0xA61C, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_CO_DRIVER_VERSION = {0x791AD198, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_CO_HARDWARE_STATUS = {0x791AD192, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_CO_LINK_SPEED = {0x791AD195, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_CO_MAC_OPTIONS = {0x791AD19A, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_CO_MEDIA_CONNECT_STATU = {0x791AD19B, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_CO_MEDIA_IN_USE = {0x791AD194, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_CO_MEDIA_SUPPORTED = {0x791AD193, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_CO_MINIMUM_LINK_SPEED = {0x791AD19D, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_CO_RCV_PDUS_ERROR = {0x0A214808, 0xE35F, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_CO_RCV_PDUS_NO_BUFFER = {0x0A214809, 0xE35F, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_CO_RCV_PDUS_OK = {0x0A214806, 0xE35F, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_CO_VENDOR_DESCRIPTION = {0x791AD197, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_CO_VENDOR_DRIVER_VERSI = {0x791AD19C, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_CO_VENDOR_ID = {0x791AD196, 0xE35C, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_CO_XMIT_PDUS_ERROR = {0x0A214807, 0xE35F, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_CO_XMIT_PDUS_OK = {0x0A214805, 0xE35F, 0x11D0, [0x96, 0x92, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_CURRENT_LOOKAHEAD = {0x5EC10361, 0xA61A, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_CURRENT_PACKET_FILTER = {0x5EC10360, 0xA61A, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_DRIVER_VERSION = {0x5EC10362, 0xA61A, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_HARDWARE_STATUS = {0x5EC10354, 0xA61A, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_LINK_SPEED = {0x5EC10359, 0xA61A, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_MAC_OPTIONS = {0x5EC10365, 0xA61A, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_MAXIMUM_FRAME_SIZE = {0x5EC10358, 0xA61A, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_MAXIMUM_LOOKAHEAD = {0x5EC10357, 0xA61A, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_MAXIMUM_SEND_PACKETS = {0x5EC10367, 0xA61A, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_MAXIMUM_TOTAL_SIZE = {0x5EC10363, 0xA61A, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_MEDIA_CONNECT_STATUS = {0x5EC10366, 0xA61A, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_MEDIA_IN_USE = {0x5EC10356, 0xA61A, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_MEDIA_SUPPORTED = {0x5EC10355, 0xA61A, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_PHYSICAL_MEDIUM = {0x418CA16D, 0x3937, 0x4208, [0x94, 0x0A, 0xEC, 0x61, 0x96, 0x27, 0x80, 0x85]};
+ const IID GUID_NDIS_GEN_RCV_ERROR = {0x447956FD, 0xA61B, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_RCV_NO_BUFFER = {0x447956FE, 0xA61B, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_RCV_OK = {0x447956FB, 0xA61B, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_RECEIVE_BLOCK_SIZE = {0x5EC1035D, 0xA61A, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_RECEIVE_BUFFER_SPACE = {0x5EC1035B, 0xA61A, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_TRANSMIT_BLOCK_SIZE = {0x5EC1035C, 0xA61A, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_TRANSMIT_BUFFER_SPACE = {0x5EC1035A, 0xA61A, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_VENDOR_DESCRIPTION = {0x5EC1035F, 0xA61A, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_VENDOR_DRIVER_VERSION = {0x447956F9, 0xA61B, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_VENDOR_ID = {0x5EC1035E, 0xA61A, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_VLAN_ID = {0x765DC702, 0xC5E8, 0x4B67, [0x84, 0x3B, 0x3F, 0x5A, 0x4F, 0xF2, 0x64, 0x8B]};
+ const IID GUID_NDIS_GEN_XMIT_ERROR = {0x447956FC, 0xA61B, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_GEN_XMIT_OK = {0x447956FA, 0xA61B, 0x11D0, [0x8D, 0xD4, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_LAN_CLASS = {0xAD498944, 0x762F, 0x11D0, [0x8D, 0xCB, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_NOTIFY_ADAPTER_ARRIVAL = {0x981F2D81, 0xB1F3, 0x11D0, [0x8D, 0xD7, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_NOTIFY_ADAPTER_REMOVAL = {0x981F2D80, 0xB1F3, 0x11D0, [0x8D, 0xD7, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_NOTIFY_BIND = {0x5413531C, 0xB1F3, 0x11D0, [0x8D, 0xD7, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_NOTIFY_UNBIND = {0x6E3CE1EC, 0xB1F3, 0x11D0, [0x8D, 0xD7, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_NOTIFY_VC_ARRIVAL = {0x182F9E0C, 0xB1F3, 0x11D0, [0x8D, 0xD7, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_NOTIFY_VC_REMOVAL = {0x981F2D79, 0xB1F3, 0x11D0, [0x8D, 0xD7, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_STATUS_LINK_SPEED_CHANGE = {0x981F2D85, 0xB1F3, 0x11D0, [0x8D, 0xD7, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_STATUS_MEDIA_CONNECT = {0x981F2D7D, 0xB1F3, 0x11D0, [0x8D, 0xD7, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_STATUS_MEDIA_DISCONNECT = {0x981F2D7E, 0xB1F3, 0x11D0, [0x8D, 0xD7, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_STATUS_MEDIA_SPECIFIC_INDIC = {0x981F2D84, 0xB1F3, 0x11D0, [0x8D, 0xD7, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_STATUS_RESET_END = {0x981F2D77, 0xB1F3, 0x11D0, [0x8D, 0xD7, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_STATUS_RESET_START = {0x981F2D76, 0xB1F3, 0x11D0, [0x8D, 0xD7, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C]};
+ const IID GUID_NDIS_WAKE_ON_MAGIC_PACKET_ONLY = {0xA14F1C97, 0x8839, 0x4F8A, [0x99, 0x96, 0xA2, 0x89, 0x96, 0xEB, 0xBF, 0x1D]};
+ const IID GUID_NETSHELL_PROPS = {0x2D15A9A1, 0xA556, 0x4189, [0x91, 0xAD, 0x02, 0x74, 0x58, 0xF1, 0x1A, 0x07]};
+ const IID GUID_NonLocalVidMemCaps = {0x86C4FA80, 0x8D84, 0x11D0, [0x94, 0xE8, 0x00, 0xC0, 0x4F, 0xC3, 0x41, 0x37]};
+ const IID GUID_NOTIFICATION_CHORD = {0xD2AC289B, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_NOTIFICATION_COMMAND = {0xD2AC289C, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_NOTIFICATION_MEASUREANDBEAT = {0xD2AC289A, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_NOTIFICATION_PERFORMANCE = {0x81F75BC5, 0x4E5D, 0x11D2, [0xBC, 0xC7, 0x00, 0xA0, 0xC9, 0x22, 0xE6, 0xEB]};
+ const IID GUID_NOTIFICATION_SEGMENT = {0xD2AC2899, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_NULL = {0x00000000, 0x0000, 0x0000, [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]};
+ const IID GUID_OPTIONVALUEEXCLUSIVE = {0x6650430B, 0xBE0F, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID GUID_OptSurfaceKmodeInfo = {0xE05C8472, 0x51D4, 0x11D1, [0x8C, 0xCE, 0x00, 0xA0, 0xC9, 0x06, 0x29, 0xA8]};
+ const IID GUID_OptSurfaceUmodeInfo = {0x9D792804, 0x5FA8, 0x11D1, [0x8C, 0xD0, 0x00, 0xA0, 0xC9, 0x06, 0x29, 0xA8]};
+ const IID GUID_PathProperty = {0x0002DE80, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID GUID_PCI_BUS_INTERFACE_STANDARD = {0x496B8281, 0x6F25, 0x11D0, [0xBE, 0xAF, 0x08, 0x00, 0x2B, 0xE2, 0x09, 0x2F]};
+ const IID GUID_PCI_DEVICE_PRESENT_INTERFACE = {0xD1B82C26, 0xBF49, 0x45EF, [0xB2, 0x16, 0x71, 0xCB, 0xD7, 0x88, 0x9B, 0x57]};
+ const IID GUID_PCMCIA_BUS_INTERFACE_STANDARD = {0x76173AF0, 0xC504, 0x11D1, [0x94, 0x7F, 0x00, 0xC0, 0x4F, 0xB9, 0x60, 0xEE]};
+ const IID GUID_PerfAutoDownload = {0xFB09565B, 0x3631, 0x11D2, [0xBC, 0xB8, 0x00, 0xA0, 0xC9, 0x22, 0xE6, 0xEB]};
+ const IID GUID_PerfMasterGrooveLevel = {0xD2AC28B2, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_PerfMasterTempo = {0xD2AC28B0, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_PerfMasterVolume = {0xD2AC28B1, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_PNP_CUSTOM_NOTIFICATION = {0xACA73F8E, 0x8D23, 0x11D1, [0xAC, 0x7D, 0x00, 0x00, 0xF8, 0x75, 0x71, 0xD0]};
+ const IID GUID_PNP_POWER_NOTIFICATION = {0xC2CF0660, 0xEB7A, 0x11D1, [0xBD, 0x7F, 0x00, 0x00, 0xF8, 0x75, 0x71, 0xD0]};
+ const IID GUID_POV = {0xA36D02F2, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID GUID_POWER_DEVICE_ENABLE = {0x827C0A6F, 0xFEB0, 0x11D0, [0xBD, 0x26, 0x00, 0xAA, 0x00, 0xB7, 0xB3, 0x2A]};
+ const IID GUID_POWER_DEVICE_TIMEOUTS = {0xA45DA735, 0xFEB0, 0x11D0, [0xBD, 0x26, 0x00, 0xAA, 0x00, 0xB7, 0xB3, 0x2A]};
+ const IID GUID_POWER_DEVICE_WAKE_ENABLE = {0xA9546A82, 0xFEB0, 0x11D0, [0xBD, 0x26, 0x00, 0xAA, 0x00, 0xB7, 0xB3, 0x2A]};
+ const IID GUID_QOS_BESTEFFORT_BANDWIDTH = {0xED885290, 0x40EC, 0x11D1, [0x2C, 0x91, 0x00, 0xAA, 0x00, 0x57, 0x49, 0x15]};
+ const IID GUID_QOS_ENABLE_AVG_STATS = {0xBAFB6D11, 0x27C4, 0x4801, [0xA4, 0x6F, 0xEF, 0x80, 0x80, 0xC1, 0x88, 0xC8]};
+ const IID GUID_QOS_ENABLE_WINDOW_ADJUSTMENT = {0xAA966725, 0xD3E9, 0x4C55, [0xB3, 0x35, 0x2A, 0x00, 0x27, 0x9A, 0x1E, 0x64]};
+ const IID GUID_QOS_FLOW_8021P_CONFORMING = {0x08C1E013, 0xFCD2, 0x11D2, [0xBE, 0x1E, 0x00, 0xA0, 0xC9, 0x9E, 0xE6, 0x3B]};
+ const IID GUID_QOS_FLOW_8021P_NONCONFORMING = {0x09023F91, 0xFCD2, 0x11D2, [0xBE, 0x1E, 0x00, 0xA0, 0xC9, 0x9E, 0xE6, 0x3B]};
+ const IID GUID_QOS_FLOW_COUNT = {0x1147F880, 0x40ED, 0x11D1, [0x2C, 0x91, 0x00, 0xAA, 0x00, 0x57, 0x49, 0x15]};
+ const IID GUID_QOS_FLOW_IP_CONFORMING = {0x07F99A8B, 0xFCD2, 0x11D2, [0xBE, 0x1E, 0x00, 0xA0, 0xC9, 0x9E, 0xE6, 0x3B]};
+ const IID GUID_QOS_FLOW_IP_NONCONFORMING = {0x087A5987, 0xFCD2, 0x11D2, [0xBE, 0x1E, 0x00, 0xA0, 0xC9, 0x9E, 0xE6, 0x3B]};
+ const IID GUID_QOS_FLOW_MODE = {0x5C82290A, 0x515A, 0x11D2, [0x8E, 0x58, 0x00, 0xC0, 0x4F, 0xC9, 0xBF, 0xCB]};
+ const IID GUID_QOS_ISSLOW_FLOW = {0xABF273A4, 0xEE07, 0x11D2, [0xBE, 0x1B, 0x00, 0xA0, 0xC9, 0x9E, 0xE6, 0x3B]};
+ const IID GUID_QOS_LATENCY = {0xFC408EF0, 0x40EC, 0x11D1, [0x2C, 0x91, 0x00, 0xAA, 0x00, 0x57, 0x49, 0x15]};
+ const IID GUID_QOS_MAX_OUTSTANDING_SENDS = {0x161FFA86, 0x6120, 0x11D1, [0x2C, 0x91, 0x00, 0xAA, 0x00, 0x57, 0x49, 0x15]};
+ const IID GUID_QOS_NON_BESTEFFORT_LIMIT = {0x185C44E0, 0x40ED, 0x11D1, [0x2C, 0x91, 0x00, 0xAA, 0x00, 0x57, 0x49, 0x15]};
+ const IID GUID_QOS_REMAINING_BANDWIDTH = {0xC4C51720, 0x40EC, 0x11D1, [0x2C, 0x91, 0x00, 0xAA, 0x00, 0x57, 0x49, 0x15]};
+ const IID GUID_QOS_STATISTICS_BUFFER = {0xBB2C0980, 0xE900, 0x11D1, [0xB0, 0x7E, 0x00, 0x80, 0xC7, 0x13, 0x82, 0xBF]};
+ const IID GUID_QOS_TIMER_RESOLUTION = {0xBA10CC88, 0xF13E, 0x11D2, [0xBE, 0x1B, 0x00, 0xA0, 0xC9, 0x9E, 0xE6, 0x3B]};
+ const IID GUID_RampForce = {0x13541C21, 0x8E33, 0x11D0, [0x9A, 0xD0, 0x00, 0xA0, 0xC9, 0xA0, 0x6E, 0x35]};
+ const IID GUID_RhythmParam = {0xD2AC289F, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_RxAxis = {0xA36D02F4, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID GUID_RyAxis = {0xA36D02F5, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID GUID_RzAxis = {0xA36D02E3, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID GUID_SawtoothDown = {0x13541C26, 0x8E33, 0x11D0, [0x9A, 0xD0, 0x00, 0xA0, 0xC9, 0xA0, 0x6E, 0x35]};
+ const IID GUID_SawtoothUp = {0x13541C25, 0x8E33, 0x11D0, [0x9A, 0xD0, 0x00, 0xA0, 0xC9, 0xA0, 0x6E, 0x35]};
+ const IID GUID_SeedVariations = {0x65B76FA5, 0xFF37, 0x11D2, [0x81, 0x4E, 0x00, 0xC0, 0x4F, 0xA3, 0x6E, 0x58]};
+ const IID GUID_Sine = {0x13541C23, 0x8E33, 0x11D0, [0x9A, 0xD0, 0x00, 0xA0, 0xC9, 0xA0, 0x6E, 0x35]};
+ const IID GUID_Slider = {0xA36D02E4, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID GUID_Spring = {0x13541C27, 0x8E33, 0x11D0, [0x9A, 0xD0, 0x00, 0xA0, 0xC9, 0xA0, 0x6E, 0x35]};
+ const IID GUID_Square = {0x13541C22, 0x8E33, 0x11D0, [0x9A, 0xD0, 0x00, 0xA0, 0xC9, 0xA0, 0x6E, 0x35]};
+ const IID GUID_StandardMIDIFile = {0x06621075, 0xE92E, 0x11D1, [0xA8, 0xC5, 0x00, 0xC0, 0x4F, 0xA3, 0x72, 0x6E]};
+ const IID GUID_SysKeyboard = {0x6F1D2B61, 0xD5A0, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID GUID_SysKeyboardEm = {0x6F1D2B82, 0xD5A0, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID GUID_SysKeyboardEm2 = {0x6F1D2B83, 0xD5A0, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID GUID_SysMouse = {0x6F1D2B60, 0xD5A0, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID GUID_SysMouseEm = {0x6F1D2B80, 0xD5A0, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID GUID_SysMouseEm2 = {0x6F1D2B81, 0xD5A0, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID GUID_TARGET_DEVICE_QUERY_REMOVE = {0xCB3A4006, 0x46F0, 0x11D0, [0xB0, 0x8F, 0x00, 0x60, 0x97, 0x13, 0x05, 0x3F]};
+ const IID GUID_TARGET_DEVICE_REMOVE_CANCELLED = {0xCB3A4007, 0x46F0, 0x11D0, [0xB0, 0x8F, 0x00, 0x60, 0x97, 0x13, 0x05, 0x3F]};
+ const IID GUID_TARGET_DEVICE_REMOVE_COMPLETE = {0xCB3A4008, 0x46F0, 0x11D0, [0xB0, 0x8F, 0x00, 0x60, 0x97, 0x13, 0x05, 0x3F]};
+ const IID GUID_TempoParam = {0xD2AC28A5, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_TimeSignature = {0xD2AC28A4, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_TRANSLATOR_INTERFACE_STANDARD = {0x6C154A92, 0xAACF, 0x11D0, [0x8D, 0x2A, 0x00, 0xA0, 0xC9, 0x06, 0xB2, 0x44]};
+ const IID GUID_Triangle = {0x13541C24, 0x8E33, 0x11D0, [0x9A, 0xD0, 0x00, 0xA0, 0xC9, 0xA0, 0x6E, 0x35]};
+ const IID GUID_TRISTATE = {0x6650430A, 0xBE0F, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID GUID_Unknown = {0xA36D02F3, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID GUID_Unload = {0xD2AC28A8, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID GUID_UserModeDriverInfo = {0xF0B0E8E2, 0x5F97, 0x11D1, [0x8C, 0xD0, 0x00, 0xA0, 0xC9, 0x06, 0x29, 0xA8]};
+ const IID GUID_UserModeDriverPassword = {0x97F861B6, 0x60A1, 0x11D1, [0x8C, 0xD0, 0x00, 0xA0, 0xC9, 0x06, 0x29, 0xA8]};
+ const IID GUID_VideoPortCallbacks = {0xEFD60CC1, 0x49E7, 0x11D0, [0x88, 0x9D, 0x00, 0xAA, 0x00, 0xBB, 0xB7, 0x6A]};
+ const IID GUID_VideoPortCaps = {0xEFD60CC3, 0x49E7, 0x11D0, [0x88, 0x9D, 0x00, 0xAA, 0x00, 0xBB, 0xB7, 0x6A]};
+ const IID GUID_XAxis = {0xA36D02E0, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID GUID_XPOS = {0x66504306, 0xBE0F, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID GUID_XPOSPIXEL = {0x66504302, 0xBE0F, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID GUID_XSIZE = {0x66504308, 0xBE0F, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID GUID_XSIZEPIXEL = {0x66504304, 0xBE0F, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID GUID_YAxis = {0xA36D02E1, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID GUID_YPOS = {0x66504307, 0xBE0F, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID GUID_YPOSPIXEL = {0x66504303, 0xBE0F, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID GUID_YSIZE = {0x66504309, 0xBE0F, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID GUID_YSIZEPIXEL = {0x66504305, 0xBE0F, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID GUID_ZAxis = {0xA36D02E2, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID GUID_ZPixelFormats = {0x93869880, 0x36CF, 0x11D1, [0x9B, 0x1B, 0x00, 0xAA, 0x00, 0xBB, 0xB8, 0xAE]};
+ const IID IID_AsyncIAdviseSink = {0x00000150, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_AsyncIAdviseSink2 = {0x00000151, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_AsyncIBackgroundCopyCallback = {0xCA29D251, 0xB4BB, 0x4679, [0xA3, 0xD9, 0xAE, 0x80, 0x06, 0x11, 0x9D, 0x54]};
+ const IID IID_AsyncIClusCfgBaseCluster = {0xA8A5C614, 0x2518, 0x47F5, [0x96, 0xCA, 0xCA, 0xFA, 0x7F, 0xFB, 0xAF, 0x68]};
+ const IID IID_AsyncIClusCfgCallback = {0xEBCE8945, 0xAC69, 0x4B3A, [0x86, 0x5D, 0xE2, 0xD4, 0xEB, 0x33, 0xE4, 0x1B]};
+ const IID IID_AsyncIClusCfgClusterInfo = {0x8BDBA247, 0x04F5, 0x4114, [0x83, 0x7E, 0xB2, 0x63, 0x41, 0x2A, 0x4B, 0x64]};
+ const IID IID_AsyncIClusCfgCredentials = {0x54AA9406, 0xA409, 0x4B49, [0xB3, 0x14, 0x5F, 0x0A, 0x0C, 0xE4, 0xC8, 0x8F]};
+ const IID IID_AsyncIClusCfgEvictCleanup = {0x6FE3E362, 0xD373, 0x4C5F, [0xA0, 0xAF, 0x1D, 0xFE, 0x84, 0x93, 0xC6, 0x55]};
+ const IID IID_AsyncIClusCfgInitialize = {0x2A0EB82E, 0xF878, 0x492A, [0x95, 0x1E, 0xAE, 0x00, 0x09, 0x18, 0xC4, 0xA6]};
+ const IID IID_AsyncIClusCfgIPAddressInfo = {0xAAEAF0A5, 0xE310, 0x4604, [0xA5, 0x5E, 0x2F, 0x9D, 0xDC, 0x41, 0x57, 0xA9]};
+ const IID IID_AsyncIClusCfgManagedResourceInfo = {0x73616028, 0x1243, 0x4749, [0xAD, 0x84, 0x0B, 0x5E, 0xB3, 0x58, 0xFF, 0xA0]};
+ const IID IID_AsyncIClusCfgMemberSetChangeListe = {0x2B645350, 0x2643, 0x4ABC, [0xA4, 0xE5, 0x82, 0x4D, 0x88, 0x1B, 0x75, 0x82]};
+ const IID IID_AsyncIClusCfgNetworkInfo = {0xED71FD2D, 0xAD02, 0x4DFC, [0xB3, 0x76, 0x5F, 0xFA, 0x5F, 0x5A, 0x7C, 0x2C]};
+ const IID IID_AsyncIClusCfgNodeInfo = {0x4F3BB40B, 0xDF27, 0x40A0, [0xB3, 0x1A, 0xBA, 0x18, 0x32, 0x4C, 0xEB, 0x9D]};
+ const IID IID_AsyncIClusCfgPartitionInfo = {0xEC1EBD9F, 0x5866, 0x4846, [0x89, 0x52, 0xEC, 0x36, 0xC3, 0x96, 0x1E, 0xEF]};
+ const IID IID_AsyncIClusCfgResourceTypeCreate = {0x3AFCE3B9, 0x5F3E, 0x4DDF, [0xA8, 0xF4, 0x4B, 0x4F, 0xCB, 0xF2, 0x8F, 0x8F]};
+ const IID IID_AsyncIClusCfgResourceTypeInfo = {0xC649A282, 0xC847, 0x4F5C, [0x98, 0x41, 0xD2, 0xF7, 0x3B, 0x5A, 0xA7, 0x1D]};
+ const IID IID_AsyncIClusCfgServer = {0x2A1640AA, 0x4561, 0x4A08, [0xB5, 0xD9, 0x0A, 0xA3, 0x8C, 0x6B, 0xE6, 0x28]};
+ const IID IID_AsyncIClusCfgStartupListener = {0xD282CAF0, 0x2EDE, 0x4AB9, [0xA5, 0xD5, 0xF7, 0xBD, 0xE3, 0xD2, 0x3F, 0x10]};
+ const IID IID_AsyncIClusCfgStartupNotify = {0xC2B0D06A, 0x6353, 0x4EE1, [0xB2, 0x53, 0x6B, 0x0D, 0x75, 0xDB, 0x2C, 0xD3]};
+ const IID IID_AsyncIEnumClusCfgIPAddresses = {0xBD5F35BA, 0x0BC0, 0x455F, [0x92, 0x6D, 0xC3, 0xD3, 0x56, 0x41, 0x94, 0x87]};
+ const IID IID_AsyncIEnumClusCfgManagedResource = {0xB138483F, 0x9695, 0x4FA6, [0xA9, 0x8F, 0x0D, 0xE2, 0xFB, 0x35, 0x54, 0x49]};
+ const IID IID_AsyncIEnumClusCfgNetworks = {0xF56B9B0D, 0xE7B8, 0x49EC, [0xA8, 0x43, 0x54, 0x75, 0x07, 0x6B, 0x94, 0x7D]};
+ const IID IID_AsyncIEnumClusCfgPartitions = {0x4440BB6A, 0xB0AC, 0x479D, [0xB5, 0x34, 0x72, 0x65, 0xA3, 0x1D, 0x6C, 0x56]};
+ const IID IID_AsyncIMultiQI = {0x000E0020, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_AsyncIPipeByte = {0xDB2F3ACB, 0x2F86, 0x11D1, [0x8E, 0x04, 0x00, 0xC0, 0x4F, 0xB9, 0x98, 0x9A]};
+ const IID IID_AsyncIPipeDouble = {0xDB2F3ACF, 0x2F86, 0x11D1, [0x8E, 0x04, 0x00, 0xC0, 0x4F, 0xB9, 0x98, 0x9A]};
+ const IID IID_AsyncIPipeLong = {0xDB2F3ACD, 0x2F86, 0x11D1, [0x8E, 0x04, 0x00, 0xC0, 0x4F, 0xB9, 0x98, 0x9A]};
+ const IID IID_AsyncIUnknown = {0x000E0000, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_DFConstraint = {0x4A3DF050, 0x23BD, 0x11D2, [0x93, 0x9F, 0x00, 0xA0, 0xC9, 0x1E, 0xED, 0xBA]};
+ const IID IID_DIEnumWbemClassObject = {0xCB7CA037, 0xF729, 0x11D0, [0x9E, 0x4D, 0x00, 0xC0, 0x4F, 0xC3, 0x24, 0xA8]};
+ const IID IID_DIWbemCallResult = {0xCB7CA039, 0xF729, 0x11D0, [0x9E, 0x4D, 0x00, 0xC0, 0x4F, 0xC3, 0x24, 0xA8]};
+ const IID IID_DIWbemClassObject = {0xCB7CA033, 0xF729, 0x11D0, [0x9E, 0x4D, 0x00, 0xC0, 0x4F, 0xC3, 0x24, 0xA8]};
+ const IID IID_DIWbemContext = {0xCB7CA038, 0xF729, 0x11D0, [0x9E, 0x4D, 0x00, 0xC0, 0x4F, 0xC3, 0x24, 0xA8]};
+ const IID IID_DIWbemLocator = {0xCB7CA035, 0xF729, 0x11D0, [0x9E, 0x4D, 0x00, 0xC0, 0x4F, 0xC3, 0x24, 0xA8]};
+ const IID IID_DIWbemObjectSink = {0xCB7CA036, 0xF729, 0x11D0, [0x9E, 0x4D, 0x00, 0xC0, 0x4F, 0xC3, 0x24, 0xA8]};
+ const IID IID_DIWbemQualifierSet = {0xCB7CA034, 0xF729, 0x11D0, [0x9E, 0x4D, 0x00, 0xC0, 0x4F, 0xC3, 0x24, 0xA8]};
+ const IID IID_DIWbemServices = {0xCB7CA03A, 0xF729, 0x11D0, [0x9E, 0x4D, 0x00, 0xC0, 0x4F, 0xC3, 0x24, 0xA8]};
+ const IID IID_Folder = {0xBBCBDE60, 0xC3FF, 0x11CE, [0x83, 0x50, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID IID_Folder2 = {0xF0D2D8EF, 0x3890, 0x11D2, [0xBF, 0x8B, 0x00, 0xC0, 0x4F, 0xB9, 0x36, 0x61]};
+ const IID IID_Folder3 = {0xA7AE5F64, 0xC4D7, 0x4D7F, [0x93, 0x07, 0x4D, 0x24, 0xEE, 0x54, 0xB8, 0x41]};
+ const IID IID_FolderItem = {0xFAC32C80, 0xCBE4, 0x11CE, [0x83, 0x50, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID IID_FolderItem2 = {0xEDC817AA, 0x92B8, 0x11D1, [0xB0, 0x75, 0x00, 0xC0, 0x4F, 0xC3, 0x3A, 0xA5]};
+ const IID IID_FolderItems = {0x744129E0, 0xCBE5, 0x11CE, [0x83, 0x50, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID IID_FolderItems2 = {0xC94F0AD0, 0xF363, 0x11D2, [0xA3, 0x27, 0x00, 0xC0, 0x4F, 0x8E, 0xEC, 0x7F]};
+ const IID IID_FolderItems3 = {0xEAA7C309, 0xBBEC, 0x49D5, [0x82, 0x1D, 0x64, 0xD9, 0x66, 0xCB, 0x66, 0x7F]};
+ const IID IID_FolderItemVerb = {0x08EC3E00, 0x50B0, 0x11CF, [0x96, 0x0C, 0x00, 0x80, 0xC7, 0xF4, 0xEE, 0x85]};
+ const IID IID_FolderItemVerbs = {0x1F8352C0, 0x50B0, 0x11CF, [0x96, 0x0C, 0x00, 0x80, 0xC7, 0xF4, 0xEE, 0x85]};
+ const IID IID_IAccessControl = {0xEEDD23E0, 0x8410, 0x11CE, [0xA1, 0xC3, 0x08, 0x00, 0x2B, 0x2B, 0x8D, 0x8F]};
+ const IID IID_IAccessible = {0x618736E0, 0x3C3D, 0x11CF, [0x81, 0x0C, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71]};
+ const IID IID_IAccessibleHandler = {0x03022430, 0xABC4, 0x11D0, [0xBD, 0xE2, 0x00, 0xAA, 0x00, 0x1A, 0x19, 0x53]};
+ const IID IID_IAccessor = {0x0C733A8C, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IAccIdentity = {0x7852B78D, 0x1CFD, 0x41C1, [0xA6, 0x15, 0x9C, 0x0C, 0x85, 0x96, 0x0B, 0x5F]};
+ const IID IID_IAccountDiscovery = {0xFA202BBC, 0x6ABE, 0x4C17, [0xB1, 0x84, 0x57, 0x0B, 0x6C, 0xF2, 0x56, 0xA6]};
+ const IID IID_IAccPropServer = {0x76C0DBBB, 0x15E0, 0x4E7B, [0xB6, 0x1B, 0x20, 0xEE, 0xEA, 0x20, 0x01, 0xE0]};
+ const IID IID_IAccPropServices = {0x6E26E776, 0x04F0, 0x495D, [0x80, 0xE4, 0x33, 0x30, 0x35, 0x2E, 0x31, 0x69]};
+ const IID IID_IACList = {0x77A130B0, 0x94FD, 0x11D0, [0xA5, 0x44, 0x00, 0xC0, 0x4F, 0xD7, 0xD0, 0x62]};
+ const IID IID_IACList2 = {0x470141A0, 0x5186, 0x11D2, [0xBB, 0xB6, 0x00, 0x60, 0x97, 0x7B, 0x46, 0x4C]};
+ const IID IID_IActionProgress = {0x49FF1173, 0xEADC, 0x446D, [0x92, 0x85, 0x15, 0x64, 0x53, 0xA6, 0x43, 0x1C]};
+ const IID IID_IActionProgressDialog = {0x49FF1172, 0xEADC, 0x446D, [0x92, 0x85, 0x15, 0x64, 0x53, 0xA6, 0x43, 0x1C]};
+ const IID IID_IActiveDesktop = {0xF490EB00, 0x1240, 0x11D1, [0x98, 0x88, 0x00, 0x60, 0x97, 0xDE, 0xAC, 0xF9]};
+ const IID IID_IActiveIME = {0x6FE20962, 0xD077, 0x11D0, [0x8F, 0xE7, 0x00, 0xAA, 0x00, 0x6B, 0xCC, 0x59]};
+ const IID IID_IActiveIME2 = {0xE1C4BF0E, 0x2D53, 0x11D2, [0x93, 0xE1, 0x00, 0x60, 0xB0, 0x67, 0xB8, 0x6E]};
+ const IID IID_IActiveIMMApp = {0x08C0E040, 0x62D1, 0x11D1, [0x93, 0x26, 0x00, 0x60, 0xB0, 0x67, 0xB8, 0x6E]};
+ const IID IID_IActiveIMMIME = {0x08C03411, 0xF96B, 0x11D0, [0xA4, 0x75, 0x00, 0xAA, 0x00, 0x6B, 0xCC, 0x59]};
+ const IID IID_IActiveIMMMessagePumpOwner = {0xB5CF2CFA, 0x8AEB, 0x11D1, [0x93, 0x64, 0x00, 0x60, 0xB0, 0x67, 0xB8, 0x6E]};
+ const IID IID_IActiveIMMRegistrar = {0xB3458082, 0xBD00, 0x11D1, [0x93, 0x9B, 0x00, 0x60, 0xB0, 0x67, 0xB8, 0x6E]};
+ const IID IID_IActiveScript = {0xBB1A2AE1, 0xA4F9, 0x11CF, [0x8F, 0x20, 0x00, 0x80, 0x5F, 0x2C, 0xD0, 0x64]};
+ const IID IID_IActiveScriptAuthor = {0x9C109DA0, 0x7006, 0x11D1, [0xB3, 0x6C, 0x00, 0xA0, 0xC9, 0x11, 0xE8, 0xB2]};
+ const IID IID_IActiveScriptAuthorProcedure = {0x7E2D4B70, 0xBD9A, 0x11D0, [0x93, 0x36, 0x00, 0xA0, 0xC9, 0x0D, 0xCA, 0xA9]};
+ const IID IID_IActiveScriptDebug = {0x51973C10, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IActiveScriptDebug32 = {0x51973C10, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IActiveScriptDebug64 = {0xBC437E23, 0xF5B8, 0x47F4, [0xBB, 0x79, 0x7D, 0x1C, 0xE5, 0x48, 0x3B, 0x86]};
+ const IID IID_IActiveScriptEncode = {0xBB1A2AE3, 0xA4F9, 0x11CF, [0x8F, 0x20, 0x00, 0x80, 0x5F, 0x2C, 0xD0, 0x64]};
+ const IID IID_IActiveScriptError = {0xEAE1BA61, 0xA4ED, 0x11CF, [0x8F, 0x20, 0x00, 0x80, 0x5F, 0x2C, 0xD0, 0x64]};
+ const IID IID_IActiveScriptError64 = {0xB21FB2A1, 0x5B8F, 0x4963, [0x8C, 0x21, 0x21, 0x45, 0x0F, 0x84, 0xED, 0x7F]};
+ const IID IID_IActiveScriptErrorDebug = {0x51973C12, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IActiveScriptGarbageCollector = {0x6AA2C4A0, 0x2B53, 0x11D4, [0xA2, 0xA0, 0x00, 0x10, 0x4B, 0xD3, 0x50, 0x90]};
+ const IID IID_IActiveScriptHostEncode = {0xBEE9B76E, 0xCFE3, 0x11D1, [0xB7, 0x47, 0x00, 0xC0, 0x4F, 0xC2, 0xB0, 0x85]};
+ const IID IID_IActiveScriptParse = {0xBB1A2AE2, 0xA4F9, 0x11CF, [0x8F, 0x20, 0x00, 0x80, 0x5F, 0x2C, 0xD0, 0x64]};
+ const IID IID_IActiveScriptParse32 = {0xBB1A2AE2, 0xA4F9, 0x11CF, [0x8F, 0x20, 0x00, 0x80, 0x5F, 0x2C, 0xD0, 0x64]};
+ const IID IID_IActiveScriptParse64 = {0xC7EF7658, 0xE1EE, 0x480E, [0x97, 0xEA, 0xD5, 0x2C, 0xB4, 0xD7, 0x6D, 0x17]};
+ const IID IID_IActiveScriptParseProcedure = {0xAA5B6A80, 0xB834, 0x11D0, [0x93, 0x2F, 0x00, 0xA0, 0xC9, 0x0D, 0xCA, 0xA9]};
+ const IID IID_IActiveScriptParseProcedure2_32 = {0x71EE5B20, 0xFB04, 0x11D1, [0xB3, 0xA8, 0x00, 0xA0, 0xC9, 0x11, 0xE8, 0xB2]};
+ const IID IID_IActiveScriptParseProcedure2_64 = {0xFE7C4271, 0x210C, 0x448D, [0x9F, 0x54, 0x76, 0xDA, 0xB7, 0x04, 0x7B, 0x28]};
+ const IID IID_IActiveScriptParseProcedure32 = {0xAA5B6A80, 0xB834, 0x11D0, [0x93, 0x2F, 0x00, 0xA0, 0xC9, 0x0D, 0xCA, 0xA9]};
+ const IID IID_IActiveScriptParseProcedure64 = {0xC64713B6, 0xE029, 0x4CC5, [0x92, 0x00, 0x43, 0x8B, 0x72, 0x89, 0x0B, 0x6A]};
+ const IID IID_IActiveScriptParseProcedureOld = {0x1CFF0050, 0x6FDD, 0x11D0, [0x93, 0x28, 0x00, 0xA0, 0xC9, 0x0D, 0xCA, 0xA9]};
+ const IID IID_IActiveScriptParseProcedureOld32 = {0x1CFF0050, 0x6FDD, 0x11D0, [0x93, 0x28, 0x00, 0xA0, 0xC9, 0x0D, 0xCA, 0xA9]};
+ const IID IID_IActiveScriptParseProcedureOld64 = {0x21F57128, 0x08C9, 0x4638, [0xBA, 0x12, 0x22, 0xD1, 0x5D, 0x88, 0xDC, 0x5C]};
+ const IID IID_IActiveScriptProperty = {0x4954E0D0, 0xFBC7, 0x11D1, [0x84, 0x10, 0x00, 0x60, 0x08, 0xC3, 0xFB, 0xFC]};
+ const IID IID_IActiveScriptSIPInfo = {0x764651D0, 0x38DE, 0x11D4, [0xA2, 0xA3, 0x00, 0x10, 0x4B, 0xD3, 0x50, 0x90]};
+ const IID IID_IActiveScriptSite = {0xDB01A1E3, 0xA42B, 0x11CF, [0x8F, 0x20, 0x00, 0x80, 0x5F, 0x2C, 0xD0, 0x64]};
+ const IID IID_IActiveScriptSiteDebug32 = {0x51973C11, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IActiveScriptSiteDebug64 = {0xD6B96B0A, 0x7463, 0x402C, [0x92, 0xAC, 0x89, 0x98, 0x42, 0x26, 0x94, 0x2F]};
+ const IID IID_IActiveScriptSiteInterruptPoll = {0x539698A0, 0xCDCA, 0x11CF, [0xA5, 0xEB, 0x00, 0xAA, 0x00, 0x47, 0xA0, 0x63]};
+ const IID IID_IActiveScriptSiteWindow = {0xD10F6761, 0x83E9, 0x11CF, [0x8F, 0x20, 0x00, 0x80, 0x5F, 0x2C, 0xD0, 0x64]};
+ const IID IID_IActiveScriptStats = {0xB8DA6310, 0xE19B, 0x11D0, [0x93, 0x3C, 0x00, 0xA0, 0xC9, 0x0D, 0xCA, 0xA9]};
+ const IID IID_IActiveXSafetyProvider = {0x69FF5101, 0xFC63, 0x11D0, [0x97, 0xEB, 0x00, 0xAA, 0x00, 0x61, 0x53, 0x33]};
+ const IID IID_IAdapterInfo = {0x480BF94A, 0x09FD, 0x4F8A, [0xA3, 0xE0, 0xB0, 0x70, 0x02, 0x82, 0xD8, 0x4D]};
+ const IID IID_IAdapterNotificationSink = {0x44AB2DC3, 0x23B2, 0x47DE, [0x82, 0x28, 0x2E, 0x1C, 0xCE, 0xEB, 0x99, 0x11]};
+ const IID IID_IAddEvents = {0xD710A6AE, 0x3371, 0x11D1, [0xBE, 0x5B, 0x00, 0xC0, 0x4F, 0xC9, 0xE2, 0xBB]};
+ const IID IID_IAddressBarParser = {0xC9D81948, 0x443A, 0x40C7, [0x94, 0x5C, 0x5E, 0x17, 0x1B, 0x8C, 0x66, 0xB4]};
+ const IID IID_IAddrExclusionControl = {0x00000148, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IAddrTrackingControl = {0x00000147, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IADs = {0xFD8256D0, 0xFD15, 0x11CE, [0xAB, 0xC4, 0x02, 0x60, 0x8C, 0x9E, 0x75, 0x53]};
+ const IID IID_IADsAccessControlEntry = {0xB4F3A14C, 0x9BDD, 0x11D0, [0x85, 0x2C, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID IID_IADsAccessControlList = {0xB7EE91CC, 0x9BDD, 0x11D0, [0x85, 0x2C, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID IID_IADsAcePrivate = {0xFD145DF2, 0xFD96, 0x4135, [0x9B, 0x22, 0x68, 0xFF, 0x0F, 0x6B, 0xF5, 0xBB]};
+ const IID IID_IADsAcl = {0x8452D3AB, 0x0869, 0x11D1, [0xA3, 0x77, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID IID_IADsADSystemInfo = {0x5BB11929, 0xAFD1, 0x11D2, [0x9C, 0xB9, 0x00, 0x00, 0xF8, 0x7A, 0x36, 0x9E]};
+ const IID IID_IADsBackLink = {0xFD1302BD, 0x4080, 0x11D1, [0xA3, 0xAC, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID IID_IADsCaseIgnoreList = {0x7B66B533, 0x4680, 0x11D1, [0xA3, 0xB4, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID IID_IADsClass = {0xC8F93DD0, 0x4AE0, 0x11CF, [0x9E, 0x73, 0x00, 0xAA, 0x00, 0x4A, 0x56, 0x91]};
+ const IID IID_IADsCollection = {0x72B945E0, 0x253B, 0x11CF, [0xA9, 0x88, 0x00, 0xAA, 0x00, 0x6B, 0xC1, 0x49]};
+ const IID IID_IADsComputer = {0xEFE3CC70, 0x1D9F, 0x11CF, [0xB1, 0xF3, 0x02, 0x60, 0x8C, 0x9E, 0x75, 0x53]};
+ const IID IID_IADsComputerOperations = {0xEF497680, 0x1D9F, 0x11CF, [0xB1, 0xF3, 0x02, 0x60, 0x8C, 0x9E, 0x75, 0x53]};
+ const IID IID_IADsContainer = {0x001677D0, 0xFD16, 0x11CE, [0xAB, 0xC4, 0x02, 0x60, 0x8C, 0x9E, 0x75, 0x53]};
+ const IID IID_IADsDeleteOps = {0xB2BD0902, 0x8878, 0x11D1, [0x8C, 0x21, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID IID_IADsDNWithBinary = {0x7E99C0A2, 0xF935, 0x11D2, [0xBA, 0x96, 0x00, 0xC0, 0x4F, 0xB6, 0xD0, 0xD1]};
+ const IID IID_IADsDNWithString = {0x370DF02E, 0xF934, 0x11D2, [0xBA, 0x96, 0x00, 0xC0, 0x4F, 0xB6, 0xD0, 0xD1]};
+ const IID IID_IADsDomain = {0x00E4C220, 0xFD16, 0x11CE, [0xAB, 0xC4, 0x02, 0x60, 0x8C, 0x9E, 0x75, 0x53]};
+ const IID IID_IADsEmail = {0x97AF011A, 0x478E, 0x11D1, [0xA3, 0xB4, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID IID_IADsExtension = {0x3D35553C, 0xD2B0, 0x11D1, [0xB1, 0x7B, 0x00, 0x00, 0xF8, 0x75, 0x93, 0xA0]};
+ const IID IID_IADsFaxNumber = {0xA910DEA9, 0x4680, 0x11D1, [0xA3, 0xB4, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID IID_IADsFileService = {0xA89D1900, 0x31CA, 0x11CF, [0xA9, 0x8A, 0x00, 0xAA, 0x00, 0x6B, 0xC1, 0x49]};
+ const IID IID_IADsFileServiceOperations = {0xA02DED10, 0x31CA, 0x11CF, [0xA9, 0x8A, 0x00, 0xAA, 0x00, 0x6B, 0xC1, 0x49]};
+ const IID IID_IADsFileShare = {0xEB6DCAF0, 0x4B83, 0x11CF, [0xA9, 0x95, 0x00, 0xAA, 0x00, 0x6B, 0xC1, 0x49]};
+ const IID IID_IADsGroup = {0x27636B00, 0x410F, 0x11CF, [0xB1, 0xFF, 0x02, 0x60, 0x8C, 0x9E, 0x75, 0x53]};
+ const IID IID_IADsHold = {0xB3EB3B37, 0x4080, 0x11D1, [0xA3, 0xAC, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID IID_IADsLargeInteger = {0x9068270B, 0x0939, 0x11D1, [0x8B, 0xE1, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID IID_IADsLocality = {0xA05E03A2, 0xEFFE, 0x11CF, [0x8A, 0xBC, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID IID_IADsMembers = {0x451A0030, 0x72EC, 0x11CF, [0xB0, 0x3B, 0x00, 0xAA, 0x00, 0x6E, 0x09, 0x75]};
+ const IID IID_IADsNamespaces = {0x28B96BA0, 0xB330, 0x11CF, [0xA9, 0xAD, 0x00, 0xAA, 0x00, 0x6B, 0xC1, 0x49]};
+ const IID IID_IADsNameTranslate = {0xB1B272A3, 0x3625, 0x11D1, [0xA3, 0xA4, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID IID_IADsNetAddress = {0xB21A50A9, 0x4080, 0x11D1, [0xA3, 0xAC, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID IID_IADsO = {0xA1CD2DC6, 0xEFFE, 0x11CF, [0x8A, 0xBC, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID IID_IADsObjectOptions = {0x46F14FDA, 0x232B, 0x11D1, [0xA8, 0x08, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0xA8]};
+ const IID IID_IADsObjOptPrivate = {0x81CBB829, 0x1867, 0x11D2, [0x92, 0x20, 0x00, 0xC0, 0x4F, 0xB6, 0xD0, 0xD1]};
+ const IID IID_IADsOctetList = {0x7B28B80F, 0x4680, 0x11D1, [0xA3, 0xB4, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID IID_IADsOpenDSObject = {0xDDF2891E, 0x0F9C, 0x11D0, [0x8A, 0xD4, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID IID_IADsOU = {0xA2F733B8, 0xEFFE, 0x11CF, [0x8A, 0xBC, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID IID_IADsPath = {0xB287FCD5, 0x4080, 0x11D1, [0xA3, 0xAC, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID IID_IADsPathname = {0xD592AED4, 0xF420, 0x11D0, [0xA3, 0x6E, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID IID_IADsPathnameProvider = {0xAACD1D30, 0x8BD0, 0x11D2, [0x92, 0xA9, 0x00, 0xC0, 0x4F, 0x79, 0xF8, 0x34]};
+ const IID IID_IADsPostalAddress = {0x7ADECF29, 0x4680, 0x11D1, [0xA3, 0xB4, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID IID_IADsPrintJob = {0x32FB6780, 0x1ED0, 0x11CF, [0xA9, 0x88, 0x00, 0xAA, 0x00, 0x6B, 0xC1, 0x49]};
+ const IID IID_IADsPrintJobOperations = {0x9A52DB30, 0x1ECF, 0x11CF, [0xA9, 0x88, 0x00, 0xAA, 0x00, 0x6B, 0xC1, 0x49]};
+ const IID IID_IADsPrintQueue = {0xB15160D0, 0x1226, 0x11CF, [0xA9, 0x85, 0x00, 0xAA, 0x00, 0x6B, 0xC1, 0x49]};
+ const IID IID_IADsPrintQueueOperations = {0x124BE5C0, 0x156E, 0x11CF, [0xA9, 0x86, 0x00, 0xAA, 0x00, 0x6B, 0xC1, 0x49]};
+ const IID IID_IADsProperty = {0xC8F93DD3, 0x4AE0, 0x11CF, [0x9E, 0x73, 0x00, 0xAA, 0x00, 0x4A, 0x56, 0x91]};
+ const IID IID_IADsPropertyEntry = {0x05792C8E, 0x941F, 0x11D0, [0x85, 0x29, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID IID_IADsPropertyList = {0xC6F602B6, 0x8F69, 0x11D0, [0x85, 0x28, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID IID_IADsPropertyValue = {0x79FA9AD0, 0xA97C, 0x11D0, [0x85, 0x34, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID IID_IADsPropertyValue2 = {0x306E831C, 0x5BC7, 0x11D1, [0xA3, 0xB8, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID IID_IADsReplicaPointer = {0xF60FB803, 0x4080, 0x11D1, [0xA3, 0xAC, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID IID_IADsResource = {0x34A05B20, 0x4AAB, 0x11CF, [0xAE, 0x2C, 0x00, 0xAA, 0x00, 0x6E, 0xBF, 0xB9]};
+ const IID IID_IADsSearch = {0xC69F7780, 0x4008, 0x11D0, [0xB9, 0x4C, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0xA8]};
+ const IID IID_IADsSecurityDescriptor = {0xB8C787CA, 0x9BDD, 0x11D0, [0x85, 0x2C, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID IID_IADsSecurityUtility = {0xA63251B2, 0x5F21, 0x474B, [0xAB, 0x52, 0x4A, 0x8E, 0xFA, 0xD1, 0x08, 0x95]};
+ const IID IID_IADsService = {0x68AF66E0, 0x31CA, 0x11CF, [0xA9, 0x8A, 0x00, 0xAA, 0x00, 0x6B, 0xC1, 0x49]};
+ const IID IID_IADsServiceOperations = {0x5D7B33F0, 0x31CA, 0x11CF, [0xA9, 0x8A, 0x00, 0xAA, 0x00, 0x6B, 0xC1, 0x49]};
+ const IID IID_IADsSession = {0x398B7DA0, 0x4AAB, 0x11CF, [0xAE, 0x2C, 0x00, 0xAA, 0x00, 0x6E, 0xBF, 0xB9]};
+ const IID IID_IADsSyntax = {0xC8F93DD2, 0x4AE0, 0x11CF, [0x9E, 0x73, 0x00, 0xAA, 0x00, 0x4A, 0x56, 0x91]};
+ const IID IID_IADsTimestamp = {0xB2F5A901, 0x4080, 0x11D1, [0xA3, 0xAC, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID IID_IADsTypedName = {0xB371A349, 0x4080, 0x11D1, [0xA3, 0xAC, 0x00, 0xC0, 0x4F, 0xB9, 0x50, 0xDC]};
+ const IID IID_IADsUmiHelperPrivate = {0x4FE243F0, 0xAD89, 0x4CBC, [0x9B, 0x14, 0x48, 0x61, 0x26, 0x44, 0x6A, 0xE0]};
+ const IID IID_IADsUser = {0x3E37E320, 0x17E2, 0x11CF, [0xAB, 0xC4, 0x02, 0x60, 0x8C, 0x9E, 0x75, 0x53]};
+ const IID IID_IADsValue = {0x1E3EF0AA, 0xAEF5, 0x11D0, [0x85, 0x37, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID IID_IADsWinNTSystemInfo = {0x6C6D65DC, 0xAFD1, 0x11D2, [0x9C, 0xB9, 0x00, 0x00, 0xF8, 0x7A, 0x36, 0x9E]};
+ const IID IID_IAdviseSink = {0x0000010F, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IAdviseSink2 = {0x00000125, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IAdviseSinkEx = {0x3AF24290, 0x0C96, 0x11CE, [0xA0, 0xCF, 0x00, 0xAA, 0x00, 0x60, 0x0A, 0xB8]};
+ const IID IID_IAlertReport = {0x4E81DFE8, 0x4CA0, 0x101A, [0x82, 0x06, 0x08, 0x00, 0x2B, 0x2F, 0xC0, 0x9B]};
+ const IID IID_IAlertTarget = {0x589B61C0, 0x54E6, 0x11CE, [0x94, 0xDD, 0x00, 0xAA, 0x00, 0x51, 0xE4, 0x0F]};
+ const IID IID_IAlgSetup = {0xA779AF1A, 0x009A, 0x4C44, [0xB9, 0xF0, 0x8F, 0x0F, 0x4C, 0xF2, 0xAE, 0x49]};
+ const IID IID_IAlterIndex = {0x0C733AA6, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IAlterTable = {0x0C733AA5, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IAnchorClick = {0x13D5413B, 0x33B9, 0x11D2, [0x95, 0xA7, 0x00, 0xC0, 0x4F, 0x8E, 0xCB, 0x02]};
+ const IID IID_IAnimationComposer = {0x5459C83D, 0x322B, 0x44B3, [0x8D, 0xAA, 0x24, 0xC9, 0x47, 0xE7, 0xB2, 0x75]};
+ const IID IID_IAnimationComposer2 = {0x1A4F0E79, 0x09CD, 0x47F3, [0xAF, 0xF1, 0x48, 0x3B, 0xF3, 0xA2, 0x22, 0xDC]};
+ const IID IID_IAnimationComposerFactory = {0xBEEB3233, 0xF71F, 0x4683, [0x8B, 0x05, 0x9A, 0x53, 0x14, 0xC9, 0x7D, 0xBC]};
+ const IID IID_IAnimationComposerSite = {0x488FCB56, 0x8FD6, 0x4CDA, [0xA0, 0x6A, 0x5B, 0xB2, 0x32, 0x93, 0x0E, 0xCA]};
+ const IID IID_IAnimationComposerSiteFactory = {0xB4EA5681, 0xED72, 0x4EFE, [0xBB, 0xD7, 0x7C, 0x47, 0xD1, 0x32, 0x56, 0x96]};
+ const IID IID_IAnimationComposerSiteSink = {0x8EF76C64, 0x71CD, 0x480F, [0x96, 0xFC, 0xBA, 0x26, 0x96, 0xE6, 0x59, 0xBE]};
+ const IID IID_IAnimationFragment = {0x319DFD88, 0x0AC6, 0x4AB1, [0xA1, 0x9F, 0x90, 0x22, 0x3B, 0xA2, 0xDA, 0x16]};
+ const IID IID_IAnimationRoot = {0x29DF6387, 0x30B4, 0x4A62, [0x89, 0x1B, 0xA9, 0xC5, 0xBE, 0x37, 0xBE, 0x88]};
+ const IID IID_IApplicationDebugger = {0x51973C2A, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IApplicationDebuggerUI = {0x51973C2B, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IApplicationGateway = {0x5134842B, 0xFDCE, 0x485D, [0x93, 0xCD, 0xDE, 0x16, 0x40, 0x64, 0x3B, 0xBE]};
+ const IID IID_IApplicationGatewayServices = {0x5134842A, 0xFDCE, 0x485D, [0x93, 0xCD, 0xDE, 0x16, 0x40, 0x64, 0x3B, 0xBE]};
+ const IID IID_IAppPublisher = {0x07250A10, 0x9CF9, 0x11D1, [0x90, 0x76, 0x00, 0x60, 0x08, 0x05, 0x93, 0x82]};
+ const IID IID_IAsyncBindCtx = {0x79EAC9D4, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IAsyncManager = {0x0000002A, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IAsyncMoniker = {0x79EAC9D3, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IAsyncOperation = {0x3D8B0590, 0xF691, 0x11D2, [0x8E, 0xA9, 0x00, 0x60, 0x97, 0xDF, 0x5B, 0xD4]};
+ const IID IID_IAsyncRpcChannelBuffer = {0xA5029FB6, 0x3C34, 0x11D1, [0x9C, 0x99, 0x00, 0xC0, 0x4F, 0xB9, 0x98, 0xAA]};
+ const IID IID_IAttributesRaw = {0x6BC096A8, 0x0CE6, 0x11D1, [0xBA, 0xAE, 0x00, 0xC0, 0x4F, 0xC2, 0xE2, 0x0D]};
+ const IID IID_IAuditControl = {0x1DA6292F, 0xBC66, 0x11CE, [0xAA, 0xE3, 0x00, 0xAA, 0x00, 0x4C, 0x27, 0x37]};
+ const IID IID_IAuthenticate = {0x79EAC9D0, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IAutoComplete = {0x00BB2762, 0x6A77, 0x11D0, [0xA5, 0x35, 0x00, 0xC0, 0x4F, 0xD7, 0xD0, 0x62]};
+ const IID IID_IAutoComplete2 = {0xEAC04BC0, 0x3791, 0x11D2, [0xBB, 0x95, 0x00, 0x60, 0x97, 0x7B, 0x46, 0x4C]};
+ const IID IID_IAutoCompleteDropDown = {0x3CD141F4, 0x3C6A, 0x11D2, [0xBC, 0xAA, 0x00, 0xC0, 0x4F, 0xD9, 0x29, 0xDB]};
+ const IID IID_IAutoCompList = {0x00BB2760, 0x6A77, 0x11D0, [0xA5, 0x35, 0x00, 0xC0, 0x4F, 0xD7, 0xD0, 0x62]};
+ const IID IID_IAutoDiscoveryProvider = {0x9DCF4A37, 0x01DE, 0x4549, [0xA9, 0xCB, 0x3A, 0xC3, 0x1E, 0xC2, 0x3C, 0x4F]};
+ const IID IID_IBackgroundCopyCallback = {0x97EA99C7, 0x0186, 0x4AD4, [0x8D, 0xF9, 0xC5, 0xB4, 0xE0, 0xED, 0x6B, 0x22]};
+ const IID IID_IBackgroundCopyCallback1 = {0x084F6593, 0x3800, 0x4E08, [0x9B, 0x59, 0x99, 0xFA, 0x59, 0xAD, 0xDF, 0x82]};
+ const IID IID_IBackgroundCopyError = {0x19C613A0, 0xFCB8, 0x4F28, [0x81, 0xAE, 0x89, 0x7C, 0x3D, 0x07, 0x8F, 0x81]};
+ const IID IID_IBackgroundCopyFile = {0x01B7BD23, 0xFB88, 0x4A77, [0x84, 0x90, 0x58, 0x91, 0xD3, 0xE4, 0x65, 0x3A]};
+ const IID IID_IBackgroundCopyGroup = {0x1DED80A7, 0x53EA, 0x424F, [0x8A, 0x04, 0x17, 0xFE, 0xA9, 0xAD, 0xC4, 0xF5]};
+ const IID IID_IBackgroundCopyJob = {0x37668D37, 0x507E, 0x4160, [0x93, 0x16, 0x26, 0x30, 0x6D, 0x15, 0x0B, 0x12]};
+ const IID IID_IBackgroundCopyJob1 = {0x59F5553C, 0x2031, 0x4629, [0xBB, 0x18, 0x26, 0x45, 0xA6, 0x97, 0x09, 0x47]};
+ const IID IID_IBackgroundCopyJob2 = {0x54B50739, 0x686F, 0x45EB, [0x9D, 0xFF, 0xD6, 0xA9, 0xA0, 0xFA, 0xA9, 0xAF]};
+ const IID IID_IBackgroundCopyManager = {0x5CE34C0D, 0x0DC9, 0x4C1F, [0x89, 0x7C, 0xDA, 0xA1, 0xB7, 0x8C, 0xEE, 0x7C]};
+ const IID IID_IBackgroundCopyQMgr = {0x16F41C69, 0x09F5, 0x41D2, [0x8C, 0xD8, 0x3C, 0x08, 0xC4, 0x7B, 0xC8, 0xA8]};
+ const IID IID_IBidiRequestSpl = {0x9C007000, 0xFFA8, 0x44FF, [0xB2, 0xB3, 0xAE, 0x91, 0x02, 0xC7, 0x4D, 0x4C]};
+ const IID IID_IBindCtx = {0x0000000E, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IBindEventHandler = {0x63CDBCB0, 0xC1B1, 0x11D0, [0x93, 0x36, 0x00, 0xA0, 0xC9, 0x0D, 0xCA, 0xA9]};
+ const IID IID_IBindHost = {0xFC4801A1, 0x2BA9, 0x11CF, [0xA2, 0x29, 0x00, 0xAA, 0x00, 0x3D, 0x73, 0x52]};
+ const IID IID_IBinding = {0x79EAC9C0, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IBindProtocol = {0x79EAC9CD, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IBindResource = {0x0C733AB1, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IBindStatusCallback = {0x79EAC9C1, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IBindStatusCallbackHolder = {0x79EAC9CC, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IBindStatusCallbackMsg = {0x79EAC9D5, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IBitsTest1 = {0x51A183DB, 0x67E0, 0x4472, [0x86, 0x02, 0x3D, 0xBC, 0x73, 0x0B, 0x7E, 0xF5]};
+ const IID IID_IBlockFormats = {0x3050F830, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IBlockingLock = {0x30F3D47A, 0x6447, 0x11D1, [0x8E, 0x3C, 0x00, 0xC0, 0x4F, 0xB9, 0x38, 0x6D]};
+ const IID IID_IBoundObject = {0x9BFBBC00, 0xEFF1, 0x101A, [0x84, 0xED, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07]};
+ const IID IID_IBoundObjectSite = {0x9BFBBC01, 0xEFF1, 0x101A, [0x84, 0xED, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07]};
+ const IID IID_IBriefcaseStg = {0x8BCE1FA1, 0x0921, 0x101B, [0xB1, 0xFF, 0x00, 0xDD, 0x01, 0x0C, 0xCC, 0x48]};
+ const IID IID_IBurnEngine = {0x520CCA66, 0x51A5, 0x11D3, [0x91, 0x44, 0x00, 0x10, 0x4B, 0xA1, 0x1C, 0x5E]};
+ const IID IID_ICallFactory = {0x1C733A30, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ICallFrame = {0xD573B4B0, 0x894E, 0x11D2, [0xB8, 0xB6, 0x00, 0xC0, 0x4F, 0xB9, 0x61, 0x8A]};
+ const IID IID_ICallFrameEvents = {0xFD5E0843, 0xFC91, 0x11D0, [0x97, 0xD7, 0x00, 0xC0, 0x4F, 0xB9, 0x61, 0x8A]};
+ const IID IID_ICallFrameWalker = {0x08B23919, 0x392D, 0x11D2, [0xB8, 0xA4, 0x00, 0xC0, 0x4F, 0xB9, 0x61, 0x8A]};
+ const IID IID_ICallIndirect = {0xD573B4B1, 0x894E, 0x11D2, [0xB8, 0xB6, 0x00, 0xC0, 0x4F, 0xB9, 0x61, 0x8A]};
+ const IID IID_ICallInterceptor = {0x60C7CA75, 0x896D, 0x11D2, [0xB8, 0xB6, 0x00, 0xC0, 0x4F, 0xB9, 0x61, 0x8A]};
+ const IID IID_ICallUnmarshal = {0x5333B003, 0x2E42, 0x11D2, [0xB8, 0x9D, 0x00, 0xC0, 0x4F, 0xB9, 0x61, 0x8A]};
+ const IID IID_ICancelMethodCalls = {0x00000029, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ICatalogFileInfo = {0x711C7600, 0x6B48, 0x11D1, [0xB4, 0x03, 0x00, 0xAA, 0x00, 0xB9, 0x2A, 0xF1]};
+ const IID IID_ICategorizer = {0xA3B14589, 0x9174, 0x49A8, [0x89, 0xA3, 0x06, 0xA1, 0xAE, 0x2B, 0x9B, 0xA7]};
+ const IID IID_ICategoryProvider = {0x9AF64809, 0x5864, 0x4C26, [0xA7, 0x20, 0xC1, 0xF7, 0x8C, 0x08, 0x6E, 0xE3]};
+ const IID IID_ICatInformation = {0x0002E013, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ICatRegister = {0x0002E012, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ICDBurn = {0x3D73A659, 0xE5D0, 0x4D42, [0xAF, 0xC0, 0x51, 0x21, 0xBA, 0x42, 0x5C, 0x8D]};
+ const IID IID_ICEnroll = {0x43F8F288, 0x7A20, 0x11D0, [0x8F, 0x06, 0x00, 0xC0, 0x4F, 0xC2, 0x95, 0xE1]};
+ const IID IID_ICEnroll2 = {0x704CA730, 0xC90B, 0x11D1, [0x9B, 0xEC, 0x00, 0xC0, 0x4F, 0xC2, 0x95, 0xE1]};
+ const IID IID_ICEnroll3 = {0xC28C2D95, 0xB7DE, 0x11D2, [0xA4, 0x21, 0x00, 0xC0, 0x4F, 0x79, 0xFE, 0x8E]};
+ const IID IID_ICEnroll4 = {0xC1F1188A, 0x2EB5, 0x4A80, [0x84, 0x1B, 0x7E, 0x72, 0x9A, 0x35, 0x6D, 0x90]};
+ const IID IID_IChannelHook = {0x1008C4A0, 0x7613, 0x11CF, [0x9A, 0xF1, 0x00, 0x20, 0xAF, 0x6E, 0x72, 0xF4]};
+ const IID IID_IChannelMgr = {0x85BD8E82, 0x0FBA, 0x11D1, [0x90, 0xC3, 0x00, 0xC0, 0x4F, 0xC2, 0xF5, 0x68]};
+ const IID IID_IChapteredRowset = {0x0C733A93, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ICheckBox = {0x3050F685, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ICiAdmin = {0xAE67C7D8, 0x85D3, 0x11D0, [0x8C, 0x45, 0x00, 0xC0, 0x4F, 0xC2, 0xDB, 0x8D]};
+ const IID IID_ICiAdminParams = {0xA82D48C6, 0x3F0F, 0x11D0, [0x8C, 0x91, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiCAdviseStatus = {0xCA05734A, 0x1218, 0x11D3, [0xAE, 0x7A, 0x00, 0xC0, 0x4F, 0x72, 0xF8, 0x31]};
+ const IID IID_ICiCDeferredPropRetriever = {0xC273AF70, 0x6D72, 0x11D0, [0x8D, 0x64, 0x00, 0xA0, 0xC9, 0x08, 0xDB, 0xF1]};
+ const IID IID_ICiCDocName = {0x76615076, 0x3C2B, 0x11D0, [0x8C, 0x90, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiCDocNameToWorkidTranslator = {0x25FC3F54, 0x3CB4, 0x11D0, [0x8C, 0x90, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiCDocNameToWorkidTranslatorEx = {0x7BBA76E6, 0xA0E3, 0x11D2, [0xBC, 0x5D, 0x00, 0xC0, 0x4F, 0xA3, 0x54, 0xBA]};
+ const IID IID_ICiCDocStore = {0x46625468, 0x3C32, 0x11D0, [0x8C, 0x90, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiCDocStoreEx = {0xF98282A7, 0xFA72, 0x11D1, [0x97, 0x98, 0x00, 0xC0, 0x4F, 0xC2, 0xF4, 0x10]};
+ const IID IID_ICiCDocStoreLocator = {0x97EE7C06, 0x5908, 0x11D0, [0x8C, 0x9B, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiCEventLogItem = {0x44CC886A, 0x4314, 0x11D0, [0x8C, 0x91, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiCFilterClient = {0xA1E0BCB6, 0x3C24, 0x11D0, [0x8C, 0x90, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiCFilterStatus = {0xBC5F3D60, 0x8BBC, 0x11D1, [0x8F, 0x73, 0x00, 0xA0, 0xC9, 0x19, 0x17, 0xF5]};
+ const IID IID_ICiCIndexNotificationStatus = {0x5FFF3840, 0x8E76, 0x11D0, [0x8D, 0x69, 0x00, 0xA0, 0xC9, 0x08, 0xDB, 0xF1]};
+ const IID IID_ICiCLangRes = {0x914C2E6C, 0x43FE, 0x11D0, [0x8C, 0x91, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiControl = {0x63DEB7F4, 0x3CCB, 0x11D0, [0x8C, 0x90, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiCOpenedDoc = {0x151EDFBE, 0x3C2F, 0x11D0, [0x8C, 0x90, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiCPropertyStorage = {0x4C46225A, 0x3CB5, 0x11D0, [0x8C, 0x90, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiCPropRetriever = {0x77D9B2DA, 0x4401, 0x11D0, [0x8C, 0x91, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiCQueryNotification = {0x0A9E9F6C, 0x3CE2, 0x11D0, [0x8C, 0x90, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiCQuerySession = {0xAE461FD6, 0x4E1D, 0x11D0, [0x8C, 0x94, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiCResourceMonitor = {0xF700FF8E, 0x20EE, 0x11D2, [0x80, 0xF7, 0x00, 0xC0, 0x4F, 0xA3, 0x54, 0xBA]};
+ const IID IID_ICiCScope = {0x1021C882, 0x3CC0, 0x11D0, [0x8C, 0x90, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiCScopeChecker = {0x7D820C9C, 0x3CBC, 0x11D0, [0x8C, 0x90, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiCScopeEnumerator = {0xCF8505EA, 0x3CCA, 0x11D0, [0x8C, 0x90, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiCSecurityChecker = {0xCA130CF4, 0x3CC2, 0x11D0, [0x8C, 0x90, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiCUserSecurity = {0x5D01D9CE, 0x3CC2, 0x11D0, [0x8C, 0x90, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiDocChangeNotifySink = {0x8BFA1386, 0x3CE5, 0x11D0, [0x8C, 0x90, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiEnumWorkids = {0x77900150, 0xA09C, 0x11D0, [0xA8, 0x0D, 0x00, 0xA0, 0xC9, 0x06, 0x24, 0x1A]};
+ const IID IID_ICiFrameworkQuery = {0xAE67C7D9, 0x85D3, 0x11D0, [0x8C, 0x45, 0x00, 0xC0, 0x4F, 0xC2, 0xDB, 0x8D]};
+ const IID IID_ICiIndexNotification = {0x4F2CD6E0, 0x8E74, 0x11D0, [0x8D, 0x69, 0x00, 0xA0, 0xC9, 0x08, 0xDB, 0xF1]};
+ const IID IID_ICiIndexNotificationEntry = {0x210769D0, 0x8E75, 0x11D0, [0x8D, 0x69, 0x00, 0xA0, 0xC9, 0x08, 0xDB, 0xF1]};
+ const IID IID_ICiISearchCreator = {0x7DC07FA0, 0x902E, 0x11D0, [0xA8, 0x0C, 0x00, 0xA0, 0xC9, 0x06, 0x24, 0x1A]};
+ const IID IID_ICiManager = {0xCF0FCF56, 0x3CCE, 0x11D0, [0x8C, 0x90, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiPersistIncrFile = {0x31B311E2, 0x4498, 0x11D0, [0x8C, 0x91, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_ICiQueryPropertyMapper = {0xD2333EB0, 0x756B, 0x11D0, [0x8D, 0x66, 0x00, 0xA0, 0xC9, 0x08, 0xDB, 0xF1]};
+ const IID IID_ICiStartup = {0x68232CB8, 0x3CCC, 0x11D0, [0x8C, 0x90, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_IClassActivator = {0x00000140, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IClassFactory = {0x00000001, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IClassFactory2 = {0xB196B28F, 0xBAB4, 0x101A, [0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07]};
+ const IID IID_IClassFactoryEx = {0x342D1EA0, 0xAE25, 0x11D1, [0x89, 0xC5, 0x00, 0x60, 0x08, 0xC3, 0xFB, 0xFC]};
+ const IID IID_IClientCaps = {0x7E8BC44D, 0xAEFF, 0x11D1, [0x89, 0xC2, 0x00, 0xC0, 0x4F, 0xB6, 0xBF, 0xC4]};
+ const IID IID_IClientSecurity = {0x0000013D, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IClusCfgAsyncEvictCleanup = {0x52C80B95, 0xC1AD, 0x4240, [0x8D, 0x89, 0x72, 0xE9, 0xFA, 0x84, 0x02, 0x5E]};
+ const IID IID_IClusCfgBaseCluster = {0xA8A5C613, 0x2518, 0x47F5, [0x96, 0xCA, 0xCA, 0xFA, 0x7F, 0xFB, 0xAF, 0x68]};
+ const IID IID_IClusCfgCallback = {0x238DCA63, 0xE2EF, 0x4F32, [0xA2, 0x4D, 0xAC, 0xBF, 0x97, 0x5B, 0xE8, 0x42]};
+ const IID IID_IClusCfgCapabilities = {0xD94AB253, 0x36C7, 0x41C1, [0xB5, 0x2E, 0x26, 0xB4, 0x51, 0x97, 0x5C, 0x8D]};
+ const IID IID_IClusCfgClusterConnection = {0xCE6EF90C, 0x3602, 0x41E7, [0x95, 0xBD, 0xAA, 0xFD, 0x37, 0xA6, 0x76, 0xDF]};
+ const IID IID_IClusCfgClusterInfo = {0x85B4BBC0, 0xDDC4, 0x4AE7, [0x82, 0x68, 0xF4, 0x85, 0x0B, 0xB2, 0xA6, 0xEE]};
+ const IID IID_IClusCfgCredentials = {0x54AA9406, 0xA409, 0x4B49, [0xB3, 0x14, 0x5F, 0x0A, 0x0C, 0xE4, 0xC8, 0x8E]};
+ const IID IID_IClusCfgEvictCleanup = {0x6FE3E361, 0xD373, 0x4C5F, [0xA0, 0xAF, 0x1D, 0xFE, 0x84, 0x93, 0xC6, 0x55]};
+ const IID IID_IClusCfgGroupCfg = {0xDCB6D3D2, 0xA55F, 0x49E5, [0xA6, 0x4A, 0x0C, 0xCF, 0xEB, 0x01, 0xED, 0x3A]};
+ const IID IID_IClusCfgInitialize = {0x2A0EB82D, 0xF878, 0x492A, [0x95, 0x1E, 0xAE, 0x00, 0x09, 0x18, 0xC4, 0xA6]};
+ const IID IID_IClusCfgIPAddressInfo = {0xAAEAF0A5, 0xE310, 0x4604, [0xA5, 0x5E, 0x2F, 0x9D, 0xDC, 0x41, 0x57, 0xA8]};
+ const IID IID_IClusCfgManagedResourceCfg = {0x60300A0F, 0x77E1, 0x440C, [0xBD, 0x94, 0x6B, 0xFB, 0x0D, 0xBF, 0xDB, 0x3A]};
+ const IID IID_IClusCfgManagedResourceInfo = {0xE0324847, 0x1520, 0x41B0, [0xB9, 0x60, 0x54, 0x19, 0x8D, 0xA5, 0xF8, 0xAF]};
+ const IID IID_IClusCfgMemberSetChangeListener = {0x2B64534F, 0x2643, 0x4ABC, [0xA4, 0xE5, 0x82, 0x4D, 0x88, 0x1B, 0x75, 0x82]};
+ const IID IID_IClusCfgNetworkInfo = {0x19FC7580, 0x950A, 0x44A6, [0x96, 0x6E, 0x74, 0xB1, 0x4B, 0x20, 0x91, 0x8F]};
+ const IID IID_IClusCfgNodeInfo = {0xE4B5FA15, 0xDD07, 0x439E, [0xA6, 0x23, 0x88, 0x23, 0x52, 0x4E, 0x3D, 0x19]};
+ const IID IID_IClusCfgPartitionInfo = {0xEC1EBD9F, 0x5866, 0x4846, [0x89, 0x52, 0xEC, 0x36, 0xC3, 0x96, 0x1E, 0xEE]};
+ const IID IID_IClusCfgPollingCallback = {0xC72DB1FD, 0x51A2, 0x43E6, [0xB7, 0x08, 0xD9, 0xDB, 0x7D, 0xA7, 0x96, 0x30]};
+ const IID IID_IClusCfgPollingCallbackInfo = {0x2AF55DA7, 0xCB6F, 0x40DE, [0xBB, 0x11, 0x66, 0x73, 0x46, 0x4B, 0x2C, 0x54]};
+ const IID IID_IClusCfgResourceCreate = {0x0647B41A, 0xC777, 0x443C, [0x94, 0x32, 0x02, 0xCC, 0xCF, 0x4F, 0xF4, 0x43]};
+ const IID IID_IClusCfgResourcePostCreate = {0x72A9BF54, 0x13B6, 0x451F, [0x91, 0x0D, 0x69, 0x13, 0xEB, 0xF0, 0x25, 0xAB]};
+ const IID IID_IClusCfgResourcePreCreate = {0x4240F6A1, 0x9D49, 0x427E, [0x8F, 0x3D, 0x09, 0x38, 0x4E, 0x1F, 0x59, 0xE4]};
+ const IID IID_IClusCfgResourceTypeCreate = {0x3AFCE3B8, 0x5F3E, 0x4DDF, [0xA8, 0xF4, 0x4B, 0x4F, 0xCB, 0xF2, 0x8F, 0x8F]};
+ const IID IID_IClusCfgResourceTypeInfo = {0xC649A281, 0xC847, 0x4F5C, [0x98, 0x41, 0xD2, 0xF7, 0x3B, 0x5A, 0xA7, 0x1D]};
+ const IID IID_IClusCfgResTypeServicesInitializ = {0x6E109698, 0xDFC4, 0x4471, [0xAC, 0xE1, 0x04, 0x14, 0x93, 0x1B, 0x3B, 0xB3]};
+ const IID IID_IClusCfgServer = {0x4C06EAE6, 0x990E, 0x4051, [0x8A, 0xA1, 0xAD, 0x4B, 0x4E, 0xAE, 0x9C, 0xAF]};
+ const IID IID_IClusCfgSetCredentials = {0x58E6E5B9, 0x4788, 0x4D9A, [0x82, 0x55, 0x1E, 0x27, 0x4E, 0x5D, 0xCC, 0xB0]};
+ const IID IID_IClusCfgStartupListener = {0xD282CAEF, 0x2EDE, 0x4AB9, [0xA5, 0xD5, 0xF7, 0xBD, 0xE3, 0xD2, 0x3F, 0x0F]};
+ const IID IID_IClusCfgStartupNotify = {0xC2B0D069, 0x6353, 0x4EE1, [0xB2, 0x53, 0x6B, 0x0D, 0x75, 0xDB, 0x2C, 0xD3]};
+ const IID IID_IClusCfgVerify = {0xD47BBEEC, 0x2286, 0x4514, [0xAA, 0x90, 0x7E, 0x88, 0xBD, 0x0F, 0xE5, 0x43]};
+ const IID IID_IClusCfgWizard = {0x2EB57A3B, 0xDA8D, 0x4B56, [0x97, 0xCF, 0xA3, 0x19, 0x1B, 0xF8, 0xFD, 0x5B]};
+ const IID IID_IClusterApplicationWizard = {0x24F97151, 0x6689, 0x11D1, [0x9A, 0xA7, 0x00, 0xC0, 0x4F, 0xB9, 0x3A, 0x80]};
+ const IID IID_ICodeInstall = {0x79EAC9D1, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IColumnMapper = {0x0B63E37A, 0x9CCC, 0x11D0, [0xBC, 0xDB, 0x00, 0x80, 0x5F, 0xCC, 0xCE, 0x04]};
+ const IID IID_IColumnMapperCreator = {0x0B63E37B, 0x9CCC, 0x11D0, [0xBC, 0xDB, 0x00, 0x80, 0x5F, 0xCC, 0xCE, 0x04]};
+ const IID IID_IColumnProvider = {0xE8025004, 0x1C42, 0x11D2, [0xBE, 0x2C, 0x00, 0xA0, 0xC9, 0xA8, 0x3D, 0xA1]};
+ const IID IID_IColumnsInfo = {0x0C733A11, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IColumnsInfo2 = {0x0C733AB8, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IColumnsRowset = {0x0C733A10, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ICombobox = {0x3050F677, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ICommand = {0x0C733A63, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ICommandCost = {0x0C733A4E, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ICommandPersist = {0x0C733AA7, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ICommandPrepare = {0x0C733A26, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ICommandProperties = {0x0C733A79, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ICommandStream = {0x0C733ABF, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ICommandText = {0x0C733A27, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ICommandTree = {0x0C733A87, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ICommandValidate = {0x0C733A18, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ICommandWithParameters = {0x0C733A64, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ICommDlgBrowser = {0x000214F1, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ICommDlgBrowser2 = {0x10339516, 0x2894, 0x11D2, [0x90, 0x39, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x3E]};
+ const IID IID_ICommonQuery = {0xAB50DEC0, 0x6F1D, 0x11D0, [0xA1, 0xC4, 0x00, 0xAA, 0x00, 0xC1, 0x6E, 0x65]};
+ const IID IID_IComThreadingInfo = {0x000001CE, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IConfigurationConnection = {0xDDAD8191, 0x66C5, 0x4A30, [0xA4, 0xDF, 0xCB, 0x6C, 0x21, 0x67, 0x04, 0xCA]};
+ const IID IID_IConnectionInfo = {0x15182CE3, 0x82D7, 0x473F, [0x92, 0xDE, 0x70, 0x6E, 0x2B, 0xCE, 0xA9, 0x02]};
+ const IID IID_IConnectionManager = {0xC0017768, 0x1BF3, 0x4352, [0x8D, 0x6C, 0x3A, 0x8C, 0x1D, 0x0F, 0xB4, 0x77]};
+ const IID IID_IConnectionPoint = {0xB196B286, 0xBAB4, 0x101A, [0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07]};
+ const IID IID_IConnectionPointContainer = {0xB196B284, 0xBAB4, 0x101A, [0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07]};
+ const IID IID_IContextCallback = {0x000001DA, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IContextMenu = {0x000214E4, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IContextMenu2 = {0x000214F4, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IContextMenu3 = {0xBCFCE0A0, 0xEC17, 0x11D0, [0x8D, 0x10, 0x00, 0xA0, 0xC9, 0x0F, 0x27, 0x19]};
+ const IID IID_IContinue = {0x0000012A, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IContinueCallback = {0xB722BCCA, 0x4E68, 0x101B, [0xA2, 0xBC, 0x00, 0xAA, 0x00, 0x40, 0x47, 0x70]};
+ const IID IID_IConvertType = {0x0C733A88, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ICrBarn = {0x276A2EE0, 0x0B5D, 0x11D2, [0xA4, 0x84, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID IID_ICrBarn2 = {0xB66A7A1B, 0x8FC6, 0x448C, [0xA2, 0xEB, 0x3C, 0x55, 0x95, 0x74, 0x78, 0xA1]};
+ const IID IID_ICrBlinds = {0x5AF5C340, 0x0BA9, 0x11D2, [0xA4, 0x84, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID IID_ICrBlinds2 = {0x7059D403, 0x599A, 0x4264, [0x81, 0x40, 0x64, 0x1E, 0xB8, 0xAE, 0x1F, 0x64]};
+ const IID IID_ICrBlur = {0x9F7C7827, 0xE87A, 0x11D1, [0x81, 0xE0, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID IID_ICreateErrorInfo = {0x22F03340, 0x547D, 0x101B, [0x8E, 0x65, 0x08, 0x00, 0x2B, 0x2B, 0xD1, 0x19]};
+ const IID IID_ICreateRow = {0x0C733AB2, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ICreateTypeInfo = {0x00020405, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ICreateTypeInfo2 = {0x0002040E, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ICreateTypeLib = {0x00020406, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ICreateTypeLib2 = {0x0002040F, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ICrEmboss = {0xE4ACFB80, 0x053E, 0x11D2, [0x81, 0xEA, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID IID_ICrEngrave = {0xE4ACFB7F, 0x053E, 0x11D2, [0x81, 0xEA, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID IID_ICrInset = {0x05C5EE20, 0x0BA6, 0x11D2, [0xA4, 0x84, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID IID_ICrIris = {0x3F69F350, 0x0379, 0x11D2, [0xA4, 0x84, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID IID_ICrIris2 = {0xF7B06961, 0xBA8C, 0x4970, [0x91, 0x8B, 0x1C, 0x60, 0xCB, 0x9F, 0xF1, 0x80]};
+ const IID IID_ICrRadialWipe = {0x424B71AE, 0x0695, 0x11D2, [0xA4, 0x84, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID IID_ICrSlide = {0x810E402E, 0x056B, 0x11D2, [0xA4, 0x84, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID IID_ICrSpiral = {0x0DE527A0, 0x0C7E, 0x11D2, [0xA4, 0x84, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID IID_ICrStretch = {0x6684AF00, 0x0A87, 0x11D2, [0xA4, 0x84, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID IID_ICrWheel = {0x3943DE80, 0x1464, 0x11D2, [0xA4, 0x84, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID IID_ICrZigzag = {0x4E5A64A0, 0x0C8B, 0x11D2, [0xA4, 0x84, 0x00, 0xC0, 0x4F, 0x8E, 0xFB, 0x69]};
+ const IID IID_ICSSFilter = {0x3050F3EC, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ICSSFilterDispatch = {0x9519152B, 0x9484, 0x4A6C, [0xB6, 0xA7, 0x4F, 0x25, 0xE9, 0x2D, 0x6C, 0x6B]};
+ const IID IID_ICSSFilterSite = {0x3050F3ED, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ICurrentWorkingDirectory = {0x91956D21, 0x9276, 0x11D1, [0x92, 0x1A, 0x00, 0x60, 0x97, 0xDF, 0x5B, 0xD4]};
+ const IID IID_ICursor = {0x9F6AA700, 0xD188, 0x11CD, [0xAD, 0x48, 0x00, 0xAA, 0x00, 0x3C, 0x9C, 0xB6]};
+ const IID IID_ICursorFind = {0xE01D7850, 0xD188, 0x11CD, [0xAD, 0x48, 0x00, 0xAA, 0x00, 0x3C, 0x9C, 0xB6]};
+ const IID IID_ICursorMove = {0xACFF0690, 0xD188, 0x11CD, [0xAD, 0x48, 0x00, 0xAA, 0x00, 0x3C, 0x9C, 0xB6]};
+ const IID IID_ICursorScroll = {0xBB87E420, 0xD188, 0x11CD, [0xAD, 0x48, 0x00, 0xAA, 0x00, 0x3C, 0x9C, 0xB6]};
+ const IID IID_ICursorUpdateARow = {0xD14216A0, 0xD188, 0x11CD, [0xAD, 0x48, 0x00, 0xAA, 0x00, 0x3C, 0x9C, 0xB6]};
+ const IID IID_ICustomDoc = {0x3050F3F0, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ICustomRatingHelper = {0xD0D9842D, 0xE211, 0x4B2C, [0x88, 0xDC, 0xBC, 0x72, 0x93, 0x42, 0xDF, 0xCB]};
+ const IID IID_IDA2Array = {0x2A8F0B06, 0xBE2B, 0x11D1, [0xB2, 0x19, 0x00, 0xC0, 0x4F, 0xC2, 0xA0, 0xCA]};
+ const IID IID_IDA2Behavior = {0xC46C1BF0, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDA2Event = {0x69B5BC70, 0x9B19, 0x11D0, [0x9B, 0x60, 0x00, 0xC0, 0x4F, 0xC2, 0xF5, 0x1D]};
+ const IID IID_IDA2FontStyle = {0x283807B5, 0x2C60, 0x11D0, [0xA3, 0x1D, 0x00, 0xAA, 0x00, 0xB9, 0x2C, 0x03]};
+ const IID IID_IDA2Geometry = {0x4A933702, 0xE36F, 0x11D0, [0x9B, 0x99, 0x00, 0xC0, 0x4F, 0xC2, 0xF5, 0x1D]};
+ const IID IID_IDA2Image = {0x45393DF0, 0x54B9, 0x11CF, [0x92, 0xA2, 0x00, 0xAA, 0x00, 0xB8, 0xA7, 0x33]};
+ const IID IID_IDA2LineStyle = {0x2AE71568, 0x4B34, 0x11D1, [0xB1, 0xE3, 0x00, 0xC0, 0x4F, 0xC2, 0xA0, 0xCA]};
+ const IID IID_IDA2Statics = {0xD17506C2, 0x6B26, 0x11D0, [0x89, 0x14, 0x00, 0xC0, 0x4F, 0xC2, 0xA0, 0xCA]};
+ const IID IID_IDA2View = {0x5F00F545, 0xDF18, 0x11D1, [0xAB, 0x6F, 0x00, 0xC0, 0x4F, 0xD9, 0x2B, 0x6B]};
+ const IID IID_IDA2ViewerControl = {0xC46C1BEF, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDA2ViewerControlWindowed = {0xC46C1BED, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDAArray = {0xFA261CF0, 0xC44E, 0x11D1, [0x9B, 0xE4, 0x00, 0xC0, 0x4F, 0xC2, 0xF5, 0x1D]};
+ const IID IID_IDABbox2 = {0xBA8B033E, 0x1E91, 0x11D1, [0x88, 0x09, 0x00, 0xC0, 0x4F, 0xC2, 0x9D, 0x46]};
+ const IID IID_IDABbox3 = {0x0E41257B, 0x812D, 0x11D0, [0x9B, 0x4A, 0x00, 0xC0, 0x4F, 0xC2, 0xF5, 0x1D]};
+ const IID IID_IDABehavior = {0x5DFB2651, 0x9668, 0x11D0, [0xB1, 0x7B, 0x00, 0xC0, 0x4F, 0xC2, 0xA0, 0xCA]};
+ const IID IID_IDABoolean = {0xC46C1BDA, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDABvrHook = {0x50B4791F, 0x4731, 0x11D0, [0x89, 0x12, 0x00, 0xC0, 0x4F, 0xC2, 0xA0, 0xCA]};
+ const IID IID_IDACamera = {0xC46C1BCA, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDAColor = {0xC46C1BDC, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDADashStyle = {0xF3E1B522, 0xD8A6, 0x11D1, [0x9B, 0xE5, 0x00, 0xC0, 0x4F, 0xC2, 0xF5, 0x1D]};
+ const IID IID_IDADrawingSurface = {0xC46C1BF4, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDADXTransformResult = {0xAF868305, 0xAB0B, 0x11D0, [0x87, 0x6A, 0x00, 0xC0, 0x4F, 0xC2, 0x9D, 0x46]};
+ const IID IID_IDAEndStyle = {0xB6FFC24C, 0x7E13, 0x11D0, [0x9B, 0x47, 0x00, 0xC0, 0x4F, 0xC2, 0xF5, 0x1D]};
+ const IID IID_IDAEvent = {0xC46C1BCE, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDAFontStyle = {0xC46C1BC1, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDAGeometry = {0xC46C1BCC, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDAImage = {0xC46C1BC4, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDAImport = {0xC46C1BEE, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDAImportationResult = {0xB90E5258, 0x574A, 0x11D1, [0x8E, 0x7B, 0x00, 0xC0, 0x4F, 0xC2, 0x9D, 0x46]};
+ const IID IID_IDAJoinStyle = {0xA3034056, 0xEC1C, 0x11D1, [0x9B, 0xE8, 0x00, 0xC0, 0x4F, 0xC2, 0xF5, 0x1D]};
+ const IID IID_IDALineStyle = {0x69AD90EF, 0x1C20, 0x11D1, [0x88, 0x01, 0x00, 0xC0, 0x4F, 0xC2, 0x9D, 0x46]};
+ const IID IID_IDAMatte = {0xC46C1BE4, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDAMicrophone = {0xC46C1BD8, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDAModifiableBehavior = {0xC46C1BEC, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDAMontage = {0xC46C1BC8, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDANumber = {0xD17506C3, 0x6B26, 0x11D0, [0x89, 0x14, 0x00, 0xC0, 0x4F, 0xC2, 0xA0, 0xCA]};
+ const IID IID_IDAPair = {0x542FB453, 0x5003, 0x11CF, [0x92, 0xA2, 0x00, 0xAA, 0x00, 0xB8, 0xA7, 0x33]};
+ const IID IID_IDAPath2 = {0xC46C1BD0, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDAPickableResult = {0xC46C1BDE, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDAPoint2 = {0x9CDE7341, 0x3C20, 0x11D0, [0xA3, 0x30, 0x00, 0xAA, 0x00, 0xB9, 0x2C, 0x03]};
+ const IID IID_IDAPoint3 = {0xC46C1BD6, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDAPreferences = {0xB90E525A, 0x574A, 0x11D1, [0x8E, 0x7B, 0x00, 0xC0, 0x4F, 0xC2, 0x9D, 0x46]};
+ const IID IID_IDASite = {0xB90E5259, 0x574A, 0x11D1, [0x8E, 0x7B, 0x00, 0xC0, 0x4F, 0xC2, 0x9D, 0x46]};
+ const IID IID_IDASound = {0xC46C1BE6, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDAStatics = {0x5DFB2650, 0x9668, 0x11D0, [0xB1, 0x7B, 0x00, 0xC0, 0x4F, 0xC2, 0xA0, 0xCA]};
+ const IID IID_IDAString = {0xC46C1BD2, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDataAdviseHolder = {0x00000110, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IDataChannel = {0xAD42D12A, 0x4AD0, 0x4856, [0x91, 0x9E, 0xE8, 0x54, 0xC9, 0x1D, 0x18, 0x56]};
+ const IID IID_IDataConvert = {0x0C733A8D, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IDataFilter = {0x69D14C80, 0xC18E, 0x11D0, [0xA9, 0xCE, 0x00, 0x60, 0x97, 0x94, 0x23, 0x11]};
+ const IID IID_IDataObject = {0x0000010E, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IDATransform2 = {0xC46C1BD4, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDATransform3 = {0xC46C1BE0, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDATuple = {0x542FB452, 0x5003, 0x11CF, [0x92, 0xA2, 0x00, 0xAA, 0x00, 0xB8, 0xA7, 0x33]};
+ const IID IID_IDAUntilNotifier = {0x25B0F91C, 0xD23D, 0x11D0, [0x9B, 0x85, 0x00, 0xC0, 0x4F, 0xC2, 0xF5, 0x1D]};
+ const IID IID_IDAUserData = {0xBACD4D86, 0x4A4F, 0x11D1, [0x9B, 0xC8, 0x00, 0xC0, 0x4F, 0xC2, 0xF5, 0x1D]};
+ const IID IID_IDAVector2 = {0xC46C1BC6, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDAVector3 = {0xC46C1BE2, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDAView = {0xAF868304, 0xAB0B, 0x11D0, [0x87, 0x6A, 0x00, 0xC0, 0x4F, 0xC2, 0x9D, 0x46]};
+ const IID IID_IDAViewerControl = {0xC46C1BDD, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDAViewerControlWindowed = {0xC46C1BCD, 0x3C52, 0x11D0, [0x92, 0x00, 0x84, 0x8C, 0x1D, 0x00, 0x00, 0x00]};
+ const IID IID_IDAViewSite = {0xBCBB1F75, 0xE384, 0x11D0, [0x9B, 0x99, 0x00, 0xC0, 0x4F, 0xC2, 0xF5, 0x1D]};
+ const IID IID_IDBAsynchNotify = {0x0C733A96, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IDBAsynchStatus = {0x0C733A95, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IDBBinderProperties = {0x0C733AB3, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IDBCreateCommand = {0x0C733A1D, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IDBCreateSession = {0x0C733A5D, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IDBDataSourceAdmin = {0x0C733A7A, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IDBInfo = {0x0C733A89, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IDBInitialize = {0x0C733A8B, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IDBProperties = {0x0C733A8A, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IDBSchemaCommand = {0x0C733A50, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IDBSchemaRowset = {0x0C733A7B, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IDCInfo = {0x0C733A9C, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IDDVideoAcceleratorContainer = {0xACA12120, 0x3356, 0x11D1, [0x8F, 0xCF, 0x00, 0xC0, 0x4F, 0xC2, 0x9B, 0x4E]};
+ const IID IID_IDDVideoPortContainer = {0x6C142760, 0xA733, 0x11CE, [0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60]};
+ const IID IID_IDebug = {0x00000123, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IDebugApplication = {0x51973C32, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugApplication32 = {0x51973C32, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugApplication64 = {0x4DEDC754, 0x04C7, 0x4F10, [0x9E, 0x60, 0x16, 0xA3, 0x90, 0xFE, 0x6E, 0x62]};
+ const IID IID_IDebugApplicationEx = {0x51973C00, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugApplicationNode = {0x51973C34, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugApplicationNodeEvents = {0x51973C35, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugApplicationThread = {0x51973C38, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugApplicationThread64 = {0x9DAC5886, 0xDBAD, 0x456D, [0x9D, 0xEE, 0x5D, 0xEC, 0x39, 0xAB, 0x3D, 0xDA]};
+ const IID IID_IDebugAsyncOperation = {0x51973C1B, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugAsyncOperationCallBack = {0x51973C1C, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugCodeContext = {0x51973C13, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugCookie = {0x51973C39, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugDocument = {0x51973C21, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugDocumentContext = {0x51973C28, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugDocumentHelper32 = {0x51973C26, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugDocumentHelper64 = {0xC4C7363C, 0x20FD, 0x47F9, [0xBD, 0x82, 0x48, 0x55, 0xE0, 0x15, 0x08, 0x71]};
+ const IID IID_IDebugDocumentHelperEx = {0x51973C02, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugDocumentHost = {0x51973C27, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugDocumentInfo = {0x51973C1F, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugDocumentProvider = {0x51973C20, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugDocumentText = {0x51973C22, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugDocumentTextAuthor = {0x51973C24, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugDocumentTextEvents = {0x51973C23, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugDocumentTextExternalAuthor = {0x51973C25, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugExpression = {0x51973C14, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugExpressionCallBack = {0x51973C16, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugExpressionContext = {0x51973C15, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugExtendedProperty = {0x51973C52, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugFormatter = {0x51973C05, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugHelper = {0x51973C3F, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugHelperEx = {0x51973C08, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugOut = {0xC733E4F1, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID IID_IDebugProperty = {0x51973C50, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugPropertyEnumType_All = {0x51973C55, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugPropertyEnumType_Arguments = {0x51973C57, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugPropertyEnumType_Locals = {0x51973C56, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugPropertyEnumType_LocalsPlus = {0x51973C58, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugPropertyEnumType_Registers = {0x51973C59, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugRegister = {0xC733E4F0, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID IID_IDebugSessionProvider = {0x51973C29, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugSessionProviderEx = {0x51973C09, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugSetValueCallback = {0x51973C06, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugStackFrame = {0x51973C17, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugStackFrameSniffer = {0x51973C18, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugStackFrameSnifferEx = {0x51973C19, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugStackFrameSnifferEx32 = {0x51973C19, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugStackFrameSnifferEx64 = {0x8CD12AF4, 0x49C1, 0x4D52, [0x8D, 0x8A, 0xC1, 0x46, 0xF4, 0x75, 0x81, 0xAA]};
+ const IID IID_IDebugStream = {0x00000124, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IDebugSyncOperation = {0x51973C1A, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugThreadCall = {0x51973C36, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugThreadCall32 = {0x51973C36, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IDebugThreadCall64 = {0xCB3FA335, 0xE979, 0x42FD, [0x9F, 0xCF, 0xA7, 0x54, 0x6A, 0x0F, 0x39, 0x05]};
+ const IID IID_IDelaydC = {0xBFF9C030, 0xB58F, 0x11CE, [0xB5, 0xB0, 0x00, 0xAA, 0x00, 0x6C, 0xB3, 0x7D]};
+ const IID IID_IDelayedRelease = {0x000214ED, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IDelegateFolder = {0xADD8BA80, 0x002B, 0x11D0, [0x8F, 0x0F, 0x00, 0xC0, 0x4F, 0xD7, 0xD0, 0x62]};
+ const IID IID_IDeskBand = {0xEB0FE172, 0x1A3A, 0x11D0, [0x89, 0xB3, 0x00, 0xA0, 0xC9, 0x0A, 0x90, 0xAC]};
+ const IID IID_IDeviceRect = {0x3050F6D5, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IDfReserved1 = {0x00000013, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IDfReserved2 = {0x00000014, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IDfReserved3 = {0x00000015, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IDialBranding = {0x8AECAFA9, 0x4306, 0x43CC, [0x8C, 0x5A, 0x76, 0x5F, 0x29, 0x79, 0xCC, 0x16]};
+ const IID IID_IDialEngine = {0x39FD782B, 0x7905, 0x40D5, [0x91, 0x48, 0x3C, 0x9B, 0x19, 0x04, 0x23, 0xD5]};
+ const IID IID_IDialEventSink = {0x2D86F4FF, 0x6E2D, 0x4488, [0xB2, 0xE9, 0x69, 0x34, 0xAF, 0xD4, 0x1B, 0xEA]};
+ const IID IID_IDifferencing = {0x994F0AF0, 0x2977, 0x11CE, [0xBB, 0x80, 0x08, 0x00, 0x2B, 0x36, 0xB2, 0xB0]};
+ const IID IID_IDirect3D = {0x3BBA0080, 0x2421, 0x11CF, [0xA3, 0x1A, 0x00, 0xAA, 0x00, 0xB9, 0x33, 0x56]};
+ const IID IID_IDirect3D2 = {0x6AAE1EC1, 0x662A, 0x11D0, [0x88, 0x9D, 0x00, 0xAA, 0x00, 0xBB, 0xB7, 0x6A]};
+ const IID IID_IDirect3D3 = {0xBB223240, 0xE72B, 0x11D0, [0xA9, 0xB4, 0x00, 0xAA, 0x00, 0xC0, 0x99, 0x3E]};
+ const IID IID_IDirect3D7 = {0xF5049E77, 0x4861, 0x11D2, [0xA4, 0x07, 0x00, 0xA0, 0xC9, 0x06, 0x29, 0xA8]};
+ const IID IID_IDirect3DDevice = {0x64108800, 0x957D, 0x11D0, [0x89, 0xAB, 0x00, 0xA0, 0xC9, 0x05, 0x41, 0x29]};
+ const IID IID_IDirect3DDevice2 = {0x93281501, 0x8CF8, 0x11D0, [0x89, 0xAB, 0x00, 0xA0, 0xC9, 0x05, 0x41, 0x29]};
+ const IID IID_IDirect3DDevice3 = {0xB0AB3B60, 0x33D7, 0x11D1, [0xA9, 0x81, 0x00, 0xC0, 0x4F, 0xD7, 0xB1, 0x74]};
+ const IID IID_IDirect3DDevice7 = {0xF5049E79, 0x4861, 0x11D2, [0xA4, 0x07, 0x00, 0xA0, 0xC9, 0x06, 0x29, 0xA8]};
+ const IID IID_IDirect3DExecuteBuffer = {0x4417C145, 0x33AD, 0x11CF, [0x81, 0x6F, 0x00, 0x00, 0xC0, 0x20, 0x15, 0x6E]};
+ const IID IID_IDirect3DHALDevice = {0x84E63DE0, 0x46AA, 0x11CF, [0x81, 0x6F, 0x00, 0x00, 0xC0, 0x20, 0x15, 0x6E]};
+ const IID IID_IDirect3DLight = {0x4417C142, 0x33AD, 0x11CF, [0x81, 0x6F, 0x00, 0x00, 0xC0, 0x20, 0x15, 0x6E]};
+ const IID IID_IDirect3DMaterial = {0x4417C144, 0x33AD, 0x11CF, [0x81, 0x6F, 0x00, 0x00, 0xC0, 0x20, 0x15, 0x6E]};
+ const IID IID_IDirect3DMaterial2 = {0x93281503, 0x8CF8, 0x11D0, [0x89, 0xAB, 0x00, 0xA0, 0xC9, 0x05, 0x41, 0x29]};
+ const IID IID_IDirect3DMaterial3 = {0xCA9C46F4, 0xD3C5, 0x11D1, [0xB7, 0x5A, 0x00, 0x60, 0x08, 0x52, 0xB3, 0x12]};
+ const IID IID_IDirect3DMMXDevice = {0x881949A1, 0xD6F3, 0x11D0, [0x89, 0xAB, 0x00, 0xA0, 0xC9, 0x05, 0x41, 0x29]};
+ const IID IID_IDirect3DNullDevice = {0x8767DF22, 0xBACC, 0x11D1, [0x89, 0x69, 0x00, 0xA0, 0xC9, 0x06, 0x29, 0xA8]};
+ const IID IID_IDirect3DRampDevice = {0xF2086B20, 0x259F, 0x11CF, [0xA3, 0x1A, 0x00, 0xAA, 0x00, 0xB9, 0x33, 0x56]};
+ const IID IID_IDirect3DRefDevice = {0x50936643, 0x13E9, 0x11D1, [0x89, 0xAA, 0x00, 0xA0, 0xC9, 0x05, 0x41, 0x29]};
+ const IID IID_IDirect3DRGBDevice = {0xA4665C60, 0x2673, 0x11CF, [0xA3, 0x1A, 0x00, 0xAA, 0x00, 0xB9, 0x33, 0x56]};
+ const IID IID_IDirect3DRM = {0x2BC49361, 0x8327, 0x11CF, [0xAC, 0x4A, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRM2 = {0x4516ECC8, 0x8F20, 0x11D0, [0x9B, 0x6D, 0x00, 0x00, 0xC0, 0x78, 0x1B, 0xC3]};
+ const IID IID_IDirect3DRM3 = {0x4516EC83, 0x8F20, 0x11D0, [0x9B, 0x6D, 0x00, 0x00, 0xC0, 0x78, 0x1B, 0xC3]};
+ const IID IID_IDirect3DRMAnimation = {0xEB16CB0D, 0xD271, 0x11CE, [0xAC, 0x48, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMAnimation2 = {0xFF6B7F77, 0xA40E, 0x11D1, [0x91, 0xF9, 0x00, 0x00, 0xF8, 0x75, 0x8E, 0x66]};
+ const IID IID_IDirect3DRMAnimationArray = {0xD5F1CAE0, 0x4BD7, 0x11D1, [0xB9, 0x74, 0x00, 0x60, 0x08, 0x3E, 0x45, 0xF3]};
+ const IID IID_IDirect3DRMAnimationSet = {0xEB16CB0E, 0xD271, 0x11CE, [0xAC, 0x48, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMAnimationSet2 = {0xFF6B7F79, 0xA40E, 0x11D1, [0x91, 0xF9, 0x00, 0x00, 0xF8, 0x75, 0x8E, 0x66]};
+ const IID IID_IDirect3DRMClippedVisual = {0x5434E733, 0x6D66, 0x11D1, [0xBB, 0x0B, 0x00, 0x00, 0xF8, 0x75, 0x86, 0x5A]};
+ const IID IID_IDirect3DRMDevice = {0xE9E19280, 0x6E05, 0x11CF, [0xAC, 0x4A, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMDevice2 = {0x4516EC78, 0x8F20, 0x11D0, [0x9B, 0x6D, 0x00, 0x00, 0xC0, 0x78, 0x1B, 0xC3]};
+ const IID IID_IDirect3DRMDevice3 = {0x549F498B, 0xBFEB, 0x11D1, [0x8E, 0xD8, 0x00, 0xA0, 0xC9, 0x67, 0xA4, 0x82]};
+ const IID IID_IDirect3DRMDeviceArray = {0xEB16CB10, 0xD271, 0x11CE, [0xAC, 0x48, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMFace = {0xEB16CB07, 0xD271, 0x11CE, [0xAC, 0x48, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMFace2 = {0x4516EC81, 0x8F20, 0x11D0, [0x9B, 0x6D, 0x00, 0x00, 0xC0, 0x78, 0x1B, 0xC3]};
+ const IID IID_IDirect3DRMFaceArray = {0xEB16CB17, 0xD271, 0x11CE, [0xAC, 0x48, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMFrame = {0xEB16CB03, 0xD271, 0x11CE, [0xAC, 0x48, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMFrame2 = {0xC3DFBD60, 0x3988, 0x11D0, [0x9E, 0xC2, 0x00, 0x00, 0xC0, 0x29, 0x1A, 0xC3]};
+ const IID IID_IDirect3DRMFrame3 = {0xFF6B7F70, 0xA40E, 0x11D1, [0x91, 0xF9, 0x00, 0x00, 0xF8, 0x75, 0x8E, 0x66]};
+ const IID IID_IDirect3DRMFrameArray = {0xEB16CB12, 0xD271, 0x11CE, [0xAC, 0x48, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMInterpolator = {0x242F6BC1, 0x3849, 0x11D0, [0x9B, 0x6D, 0x00, 0x00, 0xC0, 0x78, 0x1B, 0xC3]};
+ const IID IID_IDirect3DRMLight = {0xEB16CB08, 0xD271, 0x11CE, [0xAC, 0x48, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMLightArray = {0xEB16CB14, 0xD271, 0x11CE, [0xAC, 0x48, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMMaterial = {0xEB16CB0B, 0xD271, 0x11CE, [0xAC, 0x48, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMMaterial2 = {0xFF6B7F75, 0xA40E, 0x11D1, [0x91, 0xF9, 0x00, 0x00, 0xF8, 0x75, 0x8E, 0x66]};
+ const IID IID_IDirect3DRMMesh = {0xA3A80D01, 0x6E12, 0x11CF, [0xAC, 0x4A, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMMeshBuilder = {0xA3A80D02, 0x6E12, 0x11CF, [0xAC, 0x4A, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMMeshBuilder2 = {0x4516EC77, 0x8F20, 0x11D0, [0x9B, 0x6D, 0x00, 0x00, 0xC0, 0x78, 0x1B, 0xC3]};
+ const IID IID_IDirect3DRMMeshBuilder3 = {0x4516EC82, 0x8F20, 0x11D0, [0x9B, 0x6D, 0x00, 0x00, 0xC0, 0x78, 0x1B, 0xC3]};
+ const IID IID_IDirect3DRMObject = {0xEB16CB00, 0xD271, 0x11CE, [0xAC, 0x48, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMObject2 = {0x4516EC7C, 0x8F20, 0x11D0, [0x9B, 0x6D, 0x00, 0x00, 0xC0, 0x78, 0x1B, 0xC3]};
+ const IID IID_IDirect3DRMObjectArray = {0x242F6BC2, 0x3849, 0x11D0, [0x9B, 0x6D, 0x00, 0x00, 0xC0, 0x78, 0x1B, 0xC3]};
+ const IID IID_IDirect3DRMPicked2Array = {0x4516EC7B, 0x8F20, 0x11D0, [0x9B, 0x6D, 0x00, 0x00, 0xC0, 0x78, 0x1B, 0xC3]};
+ const IID IID_IDirect3DRMPickedArray = {0xEB16CB16, 0xD271, 0x11CE, [0xAC, 0x48, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMProgressiveMesh = {0x4516EC79, 0x8F20, 0x11D0, [0x9B, 0x6D, 0x00, 0x00, 0xC0, 0x78, 0x1B, 0xC3]};
+ const IID IID_IDirect3DRMShadow = {0xAF359780, 0x6BA3, 0x11CF, [0xAC, 0x4A, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMShadow2 = {0x86B44E25, 0x9C82, 0x11D1, [0xBB, 0x0B, 0x00, 0xA0, 0xC9, 0x81, 0xA0, 0xA6]};
+ const IID IID_IDirect3DRMTexture = {0xEB16CB09, 0xD271, 0x11CE, [0xAC, 0x48, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMTexture2 = {0x120F30C0, 0x1629, 0x11D0, [0x94, 0x1C, 0x00, 0x80, 0xC8, 0x0C, 0xFA, 0x7B]};
+ const IID IID_IDirect3DRMTexture3 = {0xFF6B7F73, 0xA40E, 0x11D1, [0x91, 0xF9, 0x00, 0x00, 0xF8, 0x75, 0x8E, 0x66]};
+ const IID IID_IDirect3DRMUserVisual = {0x59163DE0, 0x6D43, 0x11CF, [0xAC, 0x4A, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMViewport = {0xEB16CB02, 0xD271, 0x11CE, [0xAC, 0x48, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMViewport2 = {0x4A1B1BE6, 0xBFED, 0x11D1, [0x8E, 0xD8, 0x00, 0xA0, 0xC9, 0x67, 0xA4, 0x82]};
+ const IID IID_IDirect3DRMViewportArray = {0xEB16CB11, 0xD271, 0x11CE, [0xAC, 0x48, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMVisual = {0xEB16CB04, 0xD271, 0x11CE, [0xAC, 0x48, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMVisualArray = {0xEB16CB13, 0xD271, 0x11CE, [0xAC, 0x48, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMWinDevice = {0xC5016CC0, 0xD273, 0x11CE, [0xAC, 0x48, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DRMWrap = {0xEB16CB0A, 0xD271, 0x11CE, [0xAC, 0x48, 0x00, 0x00, 0xC0, 0x38, 0x25, 0xA1]};
+ const IID IID_IDirect3DTexture = {0x2CDCD9E0, 0x25A0, 0x11CF, [0xA3, 0x1A, 0x00, 0xAA, 0x00, 0xB9, 0x33, 0x56]};
+ const IID IID_IDirect3DTexture2 = {0x93281502, 0x8CF8, 0x11D0, [0x89, 0xAB, 0x00, 0xA0, 0xC9, 0x05, 0x41, 0x29]};
+ const IID IID_IDirect3DTnLHalDevice = {0xF5049E78, 0x4861, 0x11D2, [0xA4, 0x07, 0x00, 0xA0, 0xC9, 0x06, 0x29, 0xA8]};
+ const IID IID_IDirect3DVertexBuffer = {0x7A503555, 0x4A83, 0x11D1, [0xA5, 0xDB, 0x00, 0xA0, 0xC9, 0x03, 0x67, 0xF8]};
+ const IID IID_IDirect3DVertexBuffer7 = {0xF5049E7D, 0x4861, 0x11D2, [0xA4, 0x07, 0x00, 0xA0, 0xC9, 0x06, 0x29, 0xA8]};
+ const IID IID_IDirect3DViewport = {0x4417C146, 0x33AD, 0x11CF, [0x81, 0x6F, 0x00, 0x00, 0xC0, 0x20, 0x15, 0x6E]};
+ const IID IID_IDirect3DViewport2 = {0x93281500, 0x8CF8, 0x11D0, [0x89, 0xAB, 0x00, 0xA0, 0xC9, 0x05, 0x41, 0x29]};
+ const IID IID_IDirect3DViewport3 = {0xB0AB3B61, 0x33D7, 0x11D1, [0xA9, 0x81, 0x00, 0xC0, 0x4F, 0xD7, 0xB1, 0x74]};
+ const IID IID_IDirectDraw = {0x6C14DB80, 0xA733, 0x11CE, [0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60]};
+ const IID IID_IDirectDraw2 = {0xB3A6F3E0, 0x2B43, 0x11CF, [0xA2, 0xDE, 0x00, 0xAA, 0x00, 0xB9, 0x33, 0x56]};
+ const IID IID_IDirectDraw4 = {0x9C59509A, 0x39BD, 0x11D1, [0x8C, 0x4A, 0x00, 0xC0, 0x4F, 0xD9, 0x30, 0xC5]};
+ const IID IID_IDirectDraw7 = {0x15E65EC0, 0x3B9C, 0x11D2, [0xB9, 0x2F, 0x00, 0x60, 0x97, 0x97, 0xEA, 0x5B]};
+ const IID IID_IDirectDrawClipper = {0x6C14DB85, 0xA733, 0x11CE, [0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60]};
+ const IID IID_IDirectDrawColorControl = {0x4B9F0EE0, 0x0D7E, 0x11D0, [0x9B, 0x06, 0x00, 0xA0, 0xC9, 0x03, 0xA3, 0xB8]};
+ const IID IID_IDirectDrawFactory2 = {0x89B2C488, 0x4AF4, 0x11D1, [0x8C, 0x4C, 0x00, 0xC0, 0x4F, 0xD9, 0x30, 0xC5]};
+ const IID IID_IDirectDrawGammaControl = {0x69C11C3E, 0xB46B, 0x11D1, [0xAD, 0x7A, 0x00, 0xC0, 0x4F, 0xC2, 0x9B, 0x4E]};
+ const IID IID_IDirectDrawKernel = {0x8D56C120, 0x6A08, 0x11D0, [0x9B, 0x06, 0x00, 0xA0, 0xC9, 0x03, 0xA3, 0xB8]};
+ const IID IID_IDirectDrawOptSurface = {0x51191F1E, 0x4F2B, 0x11D1, [0x8C, 0xC3, 0x00, 0xA0, 0xC9, 0x06, 0x29, 0xA8]};
+ const IID IID_IDirectDrawPalette = {0x6C14DB84, 0xA733, 0x11CE, [0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60]};
+ const IID IID_IDirectDrawPalette2 = {0xC03C477E, 0x6519, 0x11D1, [0x8C, 0x52, 0x00, 0xC0, 0x4F, 0xD9, 0x30, 0xC5]};
+ const IID IID_IDirectDrawSurface = {0x6C14DB81, 0xA733, 0x11CE, [0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60]};
+ const IID IID_IDirectDrawSurface2 = {0x57805885, 0x6EEC, 0x11CF, [0x94, 0x41, 0xA8, 0x23, 0x03, 0xC1, 0x0E, 0x27]};
+ const IID IID_IDirectDrawSurface3 = {0xDA044E00, 0x69B2, 0x11D0, [0xA1, 0xD5, 0x00, 0xAA, 0x00, 0xB8, 0xDF, 0xBB]};
+ const IID IID_IDirectDrawSurface4 = {0x0B2B8630, 0xAD35, 0x11D0, [0x8E, 0xA6, 0x00, 0x60, 0x97, 0x97, 0xEA, 0x5B]};
+ const IID IID_IDirectDrawSurface7 = {0x06675A80, 0x3B9B, 0x11D2, [0xB9, 0x2F, 0x00, 0x60, 0x97, 0x97, 0xEA, 0x5B]};
+ const IID IID_IDirectDrawSurfaceKernel = {0x60755DA0, 0x6A40, 0x11D0, [0x9B, 0x06, 0x00, 0xA0, 0xC9, 0x03, 0xA3, 0xB8]};
+ const IID IID_IDirectDrawVideoAccelerator = {0xC9B2D740, 0x3356, 0x11D1, [0x8F, 0xCF, 0x00, 0xC0, 0x4F, 0xC2, 0x9B, 0x4E]};
+ const IID IID_IDirectDrawVideoPort = {0xB36D93E0, 0x2B43, 0x11CF, [0xA2, 0xDE, 0x00, 0xAA, 0x00, 0xB9, 0x33, 0x56]};
+ const IID IID_IDirectInput2A = {0x5944E662, 0xAA8A, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID IID_IDirectInput2W = {0x5944E663, 0xAA8A, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID IID_IDirectInput7A = {0x9A4CB684, 0x236D, 0x11D3, [0x8E, 0x9D, 0x00, 0xC0, 0x4F, 0x68, 0x44, 0xAE]};
+ const IID IID_IDirectInput7W = {0x9A4CB685, 0x236D, 0x11D3, [0x8E, 0x9D, 0x00, 0xC0, 0x4F, 0x68, 0x44, 0xAE]};
+ const IID IID_IDirectInputA = {0x89521360, 0xAA8A, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID IID_IDirectInputDevice2A = {0x5944E682, 0xC92E, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID IID_IDirectInputDevice2W = {0x5944E683, 0xC92E, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID IID_IDirectInputDevice7A = {0x57D7C6BC, 0x2356, 0x11D3, [0x8E, 0x9D, 0x00, 0xC0, 0x4F, 0x68, 0x44, 0xAE]};
+ const IID IID_IDirectInputDevice7W = {0x57D7C6BD, 0x2356, 0x11D3, [0x8E, 0x9D, 0x00, 0xC0, 0x4F, 0x68, 0x44, 0xAE]};
+ const IID IID_IDirectInputDeviceA = {0x5944E680, 0xC92E, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID IID_IDirectInputDeviceW = {0x5944E681, 0xC92E, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID IID_IDirectInputEffect = {0xE7E1F7C0, 0x88D2, 0x11D0, [0x9A, 0xD0, 0x00, 0xA0, 0xC9, 0xA0, 0x6E, 0x35]};
+ const IID IID_IDirectInputEffectDriver = {0x02538130, 0x898F, 0x11D0, [0x9A, 0xD0, 0x00, 0xA0, 0xC9, 0xA0, 0x6E, 0x35]};
+ const IID IID_IDirectInputJoyConfig = {0x1DE12AB1, 0xC9F5, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID IID_IDirectInputPIDDriver = {0xEEC6993A, 0xB3FD, 0x11D2, [0xA9, 0x16, 0x00, 0xC0, 0x4F, 0xB9, 0x86, 0x38]};
+ const IID IID_IDirectInputW = {0x89521361, 0xAA8A, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID IID_IDirectMusic = {0x6536115A, 0x7B2D, 0x11D2, [0xBA, 0x18, 0x00, 0x00, 0xF8, 0x75, 0xAC, 0x12]};
+ const IID IID_IDirectMusic2 = {0x6FC2CAE1, 0xBC78, 0x11D2, [0xAF, 0xA6, 0x00, 0xAA, 0x00, 0x24, 0xD8, 0xB6]};
+ const IID IID_IDirectMusicBand = {0xD2AC28C0, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID IID_IDirectMusicBuffer = {0xD2AC2878, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID IID_IDirectMusicChordMap = {0xD2AC28BE, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID IID_IDirectMusicCollection = {0xD2AC287C, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID IID_IDirectMusicComposer = {0xD2AC28BF, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID IID_IDirectMusicDownload = {0xD2AC287B, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID IID_IDirectMusicDownloadedInstrument = {0xD2AC287E, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID IID_IDirectMusicGetLoader = {0x68A04844, 0xD13D, 0x11D1, [0xAF, 0xA6, 0x00, 0xAA, 0x00, 0x24, 0xD8, 0xB6]};
+ const IID IID_IDirectMusicGraph = {0x2BEFC277, 0x5497, 0x11D2, [0xBC, 0xCB, 0x00, 0xA0, 0xC9, 0x22, 0xE6, 0xEB]};
+ const IID IID_IDirectMusicInstrument = {0xD2AC287D, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID IID_IDirectMusicLoader = {0x2FFAACA2, 0x5DCA, 0x11D2, [0xAF, 0xA6, 0x00, 0xAA, 0x00, 0x24, 0xD8, 0xB6]};
+ const IID IID_IDirectMusicObject = {0xD2AC28B5, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID IID_IDirectMusicPerformance = {0x07D43D03, 0x6523, 0x11D2, [0x87, 0x1D, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID IID_IDirectMusicPerformance2 = {0x6FC2CAE0, 0xBC78, 0x11D2, [0xAF, 0xA6, 0x00, 0xAA, 0x00, 0x24, 0xD8, 0xB6]};
+ const IID IID_IDirectMusicPort = {0x08F2D8C9, 0x37C2, 0x11D2, [0xB9, 0xF9, 0x00, 0x00, 0xF8, 0x75, 0xAC, 0x12]};
+ const IID IID_IDirectMusicPortDownload = {0xD2AC287A, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID IID_IDirectMusicSegment = {0xF96029A2, 0x4282, 0x11D2, [0x87, 0x17, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID IID_IDirectMusicSegment2 = {0xD38894D1, 0xC052, 0x11D2, [0x87, 0x2F, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID IID_IDirectMusicSegmentState = {0xA3AFDCC7, 0xD3EE, 0x11D1, [0xBC, 0x8D, 0x00, 0xA0, 0xC9, 0x22, 0xE6, 0xEB]};
+ const IID IID_IDirectMusicStyle = {0xD2AC28BD, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID IID_IDirectMusicThru = {0xCED153E7, 0x3606, 0x11D2, [0xB9, 0xF9, 0x00, 0x00, 0xF8, 0x75, 0xAC, 0x12]};
+ const IID IID_IDirectMusicTool = {0xD2AC28BA, 0xB39B, 0x11D1, [0x87, 0x04, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID IID_IDirectMusicTrack = {0xF96029A1, 0x4282, 0x11D2, [0x87, 0x17, 0x00, 0x60, 0x08, 0x93, 0xB1, 0xBD]};
+ const IID IID_IDirectoryObject = {0xE798DE2C, 0x22E4, 0x11D0, [0x84, 0xFE, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID IID_IDirectorySchemaMgmt = {0x75DB3B9C, 0xA4D8, 0x11D0, [0xA7, 0x9C, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0xA8]};
+ const IID IID_IDirectorySearch = {0x109BA8EC, 0x92F0, 0x11D0, [0xA7, 0x90, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0xA8]};
+ const IID IID_IDirectPlay = {0x5454E9A0, 0xDB65, 0x11CE, [0x92, 0x1C, 0x00, 0xAA, 0x00, 0x6C, 0x49, 0x72]};
+ const IID IID_IDirectPlay2 = {0x2B74F7C0, 0x9154, 0x11CF, [0xA9, 0xCD, 0x00, 0xAA, 0x00, 0x68, 0x86, 0xE3]};
+ const IID IID_IDirectPlay2A = {0x9D460580, 0xA822, 0x11CF, [0x96, 0x0C, 0x00, 0x80, 0xC7, 0x53, 0x4E, 0x82]};
+ const IID IID_IDirectPlay3 = {0x133EFE40, 0x32DC, 0x11D0, [0x9C, 0xFB, 0x00, 0xA0, 0xC9, 0x0A, 0x43, 0xCB]};
+ const IID IID_IDirectPlay3A = {0x133EFE41, 0x32DC, 0x11D0, [0x9C, 0xFB, 0x00, 0xA0, 0xC9, 0x0A, 0x43, 0xCB]};
+ const IID IID_IDirectPlay4 = {0x0AB1C530, 0x4745, 0x11D1, [0xA7, 0xA1, 0x00, 0x00, 0xF8, 0x03, 0xAB, 0xFC]};
+ const IID IID_IDirectPlay4A = {0x0AB1C531, 0x4745, 0x11D1, [0xA7, 0xA1, 0x00, 0x00, 0xF8, 0x03, 0xAB, 0xFC]};
+ const IID IID_IDirectPlayLobby = {0xAF465C71, 0x9588, 0x11CF, [0xA0, 0x20, 0x00, 0xAA, 0x00, 0x61, 0x57, 0xAC]};
+ const IID IID_IDirectPlayLobby2 = {0x0194C220, 0xA303, 0x11D0, [0x9C, 0x4F, 0x00, 0xA0, 0xC9, 0x05, 0x42, 0x5E]};
+ const IID IID_IDirectPlayLobby2A = {0x1BB4AF80, 0xA303, 0x11D0, [0x9C, 0x4F, 0x00, 0xA0, 0xC9, 0x05, 0x42, 0x5E]};
+ const IID IID_IDirectPlayLobby3 = {0x2DB72490, 0x652C, 0x11D1, [0xA7, 0xA8, 0x00, 0x00, 0xF8, 0x03, 0xAB, 0xFC]};
+ const IID IID_IDirectPlayLobby3A = {0x2DB72491, 0x652C, 0x11D1, [0xA7, 0xA8, 0x00, 0x00, 0xF8, 0x03, 0xAB, 0xFC]};
+ const IID IID_IDirectPlayLobbyA = {0x26C66A70, 0xB367, 0x11CF, [0xA0, 0x24, 0x00, 0xAA, 0x00, 0x61, 0x57, 0xAC]};
+ const IID IID_IDirectSound = {0x279AFA83, 0x4981, 0x11CE, [0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60]};
+ const IID IID_IDirectSound3DBuffer = {0x279AFA86, 0x4981, 0x11CE, [0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60]};
+ const IID IID_IDirectSound3DListener = {0x279AFA84, 0x4981, 0x11CE, [0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60]};
+ const IID IID_IDirectSoundBuffer = {0x279AFA85, 0x4981, 0x11CE, [0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60]};
+ const IID IID_IDirectSoundCapture = {0xB0210781, 0x89CD, 0x11D0, [0xAF, 0x08, 0x00, 0xA0, 0xC9, 0x25, 0xCD, 0x16]};
+ const IID IID_IDirectSoundCaptureBuffer = {0xB0210782, 0x89CD, 0x11D0, [0xAF, 0x08, 0x00, 0xA0, 0xC9, 0x25, 0xCD, 0x16]};
+ const IID IID_IDirectSoundNotify = {0xB0210783, 0x89CD, 0x11D0, [0xAF, 0x08, 0x00, 0xA0, 0xC9, 0x25, 0xCD, 0x16]};
+ const IID IID_IDirectWriterLock = {0x0E6D4D92, 0x6738, 0x11CF, [0x96, 0x08, 0x00, 0xAA, 0x00, 0x68, 0x0D, 0xB4]};
+ const IID IID_IDirectXFile = {0x3D82AB40, 0x62DA, 0x11CF, [0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33]};
+ const IID IID_IDirectXFileBinary = {0x3D82AB46, 0x62DA, 0x11CF, [0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33]};
+ const IID IID_IDirectXFileData = {0x3D82AB44, 0x62DA, 0x11CF, [0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33]};
+ const IID IID_IDirectXFileDataReference = {0x3D82AB45, 0x62DA, 0x11CF, [0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33]};
+ const IID IID_IDirectXFileEnumObject = {0x3D82AB41, 0x62DA, 0x11CF, [0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33]};
+ const IID IID_IDirectXFileObject = {0x3D82AB43, 0x62DA, 0x11CF, [0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33]};
+ const IID IID_IDirectXFileSaveObject = {0x3D82AB42, 0x62DA, 0x11CF, [0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33]};
+ const IID IID_IDiscardableBrowserProperty = {0x49C3DE7C, 0xD329, 0x11D0, [0xAB, 0x73, 0x00, 0xC0, 0x4F, 0xC3, 0x3E, 0x80]};
+ const IID IID_IDiscMaster = {0x520CCA62, 0x51A5, 0x11D3, [0x91, 0x44, 0x00, 0x10, 0x4B, 0xA1, 0x1C, 0x5E]};
+ const IID IID_IDiscMasterProgressEvents = {0xEC9E51C1, 0x4E5D, 0x11D3, [0x91, 0x44, 0x00, 0x10, 0x4B, 0xA1, 0x1C, 0x5E]};
+ const IID IID_IDiscRecorder = {0x85AC9776, 0xCA88, 0x4CF2, [0x89, 0x4E, 0x09, 0x59, 0x8C, 0x07, 0x8A, 0x41]};
+ const IID IID_IDiscStash = {0x520CCA64, 0x51A5, 0x11D3, [0x91, 0x44, 0x00, 0x10, 0x4B, 0xA1, 0x1C, 0x5E]};
+ const IID IID_IDispatch = {0x00020400, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IDispatchEx = {0xA6EF9860, 0xC720, 0x11D0, [0x93, 0x37, 0x00, 0xA0, 0xC9, 0x0D, 0xCA, 0xA9]};
+ const IID IID_IDispError = {0xA6EF9861, 0xC720, 0x11D0, [0x93, 0x37, 0x00, 0xA0, 0xC9, 0x0D, 0xCA, 0xA9]};
+ const IID IID_IDisplayPointer = {0x3050F69E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IDisplayServices = {0x3050F69D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IDithererImpl = {0x7C48E840, 0x3910, 0x11D0, [0x86, 0xFC, 0x00, 0xA0, 0xC9, 0x13, 0xF7, 0x50]};
+ const IID IID_IDocHostShowUI = {0xC4D244B0, 0xD43E, 0x11CF, [0x89, 0x3B, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x1A]};
+ const IID IID_IDocHostUIHandler = {0xBD3F23C0, 0xD43E, 0x11CF, [0x89, 0x3B, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x1A]};
+ const IID IID_IDocHostUIHandler2 = {0x3050F6D0, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IDockingWindow = {0x012DD920, 0x7B26, 0x11D0, [0x8C, 0xA9, 0x00, 0xA0, 0xC9, 0x2D, 0xBF, 0xE8]};
+ const IID IID_IDockingWindowFrame = {0x47D2657A, 0x7B27, 0x11D0, [0x8C, 0xA9, 0x00, 0xA0, 0xC9, 0x2D, 0xBF, 0xE8]};
+ const IID IID_IDockingWindowSite = {0x2A342FC2, 0x7B26, 0x11D0, [0x8C, 0xA9, 0x00, 0xA0, 0xC9, 0x2D, 0xBF, 0xE8]};
+ const IID IID_IDoTask = {0x0230C9F8, 0xEE7F, 0x4307, [0x98, 0xDB, 0x72, 0x6E, 0xBC, 0xAE, 0x55, 0xD6]};
+ const IID IID_IDownloadBehavior = {0x3050F5BD, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IDownloadManager = {0x988934A4, 0x064B, 0x11D3, [0xBB, 0x80, 0x00, 0x10, 0x4B, 0x35, 0xE7, 0xF9]};
+ const IID IID_IDownloadNotify = {0xCAEB5D28, 0xAE4C, 0x11D1, [0xBA, 0x40, 0x00, 0xC0, 0x4F, 0xB9, 0x2D, 0x79]};
+ const IID IID_IDragSourceHelper = {0xDE5BF786, 0x477A, 0x11D2, [0x83, 0x9D, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0]};
+ const IID IID_IDropSource = {0x00000121, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IDropTarget = {0x00000122, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IDropTargetHelper = {0x4657278B, 0x411B, 0x11D2, [0x83, 0x9A, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0]};
+ const IID IID_IDsBrowseDomainTree = {0x7CABCF1E, 0x78F5, 0x11D2, [0x96, 0x0C, 0x00, 0xC0, 0x4F, 0xA3, 0x1A, 0x86]};
+ const IID IID_IDsQueryColumnHandler = {0xC072999E, 0xFA49, 0x11D1, [0xA0, 0xAF, 0x00, 0xC0, 0x4F, 0xA3, 0x1A, 0x86]};
+ const IID IID_IDummy = {0x0D7CA54A, 0xD252, 0x4FCB, [0x91, 0x04, 0xF6, 0xDD, 0xD3, 0x10, 0xB3, 0xF9]};
+ const IID IID_IDummyHICONIncluder = {0x947990DE, 0xCC28, 0x11D2, [0xA0, 0xF7, 0x00, 0x80, 0x5F, 0x85, 0x8F, 0xB1]};
+ const IID IID_IDX2D = {0x9EFD02A9, 0xA996, 0x11D1, [0x81, 0xC9, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID IID_IDX2DDebug = {0x03BB2457, 0xA279, 0x11D1, [0x81, 0xC6, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID IID_IDXARGBReadPtr = {0xEAAAC2D6, 0xC290, 0x11D1, [0x90, 0x5D, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID IID_IDXARGBReadWritePtr = {0xEAAAC2D7, 0xC290, 0x11D1, [0x90, 0x5D, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID IID_IDXARGBSurfaceInit = {0x9EA3B63A, 0xC37D, 0x11D1, [0x90, 0x5E, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID IID_IDXBaseObject = {0x17B59B2B, 0x9CC8, 0x11D1, [0x90, 0x53, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID IID_IDXBasicImage = {0x16B280C7, 0xEE70, 0x11D1, [0x90, 0x66, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID IID_IDXDCLock = {0x0F619456, 0xCF39, 0x11D1, [0x90, 0x5E, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID IID_IDXDLUTBuilder = {0x73068231, 0x35EE, 0x11D1, [0x81, 0xA1, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID IID_IDXDMapper = {0x7FD9088B, 0x35ED, 0x11D1, [0x81, 0xA1, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID IID_IDXEffect = {0xE31FB81B, 0x1335, 0x11D1, [0x81, 0x89, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID IID_IDXGradient = {0xB2024B51, 0xEE77, 0x11D1, [0x90, 0x66, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID IID_IDXGradient2 = {0xD0EF2A80, 0x61DC, 0x11D2, [0xB2, 0xEB, 0x00, 0xA0, 0xC9, 0x36, 0xB2, 0x12]};
+ const IID IID_IDXLookupTable = {0x01BAFC7F, 0x9E63, 0x11D1, [0x90, 0x53, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID IID_IDXLUTBuilder = {0xF4370FC1, 0xCADB, 0x11D0, [0xB5, 0x2C, 0x00, 0xA0, 0xC9, 0x05, 0x43, 0x73]};
+ const IID IID_IDXMapper = {0x555278E5, 0x05DB, 0x11D1, [0x88, 0x3A, 0x3C, 0x8B, 0x00, 0xC1, 0x00, 0x00]};
+ const IID IID_IDXPixelate = {0xD33E180F, 0xFBE9, 0x11D1, [0x90, 0x6A, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID IID_IDXRasterizer = {0x9EA3B635, 0xC37D, 0x11D1, [0x90, 0x5E, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID IID_IDXRawSurface = {0x09756C8A, 0xD96A, 0x11D1, [0x90, 0x62, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID IID_IDXSurface = {0xB39FD73F, 0xE139, 0x11D1, [0x90, 0x65, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID IID_IDXSurfaceFactory = {0x144946F5, 0xC4D4, 0x11D1, [0x81, 0xD1, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID IID_IDXSurfaceInit = {0x9EA3B639, 0xC37D, 0x11D1, [0x90, 0x5E, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID IID_IDXSurfaceModifier = {0x9EA3B637, 0xC37D, 0x11D1, [0x90, 0x5E, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID IID_IDXSurfacePick = {0x30A5FB79, 0xE11F, 0x11D1, [0x90, 0x64, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID IID_IDXTAlpha = {0x1D4637E0, 0x383C, 0x11D2, [0x95, 0x2A, 0x00, 0xC0, 0x4F, 0xA3, 0x4F, 0x05]};
+ const IID IID_IDXTAlphaImageLoader = {0xA5F2D3E8, 0x7A7E, 0x48E5, [0xBC, 0x75, 0x40, 0x79, 0x0B, 0xE4, 0xA9, 0x41]};
+ const IID IID_IDXTaskManager = {0x254DBBC1, 0xF922, 0x11D0, [0x88, 0x3A, 0x3C, 0x8B, 0x00, 0xC1, 0x00, 0x00]};
+ const IID IID_IDXTBindHost = {0xD26BCE55, 0xE9DC, 0x11D1, [0x90, 0x66, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID IID_IDXTCheckerBoard = {0xAD3C2576, 0x117C, 0x4510, [0x84, 0xDD, 0xB6, 0x68, 0x97, 0x1D, 0xCF, 0xD1]};
+ const IID IID_IDXTChroma = {0x1D4637E2, 0x383C, 0x11D2, [0x95, 0x2A, 0x00, 0xC0, 0x4F, 0xA3, 0x4F, 0x05]};
+ const IID IID_IDXTClipOrigin = {0xEE1663D8, 0x0988, 0x4C48, [0x9F, 0xD6, 0xDB, 0x44, 0x50, 0x88, 0x56, 0x68]};
+ const IID IID_IDXTComposite = {0x9A43A843, 0x0831, 0x11D1, [0x81, 0x7F, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID IID_IDXTConvolution = {0x7BA7F8AF, 0xE5EA, 0x11D1, [0x81, 0xDD, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID IID_IDXTDropShadow = {0x1D4637E3, 0x383C, 0x11D2, [0x95, 0x2A, 0x00, 0xC0, 0x4F, 0xA3, 0x4F, 0x05]};
+ const IID IID_IDXTFade = {0x16B280C4, 0xEE70, 0x11D1, [0x90, 0x66, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID IID_IDXTFilter = {0x6187E5A2, 0xA445, 0x4608, [0x8F, 0xC0, 0xBE, 0x7A, 0x6C, 0x8D, 0xB3, 0x86]};
+ const IID IID_IDXTFilterBehavior = {0x14D7DDDD, 0xACA2, 0x4E45, [0x95, 0x04, 0x38, 0x08, 0xAB, 0xEB, 0x4F, 0x92]};
+ const IID IID_IDXTFilterBehaviorSite = {0x909B23C2, 0x9018, 0x499F, [0xA8, 0x6D, 0x4E, 0x7D, 0xA9, 0x37, 0xE9, 0x31]};
+ const IID IID_IDXTFilterCollection = {0x22B07B33, 0x8BFB, 0x49D4, [0x9B, 0x90, 0x09, 0x38, 0x37, 0x0C, 0x90, 0x19]};
+ const IID IID_IDXTFilterController = {0x5CF315F2, 0x273D, 0x47B6, [0xB9, 0xED, 0xF7, 0x5D, 0xC3, 0xB0, 0x15, 0x0B]};
+ const IID IID_IDXTGlow = {0x1D4637E4, 0x383C, 0x11D2, [0x95, 0x2A, 0x00, 0xC0, 0x4F, 0xA3, 0x4F, 0x05]};
+ const IID IID_IDXTGradientD = {0x623E2881, 0xFC0E, 0x11D1, [0x9A, 0x77, 0x00, 0x00, 0xF8, 0x75, 0x6A, 0x10]};
+ const IID IID_IDXTGridSize = {0xD6BBE91E, 0xFF60, 0x11D2, [0x8F, 0x6E, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x74]};
+ const IID IID_IDXTICMFilter = {0x734321ED, 0x1E7B, 0x4E1C, [0xBB, 0xFA, 0x89, 0xC8, 0x19, 0x80, 0x0E, 0x2F]};
+ const IID IID_IDXTLabel = {0xC0C17F0E, 0xAE41, 0x11D1, [0x9A, 0x3B, 0x00, 0x00, 0xF8, 0x75, 0x6A, 0x10]};
+ const IID IID_IDXTLight = {0xF9EFBEC1, 0x4302, 0x11D2, [0x95, 0x2A, 0x00, 0xC0, 0x4F, 0xA3, 0x4F, 0x05]};
+ const IID IID_IDXTMask = {0xA1067146, 0xB063, 0x47D7, [0xA5, 0x4A, 0x2C, 0x23, 0x09, 0xE9, 0x88, 0x9D]};
+ const IID IID_IDXTMatrix = {0xAC66A493, 0x0F0C, 0x4C76, [0x82, 0x5C, 0x9D, 0x68, 0xBE, 0xDE, 0x91, 0x88]};
+ const IID IID_IDXTMetaBurnFilm = {0x107045D0, 0x06E0, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID IID_IDXTMetaCenterPeel = {0xAA0D4D0B, 0x06A3, 0x11D2, [0x8F, 0x98, 0x00, 0xC0, 0x4F, 0xB9, 0x2E, 0xB7]};
+ const IID IID_IDXTMetaColorFade = {0x2A54C907, 0x07AA, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID IID_IDXTMetaFlowMotion = {0x2A54C90A, 0x07AA, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID IID_IDXTMetaGriddler = {0x2A54C910, 0x07AA, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID IID_IDXTMetaGriddler2 = {0x2A54C912, 0x07AA, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID IID_IDXTMetaJaws = {0x2A54C903, 0x07AA, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID IID_IDXTMetaLightWipe = {0x107045C7, 0x06E0, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID IID_IDXTMetaLiquid = {0xAA0D4D09, 0x06A3, 0x11D2, [0x8F, 0x98, 0x00, 0xC0, 0x4F, 0xB9, 0x2E, 0xB7]};
+ const IID IID_IDXTMetaPageTurn = {0xAA0D4D07, 0x06A3, 0x11D2, [0x8F, 0x98, 0x00, 0xC0, 0x4F, 0xB9, 0x2E, 0xB7]};
+ const IID IID_IDXTMetaPeelPiece = {0xAA0D4D0F, 0x06A3, 0x11D2, [0x8F, 0x98, 0x00, 0xC0, 0x4F, 0xB9, 0x2E, 0xB7]};
+ const IID IID_IDXTMetaPeelSmall = {0xAA0D4D0D, 0x06A3, 0x11D2, [0x8F, 0x98, 0x00, 0xC0, 0x4F, 0xB9, 0x2E, 0xB7]};
+ const IID IID_IDXTMetaPeelSplit = {0xAA0D4D11, 0x06A3, 0x11D2, [0x8F, 0x98, 0x00, 0xC0, 0x4F, 0xB9, 0x2E, 0xB7]};
+ const IID IID_IDXTMetaRadialScaleWipe = {0x107045C9, 0x06E0, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID IID_IDXTMetaRipple = {0xAA0D4D02, 0x06A3, 0x11D2, [0x8F, 0x98, 0x00, 0xC0, 0x4F, 0xB9, 0x2E, 0xB7]};
+ const IID IID_IDXTMetaRoll = {0x9C61F46D, 0x0530, 0x11D2, [0x8F, 0x98, 0x00, 0xC0, 0x4F, 0xB9, 0x2E, 0xB7]};
+ const IID IID_IDXTMetaThreshold = {0x2A54C914, 0x07AA, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID IID_IDXTMetaTwister = {0x107045CE, 0x06E0, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID IID_IDXTMetaVacuum = {0x2A54C90C, 0x07AA, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID IID_IDXTMetaWater = {0x107045C4, 0x06E0, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID IID_IDXTMetaWhiteOut = {0x107045CB, 0x06E0, 0x11D2, [0x8D, 0x6D, 0x00, 0xC0, 0x4F, 0x8E, 0xF8, 0xE0]};
+ const IID IID_IDXTMetaWormHole = {0x0E6AE021, 0x0C83, 0x11D2, [0x8C, 0xD4, 0x00, 0x10, 0x4B, 0xC7, 0x5D, 0x9A]};
+ const IID IID_IDXTMotionBlur = {0x089057BE, 0xD3F5, 0x4A2C, [0xB1, 0x0A, 0xA5, 0x13, 0x01, 0x84, 0xA0, 0xF7]};
+ const IID IID_IDXTRandomBars = {0x8A6D2022, 0x4A8F, 0x4EB9, [0xBB, 0x25, 0xAA, 0x05, 0x20, 0x1F, 0x9C, 0x84]};
+ const IID IID_IDXTransform = {0x30A5FB78, 0xE11F, 0x11D1, [0x90, 0x64, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID IID_IDXTransformFactory = {0x6A950B2B, 0xA971, 0x11D1, [0x81, 0xC8, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID IID_IDXTRedirect = {0x02F5140B, 0x626F, 0x4019, [0x9C, 0x9E, 0x2D, 0xAA, 0x1E, 0x93, 0xE8, 0xFC]};
+ const IID IID_IDXTRedirectFilterInit = {0xD1A57094, 0x21F7, 0x4E6C, [0x93, 0xE5, 0xF5, 0xF7, 0x7F, 0x74, 0x82, 0x93]};
+ const IID IID_IDXTRevealTrans = {0xB8095006, 0xA128, 0x464B, [0x8B, 0x2D, 0x90, 0x58, 0x0A, 0xEE, 0x2B, 0x05]};
+ const IID IID_IDXTScale = {0xB39FD742, 0xE139, 0x11D1, [0x90, 0x65, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID IID_IDXTScaleOutput = {0xB2024B50, 0xEE77, 0x11D1, [0x90, 0x66, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0x9D]};
+ const IID IID_IDXTShadow = {0x1D4637E6, 0x383C, 0x11D2, [0x95, 0x2A, 0x00, 0xC0, 0x4F, 0xA3, 0x4F, 0x05]};
+ const IID IID_IDXTStrips = {0xA83C9B5C, 0xFB11, 0x4AF5, [0x8F, 0x65, 0xD0, 0x3F, 0x15, 0x1D, 0x3E, 0xD5]};
+ const IID IID_IDXTWave = {0x1D4637E7, 0x383C, 0x11D2, [0x95, 0x2A, 0x00, 0xC0, 0x4F, 0xA3, 0x4F, 0x05]};
+ const IID IID_IDXTWipe = {0xAF279B2F, 0x86EB, 0x11D1, [0x81, 0xBF, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID IID_IDXTWipe2 = {0xE1FF8091, 0x442B, 0x4801, [0x88, 0xB6, 0x2B, 0x47, 0xB1, 0x61, 0x1F, 0xD2]};
+ const IID IID_IDynamicPortMapping = {0x4FC80282, 0x23B6, 0x4378, [0x9A, 0x27, 0xCD, 0x8F, 0x17, 0xC9, 0x40, 0x0C]};
+ const IID IID_IDynamicPortMappingCollection = {0xB60DE00F, 0x156E, 0x4E8D, [0x9E, 0xC1, 0x3A, 0x23, 0x42, 0xC1, 0x08, 0x99]};
+ const IID IID_IEditDebugServices = {0x3050F60B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementAdorner = {0x3050F607, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementBehavior = {0x3050F425, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementBehaviorCategory = {0x3050F4ED, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementBehaviorFactory = {0x3050F429, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementBehaviorFocus = {0x3050F6B6, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementBehaviorLayout = {0x3050F6BA, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementBehaviorLayout2 = {0x3050F846, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementBehaviorRender = {0x3050F4AA, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementBehaviorSite = {0x3050F427, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementBehaviorSiteCategory = {0x3050F4EE, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementBehaviorSiteLayout = {0x3050F6B7, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementBehaviorSiteLayout2 = {0x3050F847, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementBehaviorSiteOM = {0x3050F489, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementBehaviorSiteOM2 = {0x3050F659, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementBehaviorSiteRender = {0x3050F4A7, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementBehaviorSubmit = {0x3050F646, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementBehaviorUI = {0x3050F4BF, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementNamespace = {0x3050F671, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementNamespaceFactory = {0x3050F672, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementNamespaceFactory2 = {0x3050F805, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementNamespaceFactoryCallback = {0x3050F7FD, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementNamespacePrivate = {0x3050F7FF, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementNamespaceTable = {0x3050F670, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IElementSegment = {0x3050F68F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IEmptyVolumeCache = {0x8FCE5227, 0x04DA, 0x11D1, [0xA0, 0x04, 0x00, 0x80, 0x5F, 0x8A, 0xBE, 0x06]};
+ const IID IID_IEmptyVolumeCache2 = {0x02B7E3BA, 0x4DB3, 0x11D2, [0xB2, 0xD9, 0x00, 0xC0, 0x4F, 0x8E, 0xEC, 0x8C]};
+ const IID IID_IEmptyVolumeCacheCallBack = {0x6E793361, 0x73C6, 0x11D0, [0x84, 0x69, 0x00, 0xAA, 0x00, 0x44, 0x29, 0x01]};
+ const IID IID_IEncodingFilterFactory = {0x70BDDE00, 0xC18E, 0x11D0, [0xA9, 0xCE, 0x00, 0x60, 0x97, 0x94, 0x23, 0x11]};
+ const IID IID_IEnroll = {0xACAA7838, 0x4585, 0x11D1, [0xAB, 0x57, 0x00, 0xC0, 0x4F, 0xC2, 0x95, 0xE1]};
+ const IID IID_IEnroll2 = {0xC080E199, 0xB7DF, 0x11D2, [0xA4, 0x21, 0x00, 0xC0, 0x4F, 0x79, 0xFE, 0x8E]};
+ const IID IID_IEnroll4 = {0xF8053FE5, 0x78F4, 0x448F, [0xA0, 0xDB, 0x41, 0xD6, 0x1B, 0x73, 0x44, 0x6B]};
+ const IID IID_IEntryID = {0xE4D19810, 0xD188, 0x11CD, [0xAD, 0x48, 0x00, 0xAA, 0x00, 0x3C, 0x9C, 0xB6]};
+ const IID IID_IEnumACDGroup = {0x5AFC3157, 0x4BCC, 0x11D1, [0xBF, 0x80, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_IEnumACString = {0x8E74C210, 0xCF9D, 0x4EAF, [0xA4, 0x03, 0x73, 0x56, 0x42, 0x8F, 0x0A, 0x5A]};
+ const IID IID_IEnumAdapterInfo = {0xA23F9D11, 0x714C, 0x41FE, [0x84, 0x71, 0xFF, 0xB1, 0x9B, 0xC2, 0x84, 0x54]};
+ const IID IID_IEnumAddress = {0x1666FCA1, 0x9363, 0x11D0, [0x83, 0x5C, 0x00, 0xAA, 0x00, 0x3C, 0xCA, 0xBD]};
+ const IID IID_IEnumAgent = {0x5AFC314D, 0x4BCC, 0x11D1, [0xBF, 0x80, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_IEnumAgentHandler = {0x587E8C28, 0x9802, 0x11D1, [0xA0, 0xA4, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_IEnumAgentSession = {0x5AFC314E, 0x4BCC, 0x11D1, [0xBF, 0x80, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_IEnumBackgroundCopyFiles = {0xCA51E165, 0xC365, 0x424C, [0x8D, 0x41, 0x24, 0xAA, 0xA4, 0xFF, 0x3C, 0x40]};
+ const IID IID_IEnumBackgroundCopyGroups = {0xD993E603, 0x4AA4, 0x47C5, [0x86, 0x65, 0xC2, 0x0D, 0x39, 0xC2, 0xBA, 0x4F]};
+ const IID IID_IEnumBackgroundCopyJobs = {0x1AF4F612, 0x3B71, 0x466F, [0x8F, 0x58, 0x7B, 0x6F, 0x73, 0xAC, 0x57, 0xAD]};
+ const IID IID_IEnumBackgroundCopyJobs1 = {0x8BAEBA9D, 0x8F1C, 0x42C4, [0xB8, 0x2C, 0x09, 0xAE, 0x79, 0x98, 0x0D, 0x25]};
+ const IID IID_IEnumBstr = {0x35372049, 0x0BC6, 0x11D2, [0xA0, 0x33, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_IEnumCall = {0xAE269CF6, 0x935E, 0x11D0, [0x83, 0x5C, 0x00, 0xAA, 0x00, 0x3C, 0xCA, 0xBD]};
+ const IID IID_IEnumCallback = {0x00000108, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IEnumCallHub = {0xA3C15450, 0x5B92, 0x11D1, [0x8F, 0x4E, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_IEnumCallingCard = {0x0C4D8F02, 0x8DDB, 0x11D1, [0xA0, 0x9E, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_IEnumCATEGORYINFO = {0x0002E011, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IEnumChannels = {0xA4C65425, 0x0F82, 0x11D1, [0x90, 0xC3, 0x00, 0xC0, 0x4F, 0xC2, 0xF5, 0x68]};
+ const IID IID_IEnumClusCfgIPAddresses = {0xBD5F35BA, 0x0BC0, 0x455F, [0x92, 0x6D, 0xC3, 0xD3, 0x56, 0x41, 0x94, 0x86]};
+ const IID IID_IEnumClusCfgManagedResources = {0x7DBE11EB, 0xA5DF, 0x4534, [0xAB, 0xF6, 0x8B, 0xAC, 0x7B, 0x53, 0xFC, 0x95]};
+ const IID IID_IEnumClusCfgNetworks = {0xCF3FAED8, 0x1322, 0x4BCB, [0x99, 0x23, 0xB5, 0xB7, 0x45, 0xA6, 0x9E, 0x36]};
+ const IID IID_IEnumClusCfgPartitions = {0x4440BB6A, 0xB0AC, 0x479D, [0xB5, 0x34, 0x72, 0x65, 0xA3, 0x1D, 0x6C, 0x55]};
+ const IID IID_IEnumCodePage = {0x275C23E3, 0x3747, 0x11D0, [0x9F, 0xEA, 0x00, 0xAA, 0x00, 0x3F, 0x86, 0x46]};
+ const IID IID_IEnumConnectionPoints = {0xB196B285, 0xBAB4, 0x101A, [0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07]};
+ const IID IID_IEnumConnections = {0xB196B287, 0xBAB4, 0x101A, [0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07]};
+ const IID IID_IEnumCookies = {0x5E3E482E, 0x3C22, 0x482C, [0xB6, 0x64, 0x69, 0x30, 0x51, 0xAD, 0x0A, 0x5D]};
+ const IID IID_IEnumDebugApplicationNodes = {0x51973C3A, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IEnumDebugCodeContexts = {0x51973C1D, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IEnumDebugExpressionContexts = {0x51973C40, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IEnumDebugExtendedPropertyInfo = {0x51973C53, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IEnumDebugPropertyInfo = {0x51973C51, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IEnumDebugStackFrames = {0x51973C1E, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IEnumDebugStackFrames64 = {0x0DC38853, 0xC1B0, 0x4176, [0xA9, 0x84, 0xB2, 0x98, 0x36, 0x10, 0x27, 0xAF]};
+ const IID IID_IEnumDialableAddrs = {0x34621D70, 0x6CFF, 0x11D1, [0xAF, 0xF7, 0x00, 0xC0, 0x4F, 0xC3, 0x1F, 0xEE]};
+ const IID IID_IEnumDirectory = {0x34621D6D, 0x6CFF, 0x11D1, [0xAF, 0xF7, 0x00, 0xC0, 0x4F, 0xC3, 0x1F, 0xEE]};
+ const IID IID_IEnumDirectoryObject = {0x06C9B64A, 0x306D, 0x11D1, [0x97, 0x74, 0x00, 0xC0, 0x4F, 0xD9, 0x1A, 0xC0]};
+ const IID IID_IEnumDiscMasterFormats = {0xDDF445E1, 0x54BA, 0x11D3, [0x91, 0x44, 0x00, 0x10, 0x4B, 0xA1, 0x1C, 0x5E]};
+ const IID IID_IEnumDiscRecorders = {0x9B1921E1, 0x54AC, 0x11D3, [0x91, 0x44, 0x00, 0x10, 0x4B, 0xA1, 0x1C, 0x5E]};
+ const IID IID_IEnumExtraSearch = {0x0E700BE1, 0x9DB6, 0x11D1, [0xA1, 0xCE, 0x00, 0xC0, 0x4F, 0xD7, 0x5D, 0x13]};
+ const IID IID_IEnumFORMATETC = {0x00000103, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IEnumGeneric = {0x00000106, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IEnumGUID = {0x0002E000, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IEnumHLITEM = {0x79EAC9C6, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IEnumHNetApplicationProtocols = {0x85D18B7B, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IEnumHNetBridgedConnections = {0x85D18B7D, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IEnumHNetBridges = {0x85D18B77, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IEnumHNetFirewalledConnections = {0x85D18B78, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IEnumHNetIcsPrivateConnections = {0x85D18B7A, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IEnumHNetIcsPublicConnections = {0x85D18B79, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IEnumHNetPortMappingBindings = {0x85D18B81, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IEnumHNetPortMappingProtocols = {0x85D18B7C, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IEnumHolder = {0x00000107, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IEnumIDList = {0x000214F2, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IEnumInputContext = {0x09B5EAB0, 0xF997, 0x11D1, [0x93, 0xD4, 0x00, 0x60, 0xB0, 0x67, 0xB8, 0x6E]};
+ const IID IID_IEnumItemProperties = {0xF72C8D96, 0x6DBD, 0x11D1, [0xA1, 0xE8, 0x00, 0xC0, 0x4F, 0xC2, 0xFB, 0xE1]};
+ const IID IID_IEnumLocation = {0x0C4D8F01, 0x8DDB, 0x11D1, [0xA0, 0x9E, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_IEnumMcastScope = {0xDF0DAF09, 0xA289, 0x11D1, [0x86, 0x97, 0x00, 0x60, 0x08, 0xB0, 0xE5, 0xD2]};
+ const IID IID_IEnumMedia = {0xCA8397BE, 0x2FA4, 0x11D1, [0x97, 0x74, 0x00, 0xC0, 0x4F, 0xD9, 0x1A, 0xC0]};
+ const IID IID_IEnumMoniker = {0x00000102, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IEnumNetCfgBindingInterface = {0xC0E8AE90, 0x306E, 0x11D1, [0xAA, 0xCF, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_IEnumNetCfgBindingPath = {0xC0E8AE91, 0x306E, 0x11D1, [0xAA, 0xCF, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_IEnumNetCfgComponent = {0xC0E8AE92, 0x306E, 0x11D1, [0xAA, 0xCF, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_IEnumNetConnection = {0xC08956A0, 0x1CD3, 0x11D1, [0xB1, 0xC5, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_IEnumNetSharingEveryConnection = {0xC08956B8, 0x1CD3, 0x11D1, [0xB1, 0xC5, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_IEnumNetSharingPortMapping = {0xC08956B0, 0x1CD3, 0x11D1, [0xB1, 0xC5, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_IEnumNetSharingPrivateConnection = {0xC08956B5, 0x1CD3, 0x11D1, [0xB1, 0xC5, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_IEnumNetSharingPublicConnection = {0xC08956B4, 0x1CD3, 0x11D1, [0xB1, 0xC5, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_IEnumNodes = {0xC477E363, 0xAF0A, 0x4203, [0xA6, 0x04, 0x45, 0xCD, 0x60, 0x7D, 0xD7, 0x10]};
+ const IID IID_IEnumNotification = {0xC733E4A8, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID IID_IEnumNotificationSinkItem = {0xC733E4AA, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID IID_IEnumOleDocumentViews = {0xB722BCC8, 0x4E68, 0x101B, [0xA2, 0xBC, 0x00, 0xAA, 0x00, 0x40, 0x47, 0x70]};
+ const IID IID_IEnumOleUndoUnits = {0xB3E7C340, 0xEF97, 0x11CE, [0x9B, 0xC9, 0x00, 0xAA, 0x00, 0x60, 0x8E, 0x01]};
+ const IID IID_IEnumOLEVERB = {0x00000104, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IEnumParticipant = {0x0A91B56C, 0x5A35, 0x11D2, [0x95, 0xA0, 0x00, 0xA0, 0x24, 0x4D, 0x22, 0x98]};
+ const IID IID_IEnumPhone = {0xF15B7669, 0x4780, 0x4595, [0x8C, 0x89, 0xFB, 0x36, 0x9C, 0x8C, 0xF7, 0xAA]};
+ const IID IID_IEnumPluggableSuperclassInfo = {0xE9586A80, 0x89E6, 0x4CFF, [0x93, 0x1D, 0x47, 0x8D, 0x57, 0x51, 0xF4, 0xC0]};
+ const IID IID_IEnumPluggableTerminalClassInfo = {0x4567450C, 0xDBEE, 0x4E3F, [0xAA, 0xF5, 0x37, 0xBF, 0x9E, 0xBF, 0x5E, 0x29]};
+ const IID IID_IEnumPrivacyRecords = {0x3050F844, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IEnumPropertyMap = {0xC733E4A1, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID IID_IEnumPublishedApps = {0x0B124F8C, 0x91F0, 0x11D1, [0xB8, 0xB5, 0x00, 0x60, 0x08, 0x05, 0x93, 0x82]};
+ const IID IID_IEnumQueue = {0x5AFC3158, 0x4BCC, 0x11D1, [0xBF, 0x80, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_IEnumRegisterWordA = {0x08C03412, 0xF96B, 0x11D0, [0xA4, 0x75, 0x00, 0xAA, 0x00, 0x6B, 0xCC, 0x59]};
+ const IID IID_IEnumRegisterWordW = {0x4955DD31, 0xB159, 0x11D0, [0x8F, 0xCF, 0x00, 0xAA, 0x00, 0x6B, 0xCC, 0x59]};
+ const IID IID_IEnumRemoteDebugApplications = {0x51973C3B, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IEnumRemoteDebugApplicationThrea = {0x51973C3C, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IEnumRfc1766 = {0x3DC39D1D, 0xC030, 0x11D0, [0xB8, 0x1B, 0x00, 0xC0, 0x4F, 0xC9, 0xB3, 0x1F]};
+ const IID IID_IEnumScheduleGroup = {0xC733E4A9, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID IID_IEnumScript = {0xAE5F1430, 0x388B, 0x11D2, [0x83, 0x80, 0x00, 0xC0, 0x4F, 0x8F, 0x5D, 0xA1]};
+ const IID IID_IEnumSTATDATA = {0x00000105, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IEnumSTATPROPBAG = {0x20021801, 0x5DE6, 0x11D1, [0x8E, 0x38, 0x00, 0xC0, 0x4F, 0xB9, 0x38, 0x6D]};
+ const IID IID_IEnumSTATPROPSETSTG = {0x0000013B, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IEnumSTATPROPSTG = {0x00000139, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IEnumSTATSTG = {0x0000000D, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IEnumSTATURL = {0x3C374A42, 0xBAE4, 0x11CF, [0xBF, 0x7D, 0x00, 0xAA, 0x00, 0x69, 0x46, 0xEE]};
+ const IID IID_IEnumStream = {0xEE3BD606, 0x3868, 0x11D2, [0xA0, 0x45, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_IEnumString = {0x00000101, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IEnumSubscription = {0xF72C8D97, 0x6DBD, 0x11D1, [0xA1, 0xE8, 0x00, 0xC0, 0x4F, 0xC2, 0xFB, 0xE1]};
+ const IID IID_IEnumSubStream = {0xEE3BD609, 0x3868, 0x11D2, [0xA0, 0x45, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_IEnumSyncItems = {0xF0E1589A, 0xA700, 0x11D1, [0x98, 0x31, 0x00, 0xC0, 0x4F, 0xD9, 0x10, 0xDD]};
+ const IID IID_IEnumSyncSchedules = {0xF0E15898, 0xA700, 0x11D1, [0x98, 0x31, 0x00, 0xC0, 0x4F, 0xD9, 0x10, 0xDD]};
+ const IID IID_IEnumTerminal = {0xAE269CF4, 0x935E, 0x11D0, [0x83, 0x5C, 0x00, 0xAA, 0x00, 0x3C, 0xCA, 0xBD]};
+ const IID IID_IEnumTerminalClass = {0xAE269CF5, 0x935E, 0x11D0, [0x83, 0x5C, 0x00, 0xAA, 0x00, 0x3C, 0xCA, 0xBD]};
+ const IID IID_IEnumTime = {0x9055322E, 0x2FA8, 0x11D1, [0x97, 0x74, 0x00, 0xC0, 0x4F, 0xD9, 0x1A, 0xC0]};
+ const IID IID_IEnumTravelLogEntry = {0x7EBFDD85, 0xAD18, 0x11D3, [0xA4, 0xC5, 0x00, 0xC0, 0x4F, 0x72, 0xD6, 0xB8]};
+ const IID IID_IEnumUnknown = {0x00000100, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IEnumVARIANT = {0x00020404, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IEnumWbemClassObject = {0x027947E1, 0xD731, 0x11CE, [0xA3, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01]};
+ const IID IID_IErrorInfo = {0x1CF2B120, 0x547D, 0x101B, [0x8E, 0x65, 0x08, 0x00, 0x2B, 0x2B, 0xD1, 0x19]};
+ const IID IID_IErrorLog = {0x3127CA40, 0x446E, 0x11CE, [0x81, 0x35, 0x00, 0xAA, 0x00, 0x4B, 0xB8, 0x51]};
+ const IID IID_IErrorLookup = {0x0C733A66, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IErrorRecords = {0x0C733A67, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IESP = {0xE99A04AA, 0xAB95, 0x11D0, [0xBE, 0x96, 0x00, 0xA0, 0xC9, 0x49, 0x89, 0xDE]};
+ const IID IID_IExtendObjectManager = {0xCA7BB0B9, 0x700C, 0x4DC5, [0x99, 0x1E, 0x75, 0xF9, 0xE6, 0x5E, 0xE9, 0x75]};
+ const IID IID_IExtensionServices = {0x79EAC9CB, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IExternalConnection = {0x00000019, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IExtractIconA = {0x000214EB, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IExtractIconW = {0x000214FA, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IExtractImage = {0xBB2E617C, 0x0920, 0x11D1, [0x9A, 0x0B, 0x00, 0xC0, 0x4F, 0xC2, 0xD6, 0xC1]};
+ const IID IID_IExtractImage2 = {0x953BB1EE, 0x93B4, 0x11D1, [0x98, 0xA3, 0x00, 0xC0, 0x4F, 0xB6, 0x87, 0xDA]};
+ const IID IID_IFileSearchBand = {0x2D91EEA1, 0x9932, 0x11D2, [0xBE, 0x86, 0x00, 0xA0, 0xC9, 0xA8, 0x3D, 0xA1]};
+ const IID IID_IFileSystemBindData = {0x01E18D10, 0x4D8B, 0x11D2, [0x85, 0x5D, 0x00, 0x60, 0x08, 0x05, 0x93, 0x67]};
+ const IID IID_IFileViewerA = {0x000214F0, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IFileViewerSite = {0x000214F3, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IFileViewerW = {0x000214F8, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IFillLockBytes = {0x99CAF010, 0x415E, 0x11CF, [0x88, 0x14, 0x00, 0xAA, 0x00, 0xB5, 0x69, 0xF5]};
+ const IID IID_IFilter = {0x89BCB740, 0x6119, 0x101A, [0xBC, 0xB7, 0x00, 0xDD, 0x01, 0x06, 0x55, 0xAF]};
+ const IID IID_IFilterAnimationInfo = {0x02E29300, 0xC758, 0x49B4, [0x9E, 0x11, 0xC5, 0x8B, 0xFE, 0x90, 0x55, 0x8B]};
+ const IID IID_IFilterStatus = {0xF4EB8260, 0x8DDA, 0x11D1, [0xB3, 0xAA, 0x00, 0xA0, 0xC9, 0x06, 0x37, 0x96]};
+ const IID IID_IFolderFilter = {0x9CC22886, 0xDC8E, 0x11D2, [0xB1, 0xD0, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x3E]};
+ const IID IID_IFolderFilterSite = {0xC0A651F5, 0xB48B, 0x11D2, [0xB5, 0xED, 0x00, 0x60, 0x97, 0xC6, 0x86, 0xF6]};
+ const IID IID_IFolderView = {0xCDE725B0, 0xCCC9, 0x4519, [0x91, 0x7E, 0x32, 0x5D, 0x72, 0xFA, 0xB4, 0xCE]};
+ const IID IID_IFolderViewHost = {0x1EA58F02, 0xD55A, 0x411D, [0xB0, 0x9E, 0x9E, 0x65, 0xAC, 0x21, 0x60, 0x5B]};
+ const IID IID_IFolderViewOC = {0x9BA05970, 0xF6A8, 0x11CF, [0xA4, 0x42, 0x00, 0xA0, 0xC9, 0x0A, 0x8F, 0x39]};
+ const IID IID_IFont = {0xBEF6E002, 0xA874, 0x101A, [0x8B, 0xBA, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID IID_IFontDisp = {0xBEF6E003, 0xA874, 0x101A, [0x8B, 0xBA, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID IID_IFontEventsDisp = {0x4EF6100A, 0xAF88, 0x11D0, [0x98, 0x46, 0x00, 0xC0, 0x4F, 0xC2, 0x99, 0x93]};
+ const IID IID_IFontNames = {0x3050F839, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IForegroundTransfer = {0x00000145, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IFsCiAdmin = {0x75398C30, 0x7A26, 0x11D0, [0xA8, 0x0A, 0x00, 0xA0, 0xC9, 0x06, 0x24, 0x1A]};
+ const IID IID_IGatherData = {0x65318F4A, 0xB63C, 0x4E21, [0xAD, 0xDC, 0xBD, 0xCF, 0xB9, 0x69, 0xE1, 0x81]};
+ const IID IID_IGetClusterDataInfo = {0x97DEDE51, 0xFC6B, 0x11CF, [0xB5, 0xF5, 0x00, 0xA0, 0xC9, 0x0A, 0xB5, 0x05]};
+ const IID IID_IGetClusterGroupInfo = {0x97DEDE54, 0xFC6B, 0x11CF, [0xB5, 0xF5, 0x00, 0xA0, 0xC9, 0x0A, 0xB5, 0x05]};
+ const IID IID_IGetClusterNetInterfaceInfo = {0x97DEDE57, 0xFC6B, 0x11CF, [0xB5, 0xF5, 0x00, 0xA0, 0xC9, 0x0A, 0xB5, 0x05]};
+ const IID IID_IGetClusterNetworkInfo = {0x97DEDE56, 0xFC6B, 0x11CF, [0xB5, 0xF5, 0x00, 0xA0, 0xC9, 0x0A, 0xB5, 0x05]};
+ const IID IID_IGetClusterNodeInfo = {0x97DEDE53, 0xFC6B, 0x11CF, [0xB5, 0xF5, 0x00, 0xA0, 0xC9, 0x0A, 0xB5, 0x05]};
+ const IID IID_IGetClusterObjectInfo = {0x97DEDE52, 0xFC6B, 0x11CF, [0xB5, 0xF5, 0x00, 0xA0, 0xC9, 0x0A, 0xB5, 0x05]};
+ const IID IID_IGetClusterResourceInfo = {0x97DEDE55, 0xFC6B, 0x11CF, [0xB5, 0xF5, 0x00, 0xA0, 0xC9, 0x0A, 0xB5, 0x05]};
+ const IID IID_IGetClusterUIInfo = {0x97DEDE50, 0xFC6B, 0x11CF, [0xB5, 0xF5, 0x00, 0xA0, 0xC9, 0x0A, 0xB5, 0x05]};
+ const IID IID_IGetDataSource = {0x0C733A75, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IGetRow = {0x0C733AAF, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IGetSession = {0x0C733ABA, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IGetSourceRow = {0x0C733ABB, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IGlobalInterfaceTable = {0x00000146, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IH26XEncodeOptions = {0x65698D40, 0x282D, 0x11D0, [0x88, 0x00, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID IID_IH26XEncoderControl = {0xF9B78AA1, 0xEA12, 0x11CF, [0x9F, 0xEC, 0x00, 0xAA, 0x00, 0xA5, 0x9F, 0x69]};
+ const IID IID_IH26XRTPControl = {0x1FC3F2C0, 0x2BFD, 0x11D0, [0x88, 0x00, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID IID_IH26XSnapshot = {0x3CB194A0, 0x10AA, 0x11D0, [0x88, 0x00, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID IID_IH26XVideoEffects = {0x21555140, 0x9C2B, 0x11CF, [0x90, 0xFA, 0x00, 0xAA, 0x00, 0xA7, 0x29, 0xEA]};
+ const IID IID_IH323LineEx = {0x44CF6A9D, 0xCB40, 0x4BBC, [0xB2, 0xD3, 0xB6, 0xAA, 0x93, 0x32, 0x2C, 0x71]};
+ const IID IID_IHeaderFooter = {0x3050F6CE, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHighlightRenderingServices = {0x3050F606, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHighlightSegment = {0x3050F690, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHlink = {0x79EAC9C3, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IHlinkBrowseContext = {0x79EAC9C7, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IHlinkFrame = {0x79EAC9C5, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IHlinkSite = {0x79EAC9C2, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IHlinkTarget = {0x79EAC9C4, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IHNetApplicationProtocol = {0x85D18B7F, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IHNetBridge = {0x85D18B75, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IHNetBridgedConnection = {0x85D18B76, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IHNetBridgeSettings = {0x85D18B6D, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IHNetCfgMgr = {0x85D18B6C, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IHNetConnection = {0x85D18B71, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IHNetFirewalledConnection = {0x85D18B72, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IHNetFirewallSettings = {0x85D18B6E, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IHNetIcsPrivateConnection = {0x85D18B74, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IHNetIcsPublicConnection = {0x85D18B73, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IHNetIcsSettings = {0x85D18B6F, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IHNetPortMappingBinding = {0x85D18B80, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IHNetPortMappingProtocol = {0x85D18B7E, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IHNetProtocolSettings = {0x85D18B70, 0x3032, 0x11D4, [0x93, 0x48, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x71]};
+ const IID IID_IHomePage = {0x766BF2AF, 0xD650, 0x11D1, [0x98, 0x11, 0x00, 0xC0, 0x4F, 0xC3, 0x1D, 0x2E]};
+ const IID IID_IHostBehaviorInit = {0x3050F842, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHostDialogHelper = {0x53DEC138, 0xA51E, 0x11D2, [0x86, 0x1E, 0x00, 0xC0, 0x4F, 0xA3, 0x5C, 0x89]};
+ const IID IID_IHTCAttachBehavior = {0x3050F5F4, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTCAttachBehavior2 = {0x3050F7EB, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTCDefaultDispatch = {0x3050F4FD, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTCDescBehavior = {0x3050F5DC, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTCEventBehavior = {0x3050F4FF, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTCMethodBehavior = {0x3050F631, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTCPropertyBehavior = {0x3050F5DF, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLAnchorElement = {0x3050F1DA, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLAnchorElement2 = {0x3050F825, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLAppBehavior = {0x3050F5CA, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLAppBehavior2 = {0x3050F5C9, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLAppBehavior3 = {0x3050F5CD, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHtmlArea = {0x3050F64E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLAreaElement = {0x3050F265, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLAreasCollection = {0x3050F383, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLAreasCollection2 = {0x3050F5EC, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLAreasCollection3 = {0x3050F837, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLAttributeCollection = {0x3050F4C3, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLAttributeCollection2 = {0x3050F80A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLBaseElement = {0x3050F204, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLBaseFontElement = {0x3050F202, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLBGsound = {0x3050F369, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLBlockElement = {0x3050F208, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLBlockElement2 = {0x3050F823, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLBodyElement = {0x3050F1D8, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLBodyElement2 = {0x3050F5C5, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLBookmarkCollection = {0x3050F4CE, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLBRElement = {0x3050F1F0, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLButtonElement = {0x3050F2BB, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLCaret = {0x3050F604, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLChangeLog = {0x3050F649, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLChangePlayback = {0x3050F6E0, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLChangeSink = {0x3050F64A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLCommentElement = {0x3050F20C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLCommentElement2 = {0x3050F813, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLComputedStyle = {0x3050F6C3, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLControlElement = {0x3050F4E9, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLControlRange = {0x3050F29C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLControlRange2 = {0x3050F65E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLCurrentStyle = {0x3050F3DB, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLCurrentStyle2 = {0x3050F658, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLCurrentStyle3 = {0x3050F818, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDatabinding = {0x3050F3F2, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDataTransfer = {0x3050F4B3, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDDElement = {0x3050F1F2, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDialog = {0x3050F216, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDialog2 = {0x3050F5E0, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDialog3 = {0x3050F388, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDivElement = {0x3050F200, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDivPosition = {0x3050F212, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHtmlDlgSafeHelper = {0x3050F81A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDListElement = {0x3050F1F1, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDocument = {0x626FC520, 0xA41E, 0x11CF, [0xA7, 0x31, 0x00, 0xA0, 0xC9, 0x08, 0x26, 0x37]};
+ const IID IID_IHTMLDocument2 = {0x332C4425, 0x26CB, 0x11D0, [0xB4, 0x83, 0x00, 0xC0, 0x4F, 0xD9, 0x01, 0x19]};
+ const IID IID_IHTMLDocument3 = {0x3050F485, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDocument4 = {0x3050F69A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDocument5 = {0x3050F80C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDOMAttribute = {0x3050F4B0, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDOMAttribute2 = {0x3050F810, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDOMChildrenCollection = {0x3050F5AB, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDOMImplementation = {0x3050F80D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDOMNode = {0x3050F5DA, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDOMNode2 = {0x3050F80B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDOMTextNode = {0x3050F4B1, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDOMTextNode2 = {0x3050F809, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDTElement = {0x3050F1F3, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLDXTransform = {0x30E2AB7D, 0x4FDD, 0x4159, [0xB7, 0xEA, 0xDC, 0x72, 0x2B, 0xF4, 0xAD, 0xE5]};
+ const IID IID_IHTMLEditDesigner = {0x3050F662, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLEditHost = {0x3050F6A0, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLEditHost2 = {0x3050F848, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0D]};
+ const IID IID_IHTMLEditingServices = {0x3050F7FB, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLEditor = {0x3050F7FA, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLEditServices = {0x3050F663, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLEditServices2 = {0x3050F812, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLElement = {0x3050F1FF, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLElement2 = {0x3050F434, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLElement3 = {0x3050F673, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLElement4 = {0x3050F80F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLElementCollection = {0x3050F21F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLElementCollection2 = {0x3050F5EE, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLElementCollection3 = {0x3050F835, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLElementDefaults = {0x3050F6C9, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLElementRender = {0x3050F669, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLEmbedElement = {0x3050F25F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLEventObj = {0x3050F32D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLEventObj2 = {0x3050F48B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLEventObj3 = {0x3050F680, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLEventObj4 = {0x3050F814, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLFieldSetElement = {0x3050F3E7, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLFieldSetElement2 = {0x3050F833, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLFilterPainter = {0x3050F6DE, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLFilterPaintSite = {0x3050F6D3, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLFiltersCollection = {0x3050F3EE, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLFontElement = {0x3050F1D9, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLFontNamesCollection = {0x3050F376, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLFontSizesCollection = {0x3050F377, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLFormElement = {0x3050F1F7, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLFormElement2 = {0x3050F4F6, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLFormElement3 = {0x3050F836, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLFrameBase = {0x3050F311, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLFrameBase2 = {0x3050F6DB, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLFrameBase3 = {0x3050F82E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLFrameElement = {0x3050F313, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLFrameElement2 = {0x3050F7F5, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLFramesCollection2 = {0x332C4426, 0x26CB, 0x11D0, [0xB4, 0x83, 0x00, 0xC0, 0x4F, 0xD9, 0x01, 0x19]};
+ const IID IID_IHTMLFrameSetElement = {0x3050F319, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLFrameSetElement2 = {0x3050F5C6, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLGenericElement = {0x3050F4B7, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLHeadElement = {0x3050F81D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLHeaderElement = {0x3050F1F6, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLHRElement = {0x3050F1F4, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLHtmlElement = {0x3050F81C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLIFrameElement = {0x3050F315, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLIFrameElement2 = {0x3050F4E6, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLImageElementFactory = {0x3050F38E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLImgElement = {0x3050F240, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLImgElement2 = {0x3050F826, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLInputButtonElement = {0x3050F2B2, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLInputElement = {0x3050F5D2, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLInputElement2 = {0x3050F821, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLInputFileElement = {0x3050F2AD, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLInputHiddenElement = {0x3050F2A4, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLInputImage = {0x3050F2C2, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLInputTextElement = {0x3050F2A6, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLIPrintCollection = {0x3050F6B5, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLIsIndexElement = {0x3050F206, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLIsIndexElement2 = {0x3050F82F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLLabelElement = {0x3050F32A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLLabelElement2 = {0x3050F832, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLLegendElement = {0x3050F3EA, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLLegendElement2 = {0x3050F834, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLLIElement = {0x3050F1E0, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLLinkElement = {0x3050F205, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLLinkElement2 = {0x3050F4E5, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLLinkElement3 = {0x3050F81E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLListElement = {0x3050F20E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLListElement2 = {0x3050F822, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHtmlLoadOptions = {0xA71A0808, 0x0F88, 0x11D1, [0xBA, 0x19, 0x00, 0xC0, 0x4F, 0xD9, 0x12, 0xD0]};
+ const IID IID_IHTMLLocation = {0x163BB1E0, 0x6E00, 0x11CF, [0x83, 0x7A, 0x48, 0xDC, 0x04, 0xC1, 0x00, 0x00]};
+ const IID IID_IHTMLMapElement = {0x3050F266, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLMarqueeElement = {0x3050F2B5, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLMetaElement = {0x3050F203, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLMetaElement2 = {0x3050F81F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLMimeTypesCollection = {0x3050F3FC, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLModelessInit = {0x3050F5E4, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLNamespace = {0x3050F6BB, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLNamespaceCollection = {0x3050F6B8, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLNextIdElement = {0x3050F207, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLNoShowElement = {0x3050F38A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLObjectElement = {0x3050F24F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLObjectElement2 = {0x3050F4CD, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLObjectElement3 = {0x3050F827, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLOListElement = {0x3050F1DE, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLOMWindowServices = {0x3050F5FC, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLOpsProfile = {0x3050F401, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLOptionButtonElement = {0x3050F2BC, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLOptionElement = {0x3050F211, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLOptionElement2 = {0x3050F697, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLOptionElement3 = {0x3050F820, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLOptionElementFactory = {0x3050F38C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLOptionsHolder = {0x3050F378, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLPainter = {0x3050F6A6, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLPainterEventInfo = {0x3050F6DF, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLPainterOverlay = {0x3050F7E3, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLPaintSite = {0x3050F6A7, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLParaElement = {0x3050F1F5, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLParamElement = {0x3050F83D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLPersistData = {0x3050F4C5, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLPersistDataOM = {0x3050F4C0, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLPhraseElement = {0x3050F20A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLPhraseElement2 = {0x3050F824, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLPluginsCollection = {0x3050F3FD, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLPopup = {0x3050F666, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLPrivateWindow = {0x3050F6DC, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLPrivateWindow2 = {0x3050F7E5, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLPrivateWindow3 = {0x3050F840, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLRect = {0x3050F4A3, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLRectCollection = {0x3050F4A4, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLRenderStyle = {0x3050F6AE, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLRuleStyle = {0x3050F3CF, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLRuleStyle2 = {0x3050F4AC, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLRuleStyle3 = {0x3050F657, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLRuleStyle4 = {0x3050F817, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLScreen = {0x3050F35C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLScreen2 = {0x3050F84A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLScriptElement = {0x3050F28B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLScriptElement2 = {0x3050F828, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLSelectElement = {0x3050F244, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLSelectElement2 = {0x3050F5ED, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLSelectElement3 = {0x3050F687, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLSelectElement4 = {0x3050F838, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLSelectionObject = {0x3050F25A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLSelectionObject2 = {0x3050F7EC, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLSpanElement = {0x3050F3F3, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLSpanFlow = {0x3050F3E5, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLStyle = {0x3050F25E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLStyle2 = {0x3050F4A2, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLStyle3 = {0x3050F656, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLStyle4 = {0x3050F816, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLStyleElement = {0x3050F375, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLStyleFontFace = {0x3050F3D5, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLStyleSheet = {0x3050F2E3, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLStyleSheet2 = {0x3050F3D1, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLStyleSheetPage = {0x3050F7EE, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLStyleSheetPagesCollection = {0x3050F7F0, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLStyleSheetRule = {0x3050F357, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLStyleSheetRulesCollection = {0x3050F2E5, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLStyleSheetsCollection = {0x3050F37E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLSubmitData = {0x3050F645, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTable = {0x3050F21E, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTable2 = {0x3050F4AD, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTable3 = {0x3050F829, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTableCaption = {0x3050F2EB, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTableCell = {0x3050F23D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTableCell2 = {0x3050F82D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTableCol = {0x3050F23A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTableCol2 = {0x3050F82A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTableRow = {0x3050F23C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTableRow2 = {0x3050F4A1, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTableRow3 = {0x3050F82C, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTableRowMetrics = {0x3050F413, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTableSection = {0x3050F23B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTableSection2 = {0x3050F5C7, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTableSection3 = {0x3050F82B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTextAreaElement = {0x3050F2AA, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTextContainer = {0x3050F230, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTextElement = {0x3050F218, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTextRangeMetrics = {0x3050F40B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTextRangeMetrics2 = {0x3050F4A6, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTitleElement = {0x3050F322, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTxtRange = {0x3050F220, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLTxtRangeCollection = {0x3050F7ED, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLUListElement = {0x3050F1DD, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLUniqueName = {0x3050F4D0, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLUnknownElement = {0x3050F209, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLUrnCollection = {0x3050F5E2, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLUserDataOM = {0x3050F48F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLViewFilter = {0x3050F2F1, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLViewFilterSite = {0x3050F2F4, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLWindow2 = {0x332C4427, 0x26CB, 0x11D0, [0xB4, 0x83, 0x00, 0xC0, 0x4F, 0xD9, 0x01, 0x19]};
+ const IID IID_IHTMLWindow3 = {0x3050F4AE, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHTMLWindow4 = {0x3050F6CF, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IHttpNegotiate = {0x79EAC9D2, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IHttpNegotiate2 = {0x4F9F9FCB, 0xE0F4, 0x48EB, [0xB7, 0xAB, 0xFA, 0x2E, 0xA9, 0x36, 0x5C, 0xB4]};
+ const IID IID_IHttpSecurity = {0x79EAC9D7, 0xBAFA, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IHWEventHandler = {0xC1FB73D0, 0xEC3A, 0x4BA2, [0xB5, 0x12, 0x8C, 0xDB, 0x91, 0x87, 0xB6, 0xD1]};
+ const IID IID_IImageDecodeEventSink = {0xBAA342A0, 0x2DED, 0x11D0, [0x86, 0xF4, 0x00, 0xA0, 0xC9, 0x13, 0xF7, 0x50]};
+ const IID IID_IImageDecodeFilter = {0xA3CCEDF3, 0x2DE2, 0x11D0, [0x86, 0xF4, 0x00, 0xA0, 0xC9, 0x13, 0xF7, 0x50]};
+ const IID IID_IImageList = {0x46EB5926, 0x582E, 0x4017, [0x9F, 0xDF, 0xE8, 0x99, 0x8D, 0xAA, 0x09, 0x50]};
+ const IID IID_IIMEServices = {0x3050F6CA, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IImgCtx = {0x3050F3D7, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IIndexDefinition = {0x0C733A68, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IInputObject = {0x68284FAA, 0x6A48, 0x11D0, [0x8C, 0x78, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xB4]};
+ const IID IID_IInputObjectSite = {0xF1DB8392, 0x7331, 0x11D0, [0x8C, 0x99, 0x00, 0xA0, 0xC9, 0x2D, 0xBF, 0xE8]};
+ const IID IID_IIntDitherer = {0x06670CA0, 0xECEF, 0x11D0, [0xAA, 0xE7, 0x00, 0xC0, 0x4F, 0xC9, 0xB3, 0x04]};
+ const IID IID_IIntelliForms = {0x9B9F68E6, 0x1AAA, 0x11D2, [0xBC, 0xA5, 0x00, 0xC0, 0x4F, 0xD9, 0x29, 0xDB]};
+ const IID IID_IInterfaceRelated = {0xD1FB5A79, 0x7706, 0x11D1, [0xAD, 0xBA, 0x00, 0xC0, 0x4F, 0xC2, 0xAD, 0xC0]};
+ const IID IID_IInternalMoniker = {0x00000011, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IInternalUnknown = {0x00000021, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IInternet = {0x79EAC9E0, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IInternetBindInfo = {0x79EAC9E1, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IInternetConnectionDevice = {0x04DF6137, 0x5610, 0x11D4, [0x9E, 0xC8, 0x00, 0xB0, 0xD0, 0x22, 0xDD, 0x1F]};
+ const IID IID_IInternetConnectionDeviceClient = {0x04DF6139, 0x5610, 0x11D4, [0x9E, 0xC8, 0x00, 0xB0, 0xD0, 0x22, 0xDD, 0x1F]};
+ const IID IID_IInternetConnectionDeviceSharedCo = {0x04DF6138, 0x5610, 0x11D4, [0x9E, 0xC8, 0x00, 0xB0, 0xD0, 0x22, 0xDD, 0x1F]};
+ const IID IID_IInternetHostSecurityManager = {0x3AF280B6, 0xCB3F, 0x11D0, [0x89, 0x1E, 0x00, 0xC0, 0x4F, 0xB6, 0xBF, 0xC4]};
+ const IID IID_IInternetPriority = {0x79EAC9EB, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IInternetProtocol = {0x79EAC9E4, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IInternetProtocolInfo = {0x79EAC9EC, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IInternetProtocolRoot = {0x79EAC9E3, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IInternetProtocolSink = {0x79EAC9E5, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IInternetProtocolSinkStackable = {0x79EAC9F0, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IInternetSecurityManager = {0x79EAC9EE, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IInternetSecurityMgrSite = {0x79EAC9ED, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IInternetSession = {0x79EAC9E7, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IInternetThreadSwitch = {0x79EAC9E8, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IInternetZoneManager = {0x79EAC9EF, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IIpxAdapterInfo = {0x98133270, 0x4B20, 0x11D1, [0xAB, 0x01, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_IItemNameLimits = {0x1DF0D7F1, 0xB267, 0x4D28, [0x8B, 0x10, 0x12, 0xE2, 0x32, 0x02, 0xA5, 0xC4]};
+ const IID IID_IJolietDiscMaster = {0xE3BC42CE, 0x4E5C, 0x11D3, [0x91, 0x44, 0x00, 0x10, 0x4B, 0xA1, 0x1C, 0x5E]};
+ const IID IID_IKeyFrameControl = {0xC3341386, 0xAF91, 0x4EF9, [0x83, 0xB6, 0xBE, 0x37, 0x62, 0xE4, 0x2E, 0xCB]};
+ const IID IID_IKsControl = {0x28F54685, 0x06FD, 0x11D2, [0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96]};
+ const IID IID_IKsPropertySet = {0x31EFAC30, 0x515C, 0x11D0, [0xA9, 0xAA, 0x00, 0xAA, 0x00, 0x61, 0xBE, 0x93]};
+ const IID IID_ILayoutRect = {0x3050F665, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ILayoutStorage = {0x0E6D4D90, 0x6738, 0x11CF, [0x96, 0x08, 0x00, 0xAA, 0x00, 0x68, 0x0D, 0xB4]};
+ const IID IID_ILineInfo = {0x3050F7E2, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ILocalMachine = {0x60664CAF, 0xAF0D, 0x1005, [0xA3, 0x00, 0x5C, 0x7D, 0x25, 0xFF, 0x22, 0xA0]};
+ const IID IID_ILockBytes = {0x0000000A, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ILogger = {0xD9598418, 0x304E, 0x4F94, [0xB6, 0xA1, 0xE6, 0x42, 0xFE, 0x95, 0xED, 0x57]};
+ const IID IID_ILogManager = {0x4759DC11, 0x8DA0, 0x4261, [0xBB, 0xFB, 0xEC, 0x32, 0x19, 0x11, 0xD1, 0xC9]};
+ const IID IID_ILogonEnumUsers = {0x60664CAF, 0xAF0D, 0x1004, [0xA3, 0x00, 0x5C, 0x7D, 0x25, 0xFF, 0x22, 0xA0]};
+ const IID IID_ILogonStatusHost = {0x60664CAF, 0xAF0D, 0x1007, [0xA3, 0x00, 0x5C, 0x7D, 0x25, 0xFF, 0x22, 0xA0]};
+ const IID IID_ILogonUser = {0x60664CAF, 0xAF0D, 0x1003, [0xA3, 0x00, 0x5C, 0x7D, 0x25, 0xFF, 0x22, 0xA0]};
+ const IID IID_IMachineDebugManager = {0x51973C2C, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IMachineDebugManagerCookie = {0x51973C2D, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IMachineDebugManagerEvents = {0x51973C2E, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IMailAutoDiscovery = {0x80402DEE, 0xB114, 0x4D32, [0xB4, 0x4E, 0x82, 0xFD, 0x82, 0x34, 0xC9, 0x2A]};
+ const IID IID_IMailProtocolADEntry = {0x40EF8C68, 0xD554, 0x47ED, [0xAA, 0x37, 0xE5, 0xFB, 0x6B, 0xC9, 0x10, 0x75]};
+ const IID IID_IMalloc = {0x00000002, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IMallocSpy = {0x0000001D, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IMapMIMEToCLSID = {0xD9E89500, 0x30FA, 0x11D0, [0xB7, 0x24, 0x00, 0xAA, 0x00, 0x6C, 0x1A, 0x01]};
+ const IID IID_IMarkupContainer = {0x3050F5F9, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IMarkupContainer2 = {0x3050F648, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IMarkupPointer = {0x3050F49F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IMarkupPointer2 = {0x3050F675, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IMarkupServices = {0x3050F4A0, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IMarkupServices2 = {0x3050F682, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IMarkupTextFrags = {0x3050F5FA, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IMarshal = {0x00000003, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IMarshal2 = {0x000001CF, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IMcastAddressAllocation = {0xDF0DAEF1, 0xA289, 0x11D1, [0x86, 0x97, 0x00, 0x60, 0x08, 0xB0, 0xE5, 0xD2]};
+ const IID IID_IMcastLeaseInfo = {0xDF0DAEFD, 0xA289, 0x11D1, [0x86, 0x97, 0x00, 0x60, 0x08, 0xB0, 0xE5, 0xD2]};
+ const IID IID_IMcastScope = {0xDF0DAEF4, 0xA289, 0x11D1, [0x86, 0x97, 0x00, 0x60, 0x08, 0xB0, 0xE5, 0xD2]};
+ const IID IID_IMDDataset = {0xA07CCCD1, 0x8148, 0x11D0, [0x87, 0xBB, 0x00, 0xC0, 0x4F, 0xC3, 0x39, 0x42]};
+ const IID IID_IMDFind = {0xA07CCCD2, 0x8148, 0x11D0, [0x87, 0xBB, 0x00, 0xC0, 0x4F, 0xC3, 0x39, 0x42]};
+ const IID IID_IMDRangeRowset = {0x0C733AA0, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IMessageFilter = {0x00000016, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IMigrationWizardAuto = {0xCE20DAB9, 0xB353, 0x469B, [0x8B, 0x4D, 0x6D, 0xBB, 0x3A, 0x7B, 0xA0, 0x16]};
+ const IID IID_IMimeInfo = {0xF77459A0, 0xBF9A, 0x11CF, [0xBA, 0x4E, 0x00, 0xC0, 0x4F, 0xD7, 0x08, 0x16]};
+ const IID IID_IMLangCodePages = {0x359F3443, 0xBD4A, 0x11D0, [0xB1, 0x88, 0x00, 0xAA, 0x00, 0x38, 0xC9, 0x69]};
+ const IID IID_IMLangConvertCharset = {0xD66D6F98, 0xCDAA, 0x11D0, [0xB8, 0x22, 0x00, 0xC0, 0x4F, 0xC9, 0xB3, 0x1F]};
+ const IID IID_IMLangFontLink = {0x359F3441, 0xBD4A, 0x11D0, [0xB1, 0x88, 0x00, 0xAA, 0x00, 0x38, 0xC9, 0x69]};
+ const IID IID_IMLangFontLink2 = {0xDCCFC162, 0x2B38, 0x11D2, [0xB7, 0xEC, 0x00, 0xC0, 0x4F, 0x8F, 0x5D, 0x9A]};
+ const IID IID_IMLangLineBreakConsole = {0xF5BE2EE1, 0xBFD7, 0x11D0, [0xB1, 0x88, 0x00, 0xAA, 0x00, 0x38, 0xC9, 0x69]};
+ const IID IID_IMLangString = {0xC04D65CE, 0xB70D, 0x11D0, [0xB1, 0x88, 0x00, 0xAA, 0x00, 0x38, 0xC9, 0x69]};
+ const IID IID_IMLangStringAStr = {0xC04D65D2, 0xB70D, 0x11D0, [0xB1, 0x88, 0x00, 0xAA, 0x00, 0x38, 0xC9, 0x69]};
+ const IID IID_IMLangStringBufA = {0xD24ACD23, 0xBA72, 0x11D0, [0xB1, 0x88, 0x00, 0xAA, 0x00, 0x38, 0xC9, 0x69]};
+ const IID IID_IMLangStringBufW = {0xD24ACD21, 0xBA72, 0x11D0, [0xB1, 0x88, 0x00, 0xAA, 0x00, 0x38, 0xC9, 0x69]};
+ const IID IID_IMLangStringWStr = {0xC04D65D0, 0xB70D, 0x11D0, [0xB1, 0x88, 0x00, 0xAA, 0x00, 0x38, 0xC9, 0x69]};
+ const IID IID_IMofCompiler = {0x6DAF974E, 0x2E37, 0x11D2, [0xAE, 0xC9, 0x00, 0xC0, 0x4F, 0xB6, 0x88, 0x20]};
+ const IID IID_IMoniker = {0x0000000F, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IMonikerProp = {0xA5CA5F7F, 0x1847, 0x4D87, [0x9C, 0x5B, 0x91, 0x85, 0x09, 0xF7, 0x51, 0x1D]};
+ const IID IID_IMountedVolume = {0x12518492, 0x00B2, 0x11D2, [0x9F, 0xA5, 0x9E, 0x34, 0x20, 0x52, 0x41, 0x53]};
+ const IID IID_IMulticastControl = {0x410FA507, 0x4DC6, 0x415A, [0x90, 0x14, 0x63, 0x38, 0x75, 0xD5, 0x40, 0x6E]};
+ const IID IID_IMultiLanguage = {0x275C23E1, 0x3747, 0x11D0, [0x9F, 0xEA, 0x00, 0xAA, 0x00, 0x3F, 0x86, 0x46]};
+ const IID IID_IMultiLanguage2 = {0xDCCFC164, 0x2B38, 0x11D2, [0xB7, 0xEC, 0x00, 0xC0, 0x4F, 0x8F, 0x5D, 0x9A]};
+ const IID IID_IMultiLanguage3 = {0x4E5868AB, 0xB157, 0x4623, [0x9A, 0xCC, 0x6A, 0x1D, 0x9C, 0xAE, 0xBE, 0x04]};
+ const IID IID_IMultiplePropertyAccess = {0xEC81FEDE, 0xD432, 0x11CE, [0x92, 0x44, 0x00, 0x20, 0xAF, 0x6E, 0x72, 0xDB]};
+ const IID IID_IMultipleResults = {0x0C733A90, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IMultiQI = {0x00000020, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_INamedPropertyBag = {0xFB700430, 0x952C, 0x11D1, [0x94, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]};
+ const IID IID_INATEventManager = {0x624BD588, 0x9060, 0x4109, [0xB0, 0xB0, 0x1A, 0xDB, 0xBC, 0xAC, 0x32, 0xDF]};
+ const IID IID_INATExternalIPAddressCallback = {0x9C416740, 0xA34E, 0x446F, [0xBA, 0x06, 0xAB, 0xD0, 0x4C, 0x31, 0x49, 0xAE]};
+ const IID IID_INATNumberOfEntriesCallback = {0xC83A0A74, 0x91EE, 0x41B6, [0xB6, 0x7A, 0x67, 0xE0, 0xF0, 0x0B, 0xBD, 0x78]};
+ const IID IID_INetCfg = {0xC0E8AE93, 0x306E, 0x11D1, [0xAA, 0xCF, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetCfgBindingInterface = {0xC0E8AE94, 0x306E, 0x11D1, [0xAA, 0xCF, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetCfgBindingPath = {0xC0E8AE96, 0x306E, 0x11D1, [0xAA, 0xCF, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetCfgClass = {0xC0E8AE97, 0x306E, 0x11D1, [0xAA, 0xCF, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetCfgClassSetup = {0xC0E8AE9D, 0x306E, 0x11D1, [0xAA, 0xCF, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetCfgComponent = {0xC0E8AE99, 0x306E, 0x11D1, [0xAA, 0xCF, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetCfgComponentBindings = {0xC0E8AE9E, 0x306E, 0x11D1, [0xAA, 0xCF, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetCfgComponentControl = {0x932238DF, 0xBEA1, 0x11D0, [0x92, 0x98, 0x00, 0xC0, 0x4F, 0xC9, 0x9D, 0xCF]};
+ const IID IID_INetCfgComponentNotifyBinding = {0x932238E1, 0xBEA1, 0x11D0, [0x92, 0x98, 0x00, 0xC0, 0x4F, 0xC9, 0x9D, 0xCF]};
+ const IID IID_INetCfgComponentNotifyGlobal = {0x932238E2, 0xBEA1, 0x11D0, [0x92, 0x98, 0x00, 0xC0, 0x4F, 0xC9, 0x9D, 0xCF]};
+ const IID IID_INetCfgComponentPrivate = {0x98133273, 0x4B20, 0x11D1, [0xAB, 0x01, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetCfgComponentPropertyUi = {0x932238E0, 0xBEA1, 0x11D0, [0x92, 0x98, 0x00, 0xC0, 0x4F, 0xC9, 0x9D, 0xCF]};
+ const IID IID_INetCfgComponentSetup = {0x932238E3, 0xBEA1, 0x11D0, [0x92, 0x98, 0x00, 0xC0, 0x4F, 0xC9, 0x9D, 0xCF]};
+ const IID IID_INetCfgComponentSysPrep = {0xC0E8AE9A, 0x306E, 0x11D1, [0xAA, 0xCF, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetCfgComponentUpperEdge = {0x932238E4, 0xBEA1, 0x11D0, [0x92, 0x98, 0x00, 0xC0, 0x4F, 0xC9, 0x9D, 0xCF]};
+ const IID IID_INetCfgInternalSetup = {0x98133276, 0x4B20, 0x11D1, [0xAB, 0x01, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetCfgLock = {0xC0E8AE9F, 0x306E, 0x11D1, [0xAA, 0xCF, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetCfgPnpReconfigCallback = {0x8D84BD35, 0xE227, 0x11D2, [0xB7, 0x00, 0x00, 0xA0, 0xC9, 0x8A, 0x6A, 0x85]};
+ const IID IID_INetCfgSpecialCase = {0xC0E8AE95, 0x306E, 0x11D1, [0xAA, 0xCF, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetCfgSysPrep = {0xC0E8AE98, 0x306E, 0x11D1, [0xAA, 0xCF, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetConnection = {0xC08956A1, 0x1CD3, 0x11D1, [0xB1, 0xC5, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetConnection2 = {0xFAEDCF6A, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetConnectionBrandingInfo = {0xFAEDCF5B, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetConnectionCMUtil = {0xFAEDCF60, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetConnectionCommonUi = {0xC08956A5, 0x1CD3, 0x11D1, [0xB1, 0xC5, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetConnectionConnectUi = {0xC08956A3, 0x1CD3, 0x11D1, [0xB1, 0xC5, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetConnectionHNetUtil = {0xFAEDCF64, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetConnectionManager = {0xC08956A2, 0x1CD3, 0x11D1, [0xB1, 0xC5, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetConnectionManager2 = {0xFAEDCF69, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetConnectionManagerDebug = {0xFAEDCF5D, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetConnectionManagerEvents = {0xC08956BA, 0x1CD3, 0x11D1, [0xB1, 0xC5, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetConnectionNotifySink = {0xFAEDCF5C, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetConnectionPropertyUi = {0xC08956A4, 0x1CD3, 0x11D1, [0xB1, 0xC5, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetConnectionPropertyUi2 = {0xC08956B9, 0x1CD3, 0x11D1, [0xB1, 0xC5, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetConnectionProps = {0xF4277C95, 0xCE5B, 0x463D, [0x81, 0x67, 0x56, 0x62, 0xD9, 0xBC, 0xAA, 0x72]};
+ const IID IID_INetConnectionRefresh = {0xFAEDCF5F, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetConnectionSysTray = {0xFAEDCF65, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetConnectionUiLock = {0xFAEDCF50, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetConnectionUiUtilities = {0xFAEDCF5E, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetConnectionWizardUi = {0xFAEDCF51, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetConnectionWizardUiContext = {0xFAEDCF52, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetCrawler = {0x49C929EE, 0xA1B7, 0x4C58, [0xB5, 0x39, 0xE6, 0x3B, 0xE3, 0x92, 0xB6, 0xF3]};
+ const IID IID_INetDefaultConnection = {0xFAEDCF66, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetInboundConnection = {0xFAEDCF53, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetInstallQueue = {0x98133274, 0x4B20, 0x11D1, [0xAB, 0x01, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetLanConnection = {0xFAEDCF54, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetLanConnectionUiInfo = {0xC08956A6, 0x1CD3, 0x11D1, [0xB1, 0xC5, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetLanConnectionWizardUi = {0xFAEDCF56, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetMachinePolicies = {0xFAEDCF68, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetRasConnection = {0xFAEDCF57, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetRasConnectionIpUiInfo = {0xFAEDCF58, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetSharedAccessConnection = {0xFAEDCF55, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetSharingConfiguration = {0xC08956B6, 0x1CD3, 0x11D1, [0xB1, 0xC5, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetSharingEveryConnectionCollect = {0x33C4643C, 0x7811, 0x46FA, [0xA8, 0x9A, 0x76, 0x85, 0x97, 0xBD, 0x72, 0x23]};
+ const IID IID_INetSharingManager = {0xC08956B7, 0x1CD3, 0x11D1, [0xB1, 0xC5, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetSharingPortMapping = {0xC08956B1, 0x1CD3, 0x11D1, [0xB1, 0xC5, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_INetSharingPortMappingCollection = {0x02E4A2DE, 0xDA20, 0x4E34, [0x89, 0xC8, 0xAC, 0x22, 0x27, 0x5A, 0x01, 0x0B]};
+ const IID IID_INetSharingPortMappingProps = {0x24B7E9B5, 0xE38F, 0x4685, [0x85, 0x1B, 0x00, 0x89, 0x2C, 0xF5, 0xF9, 0x40]};
+ const IID IID_INetSharingPrivateConnectionColle = {0x38AE69E0, 0x4409, 0x402A, [0xA2, 0xCB, 0xE9, 0x65, 0xC7, 0x27, 0xF8, 0x40]};
+ const IID IID_INetSharingPublicConnectionCollec = {0x7D7A6355, 0xF372, 0x4971, [0xA1, 0x49, 0xBF, 0xC9, 0x27, 0xBE, 0x76, 0x2A]};
+ const IID IID_INewShortcutHookA = {0x000214E1, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_INewShortcutHookW = {0x000214F7, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_INewWDEvents = {0x0751C551, 0x7568, 0x41C9, [0x8E, 0x5B, 0xE2, 0x2E, 0x38, 0x91, 0x92, 0x36]};
+ const IID IID_INotification = {0xC733E4A3, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID IID_INotificationHelper = {0xC733E4AB, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID IID_INotificationManager = {0x95531501, 0x8782, 0x4845, [0x90, 0x1D, 0x31, 0x2F, 0x36, 0xBA, 0x6C, 0x6E]};
+ const IID IID_INotificationMgr = {0xC733E4A4, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID IID_INotificationPing = {0xC733E4AC, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID IID_INotificationProcessMgr0 = {0xC733E4AE, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID IID_INotificationReport = {0xC733E4A7, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID IID_INotificationRunning = {0xC733E4AD, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID IID_INotificationSink = {0xC733E4A5, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID IID_INotifyDBEvents = {0xDB526CC0, 0xD188, 0x11CD, [0xAD, 0x48, 0x00, 0xAA, 0x00, 0x3C, 0x9C, 0xB6]};
+ const IID IID_INotifyReplica = {0x99180163, 0xDA16, 0x101A, [0x93, 0x5C, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID IID_INotifyUI = {0xE5E8D401, 0x1A37, 0x4FBF, [0x88, 0x0C, 0x82, 0x6C, 0xC8, 0x95, 0x16, 0xFD]};
+ const IID IID_IObjectAccessControl = {0x0C733AA3, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IObjectIdentity = {0xCA04B7E6, 0x0D21, 0x11D1, [0x8C, 0xC5, 0x00, 0xC0, 0x4F, 0xC2, 0xB0, 0x85]};
+ const IID IID_IObjectManager = {0xD51351DF, 0x6394, 0x4236, [0x97, 0x83, 0x65, 0xED, 0x05, 0x63, 0x10, 0x68]};
+ const IID IID_IObjectSafety = {0xCB5BDC81, 0x93C1, 0x11CF, [0x8F, 0x20, 0x00, 0x80, 0x5F, 0x2C, 0xD0, 0x64]};
+ const IID IID_IObjectWithSite = {0xFC4801A3, 0x2BA9, 0x11CF, [0xA2, 0x29, 0x00, 0xAA, 0x00, 0x3D, 0x73, 0x52]};
+ const IID IID_IObjMgr = {0x00BB2761, 0x6A77, 0x11D0, [0xA5, 0x35, 0x00, 0xC0, 0x4F, 0xD7, 0xD0, 0x62]};
+ const IID IID_IOInet = {0x79EAC9E0, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IOInetBindClient = {0x79EAC9E2, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IOInetBindInfo = {0x79EAC9E1, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IOInetCache = {0x79EAC9EA, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IOInetPriority = {0x79EAC9EB, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IOInetProtocol = {0x79EAC9E4, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IOInetProtocolInfo = {0x79EAC9EC, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IOInetProtocolRoot = {0x79EAC9E3, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IOInetProtocolSink = {0x79EAC9E5, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IOInetSession = {0x79EAC967, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IOInetThreadSwitch = {0x79EAC968, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IOldSyncMgrRegister = {0x894D8C55, 0xBDDF, 0x11D1, [0xB8, 0x5D, 0x00, 0xC0, 0x4F, 0xB9, 0x39, 0x81]};
+ const IID IID_IOldSyncMgrSynchronize = {0x6295DF28, 0x35EE, 0x11D1, [0x87, 0x07, 0x00, 0xC0, 0x4F, 0xD9, 0x33, 0x27]};
+ const IID IID_IOldSyncMgrSynchronizeCallback = {0x6295DF29, 0x35EE, 0x11D1, [0x87, 0x07, 0x00, 0xC0, 0x4F, 0xD9, 0x33, 0x27]};
+ const IID IID_IOleAdviseHolder = {0x00000111, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IOleCache = {0x0000011E, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IOleCache2 = {0x00000128, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IOleCacheControl = {0x00000129, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IOleClientSite = {0x00000118, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IOleCommandTarget = {0xB722BCCB, 0x4E68, 0x101B, [0xA2, 0xBC, 0x00, 0xAA, 0x00, 0x40, 0x47, 0x70]};
+ const IID IID_IOleContainer = {0x0000011B, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IOleControl = {0xB196B288, 0xBAB4, 0x101A, [0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07]};
+ const IID IID_IOleControlSite = {0xB196B289, 0xBAB4, 0x101A, [0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07]};
+ const IID IID_IOleDocument = {0xB722BCC5, 0x4E68, 0x101B, [0xA2, 0xBC, 0x00, 0xAA, 0x00, 0x40, 0x47, 0x70]};
+ const IID IID_IOleDocumentSite = {0xB722BCC7, 0x4E68, 0x101B, [0xA2, 0xBC, 0x00, 0xAA, 0x00, 0x40, 0x47, 0x70]};
+ const IID IID_IOleDocumentView = {0xB722BCC6, 0x4E68, 0x101B, [0xA2, 0xBC, 0x00, 0xAA, 0x00, 0x40, 0x47, 0x70]};
+ const IID IID_IOleInPlaceActiveObject = {0x00000117, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IOleInPlaceFrame = {0x00000116, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IOleInPlaceObject = {0x00000113, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IOleInPlaceObjectWindowless = {0x1C2056CC, 0x5EF4, 0x101B, [0x8B, 0xC8, 0x00, 0xAA, 0x00, 0x3E, 0x3B, 0x29]};
+ const IID IID_IOleInPlaceSite = {0x00000119, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IOleInPlaceSiteEx = {0x9C2CAD80, 0x3424, 0x11CF, [0xB6, 0x70, 0x00, 0xAA, 0x00, 0x4C, 0xD6, 0xD8]};
+ const IID IID_IOleInPlaceSiteWindowless = {0x922EADA0, 0x3424, 0x11CF, [0xB6, 0x70, 0x00, 0xAA, 0x00, 0x4C, 0xD6, 0xD8]};
+ const IID IID_IOleInPlaceUIWindow = {0x00000115, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IOleItemContainer = {0x0000011C, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IOleLink = {0x0000011D, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IOleManager = {0x0000011F, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IOleObject = {0x00000112, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IOleParentUndoUnit = {0xA1FAF330, 0xEF97, 0x11CE, [0x9B, 0xC9, 0x00, 0xAA, 0x00, 0x60, 0x8E, 0x01]};
+ const IID IID_IOlePresObj = {0x00000120, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IOleUndoManager = {0xD001F200, 0xEF97, 0x11CE, [0x9B, 0xC9, 0x00, 0xAA, 0x00, 0x60, 0x8E, 0x01]};
+ const IID IID_IOleUndoUnit = {0x894AD3B0, 0xEF97, 0x11CE, [0x9B, 0xC9, 0x00, 0xAA, 0x00, 0x60, 0x8E, 0x01]};
+ const IID IID_IOleWindow = {0x00000114, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IOmHistory = {0xFECEAAA2, 0x8405, 0x11CF, [0x8B, 0xA1, 0x00, 0xAA, 0x00, 0x47, 0x6D, 0xA6]};
+ const IID IID_IOmNavigator = {0xFECEAAA5, 0x8405, 0x11CF, [0x8B, 0xA1, 0x00, 0xAA, 0x00, 0x47, 0x6D, 0xA6]};
+ const IID IID_IOpaqueDataInfo = {0x000001A9, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IOpenRowset = {0x0C733A69, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IOplockStorage = {0x8D19C834, 0x8879, 0x11D1, [0x83, 0xE9, 0x00, 0xC0, 0x4F, 0xC2, 0xC6, 0xD4]};
+ const IID IID_IOpsProfileSimple = {0x7DD1362C, 0x28B6, 0x11D2, [0xBC, 0xA7, 0x00, 0xC0, 0x4F, 0xD9, 0x29, 0xDB]};
+ const IID IID_IOptionArray = {0x22B6D492, 0x0F88, 0x11D1, [0xBA, 0x19, 0x00, 0xC0, 0x4F, 0xD9, 0x12, 0xD0]};
+ const IID IID_IOverlappedCompletion = {0x521A28F0, 0xE40B, 0x11CE, [0xB2, 0xC9, 0x00, 0xAA, 0x00, 0x68, 0x09, 0x37]};
+ const IID IID_IOverlappedStream = {0x49384070, 0xE40A, 0x11CE, [0xB2, 0xC9, 0x00, 0xAA, 0x00, 0x68, 0x09, 0x37]};
+ const IID IID_IParentRowset = {0x0C733AAA, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IParseDisplayName = {0x0000011A, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IParser = {0x186442B0, 0x472E, 0x11D1, [0x89, 0x52, 0x00, 0xC0, 0x4F, 0xD6, 0x11, 0xD7]};
+ const IID IID_IParserSession = {0x186442B1, 0x472E, 0x11D1, [0x89, 0x52, 0x00, 0xC0, 0x4F, 0xD6, 0x11, 0xD7]};
+ const IID IID_IParserTreeProperties = {0x186442B2, 0x472E, 0x11D1, [0x89, 0x52, 0x00, 0xC0, 0x4F, 0xD6, 0x11, 0xD7]};
+ const IID IID_IParserVerify = {0x186442B3, 0x472E, 0x11D1, [0x89, 0x52, 0x00, 0xC0, 0x4F, 0xD6, 0x11, 0xD7]};
+ const IID IID_IPassportClientServices = {0xB30F7305, 0x5967, 0x45D1, [0xB7, 0xBC, 0xD6, 0xEB, 0x71, 0x63, 0xD7, 0x70]};
+ const IID IID_IPeerFactory = {0x6663F9D3, 0xB482, 0x11D1, [0x89, 0xC6, 0x00, 0xC0, 0x4F, 0xB6, 0xBF, 0xC4]};
+ const IID IID_IPendingProxyConnection = {0xB68E5043, 0x3E3D, 0x4CC2, [0xB9, 0xC1, 0x5F, 0x8F, 0x88, 0xFE, 0xE8, 0x1C]};
+ const IID IID_IPerPropertyBrowsing = {0x376BD3AA, 0x3845, 0x101B, [0x84, 0xED, 0x08, 0x00, 0x2B, 0x2E, 0xC7, 0x13]};
+ const IID IID_IPerPropertyBrowsing2 = {0x51973C54, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IPersist = {0x0000010C, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IPersistentDataChannel = {0xA180E934, 0xD92A, 0x415D, [0x91, 0x44, 0x75, 0x9F, 0x80, 0x54, 0xE8, 0xF6]};
+ const IID IID_IPersistFile = {0x0000010B, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IPersistFolder = {0x000214EA, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IPersistFolder2 = {0x1AC3D9F0, 0x175C, 0x11D1, [0x95, 0xBE, 0x00, 0x60, 0x97, 0x97, 0xEA, 0x4F]};
+ const IID IID_IPersistFolder3 = {0xCEF04FDF, 0xFE72, 0x11D2, [0x87, 0xA5, 0x00, 0xC0, 0x4F, 0x68, 0x37, 0xCF]};
+ const IID IID_IPersistHistory = {0x91A565C1, 0xE38F, 0x11D0, [0x94, 0xBF, 0x00, 0xA0, 0xC9, 0x05, 0x5C, 0xBF]};
+ const IID IID_IPersistIDList = {0x1079ACFC, 0x29BD, 0x11D3, [0x8E, 0x0D, 0x00, 0xC0, 0x4F, 0x68, 0x37, 0xD5]};
+ const IID IID_IPersistMemory = {0xBD1AE5E0, 0xA6AE, 0x11CE, [0xBD, 0x37, 0x50, 0x42, 0x00, 0xC1, 0x00, 0x00]};
+ const IID IID_IPersistMoniker = {0x79EAC9C9, 0xBAF9, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IPersistNetConnection = {0xFAEDCF59, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_IPersistPropertyBag = {0x37D84F60, 0x42CB, 0x11CE, [0x81, 0x35, 0x00, 0xAA, 0x00, 0x4B, 0xB8, 0x51]};
+ const IID IID_IPersistPropertyBag2 = {0x22F55881, 0x280B, 0x11D0, [0xA8, 0xA9, 0x00, 0xA0, 0xC9, 0x0C, 0x20, 0x04]};
+ const IID IID_IPersistQuery = {0x1A3114B8, 0xA62E, 0x11D0, [0xA6, 0xC5, 0x00, 0xA0, 0xC9, 0x06, 0xAF, 0x45]};
+ const IID IID_IPersistStorage = {0x0000010A, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IPersistStream = {0x00000109, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IPersistStreamInit = {0x7FD52380, 0x4E07, 0x101B, [0xAE, 0x2D, 0x08, 0x00, 0x2B, 0x2E, 0xC7, 0x13]};
+ const IID IID_IPhraseSink = {0xCC906FF0, 0xC058, 0x101A, [0xB5, 0x54, 0x08, 0x00, 0x2B, 0x33, 0xB0, 0xE6]};
+ const IID IID_IPicture = {0x7BF80980, 0xBF32, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID IID_IPictureDisp = {0x7BF80981, 0xBF32, 0x101A, [0x8B, 0xBB, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID IID_IPipeByte = {0xDB2F3ACA, 0x2F86, 0x11D1, [0x8E, 0x04, 0x00, 0xC0, 0x4F, 0xB9, 0x98, 0x9A]};
+ const IID IID_IPipeDouble = {0xDB2F3ACE, 0x2F86, 0x11D1, [0x8E, 0x04, 0x00, 0xC0, 0x4F, 0xB9, 0x98, 0x9A]};
+ const IID IID_IPipeLong = {0xDB2F3ACC, 0x2F86, 0x11D1, [0x8E, 0x04, 0x00, 0xC0, 0x4F, 0xB9, 0x98, 0x9A]};
+ const IID IID_IPointerInactive = {0x55980BA0, 0x35AA, 0x11CF, [0xB6, 0x71, 0x00, 0xAA, 0x00, 0x4C, 0xD6, 0xD8]};
+ const IID IID_IPrimaryControlChannel = {0x1A2E8B62, 0x9012, 0x4BE6, [0x84, 0xAE, 0x32, 0xBD, 0x66, 0xBA, 0x65, 0x7A]};
+ const IID IID_IPrint = {0xB722BCC9, 0x4E68, 0x101B, [0xA2, 0xBC, 0x00, 0xAA, 0x00, 0x40, 0x47, 0x70]};
+ const IID IID_IPrintDialogCallback = {0x5852A2C3, 0x6530, 0x11D1, [0xB6, 0xA3, 0x00, 0x00, 0xF8, 0x75, 0x7B, 0xF9]};
+ const IID IID_IPrintDialogServices = {0x509AAEDA, 0x5639, 0x11D1, [0xB6, 0xA1, 0x00, 0x00, 0xF8, 0x75, 0x7B, 0xF9]};
+ const IID IID_IPrivacyServices = {0x3050F84B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IPrivateDispatch = {0x86AB4BBE, 0x65F6, 0x11D1, [0x8C, 0x13, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID IID_IPrivateUnknown = {0x89126BAB, 0x6EAD, 0x11D1, [0x8C, 0x18, 0x00, 0xC0, 0x4F, 0xD8, 0xD5, 0x03]};
+ const IID IID_IPrivSyncMgrSynchronizeInvoke = {0x6295DF2E, 0x35EE, 0x11D1, [0x87, 0x07, 0x00, 0xC0, 0x4F, 0xD9, 0x33, 0x27]};
+ const IID IID_IProcessDebugManager = {0x51973C2F, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IProcessDebugManager32 = {0x51973C2F, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IProcessDebugManager64 = {0x56B9FC1C, 0x63A9, 0x4CC1, [0xAC, 0x21, 0x08, 0x7D, 0x69, 0xA1, 0x7F, 0xAB]};
+ const IID IID_IProcessInitControl = {0x72380D55, 0x8D2B, 0x43A3, [0x85, 0x13, 0x2B, 0x6E, 0xF3, 0x14, 0x34, 0xE9]};
+ const IID IID_IProfferService = {0xCB728B20, 0xF786, 0x11CE, [0x92, 0xAD, 0x00, 0xAA, 0x00, 0xA7, 0x4C, 0xD0]};
+ const IID IID_IProgressDialog = {0xEBBC7C04, 0x315E, 0x11D2, [0xB6, 0x2F, 0x00, 0x60, 0x97, 0xDF, 0x5B, 0xD4]};
+ const IID IID_IProgressNotify = {0xA9D758A0, 0x4617, 0x11CF, [0x95, 0xFC, 0x00, 0xAA, 0x00, 0x68, 0x0D, 0xB4]};
+ const IID IID_IProgSink = {0x3050F371, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IPropertyBag = {0x55272A00, 0x42CB, 0x11CE, [0x81, 0x35, 0x00, 0xAA, 0x00, 0x4B, 0xB8, 0x51]};
+ const IID IID_IPropertyBag2 = {0x22F55882, 0x280B, 0x11D0, [0xA8, 0xA9, 0x00, 0xA0, 0xC9, 0x0C, 0x20, 0x04]};
+ const IID IID_IPropertyBagEx = {0x20011801, 0x5DE6, 0x11D1, [0x8E, 0x38, 0x00, 0xC0, 0x4F, 0xB9, 0x38, 0x6D]};
+ const IID IID_IPropertyFrame = {0xB196B28A, 0xBAB4, 0x101A, [0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07]};
+ const IID IID_IPropertyMap = {0xC733E4A2, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID IID_IPropertyMapper = {0xB324B226, 0x41A0, 0x11D0, [0x8C, 0x91, 0x00, 0x20, 0xAF, 0x1D, 0x74, 0x0E]};
+ const IID IID_IPropertyNotifySink = {0x9BFBBC02, 0xEFF1, 0x101A, [0x84, 0xED, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07]};
+ const IID IID_IPropertyPage = {0xB196B28D, 0xBAB4, 0x101A, [0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07]};
+ const IID IID_IPropertyPage2 = {0x01E44665, 0x24AC, 0x101B, [0x84, 0xED, 0x08, 0x00, 0x2B, 0x2E, 0xC7, 0x13]};
+ const IID IID_IPropertyPageSite = {0xB196B28C, 0xBAB4, 0x101A, [0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07]};
+ const IID IID_IPropertySetContainer = {0xB4FFAE60, 0xA7CA, 0x11CD, [0xB5, 0x8B, 0x00, 0x00, 0x6B, 0x82, 0x91, 0x56]};
+ const IID IID_IPropertySetStorage = {0x0000013A, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IPropertyStorage = {0x00000138, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IPropertyUI = {0x757A7D9F, 0x919A, 0x4118, [0x99, 0xD7, 0xDB, 0xB2, 0x08, 0xC8, 0xCC, 0x66]};
+ const IID IID_IPropSheetPage = {0x000214F6, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IProvideClassInfo = {0xB196B283, 0xBAB4, 0x101A, [0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07]};
+ const IID IID_IProvideClassInfo2 = {0xA6BC3AC0, 0xDBAA, 0x11CE, [0x9D, 0xE3, 0x00, 0xAA, 0x00, 0x4B, 0xB8, 0x51]};
+ const IID IID_IProvideExpressionContexts = {0x51973C41, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IProvideMoniker = {0x0C733A4D, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IProvideMultipleClassInfo = {0xA7ABA9C1, 0x8983, 0x11CF, [0x8F, 0x20, 0x00, 0x80, 0x5F, 0x2C, 0xD0, 0x64]};
+ const IID IID_IProxy = {0x00000027, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IProxyManager = {0x00000008, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IPSFactory = {0x00000009, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IPSFactoryBuffer = {0xD5F569D0, 0x593B, 0x101A, [0xB5, 0x69, 0x08, 0x00, 0x2B, 0x2D, 0xBF, 0x7A]};
+ const IID IID_IPublishedApp = {0x1BC752E0, 0x9046, 0x11D1, [0xB8, 0xB3, 0x00, 0x60, 0x08, 0x05, 0x93, 0x82]};
+ const IID IID_IPublishingWizard = {0xAA9198BB, 0xCCEC, 0x472D, [0xBE, 0xED, 0x19, 0xA4, 0xF6, 0x73, 0x3F, 0x7A]};
+ const IID IID_IQualityControl = {0x6BC096AB, 0x0CE6, 0x11D1, [0xBA, 0xAE, 0x00, 0xC0, 0x4F, 0xC2, 0xE2, 0x0D]};
+ const IID IID_IQuery = {0x0C733A51, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IQueryAssociations = {0xC46CA590, 0x3C3F, 0x11D2, [0xBE, 0xE6, 0x00, 0x00, 0xF8, 0x05, 0xCA, 0x57]};
+ const IID IID_IQueryCancelAutoPlay = {0xDDEFE873, 0x6997, 0x4E68, [0xBE, 0x26, 0x39, 0xB6, 0x33, 0xAD, 0xBE, 0x12]};
+ const IID IID_IQueryContinue = {0x7307055C, 0xB24A, 0x486B, [0x9F, 0x25, 0x16, 0x3E, 0x59, 0x7A, 0x28, 0xA9]};
+ const IID IID_IQueryForm = {0x8CFCEE30, 0x39BD, 0x11D0, [0xB8, 0xD1, 0x00, 0xA0, 0x24, 0xAB, 0x2D, 0xBB]};
+ const IID IID_IQueryFrame = {0x7E8C7C20, 0x7C9D, 0x11D0, [0x91, 0x3F, 0x00, 0xAA, 0x00, 0xC1, 0x6E, 0x65]};
+ const IID IID_IQueryHandler = {0xA60CC73F, 0xE0FC, 0x11D0, [0x97, 0x50, 0x00, 0xA0, 0xC9, 0x06, 0xAF, 0x45]};
+ const IID IID_IQueryInfo = {0x00021500, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IQuickActivate = {0xCF51ED10, 0x62FE, 0x11CF, [0xBF, 0x86, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0x36]};
+ const IID IID_IRadioButton = {0x3050F69B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IRatingNotification = {0x639447BD, 0xB2D3, 0x44B9, [0x9F, 0xB0, 0x51, 0x0F, 0x23, 0xCB, 0x45, 0xE4]};
+ const IID IID_IReadData = {0x0C733A6A, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IReadEvents = {0xF64AEFDE, 0x3376, 0x11D1, [0xBE, 0x5B, 0x00, 0xC0, 0x4F, 0xC9, 0xE2, 0xBB]};
+ const IID IID_IRecalcEngine = {0x3050F496, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IRecalcHost = {0x3050F497, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IRecalcHostDebug = {0x3050F5F7, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IRecalcProperty = {0x3050F5D6, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IReconcilableObject = {0x99180162, 0xDA16, 0x101A, [0x93, 0x5C, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID IID_IReconcileInitiator = {0x99180161, 0xDA16, 0x101A, [0x93, 0x5C, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID IID_IRecordInfo = {0x0000002F, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IRedbookDiscMaster = {0xE3BC42CD, 0x4E5C, 0x11D3, [0x91, 0x44, 0x00, 0x10, 0x4B, 0xA1, 0x1C, 0x5E]};
+ const IID IID_IReferenceClock = {0x56A86897, 0x0AD4, 0x11CE, [0xB0, 0x3A, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70]};
+ const IID IID_IRegisterProvider = {0x0C733AB9, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRegisterVirusScanEngine = {0x0825E060, 0xB961, 0x11CF, [0xAA, 0xFA, 0x00, 0xAA, 0x00, 0xB6, 0x01, 0x5C]};
+ const IID IID_IReleaseMarshalBuffers = {0xEB0CB9E8, 0x7996, 0x11D2, [0x87, 0x2E, 0x00, 0x00, 0xF8, 0x08, 0x08, 0x59]};
+ const IID IID_IRemoteCallBack = {0x8947C648, 0x3833, 0x11D1, [0x86, 0x82, 0x00, 0xC0, 0x4F, 0xBF, 0xE1, 0x71]};
+ const IID IID_IRemoteComputer = {0x000214FE, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IRemoteDebugApplication = {0x51973C30, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IRemoteDebugApplicationEvents = {0x51973C33, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IRemoteDebugApplicationEx = {0x51973C01, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IRemoteDebugApplicationThread = {0x51973C37, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_IRemoteDebugApplicationThreadEx = {0xB9B32B0C, 0x9147, 0x11D1, [0x94, 0xEA, 0x00, 0xC0, 0x4F, 0xA3, 0x02, 0xA1]};
+ const IID IID_IRemoteDelaydC = {0x394540A0, 0x6FCF, 0x11D0, [0xAC, 0xE0, 0x00, 0x00, 0xF8, 0x01, 0x14, 0xD3]};
+ const IID IID_IRemoteESP = {0xE99A04AB, 0xAB95, 0x11D0, [0xBE, 0x96, 0x00, 0xA0, 0xC9, 0x49, 0x89, 0xDE]};
+ const IID IID_IRemoteFinder = {0x944AD532, 0xB09D, 0x11CE, [0xB5, 0x9C, 0x00, 0xAA, 0x00, 0x6C, 0xB3, 0x7D]};
+ const IID IID_IRemoteStats = {0x944AD531, 0xB09D, 0x11CE, [0xB5, 0x9C, 0x00, 0xAA, 0x00, 0x6C, 0xB3, 0x7D]};
+ const IID IID_IRequest = {0x6BC096A7, 0x0CE6, 0x11D1, [0xBA, 0xAE, 0x00, 0xC0, 0x4F, 0xC2, 0xE2, 0x0D]};
+ const IID IID_IRequestHandler = {0x6BC096AA, 0x0CE6, 0x11D1, [0xBA, 0xAE, 0x00, 0xC0, 0x4F, 0xC2, 0xE2, 0x0D]};
+ const IID IID_IRequestSource = {0x6BC096A9, 0x0CE6, 0x11D1, [0xBA, 0xAE, 0x00, 0xC0, 0x4F, 0xC2, 0xE2, 0x0D]};
+ const IID IID_IRequestState = {0x6BC096BA, 0x0CE6, 0x11D1, [0xBA, 0xAE, 0x00, 0xC0, 0x4F, 0xC2, 0xE2, 0x0D]};
+ const IID IID_IResolveShellLink = {0x5CD52983, 0x9449, 0x11D2, [0x96, 0x3A, 0x00, 0xC0, 0x4F, 0x79, 0xAD, 0xF0]};
+ const IID IID_IRichEditOle = {0x00020D00, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IRichEditOleCallback = {0x00020D03, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IRootStorage = {0x00000012, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IROTData = {0xF29F6BC0, 0x5021, 0x11CE, [0xAA, 0x15, 0x00, 0x00, 0x69, 0x01, 0x29, 0x3F]};
+ const IID IID_IRow = {0x0C733AB4, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowChange = {0x0C733AB5, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowInfo = {0x0C733AC1, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowPosition = {0x0C733A94, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowPositionChange = {0x0997A571, 0x126E, 0x11D0, [0x9F, 0x8A, 0x00, 0xA0, 0xC9, 0xA0, 0x63, 0x1E]};
+ const IID IID_IRowSchemaChange = {0x0C733AAE, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowset = {0x0C733A7C, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetAsynch = {0x0C733A0F, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetBookmark = {0x0C733AC2, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetChange = {0x0C733A05, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetChapterMember = {0x0C733AA8, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetCopyRows = {0x0C733A6B, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetCurrentIndex = {0x0C733ABD, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetExactScroll = {0x0C733A7F, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetFind = {0x0C733A9D, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetIdentity = {0x0C733A09, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetIndex = {0x0C733A82, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetInfo = {0x0C733A55, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetKeys = {0x0C733A12, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetLocate = {0x0C733A7D, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetNewRowAfter = {0x0C733A71, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetNextRowset = {0x0C733A72, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetNotify = {0x0C733A83, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetQueryStatus = {0xA7AC77ED, 0xF8D7, 0x11CE, [0xA7, 0x98, 0x00, 0x20, 0xF8, 0x00, 0x80, 0x24]};
+ const IID IID_IRowsetRefresh = {0x0C733AA9, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetResynch = {0x0C733A84, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetScroll = {0x0C733A7E, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetUpdate = {0x0C733A6D, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetView = {0x0C733A99, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetWatchAll = {0x0C733A73, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetWatchNotify = {0x0C733A44, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetWatchRegion = {0x0C733A45, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRowsetWithParameters = {0x0C733A6E, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IRpcChannel = {0x00000004, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IRpcChannelBuffer = {0xD5F56B60, 0x593B, 0x101A, [0xB5, 0x69, 0x08, 0x00, 0x2B, 0x2D, 0xBF, 0x7A]};
+ const IID IID_IRpcChannelBuffer2 = {0x594F31D0, 0x7F19, 0x11D0, [0xB1, 0x94, 0x00, 0xA0, 0xC9, 0x0D, 0xC8, 0xBF]};
+ const IID IID_IRpcChannelBuffer3 = {0x25B15600, 0x0115, 0x11D0, [0xBF, 0x0D, 0x00, 0xAA, 0x00, 0xB8, 0xDF, 0xD2]};
+ const IID IID_IRpcHelper = {0x00000149, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IRpcOptions = {0x00000144, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IRpcProxy = {0x00000007, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IRpcProxyBuffer = {0xD5F56A34, 0x593B, 0x101A, [0xB5, 0x69, 0x08, 0x00, 0x2B, 0x2D, 0xBF, 0x7A]};
+ const IID IID_IRpcStub = {0x00000005, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IRpcStubBuffer = {0xD5F56AFC, 0x593B, 0x101A, [0xB5, 0x69, 0x08, 0x00, 0x2B, 0x2D, 0xBF, 0x7A]};
+ const IID IID_IRpcSyntaxNegotiate = {0x58A08519, 0x24C8, 0x4935, [0xB4, 0x82, 0x3F, 0xD8, 0x23, 0x33, 0x3A, 0x4F]};
+ const IID IID_IRTC = {0x4811EA40, 0xB582, 0x11CE, [0xB5, 0xAF, 0x00, 0xAA, 0x00, 0x6C, 0xB3, 0x7D]};
+ const IID IID_IRTCBuddy = {0xFCB136C8, 0x7B90, 0x4E0C, [0xBE, 0xFE, 0x56, 0xED, 0xF0, 0xBA, 0x6F, 0x1C]};
+ const IID IID_IRTCBuddyEvent = {0xF36D755D, 0x17E6, 0x404E, [0x95, 0x4F, 0x0F, 0xC0, 0x75, 0x74, 0xC7, 0x8D]};
+ const IID IID_IRTCClient = {0x07829E45, 0x9A34, 0x408E, [0xA0, 0x11, 0xBD, 0xDF, 0x13, 0x48, 0x7C, 0xD1]};
+ const IID IID_IRTCClientEvent = {0x2B493B7A, 0x3CBA, 0x4170, [0x9C, 0x8B, 0x76, 0xA9, 0xDA, 0xCD, 0xD6, 0x44]};
+ const IID IID_IRTCClientPresence = {0x11C3CBCC, 0x0744, 0x42D1, [0x96, 0x8A, 0x51, 0xAA, 0x1B, 0xB2, 0x74, 0xC6]};
+ const IID IID_IRTCClientProvisioning = {0xB9F5CF06, 0x65B9, 0x4A80, [0xA0, 0xE6, 0x73, 0xCA, 0xE3, 0xEF, 0x38, 0x22]};
+ const IID IID_IRTCCollection = {0xEC7C8096, 0xB918, 0x4044, [0x94, 0xF1, 0xE4, 0xFB, 0xA0, 0x36, 0x1D, 0x5C]};
+ const IID IID_IRTCEnumBuddies = {0xF7296917, 0x5569, 0x4B3B, [0xB3, 0xAF, 0x98, 0xD1, 0x14, 0x4B, 0x2B, 0x87]};
+ const IID IID_IRTCEnumParticipants = {0xFCD56F29, 0x4A4F, 0x41B2, [0xBA, 0x5C, 0xF5, 0xBC, 0xCC, 0x06, 0x0B, 0xF6]};
+ const IID IID_IRTCEnumProfiles = {0x29B7C41C, 0xED82, 0x4BCA, [0x84, 0xAD, 0x39, 0xD5, 0x10, 0x1B, 0x58, 0xE3]};
+ const IID IID_IRTCEnumWatchers = {0xA87D55D7, 0xDB74, 0x4ED1, [0x9C, 0xA4, 0x77, 0xA0, 0xE4, 0x1B, 0x41, 0x3E]};
+ const IID IID_IRTCEventNotification = {0x13FA24C7, 0x5748, 0x4B21, [0x91, 0xF5, 0x73, 0x97, 0x60, 0x9C, 0xE7, 0x47]};
+ const IID IID_IRTCIntensityEvent = {0x4C23BF51, 0x390C, 0x4992, [0xA4, 0x1D, 0x41, 0xEE, 0xC0, 0x5B, 0x2A, 0x4B]};
+ const IID IID_IRTCMediaEvent = {0x099944FB, 0xBCDA, 0x453E, [0x8C, 0x41, 0xE1, 0x3D, 0xA2, 0xAD, 0xF7, 0xF3]};
+ const IID IID_IRTCMessagingEvent = {0xD3609541, 0x1B29, 0x4DE5, [0xA4, 0xAD, 0x5A, 0xEB, 0xAF, 0x31, 0x95, 0x12]};
+ const IID IID_IRTCParticipant = {0xAE86ADD5, 0x26B1, 0x4414, [0xAF, 0x1D, 0xB9, 0x4C, 0xD9, 0x38, 0xD7, 0x39]};
+ const IID IID_IRTCParticipantStateChangeEvent = {0x09BCB597, 0xF0FA, 0x48F9, [0xB4, 0x20, 0x46, 0x8C, 0xEA, 0x7F, 0xDE, 0x04]};
+ const IID IID_IRTCPresenceContact = {0x8B22F92C, 0xCD90, 0x42DB, [0xA7, 0x33, 0x21, 0x22, 0x05, 0xC3, 0xE3, 0xDF]};
+ const IID IID_IRTCProfile = {0xD07ECA9E, 0x4062, 0x4DD4, [0x9E, 0x7D, 0x72, 0x2A, 0x49, 0xBA, 0x73, 0x03]};
+ const IID IID_IRTCProfileEvent = {0xD6D5AB3B, 0x770E, 0x43E8, [0x80, 0x0A, 0x79, 0xB0, 0x62, 0x39, 0x5F, 0xCA]};
+ const IID IID_IRTCRegistrationStateChangeEvent = {0x62D0991B, 0x50AB, 0x4F02, [0xB9, 0x48, 0xCA, 0x94, 0xF2, 0x6F, 0x8F, 0x95]};
+ const IID IID_IRTCSession = {0x387C8086, 0x99BE, 0x42FB, [0x99, 0x73, 0x7C, 0x0F, 0xC0, 0xCA, 0x9F, 0xA8]};
+ const IID IID_IRTCSessionOperationCompleteEven = {0xA6BFF4C0, 0xF7C8, 0x4D3C, [0x9A, 0x41, 0x35, 0x50, 0xF7, 0x8A, 0x95, 0xB0]};
+ const IID IID_IRTCSessionStateChangeEvent = {0xB5BAD703, 0x5952, 0x48B3, [0x93, 0x21, 0x7F, 0x45, 0x00, 0x52, 0x15, 0x06]};
+ const IID IID_IRTCWatcher = {0xC7CEDAD8, 0x346B, 0x4D1B, [0xAC, 0x02, 0xA2, 0x08, 0x8D, 0xF9, 0xBE, 0x4F]};
+ const IID IID_IRTCWatcherEvent = {0xF30D7261, 0x587A, 0x424F, [0x82, 0x2C, 0x31, 0x27, 0x88, 0xF4, 0x35, 0x48]};
+ const IID IID_IRunnableObject = {0x00000126, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IRunnableTask = {0x85788D00, 0x6807, 0x11D0, [0xB8, 0x10, 0x00, 0xC0, 0x4F, 0xD7, 0x06, 0xEC]};
+ const IID IID_IRunningObjectTable = {0x00000010, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IScheduleGroup = {0xC733E4A6, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID IID_IScopedOperations = {0x0C733AB0, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IScriptEntry = {0x0AEE2A95, 0xBCBB, 0x11D0, [0x8C, 0x72, 0x00, 0xC0, 0x4F, 0xC2, 0xB0, 0x85]};
+ const IID IID_IScriptErrorList = {0xF3470F24, 0x15FD, 0x11D2, [0xBB, 0x2E, 0x00, 0x80, 0x5F, 0xF7, 0xEF, 0xCA]};
+ const IID IID_IScriptNode = {0x0AEE2A94, 0xBCBB, 0x11D0, [0x8C, 0x72, 0x00, 0xC0, 0x4F, 0xC2, 0xB0, 0x85]};
+ const IID IID_IScriptScriptlet = {0x0AEE2A96, 0xBCBB, 0x11D0, [0x8C, 0x72, 0x00, 0xC0, 0x4F, 0xC2, 0xB0, 0x85]};
+ const IID IID_IScrollBar = {0x3050F689, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ISdo = {0x56BC53DE, 0x96DB, 0x11D1, [0xBF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]};
+ const IID IID_ISdoCollection = {0x56BC53E2, 0x96DB, 0x11D1, [0xBF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]};
+ const IID IID_ISdoDictionaryOld = {0xD432E5F4, 0x53D8, 0x11D2, [0x9A, 0x3A, 0x00, 0xC0, 0x4F, 0xB9, 0x98, 0xAC]};
+ const IID IID_ISdoMachine = {0x479F6E75, 0x49A2, 0x11D2, [0x8E, 0xCA, 0x00, 0xC0, 0x4F, 0xC2, 0xF5, 0x19]};
+ const IID IID_ISdoServiceControl = {0x479F6E74, 0x49A2, 0x11D2, [0x8E, 0xCA, 0x00, 0xC0, 0x4F, 0xC2, 0xF5, 0x19]};
+ const IID IID_ISearch = {0xBA9239A4, 0x3DD5, 0x11D2, [0xBF, 0x8B, 0x00, 0xC0, 0x4F, 0xB9, 0x36, 0x61]};
+ const IID IID_ISearchAssistantOC = {0x72423E8F, 0x8011, 0x11D2, [0xBE, 0x79, 0x00, 0xA0, 0xC9, 0xA8, 0x3D, 0xA1]};
+ const IID IID_ISearchAssistantOC2 = {0x72423E8F, 0x8011, 0x11D2, [0xBE, 0x79, 0x00, 0xA0, 0xC9, 0xA8, 0x3D, 0xA2]};
+ const IID IID_ISearchAssistantOC3 = {0x72423E8F, 0x8011, 0x11D2, [0xBE, 0x79, 0x00, 0xA0, 0xC9, 0xA8, 0x3D, 0xA3]};
+ const IID IID_ISearchCommandExt = {0x1D2EFD50, 0x75CE, 0x11D1, [0xB7, 0x5A, 0x00, 0xA0, 0xC9, 0x05, 0x64, 0xFE]};
+ const IID IID_ISearchContext = {0x09F656A2, 0x41AF, 0x480C, [0x88, 0xF7, 0x16, 0xCC, 0x0D, 0x16, 0x46, 0x15]};
+ const IID IID_ISearches = {0x47C922A2, 0x3DD5, 0x11D2, [0xBF, 0x8B, 0x00, 0xC0, 0x4F, 0xB9, 0x36, 0x61]};
+ const IID IID_ISearchQueryHits = {0xED8CE7E0, 0x106C, 0x11CE, [0x84, 0xE2, 0x00, 0xAA, 0x00, 0x4B, 0x99, 0x86]};
+ const IID IID_ISecondaryControlChannel = {0xA23F9D10, 0x714C, 0x41FE, [0x84, 0x71, 0xFF, 0xB1, 0x9B, 0xC2, 0x84, 0x54]};
+ const IID IID_ISecureUrlHost = {0xC81984C4, 0x74C8, 0x11D2, [0xBA, 0xA9, 0x00, 0xC0, 0x4F, 0xC2, 0x04, 0x0E]};
+ const IID IID_ISecurityInfo = {0x0C733AA4, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ISegment = {0x3050F683, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ISegmentList = {0x3050F605, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ISegmentListIterator = {0x3050F692, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ISelectionObject2 = {0x3050F7FC, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ISelectionServices = {0x3050F684, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ISelectionServicesListener = {0x3050F699, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ISensLogon = {0xD597BAB3, 0x5B9F, 0x11D1, [0x8D, 0xD2, 0x00, 0xAA, 0x00, 0x4A, 0xBD, 0x5E]};
+ const IID IID_ISensLogon2 = {0xD597BAB4, 0x5B9F, 0x11D1, [0x8D, 0xD2, 0x00, 0xAA, 0x00, 0x4A, 0xBD, 0x5E]};
+ const IID IID_ISensNetwork = {0xD597BAB1, 0x5B9F, 0x11D1, [0x8D, 0xD2, 0x00, 0xAA, 0x00, 0x4A, 0xBD, 0x5E]};
+ const IID IID_ISensOnNow = {0xD597BAB2, 0x5B9F, 0x11D1, [0x8D, 0xD2, 0x00, 0xAA, 0x00, 0x4A, 0xBD, 0x5E]};
+ const IID IID_ISequenceNumber = {0x3050F6C1, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ISequentialStream = {0x0C733A30, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IServerSecurity = {0x0000013E, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IServiceProvider = {0x6D5140C1, 0x7436, 0x11CE, [0x80, 0x34, 0x00, 0xAA, 0x00, 0x60, 0x09, 0xFA]};
+ const IID IID_ISessionProperties = {0x0C733A85, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ISetNextStatement = {0x51973C03, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_ISharedAccessBeacon = {0xFAEDCF6B, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_ISharedAccessBeaconFinder = {0xFAEDCF67, 0x31FE, 0x11D1, [0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_IShellApp = {0xA3E14960, 0x935F, 0x11D1, [0xB8, 0xB8, 0x00, 0x60, 0x08, 0x05, 0x93, 0x82]};
+ const IID IID_IShellBrowser = {0x000214E2, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IShellChangeNotify = {0xD82BE2B1, 0x5764, 0x11D0, [0xA9, 0x6E, 0x00, 0xC0, 0x4F, 0xD7, 0x05, 0xA2]};
+ const IID IID_IShellCopyHookA = {0x000214EF, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IShellCopyHookW = {0x000214FC, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IShellDetails = {0x000214EC, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IShellDetails3 = {0xD2A105C0, 0x87D5, 0x11D1, [0x83, 0x91, 0x00, 0x00, 0xF8, 0x04, 0x61, 0xCF]};
+ const IID IID_IShellDispatch = {0xD8F015C0, 0xC278, 0x11CE, [0xA4, 0x9E, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID IID_IShellDispatch2 = {0xA4C6892C, 0x3BA9, 0x11D2, [0x9D, 0xEA, 0x00, 0xC0, 0x4F, 0xB1, 0x61, 0x62]};
+ const IID IID_IShellDispatch3 = {0x177160CA, 0xBB5A, 0x411C, [0x84, 0x1D, 0xBD, 0x38, 0xFA, 0xCD, 0xEA, 0xA0]};
+ const IID IID_IShellDispatch4 = {0xEFD84B2D, 0x4BCF, 0x4298, [0xBE, 0x25, 0xEB, 0x54, 0x2A, 0x59, 0xFB, 0xDA]};
+ const IID IID_IShellExecuteHookA = {0x000214F5, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IShellExecuteHookW = {0x000214FB, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IShellExtInit = {0x000214E8, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IShellFavoritesNameSpace = {0x55136804, 0xB2DE, 0x11D1, [0xB9, 0xF2, 0x00, 0xA0, 0xC9, 0x8B, 0xC5, 0x47]};
+ const IID IID_IShellFolder = {0x000214E6, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IShellFolder2 = {0x93F2F68C, 0x1D1B, 0x11D3, [0xA3, 0x0E, 0x00, 0xC0, 0x4F, 0x79, 0xAB, 0xD1]};
+ const IID IID_IShellFolderViewCB = {0x2047E320, 0xF2A9, 0x11CE, [0xAE, 0x65, 0x08, 0x00, 0x2B, 0x2E, 0x12, 0x62]};
+ const IID IID_IShellFolderViewDual = {0xE7A1AF80, 0x4D96, 0x11CF, [0x96, 0x0C, 0x00, 0x80, 0xC7, 0xF4, 0xEE, 0x85]};
+ const IID IID_IShellFolderViewDual2 = {0x31C147B6, 0x0ADE, 0x4A3C, [0xB5, 0x14, 0xDD, 0xF9, 0x32, 0xEF, 0x6D, 0x17]};
+ const IID IID_IShellIcon = {0x000214E5, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IShellIconOverlay = {0x7D688A70, 0xC613, 0x11D0, [0x99, 0x9B, 0x00, 0xC0, 0x4F, 0xD6, 0x55, 0xE1]};
+ const IID IID_IShellIconOverlayIdentifier = {0x0C6C4200, 0xC589, 0x11D0, [0x99, 0x9A, 0x00, 0xC0, 0x4F, 0xD6, 0x55, 0xE1]};
+ const IID IID_IShellImageData = {0xBFDEEC12, 0x8040, 0x4403, [0xA5, 0xEA, 0x9E, 0x07, 0xDA, 0xFC, 0xF5, 0x30]};
+ const IID IID_IShellImageDataAbort = {0x53FB8E58, 0x50C0, 0x4003, [0xB4, 0xAA, 0x0C, 0x8D, 0xF2, 0x8E, 0x7F, 0x3A]};
+ const IID IID_IShellImageDataFactory = {0x9BE8ED5C, 0xEDAB, 0x4D75, [0x90, 0xF3, 0xBD, 0x5B, 0xDB, 0xB2, 0x1C, 0x82]};
+ const IID IID_IShellLinkA = {0x000214EE, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IShellLinkDataList = {0x45E2B4AE, 0xB1C3, 0x11D0, [0xB9, 0x2F, 0x00, 0xA0, 0xC9, 0x03, 0x12, 0xE1]};
+ const IID IID_IShellLinkDual = {0x88A05C00, 0xF000, 0x11CE, [0x83, 0x50, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
+ const IID IID_IShellLinkDual2 = {0x317EE249, 0xF12E, 0x11D2, [0xB1, 0xE4, 0x00, 0xC0, 0x4F, 0x8E, 0xEB, 0x3E]};
+ const IID IID_IShellLinkW = {0x000214F9, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IShellNameSpace = {0xE572D3C9, 0x37BE, 0x4AE2, [0x82, 0x5D, 0xD5, 0x21, 0x76, 0x3E, 0x31, 0x08]};
+ const IID IID_IShellPropSheetExt = {0x000214E9, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IShellUIHelper = {0x729FE2F8, 0x1EA8, 0x11D1, [0x8F, 0x85, 0x00, 0xC0, 0x4F, 0xC2, 0xFB, 0xE1]};
+ const IID IID_IShellView = {0x000214E3, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IShellView2 = {0x88E39E80, 0x3578, 0x11CF, [0xAE, 0x69, 0x08, 0x00, 0x2B, 0x2E, 0x12, 0x62]};
+ const IID IID_IShellWindows = {0x85CB6900, 0x4D95, 0x11CF, [0x96, 0x0C, 0x00, 0x80, 0xC7, 0xF4, 0xEE, 0x85]};
+ const IID IID_ISimpleCommandCreator = {0x5E341AB7, 0x02D0, 0x11D1, [0x90, 0x0C, 0x00, 0xA0, 0xC9, 0x06, 0x37, 0x96]};
+ const IID IID_ISimpleConnectionPoint = {0x51973C3E, 0xCB0C, 0x11D0, [0xB5, 0xC9, 0x00, 0xA0, 0x24, 0x4A, 0x0E, 0x7A]};
+ const IID IID_ISimpleFrameSite = {0x742B0E01, 0x14E6, 0x101B, [0x91, 0x4E, 0x00, 0xAA, 0x00, 0x30, 0x0C, 0xAB]};
+ const IID IID_ISliderBar = {0x3050F68D, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ISniffStream = {0x4EF17940, 0x30E0, 0x11D0, [0xB7, 0x24, 0x00, 0xAA, 0x00, 0x6C, 0x1A, 0x01]};
+ const IID IID_ISOAPRequest = {0xAD194525, 0x6E01, 0x4BCA, [0x92, 0x9C, 0x23, 0xC7, 0x38, 0x33, 0x36, 0xAF]};
+ const IID IID_ISoftDistExt = {0xB15B8DC1, 0xC7E1, 0x11D0, [0x86, 0x80, 0x00, 0xAA, 0x00, 0xBD, 0xCB, 0x71]};
+ const IID IID_ISourcesRowset = {0x0C733A1E, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ISpecialSystemProperties = {0x000001B9, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ISpecifyPropertyPages = {0xB196B28B, 0xBAB4, 0x101A, [0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07]};
+ const IID IID_ISpinButton = {0x3050F68B, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ISQLErrorInfo = {0x0C733A74, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IStandardActivator = {0x000001B8, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IStandardInfo = {0xF1D9C1A5, 0x9589, 0x40DD, [0xB6, 0x3D, 0x9B, 0xB0, 0xB3, 0x8A, 0x10, 0x22]};
+ const IID IID_IStaticPortMapping = {0x6F10711F, 0x729B, 0x41E5, [0x93, 0xB8, 0xF2, 0x1D, 0x0F, 0x81, 0x8D, 0xF1]};
+ const IID IID_IStaticPortMappingCollection = {0xCD1F3E77, 0x66D6, 0x4664, [0x82, 0xC7, 0x36, 0xDB, 0xB6, 0x41, 0xD0, 0xF1]};
+ const IID IID_IStats = {0x944AD530, 0xB09D, 0x11CE, [0xB5, 0x9C, 0x00, 0xAA, 0x00, 0x6C, 0xB3, 0x7D]};
+ const IID IID_IStdMarshalInfo = {0x00000018, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IStemmer = {0xEFBAF140, 0x7F42, 0x11CE, [0xBE, 0x57, 0x00, 0xAA, 0x00, 0x51, 0xFE, 0x20]};
+ const IID IID_IStemSink = {0xFE77C330, 0x7F42, 0x11CE, [0xBE, 0x57, 0x00, 0xAA, 0x00, 0x51, 0xFE, 0x20]};
+ const IID IID_IStorage = {0x0000000B, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IStream = {0x0000000C, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IStub = {0x00000026, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IStubManager = {0x00000006, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ISubDivisionProvider = {0x3050F4D2, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ISubscriptionAgentControl = {0xA89E8FF0, 0x70F4, 0x11D1, [0xBC, 0x7F, 0x00, 0xC0, 0x4F, 0xD9, 0x29, 0xDB]};
+ const IID IID_ISubscriptionAgentEvents = {0xA89E8FF1, 0x70F4, 0x11D1, [0xBC, 0x7F, 0x00, 0xC0, 0x4F, 0xD9, 0x29, 0xDB]};
+ const IID IID_ISubscriptionAgentShellExt = {0x81B184BA, 0xB302, 0x11D1, [0x85, 0x52, 0x00, 0xC0, 0x4F, 0xA3, 0x5C, 0x89]};
+ const IID IID_ISubscriptionItem = {0xA97559F8, 0x6C4A, 0x11D1, [0xA1, 0xE8, 0x00, 0xC0, 0x4F, 0xC2, 0xFB, 0xE1]};
+ const IID IID_ISubscriptionMgr = {0x085FB2C0, 0x0DF8, 0x11D1, [0x8F, 0x4B, 0x00, 0xA0, 0xC9, 0x05, 0x41, 0x3F]};
+ const IID IID_ISubscriptionMgr2 = {0x614BC270, 0xAEDF, 0x11D1, [0xA1, 0xF9, 0x00, 0xC0, 0x4F, 0xC2, 0xFB, 0xE1]};
+ const IID IID_ISubscriptionMgrPriv = {0xD66B399E, 0xAF1D, 0x11D1, [0xA1, 0xF9, 0x00, 0xC0, 0x4F, 0xC2, 0xFB, 0xE1]};
+ const IID IID_ISubscriptionThrottler = {0x1E9B00E4, 0x9846, 0x11D1, [0xA1, 0xEE, 0x00, 0xC0, 0x4F, 0xC2, 0xFB, 0xE1]};
+ const IID IID_ISupportErrorInfo = {0xDF0B3D60, 0x548F, 0x101B, [0x8E, 0x65, 0x08, 0x00, 0x2B, 0x2B, 0xD1, 0x19]};
+ const IID IID_ISurrogate = {0x00000022, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ISWbemDateTime = {0x5E97458A, 0xCF77, 0x11D3, [0xB3, 0x8F, 0x00, 0x10, 0x5A, 0x1F, 0x47, 0x3A]};
+ const IID IID_ISWbemEventSource = {0x27D54D92, 0x0EBE, 0x11D2, [0x8B, 0x22, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID IID_ISWbemLastError = {0xD962DB84, 0xD4BB, 0x11D1, [0x8B, 0x09, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID IID_ISWbemLocator = {0x76A6415B, 0xCB41, 0x11D1, [0x8B, 0x02, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID IID_ISWbemMethod = {0x422E8E90, 0xD955, 0x11D1, [0x8B, 0x09, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID IID_ISWbemMethodSet = {0xC93BA292, 0xD955, 0x11D1, [0x8B, 0x09, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID IID_ISWbemNamedValue = {0x76A64164, 0xCB41, 0x11D1, [0x8B, 0x02, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID IID_ISWbemNamedValueSet = {0xCF2376EA, 0xCE8C, 0x11D1, [0x8B, 0x05, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID IID_ISWbemObject = {0x76A6415A, 0xCB41, 0x11D1, [0x8B, 0x02, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID IID_ISWbemObjectEx = {0x269AD56A, 0x8A67, 0x4129, [0xBC, 0x8C, 0x05, 0x06, 0xDC, 0xFE, 0x98, 0x80]};
+ const IID IID_ISWbemObjectPath = {0x5791BC27, 0xCE9C, 0x11D1, [0x97, 0xBF, 0x00, 0x00, 0xF8, 0x1E, 0x84, 0x9C]};
+ const IID IID_ISWbemObjectSet = {0x76A6415F, 0xCB41, 0x11D1, [0x8B, 0x02, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID IID_ISWbemPrivilege = {0x26EE67BD, 0x5804, 0x11D2, [0x8B, 0x4A, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID IID_ISWbemPrivilegeSet = {0x26EE67BF, 0x5804, 0x11D2, [0x8B, 0x4A, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID IID_ISWbemProperty = {0x1A388F98, 0xD4BA, 0x11D1, [0x8B, 0x09, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID IID_ISWbemPropertySet = {0xDEA0A7B2, 0xD4BA, 0x11D1, [0x8B, 0x09, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID IID_ISWbemQualifier = {0x79B05932, 0xD3B7, 0x11D1, [0x8B, 0x06, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID IID_ISWbemQualifierSet = {0x9B16ED16, 0xD3DF, 0x11D1, [0x8B, 0x08, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID IID_ISWbemRefreshableItem = {0x5AD4BF92, 0xDAAB, 0x11D3, [0xB3, 0x8F, 0x00, 0x10, 0x5A, 0x1F, 0x47, 0x3A]};
+ const IID IID_ISWbemRefresher = {0x14D8250E, 0xD9C2, 0x11D3, [0xB3, 0x8F, 0x00, 0x10, 0x5A, 0x1F, 0x47, 0x3A]};
+ const IID IID_ISWbemSecurity = {0xB54D66E6, 0x2287, 0x11D2, [0x8B, 0x33, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID IID_ISWbemServices = {0x76A6415C, 0xCB41, 0x11D1, [0x8B, 0x02, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID IID_ISWbemServicesEx = {0xD2F68443, 0x85DC, 0x427E, [0x91, 0xD8, 0x36, 0x65, 0x54, 0xCC, 0x75, 0x4C]};
+ const IID IID_ISWbemSink = {0x75718C9F, 0xF029, 0x11D1, [0xA1, 0xAC, 0x00, 0xC0, 0x4F, 0xB6, 0xC2, 0x23]};
+ const IID IID_ISynchronize = {0x00000030, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ISynchronizeContainer = {0x00000033, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ISynchronizedCallBack = {0x74C26041, 0x70D1, 0x11D1, [0xB7, 0x5A, 0x00, 0xA0, 0xC9, 0x05, 0x64, 0xFE]};
+ const IID IID_ISynchronizeEvent = {0x00000032, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ISynchronizeHandle = {0x00000031, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ISynchronizeMutex = {0x00000025, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ISyncMgrEnumItems = {0x6295DF2A, 0x35EE, 0x11D1, [0x87, 0x07, 0x00, 0xC0, 0x4F, 0xD9, 0x33, 0x27]};
+ const IID IID_ISyncMgrRegisterCSC = {0x47681A61, 0xBC74, 0x11D2, [0xB5, 0xC5, 0x00, 0xC0, 0x4F, 0xB9, 0x39, 0x81]};
+ const IID IID_ISyncMgrSynchronizeInvoke = {0x6295DF2C, 0x35EE, 0x11D1, [0x87, 0x07, 0x00, 0xC0, 0x4F, 0xD9, 0x33, 0x27]};
+ const IID IID_ISyncSchedule = {0xF0E15899, 0xA700, 0x11D1, [0x98, 0x31, 0x00, 0xC0, 0x4F, 0xD9, 0x10, 0xDD]};
+ const IID IID_ISyncScheduleMgr = {0xF0E15897, 0xA700, 0x11D1, [0x98, 0x31, 0x00, 0xC0, 0x4F, 0xD9, 0x10, 0xDD]};
+ const IID IID_ISyncSchedulep = {0xF0E1589B, 0xA700, 0x11D1, [0x98, 0x31, 0x00, 0xC0, 0x4F, 0xD9, 0x10, 0xDD]};
+ const IID IID_ITableCreation = {0x0C733ABC, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ITableDefinition = {0x0C733A86, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ITableDefinitionWithConstraints = {0x0C733AAB, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ITableRename = {0x0C733A77, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ITACDGroup = {0x5AFC3148, 0x4BCC, 0x11D1, [0xBF, 0x80, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_ITACDGroupEvent = {0x297F3032, 0xBD11, 0x11D1, [0xA0, 0xA7, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_ITAddress = {0xB1EFC386, 0x9355, 0x11D0, [0x83, 0x5C, 0x00, 0xAA, 0x00, 0x3C, 0xCA, 0xBD]};
+ const IID IID_ITAddress2 = {0xB0AE5D9B, 0xBE51, 0x46C9, [0xB0, 0xF7, 0xDF, 0xA8, 0xA2, 0x2A, 0x8B, 0xC4]};
+ const IID IID_ITAddressCapabilities = {0x8DF232F5, 0x821B, 0x11D1, [0xBB, 0x5C, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITAddressDeviceSpecificEvent = {0x3ACB216B, 0x40BD, 0x487A, [0x86, 0x72, 0x5C, 0xE7, 0x7B, 0xD7, 0xE3, 0xA3]};
+ const IID IID_ITAddressEvent = {0x831CE2D1, 0x83B5, 0x11D1, [0xBB, 0x5C, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITAddressTranslation = {0x0C4D8F03, 0x8DDB, 0x11D1, [0xA0, 0x9E, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_ITAddressTranslationInfo = {0xAFC15945, 0x8D40, 0x11D1, [0xA0, 0x9E, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_ITAgent = {0x5770ECE5, 0x4B27, 0x11D1, [0xBF, 0x80, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_ITAgentEvent = {0x5AFC314A, 0x4BCC, 0x11D1, [0xBF, 0x80, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_ITAgentHandler = {0x587E8C22, 0x9802, 0x11D1, [0xA0, 0xA4, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_ITAgentHandlerEvent = {0x297F3034, 0xBD11, 0x11D1, [0xA0, 0xA7, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_ITAgentSession = {0x5AFC3147, 0x4BCC, 0x11D1, [0xBF, 0x80, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_ITAgentSessionEvent = {0x5AFC314B, 0x4BCC, 0x11D1, [0xBF, 0x80, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_ITAllocatorProperties = {0xC1BC3C90, 0xBCFE, 0x11D1, [0x97, 0x45, 0x00, 0xC0, 0x4F, 0xD9, 0x1A, 0xC0]};
+ const IID IID_ITAMMediaFormat = {0x0364EB00, 0x4A77, 0x11D1, [0xA6, 0x71, 0x00, 0x60, 0x97, 0xC9, 0xA2, 0xE8]};
+ const IID IID_ITargetContainer = {0x7847EC01, 0x2BEC, 0x11D0, [0x82, 0xB4, 0x00, 0xA0, 0xC9, 0x0C, 0x29, 0xC5]};
+ const IID IID_ITargetEmbedding = {0x548793C0, 0x9E74, 0x11CF, [0x96, 0x55, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0x23]};
+ const IID IID_ITargetFrame = {0xD5F78C80, 0x5252, 0x11CF, [0x90, 0xFA, 0x00, 0xAA, 0x00, 0x42, 0x10, 0x6E]};
+ const IID IID_ITargetFrame2 = {0x86D52E11, 0x94A8, 0x11D0, [0x82, 0xAF, 0x00, 0xC0, 0x4F, 0xD5, 0xAE, 0x38]};
+ const IID IID_ITargetFramePriv = {0x9216E421, 0x2BF5, 0x11D0, [0x82, 0xB4, 0x00, 0xA0, 0xC9, 0x0C, 0x29, 0xC5]};
+ const IID IID_ITargetNotify = {0x863A99A0, 0x21BC, 0x11D0, [0x82, 0xB4, 0x00, 0xA0, 0xC9, 0x0C, 0x29, 0xC5]};
+ const IID IID_ITargetNotify2 = {0x3050F6B1, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ITaskAnalyzeCluster = {0x795737A1, 0xE13A, 0x45EB, [0x8D, 0xFD, 0x81, 0x85, 0xC4, 0xB7, 0xAD, 0x4E]};
+ const IID IID_ITaskbarList = {0x56FDF342, 0xFD6D, 0x11D0, [0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90]};
+ const IID IID_ITaskbarList2 = {0x602D4995, 0xB13A, 0x429B, [0xA6, 0x6E, 0x19, 0x35, 0xE4, 0x4F, 0x43, 0x17]};
+ const IID IID_ITaskCommitClusterChanges = {0x1BF12DDE, 0xF8B0, 0x49B1, [0xA4, 0x58, 0x67, 0x47, 0xDB, 0x78, 0x8A, 0x47]};
+ const IID IID_ITaskCompareAndPushInformation = {0xD4F1C2AF, 0xB370, 0x49DE, [0x87, 0x68, 0x40, 0x10, 0xB5, 0x68, 0x63, 0x6C]};
+ const IID IID_ITaskGatherClusterInfo = {0xE167965C, 0xC5D6, 0x493C, [0xA3, 0x43, 0x4C, 0x10, 0x5C, 0x01, 0xDD, 0xE7]};
+ const IID IID_ITaskGatherInformation = {0xB9AAF3F8, 0x238E, 0x4993, [0xBA, 0x31, 0x14, 0x85, 0x98, 0x04, 0xF9, 0x2C]};
+ const IID IID_ITaskGatherNodeInfo = {0xF19A2E01, 0x2CB3, 0x47B4, [0x8F, 0x5D, 0xB9, 0x77, 0x17, 0x6B, 0x45, 0xC8]};
+ const IID IID_ITaskGetDomains = {0xDFCB4ACD, 0xC4DB, 0x4DB4, [0x8E, 0xBB, 0x1D, 0xD0, 0x7A, 0x9D, 0x5B, 0x82]};
+ const IID IID_ITaskGetDomainsCallback = {0x85402E44, 0x6834, 0x41DF, [0x85, 0x90, 0x01, 0x82, 0x7D, 0x12, 0x4E, 0x1B]};
+ const IID IID_ITaskLoginDomain = {0x76AD8E51, 0x53C3, 0x4347, [0x89, 0x5D, 0x6C, 0x30, 0xF4, 0x13, 0x93, 0x74]};
+ const IID IID_ITaskLoginDomainCallback = {0xEFAF3C43, 0x7A8F, 0x469B, [0xB8, 0xBB, 0xC8, 0x0C, 0x57, 0x47, 0xCE, 0x05]};
+ const IID IID_ITaskManager = {0x16116694, 0xDFC5, 0x470B, [0xAC, 0x12, 0x46, 0xFB, 0xB0, 0x1C, 0xEF, 0x10]};
+ const IID IID_ITaskPollingCallback = {0x49E92395, 0x66AF, 0x4ADD, [0xA4, 0x1E, 0x43, 0x51, 0x2C, 0xB5, 0x19, 0xB3]};
+ const IID IID_ITaskVerifyIPAddress = {0x0C95E1B1, 0x0CFF, 0x4740, [0x8A, 0xBD, 0x69, 0x91, 0x2D, 0x10, 0x5B, 0xD1]};
+ const IID IID_ITASRTerminalEvent = {0xEE016A02, 0x4FA9, 0x467C, [0x93, 0x3F, 0x5A, 0x15, 0xB1, 0x23, 0x77, 0xD7]};
+ const IID IID_ITAttributeList = {0x5037FB82, 0xCAE9, 0x11D0, [0x8D, 0x58, 0x00, 0xC0, 0x4F, 0xD9, 0x1A, 0xC0]};
+ const IID IID_ITAudioDeviceControl = {0x6C0AB6C5, 0x21E3, 0x11D3, [0xA5, 0x77, 0x00, 0xC0, 0x4F, 0x8E, 0xF6, 0xE3]};
+ const IID IID_ITAudioSettings = {0x6C0AB6C6, 0x21E3, 0x11D3, [0xA5, 0x77, 0x00, 0xC0, 0x4F, 0x8E, 0xF6, 0xE3]};
+ const IID IID_ITAutomatedPhoneControl = {0x1EE1AF0E, 0x6159, 0x4A61, [0xB7, 0x9B, 0x6A, 0x4B, 0xA3, 0xFC, 0x9D, 0xFC]};
+ const IID IID_ITBasicAudioTerminal = {0xB1EFC38D, 0x9355, 0x11D0, [0x83, 0x5C, 0x00, 0xAA, 0x00, 0x3C, 0xCA, 0xBD]};
+ const IID IID_ITBasicCallControl = {0xB1EFC389, 0x9355, 0x11D0, [0x83, 0x5C, 0x00, 0xAA, 0x00, 0x3C, 0xCA, 0xBD]};
+ const IID IID_ITBasicCallControl2 = {0x161A4A56, 0x1E99, 0x4B3F, [0xA4, 0x6A, 0x16, 0x8F, 0x38, 0xA5, 0xEE, 0x4C]};
+ const IID IID_ITCallHub = {0xA3C1544E, 0x5B92, 0x11D1, [0x8F, 0x4E, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITCallHubEvent = {0xA3C15451, 0x5B92, 0x11D1, [0x8F, 0x4E, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITCallInfo = {0x350F85D1, 0x1227, 0x11D3, [0x83, 0xD4, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITCallInfo2 = {0x94D70CA6, 0x7AB0, 0x4DAA, [0x81, 0xCA, 0xB8, 0xF8, 0x64, 0x3F, 0xAE, 0xC1]};
+ const IID IID_ITCallInfoChangeEvent = {0x5D4B65F9, 0xE51C, 0x11D1, [0xA0, 0x2F, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITCallingCard = {0x0C4D8F00, 0x8DDB, 0x11D1, [0xA0, 0x9E, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_ITCallMediaEvent = {0xFF36B87F, 0xEC3A, 0x11D0, [0x8E, 0xE4, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITCallNotificationEvent = {0x895801DF, 0x3DD6, 0x11D1, [0x8F, 0x30, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITCallQualityControl = {0xFE1D8AE0, 0xEDC4, 0x49B5, [0x8F, 0x8C, 0x4D, 0xE4, 0x0F, 0x9C, 0xDF, 0xAF]};
+ const IID IID_ITCallStateEvent = {0x62F47097, 0x95C9, 0x11D0, [0x83, 0x5D, 0x00, 0xAA, 0x00, 0x3C, 0xCA, 0xBD]};
+ const IID IID_ITCollection = {0x5EC5ACF2, 0x9C02, 0x11D0, [0x83, 0x62, 0x00, 0xAA, 0x00, 0x3C, 0xCA, 0xBD]};
+ const IID IID_ITCollection2 = {0xE6DDDDA5, 0xA6D3, 0x48FF, [0x87, 0x37, 0xD3, 0x2F, 0xC4, 0xD9, 0x54, 0x77]};
+ const IID IID_ITConferenceBlob = {0xC259D7AA, 0xC8AB, 0x11D0, [0x8D, 0x58, 0x00, 0xC0, 0x4F, 0xD9, 0x1A, 0xC0]};
+ const IID IID_ITConnection = {0x8FA381D4, 0xC8C2, 0x11D0, [0x8D, 0x58, 0x00, 0xC0, 0x4F, 0xD9, 0x1A, 0xC0]};
+ const IID IID_ITcpipProperties = {0x98133271, 0x4B20, 0x11D1, [0xAB, 0x01, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E]};
+ const IID IID_ITCustomTone = {0x357AD764, 0xB3C6, 0x4B2A, [0x8F, 0xA5, 0x07, 0x22, 0x82, 0x7A, 0x92, 0x54]};
+ const IID IID_ITDetectTone = {0x961F79BD, 0x3097, 0x49DF, [0xA1, 0xD6, 0x90, 0x9B, 0x77, 0xE8, 0x9C, 0xA0]};
+ const IID IID_ITDigitDetectionEvent = {0x80D3BFAC, 0x57D9, 0x11D2, [0xA0, 0x4A, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITDigitGenerationEvent = {0x80D3BFAD, 0x57D9, 0x11D2, [0xA0, 0x4A, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITDigitsGatheredEvent = {0xE52EC4C1, 0xCBA3, 0x441A, [0x9E, 0x6A, 0x93, 0xCB, 0x90, 0x9E, 0x97, 0x24]};
+ const IID IID_ITDirectory = {0x34621D6C, 0x6CFF, 0x11D1, [0xAF, 0xF7, 0x00, 0xC0, 0x4F, 0xC3, 0x1F, 0xEE]};
+ const IID IID_ITDirectoryObject = {0x34621D6E, 0x6CFF, 0x11D1, [0xAF, 0xF7, 0x00, 0xC0, 0x4F, 0xC3, 0x1F, 0xEE]};
+ const IID IID_ITDirectoryObjectConference = {0xF1029E5D, 0xCB5B, 0x11D0, [0x8D, 0x59, 0x00, 0xC0, 0x4F, 0xD9, 0x1A, 0xC0]};
+ const IID IID_ITDirectoryObjectUser = {0x34621D6F, 0x6CFF, 0x11D1, [0xAF, 0xF7, 0x00, 0xC0, 0x4F, 0xC3, 0x1F, 0xEE]};
+ const IID IID_ITDispatchMapper = {0xE9225295, 0xC759, 0x11D1, [0xA0, 0x2B, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITemplatePrinter = {0x3050F6B4, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ITemplatePrinter2 = {0x3050F83F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ITFileTerminalEvent = {0xE4A7FBAC, 0x8C17, 0x4427, [0x9F, 0x55, 0x9F, 0x58, 0x9A, 0xC8, 0xAF, 0x00]};
+ const IID IID_ITFileTrack = {0x31CA6EA9, 0xC08A, 0x4BEA, [0x88, 0x11, 0x8E, 0x9C, 0x1B, 0xA3, 0xEA, 0x3A]};
+ const IID IID_ITfLangBarAddIn = {0xC9ADDAC3, 0x15CB, 0x4957, [0xB9, 0x3C, 0xDB, 0x08, 0x73, 0xFF, 0x98, 0xBB]};
+ const IID IID_ITFormatControl = {0x6C0AB6C1, 0x21E3, 0x11D3, [0xA5, 0x77, 0x00, 0xC0, 0x4F, 0x8E, 0xF6, 0xE3]};
+ const IID IID_ITForwardInformation = {0x449F659E, 0x88A3, 0x11D1, [0xBB, 0x5D, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITForwardInformation2 = {0x5229B4ED, 0xB260, 0x4382, [0x8E, 0x1A, 0x5D, 0xF3, 0xA8, 0xA4, 0xCC, 0xC0]};
+ const IID IID_ITfSpeechUIServer = {0x90E9A944, 0x9244, 0x489F, [0xA7, 0x8F, 0xDE, 0x67, 0xAF, 0xC0, 0x13, 0xA7]};
+ const IID IID_IThumbnailCapture = {0x4EA39266, 0x7211, 0x409F, [0xB6, 0x22, 0xF6, 0x3D, 0xBD, 0x16, 0xC5, 0x33]};
+ const IID IID_IThumbnailExtractor = {0x969DC708, 0x5C76, 0x11D1, [0x8D, 0x86, 0x00, 0x00, 0xF8, 0x04, 0xB0, 0x57]};
+ const IID IID_ITILSConfig = {0x34621D72, 0x6CFF, 0x11D1, [0xAF, 0xF7, 0x00, 0xC0, 0x4F, 0xC3, 0x1F, 0xEE]};
+ const IID IID_ITIMEActiveElementCollection = {0x403E2540, 0x4520, 0x11D3, [0x93, 0xAB, 0x00, 0xA0, 0xC9, 0x67, 0xA4, 0x38]};
+ const IID IID_ITimeAndNoticeControl = {0xBC0BF6AE, 0x8878, 0x11D1, [0x83, 0xE9, 0x00, 0xC0, 0x4F, 0xC2, 0xC6, 0xD4]};
+ const IID IID_ITIMEAnimationElement = {0xA74F14B1, 0xB6A2, 0x430A, [0xA5, 0xE8, 0x1F, 0x4E, 0x53, 0xF7, 0x10, 0xFE]};
+ const IID IID_ITIMEAnimationElement2 = {0x29CE8661, 0xBD43, 0x421A, [0xB6, 0x16, 0xE9, 0xB3, 0x1F, 0x33, 0xA5, 0x72]};
+ const IID IID_ITIMEBodyElement = {0x8C90E348, 0xEC0A, 0x4229, [0x90, 0xB0, 0xE5, 0x7D, 0x2C, 0xA4, 0x5C, 0xCB]};
+ const IID IID_ITIMEDMusicPlayerObject = {0x407954F5, 0x2BAB, 0x4CFA, [0x95, 0x4D, 0x24, 0x9F, 0x9F, 0xCE, 0x43, 0xA1]};
+ const IID IID_ITIMEDVDPlayerObject = {0x3AF7AB68, 0x4F29, 0x462C, [0xAA, 0x6E, 0x58, 0x72, 0x44, 0x88, 0x99, 0xE3]};
+ const IID IID_ITIMEElement = {0x1C2EF64E, 0xF07D, 0x4338, [0x97, 0x71, 0x91, 0x54, 0x49, 0x1C, 0xD8, 0xB9]};
+ const IID IID_ITIMEElementCollection = {0x50ABC224, 0x6D53, 0x4F83, [0x91, 0x35, 0x24, 0x40, 0xA4, 0x1B, 0x7B, 0xC8]};
+ const IID IID_ITIMEFactory = {0xCD51E446, 0x3006, 0x434F, [0x90, 0xE2, 0xE3, 0x7E, 0x8F, 0xB8, 0xCA, 0x8F]};
+ const IID IID_ITIMEMediaElement = {0x47A6972F, 0xAE65, 0x4A6B, [0xAE, 0x63, 0xD0, 0xC1, 0xD5, 0x30, 0x7B, 0x58]};
+ const IID IID_ITIMEMediaElement2 = {0x9EE29400, 0x7EE6, 0x453A, [0x85, 0xB3, 0x4E, 0xC2, 0x8E, 0x03, 0x05, 0xB4]};
+ const IID IID_ITIMEMediaPlayer = {0xEA4A95BE, 0xACC9, 0x4BF0, [0x85, 0xA4, 0x1B, 0xF3, 0xC5, 0x1E, 0x43, 0x1C]};
+ const IID IID_ITIMEMediaPlayerAudio = {0xFFAACFDA, 0xB374, 0x4F22, [0xAC, 0x9A, 0xC5, 0xBB, 0x94, 0x37, 0xCB, 0x56]};
+ const IID IID_ITIMEMediaPlayerControl = {0x897A99E7, 0xF386, 0x45C8, [0xB5, 0x1B, 0x3A, 0x25, 0xBB, 0xCB, 0xBA, 0x69]};
+ const IID IID_ITIMEMediaPlayerNetwork = {0xB9987FCA, 0x7FBB, 0x4015, [0xBD, 0x3D, 0x74, 0x18, 0x60, 0x55, 0x14, 0xDA]};
+ const IID IID_ITIMEMediaPlayerSite = {0xBF0571ED, 0x344F, 0x4F58, [0x82, 0xC7, 0x74, 0x31, 0xED, 0x0F, 0xD8, 0x34]};
+ const IID IID_ITIMEPlayItem = {0x2A6096D9, 0x2CE0, 0x47DC, [0xA8, 0x13, 0x90, 0x99, 0xA2, 0x46, 0x63, 0x09]};
+ const IID IID_ITIMEPlayItem2 = {0x4262CD38, 0x6BDC, 0x40A4, [0xBC, 0x50, 0x4C, 0xC5, 0x03, 0x66, 0xE7, 0x02]};
+ const IID IID_ITIMEPlayList = {0xE9B75B62, 0xDD97, 0x4B19, [0x8F, 0xD9, 0x96, 0x46, 0x29, 0x29, 0x52, 0xE0]};
+ const IID IID_ITimer = {0x3050F360, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ITimerService = {0x3050F35F, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ITimerSink = {0x3050F361, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ITIMEState = {0xDD5EC62A, 0x9D77, 0x4573, [0x80, 0xA8, 0x75, 0x85, 0x94, 0xE6, 0x9C, 0xEA]};
+ const IID IID_ITIMETransitionElement = {0xF383D66F, 0x5E68, 0x4FC2, [0xB6, 0x41, 0x03, 0x67, 0x2B, 0x54, 0x3A, 0x49]};
+ const IID IID_ITLegacyAddressMediaControl = {0xAB493640, 0x4C0B, 0x11D2, [0xA0, 0x46, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITLegacyAddressMediaControl2 = {0xB0EE512B, 0xA531, 0x409E, [0x9D, 0xD9, 0x40, 0x99, 0xFE, 0x86, 0xC7, 0x38]};
+ const IID IID_ITLegacyCallMediaControl = {0xD624582F, 0xCC23, 0x4436, [0xB8, 0xA5, 0x47, 0xC6, 0x25, 0xC8, 0x04, 0x5D]};
+ const IID IID_ITLegacyCallMediaControl2 = {0x57CA332D, 0x7BC2, 0x44F1, [0xA6, 0x0C, 0x93, 0x6F, 0xE8, 0xD7, 0xCE, 0x73]};
+ const IID IID_ITLegacyWaveSupport = {0x207823EA, 0xE252, 0x11D2, [0xB7, 0x7E, 0x00, 0x80, 0xC7, 0x13, 0x53, 0x81]};
+ const IID IID_ITLocalParticipant = {0x39CBF055, 0xF77A, 0x11D2, [0xA8, 0x24, 0x00, 0xC0, 0x4F, 0x8E, 0xF6, 0xE3]};
+ const IID IID_ITLocationInfo = {0x0C4D8EFF, 0x8DDB, 0x11D1, [0xA0, 0x9E, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_ITMedia = {0x0CC1F053, 0xCAEB, 0x11D0, [0x8D, 0x58, 0x00, 0xC0, 0x4F, 0xD9, 0x1A, 0xC0]};
+ const IID IID_ITMediaCollection = {0x6A8E16A2, 0x0ABC, 0x11D1, [0x97, 0x6D, 0x00, 0xC0, 0x4F, 0xD9, 0x1A, 0xC0]};
+ const IID IID_ITMediaControl = {0xC445DDE8, 0x5199, 0x4BC7, [0x98, 0x07, 0x5F, 0xFB, 0x92, 0xE4, 0x2E, 0x09]};
+ const IID IID_ITMediaPlayback = {0x627E8AE6, 0xAE4C, 0x4A69, [0xBB, 0x63, 0x2A, 0xD6, 0x25, 0x40, 0x4B, 0x77]};
+ const IID IID_ITMediaRecord = {0xF5DD4592, 0x5476, 0x4CC1, [0x9D, 0x4D, 0xFA, 0xD3, 0xEE, 0xFE, 0x7D, 0xB2]};
+ const IID IID_ITMediaSupport = {0xB1EFC384, 0x9355, 0x11D0, [0x83, 0x5C, 0x00, 0xAA, 0x00, 0x3C, 0xCA, 0xBD]};
+ const IID IID_ITMSPAddress = {0xEE3BD600, 0x3868, 0x11D2, [0xA0, 0x45, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITMultiTrackTerminal = {0xFE040091, 0xADE8, 0x4072, [0x95, 0xC9, 0xBF, 0x7D, 0xE8, 0xC5, 0x4B, 0x44]};
+ const IID IID_ITParticipant = {0x5899B820, 0x5A34, 0x11D2, [0x95, 0xA0, 0x00, 0xA0, 0x24, 0x4D, 0x22, 0x98]};
+ const IID IID_ITParticipantControl = {0xD2EE6684, 0x5A34, 0x11D2, [0x95, 0xA0, 0x00, 0xA0, 0x24, 0x4D, 0x22, 0x98]};
+ const IID IID_ITParticipantEvent = {0x8BB35070, 0x2DAD, 0x11D3, [0xA5, 0x80, 0x00, 0xC0, 0x4F, 0x8E, 0xF6, 0xE3]};
+ const IID IID_ITParticipantSubStreamControl = {0x2C679108, 0x5A35, 0x11D2, [0x95, 0xA0, 0x00, 0xA0, 0x24, 0x4D, 0x22, 0x98]};
+ const IID IID_ITPhone = {0x09D48DB4, 0x10CC, 0x4388, [0x9D, 0xE7, 0xA8, 0x46, 0x56, 0x18, 0x97, 0x5A]};
+ const IID IID_ITPhoneDeviceSpecificEvent = {0x63FFB2A6, 0x872B, 0x4CD3, [0xA5, 0x01, 0x32, 0x6E, 0x8F, 0xB4, 0x0A, 0xF7]};
+ const IID IID_ITPhoneEvent = {0x8F942DD8, 0x64ED, 0x4AAF, [0xA7, 0x7D, 0xB2, 0x3D, 0xB0, 0x83, 0x7E, 0xAD]};
+ const IID IID_ITPluggableTerminalClassInfo = {0x41757F4A, 0xCF09, 0x4B34, [0xBC, 0x96, 0x0A, 0x79, 0xD2, 0x39, 0x00, 0x76]};
+ const IID IID_ITPluggableTerminalClassRegistrat = {0x924A3723, 0xA00B, 0x4F5F, [0x9F, 0xEE, 0x8E, 0x9A, 0xEB, 0x9E, 0x82, 0xAA]};
+ const IID IID_ITPluggableTerminalEventSink = {0x6E0887BE, 0xBA1A, 0x492E, [0xBD, 0x10, 0x40, 0x20, 0xEC, 0x5E, 0x33, 0xE0]};
+ const IID IID_ITPluggableTerminalEventSinkRegis = {0xF7115709, 0xA216, 0x4957, [0xA7, 0x59, 0x06, 0x0A, 0xB3, 0x2A, 0x90, 0xD1]};
+ const IID IID_ITPluggableTerminalInitializatio = {0xAED6483C, 0x3304, 0x11D2, [0x86, 0xF1, 0x00, 0x60, 0x08, 0xB0, 0xE5, 0xD2]};
+ const IID IID_ITPluggableTerminalSuperclassInf = {0x6D54E42C, 0x4625, 0x4359, [0xA6, 0xF7, 0x63, 0x19, 0x99, 0x10, 0x7E, 0x05]};
+ const IID IID_ITPluggableTerminalSuperclassRegi = {0x60D3C08A, 0xC13E, 0x4195, [0x9A, 0xB0, 0x8D, 0xE7, 0x68, 0x09, 0x0F, 0x25]};
+ const IID IID_ITPrivateEvent = {0x0E269CD0, 0x10D4, 0x4121, [0x9C, 0x22, 0x9C, 0x85, 0xD6, 0x25, 0x65, 0x0D]};
+ const IID IID_ITQOSApplicationID = {0xE8C89D27, 0xA3BD, 0x47D5, [0xA6, 0xFC, 0xD2, 0xAE, 0x40, 0xCD, 0xBC, 0x6E]};
+ const IID IID_ITQOSEvent = {0xCFA3357C, 0xAD77, 0x11D1, [0xBB, 0x68, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITQueue = {0x5AFC3149, 0x4BCC, 0x11D1, [0xBF, 0x80, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_ITQueueEvent = {0x297F3033, 0xBD11, 0x11D1, [0xA0, 0xA7, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_ITrackFile = {0x8790C948, 0xA30B, 0x11D0, [0x8C, 0xAB, 0x00, 0xC0, 0x4F, 0xD9, 0x0F, 0x85]};
+ const IID IID_ITransaction = {0x0FB15084, 0xAF41, 0x11CE, [0xBD, 0x2B, 0x20, 0x4C, 0x4F, 0x4F, 0x50, 0x20]};
+ const IID IID_ITransaction2 = {0x34021548, 0x0065, 0x11D3, [0xBA, 0xC1, 0x00, 0xC0, 0x4F, 0x79, 0x7B, 0xE2]};
+ const IID IID_ITransactionCloner = {0x02656950, 0x2152, 0x11D0, [0x94, 0x4C, 0x00, 0xA0, 0xC9, 0x05, 0x41, 0x6E]};
+ const IID IID_ITransactionDispenser = {0x3A6AD9E1, 0x23B9, 0x11CF, [0xAD, 0x60, 0x00, 0xAA, 0x00, 0xA7, 0x4C, 0xCD]};
+ const IID IID_ITransactionJoin = {0x0C733A5E, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ITransactionLocal = {0x0C733A5F, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ITransactionObject = {0x0C733A60, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ITransactionOptions = {0x3A6AD9E0, 0x23B9, 0x11CF, [0xAD, 0x60, 0x00, 0xAA, 0x00, 0xA7, 0x4C, 0xCD]};
+ const IID IID_ITransactionOutcomeEvents = {0x3A6AD9E2, 0x23B9, 0x11CF, [0xAD, 0x60, 0x00, 0xAA, 0x00, 0xA7, 0x4C, 0xCD]};
+ const IID IID_ITransmt = {0xB3C9F150, 0xB593, 0x11CE, [0xB5, 0xB0, 0x00, 0xAA, 0x00, 0x6C, 0xB3, 0x7D]};
+ const IID IID_ITravelEntry = {0xF46EDB3B, 0xBC2F, 0x11D0, [0x94, 0x12, 0x00, 0xAA, 0x00, 0xA3, 0xEB, 0xD3]};
+ const IID IID_ITravelLog = {0x66A9CB08, 0x4802, 0x11D2, [0xA5, 0x61, 0x00, 0xA0, 0xC9, 0x2D, 0xBF, 0xE8]};
+ const IID IID_ITravelLogClient = {0x3050F67A, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ITravelLogClient2 = {0x0AD364CE, 0xADCB, 0x11D3, [0x82, 0x69, 0x00, 0x80, 0x5F, 0xC7, 0x32, 0xC0]};
+ const IID IID_ITravelLogEntry = {0x7EBFDD87, 0xAD18, 0x11D3, [0xA4, 0xC5, 0x00, 0xC0, 0x4F, 0x72, 0xD6, 0xB8]};
+ const IID IID_ITravelLogEx = {0x3050F679, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_ITravelLogStg = {0x7EBFDD80, 0xAD18, 0x11D3, [0xA4, 0xC5, 0x00, 0xC0, 0x4F, 0x72, 0xD6, 0xB8]};
+ const IID IID_ITRendezvous = {0x34621D6B, 0x6CFF, 0x11D1, [0xAF, 0xF7, 0x00, 0xC0, 0x4F, 0xC3, 0x1F, 0xEE]};
+ const IID IID_ITRequest = {0xAC48FFDF, 0xF8C4, 0x11D1, [0xA0, 0x30, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITRequestEvent = {0xAC48FFDE, 0xF8C4, 0x11D1, [0xA0, 0x30, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITridentEventSink = {0x1DC9CA50, 0x06EF, 0x11D2, [0x84, 0x15, 0x00, 0x60, 0x08, 0xC3, 0xFB, 0xFC]};
+ const IID IID_ITrkForceOwnership = {0xA2531F44, 0xC67D, 0x11D0, [0x8C, 0xB1, 0x00, 0xC0, 0x4F, 0xD9, 0x0F, 0x85]};
+ const IID IID_ITrkRestoreNotify = {0xD0056F6B, 0xE2A0, 0x11D0, [0xB1, 0xC2, 0x00, 0xC0, 0x4F, 0xB9, 0x38, 0x6D]};
+ const IID IID_ITrkRestoreParser = {0x755939E3, 0xE381, 0x11D0, [0xB1, 0xC5, 0x00, 0xC0, 0x4F, 0xB9, 0x38, 0x6D]};
+ const IID IID_ITrusteeAdmin = {0x0C733AA1, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ITrusteeGroupAdmin = {0x0C733AA2, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_ITScriptableAudioFormat = {0xB87658BD, 0x3C59, 0x4F64, [0xBE, 0x74, 0xAE, 0xDE, 0x3E, 0x86, 0xA8, 0x1E]};
+ const IID IID_ITSdp = {0x9B2719D8, 0xB696, 0x11D0, [0xA4, 0x89, 0x00, 0xC0, 0x4F, 0xD9, 0x1A, 0xC0]};
+ const IID IID_ITStaticAudioTerminal = {0xA86B7871, 0xD14C, 0x48E6, [0x92, 0x2E, 0xA8, 0xD1, 0x5F, 0x98, 0x48, 0x00]};
+ const IID IID_ITStream = {0xEE3BD605, 0x3868, 0x11D2, [0xA0, 0x45, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITStreamControl = {0xEE3BD604, 0x3868, 0x11D2, [0xA0, 0x45, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITStreamQualityControl = {0x6C0AB6C2, 0x21E3, 0x11D3, [0xA5, 0x77, 0x00, 0xC0, 0x4F, 0x8E, 0xF6, 0xE3]};
+ const IID IID_ITSubStream = {0xEE3BD608, 0x3868, 0x11D2, [0xA0, 0x45, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITSubStreamControl = {0xEE3BD607, 0x3868, 0x11D2, [0xA0, 0x45, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITTAPI = {0xB1EFC382, 0x9355, 0x11D0, [0x83, 0x5C, 0x00, 0xAA, 0x00, 0x3C, 0xCA, 0xBD]};
+ const IID IID_ITTAPI2 = {0x54FBDC8C, 0xD90F, 0x4DAD, [0x96, 0x95, 0xB3, 0x73, 0x09, 0x7F, 0x09, 0x4B]};
+ const IID IID_ITTAPICallCenter = {0x5AFC3154, 0x4BCC, 0x11D1, [0xBF, 0x80, 0x00, 0x80, 0x5F, 0xC1, 0x47, 0xD3]};
+ const IID IID_ITTAPIEventNotification = {0xEDDB9426, 0x3B91, 0x11D1, [0x8F, 0x30, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITTAPIObjectEvent = {0xF4854D48, 0x937A, 0x11D1, [0xBB, 0x58, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID IID_ITTAPIObjectEvent2 = {0x359DDA6E, 0x68CE, 0x4383, [0xBF, 0x0B, 0x16, 0x91, 0x33, 0xC4, 0x1B, 0x46]};
+ const IID IID_ITTerminal = {0xB1EFC38A, 0x9355, 0x11D0, [0x83, 0x5C, 0x00, 0xAA, 0x00, 0x3C, 0xCA, 0xBD]};
+ const IID IID_ITTerminalControl = {0xAED6483B, 0x3304, 0x11D2, [0x86, 0xF1, 0x00, 0x60, 0x08, 0xB0, 0xE5, 0xD2]};
+ const IID IID_ITTerminalManager = {0x7170F2DE, 0x9BE3, 0x11D0, [0xA0, 0x09, 0x00, 0xAA, 0x00, 0xB6, 0x05, 0xA4]};
+ const IID IID_ITTerminalManager2 = {0xBB33DEC6, 0xB2C7, 0x46E6, [0x9E, 0xD1, 0x49, 0x8B, 0x91, 0xFA, 0x85, 0xAC]};
+ const IID IID_ITTerminalSupport = {0xB1EFC385, 0x9355, 0x11D0, [0x83, 0x5C, 0x00, 0xAA, 0x00, 0x3C, 0xCA, 0xBD]};
+ const IID IID_ITTerminalSupport2 = {0xF3EB39BC, 0x1B1F, 0x4E99, [0xA0, 0xC0, 0x56, 0x30, 0x5C, 0x4D, 0xD5, 0x91]};
+ const IID IID_ITTime = {0x2652BB78, 0x1516, 0x11D1, [0x97, 0x71, 0x00, 0xC0, 0x4F, 0xD9, 0x1A, 0xC0]};
+ const IID IID_ITTimeCollection = {0x0CC1F04F, 0xCAEB, 0x11D0, [0x8D, 0x58, 0x00, 0xC0, 0x4F, 0xD9, 0x1A, 0xC0]};
+ const IID IID_ITToneDetectionEvent = {0x407E0FAF, 0xD047, 0x4753, [0xB0, 0xC6, 0x8E, 0x06, 0x03, 0x73, 0xFE, 0xCD]};
+ const IID IID_ITToneTerminalEvent = {0xE6F56009, 0x611F, 0x4945, [0xBB, 0xD2, 0x2D, 0x0C, 0xE5, 0x61, 0x20, 0x56]};
+ const IID IID_ITTTSTerminalEvent = {0xD964788F, 0x95A5, 0x461D, [0xAB, 0x0C, 0xB9, 0x90, 0x0A, 0x6C, 0x27, 0x13]};
+ const IID IID_ITypeChangeEvents = {0x00020410, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ITypeComp = {0x00020403, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ITypeFactory = {0x0000002E, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ITypeInfo = {0x00020401, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ITypeInfo2 = {0x00020412, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ITypeLib = {0x00020402, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ITypeLib2 = {0x00020411, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_ITypeMarshal = {0x0000002D, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IUmiADSIPrivate = {0xCFCECB01, 0x3123, 0x4926, [0xB5, 0xE3, 0x62, 0x78, 0x08, 0x27, 0x26, 0x43]};
+ const IID IID_IUniformResourceLocatorA = {0xFBF23B80, 0xE3F0, 0x101B, [0x84, 0x88, 0x00, 0xAA, 0x00, 0x3E, 0x56, 0xF8]};
+ const IID IID_IUniformResourceLocatorW = {0xCABB0DA0, 0xDA57, 0x11CF, [0x99, 0x74, 0x00, 0x20, 0xAF, 0xD7, 0x97, 0x62]};
+ const IID IID_IUnknown = {0x00000000, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IUnsecuredApartment = {0x1CFABA8C, 0x1523, 0x11D1, [0xAD, 0x79, 0x00, 0xC0, 0x4F, 0xD8, 0xFD, 0xFF]};
+ const IID IID_IUPnPDescriptionDocument = {0x11D1C1B2, 0x7DAA, 0x4C9E, [0x95, 0x95, 0x7F, 0x82, 0xED, 0x20, 0x6D, 0x1E]};
+ const IID IID_IUPnPDescriptionDocumentCallback = {0x77394C69, 0x5486, 0x40D6, [0x9B, 0xC3, 0x49, 0x91, 0x98, 0x3E, 0x02, 0xDA]};
+ const IID IID_IUPnPDevice = {0x3D44D0D1, 0x98C9, 0x4889, [0xAC, 0xD1, 0xF9, 0xD6, 0x74, 0xBF, 0x22, 0x21]};
+ const IID IID_IUPnPDeviceControl = {0x204810BA, 0x73B2, 0x11D4, [0xBF, 0x42, 0x00, 0xB0, 0xD0, 0x11, 0x8B, 0x56]};
+ const IID IID_IUPnPDeviceDocumentAccess = {0xE7772804, 0x3287, 0x418E, [0x90, 0x72, 0xCF, 0x2B, 0x47, 0x23, 0x89, 0x81]};
+ const IID IID_IUPnPDeviceFinder = {0xADDA3D55, 0x6F72, 0x4319, [0xBF, 0xF9, 0x18, 0x60, 0x0A, 0x53, 0x9B, 0x10]};
+ const IID IID_IUPnPDeviceFinderAddCallbackWithI = {0x983DFC0B, 0x1796, 0x44DF, [0x89, 0x75, 0xCA, 0x54, 0x5B, 0x62, 0x0E, 0xE5]};
+ const IID IID_IUPnPDeviceFinderCallback = {0x415A984A, 0x88B3, 0x49F3, [0x92, 0xAF, 0x05, 0x08, 0xBE, 0xDF, 0x0D, 0x6C]};
+ const IID IID_IUPnPDeviceHostICSSupport = {0x3FFC5AE5, 0xA66B, 0x499C, [0xA1, 0x80, 0xC7, 0x39, 0x3D, 0xB6, 0xBA, 0x8D]};
+ const IID IID_IUPnPDeviceHostSetup = {0x6BD34909, 0x54E7, 0x4FBF, [0x85, 0x62, 0x7B, 0x89, 0x70, 0x9A, 0x58, 0x9A]};
+ const IID IID_IUPnPDeviceProvider = {0x204810B8, 0x73B2, 0x11D4, [0xBF, 0x42, 0x00, 0xB0, 0xD0, 0x11, 0x8B, 0x56]};
+ const IID IID_IUPnPDevices = {0xFDBC0C73, 0xBDA3, 0x4C66, [0xAC, 0x4F, 0xF2, 0xD9, 0x6F, 0xDA, 0xD6, 0x8C]};
+ const IID IID_IUPnPEventSink = {0x204810B4, 0x73B2, 0x11D4, [0xBF, 0x42, 0x00, 0xB0, 0xD0, 0x11, 0x8B, 0x56]};
+ const IID IID_IUPnPEventSource = {0x204810B5, 0x73B2, 0x11D4, [0xBF, 0x42, 0x00, 0xB0, 0xD0, 0x11, 0x8B, 0x56]};
+ const IID IID_IUPnPNAT = {0xB171C812, 0xCC76, 0x485A, [0x94, 0xD8, 0xB6, 0xB3, 0xA2, 0x79, 0x4E, 0x99]};
+ const IID IID_IUPnPPrivateCallbackHelper = {0x8DCC8327, 0xDBE9, 0x48E6, [0x84, 0x6C, 0x33, 0x72, 0x58, 0x65, 0xD5, 0x0C]};
+ const IID IID_IUPnPPrivateDocumentCallbackHelp = {0x19432A8E, 0x4A32, 0x4860, [0xB8, 0xFB, 0x95, 0xB1, 0x11, 0x7C, 0xD4, 0xE5]};
+ const IID IID_IUPnPPrivateServiceHelper2 = {0x340F4076, 0x6856, 0x48F9, [0xB3, 0xC4, 0x97, 0xB9, 0x1B, 0x68, 0xD7, 0x7E]};
+ const IID IID_IUPnPRegistrar = {0x204810B6, 0x73B2, 0x11D4, [0xBF, 0x42, 0x00, 0xB0, 0xD0, 0x11, 0x8B, 0x56]};
+ const IID IID_IUPnPReregistrar = {0x204810B7, 0x73B2, 0x11D4, [0xBF, 0x42, 0x00, 0xB0, 0xD0, 0x11, 0x8B, 0x56]};
+ const IID IID_IUPnPService = {0xA295019C, 0xDC65, 0x47DD, [0x90, 0xDC, 0x7F, 0xE9, 0x18, 0xA1, 0xAB, 0x44]};
+ const IID IID_IUPnPServiceCallback = {0x31FADCA9, 0xAB73, 0x464B, [0xB6, 0x7D, 0x5C, 0x1D, 0x0F, 0x83, 0xC8, 0xB8]};
+ const IID IID_IUPnPServiceCallbackPrivate = {0x24EA2515, 0xF612, 0x4528, [0xBA, 0x82, 0x7B, 0xD3, 0xDB, 0xBA, 0xD3, 0x03]};
+ const IID IID_IUPnPServices = {0x3F8C8E9E, 0x9A7A, 0x4DC8, [0xBC, 0x41, 0xFF, 0x31, 0xFA, 0x37, 0x49, 0x56]};
+ const IID IID_IUrlHistoryNotify = {0xBC40BEC1, 0xC493, 0x11D0, [0x83, 0x1B, 0x00, 0xC0, 0x4F, 0xD5, 0xAE, 0x38]};
+ const IID IID_IUrlHistoryStg = {0x3C374A41, 0xBAE4, 0x11CF, [0xBF, 0x7D, 0x00, 0xAA, 0x00, 0x69, 0x46, 0xEE]};
+ const IID IID_IUrlHistoryStg2 = {0xAFA0DC11, 0xC313, 0x11D0, [0x83, 0x1A, 0x00, 0xC0, 0x4F, 0xD5, 0xAE, 0x38]};
+ const IID IID_IUrlMon = {0x00000026, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IURLSearchHook = {0xAC60F6A0, 0x0FD9, 0x11D0, [0x99, 0xCB, 0x00, 0xC0, 0x4F, 0xD6, 0x44, 0x97]};
+ const IID IID_IURLSearchHook2 = {0x5EE44DA4, 0x6D32, 0x46E3, [0x86, 0xBC, 0x07, 0x54, 0x0D, 0xED, 0xD0, 0xE0]};
+ const IID IID_IUrlTrackingStg = {0xF2F8CBB3, 0xB040, 0x11D0, [0xBB, 0x16, 0x00, 0xC0, 0x4F, 0xB6, 0x6F, 0x63]};
+ const IID IID_IUserEventTimer = {0x0F504B94, 0x6E42, 0x42E6, [0x99, 0xE0, 0xE2, 0x0F, 0xAF, 0xE5, 0x2A, 0xB4]};
+ const IID IID_IUserEventTimerCallback = {0xE9EAD8E6, 0x2A25, 0x410E, [0x9B, 0x58, 0xA9, 0xFB, 0xEF, 0x1D, 0xD1, 0xA2]};
+ const IID IID_IUserNotification = {0xBA9711BA, 0x5893, 0x4787, [0xA7, 0xE1, 0x41, 0x27, 0x71, 0x51, 0x55, 0x0B]};
+ const IID IID_IUtilityButton = {0x3050F6AF, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID IID_IVariantChangeType = {0xA6EF9862, 0xC720, 0x11D0, [0x93, 0x37, 0x00, 0xA0, 0xC9, 0x0D, 0xCA, 0xA9]};
+ const IID IID_IVersionHost = {0x667115AC, 0xDC02, 0x11D1, [0xBA, 0x57, 0x00, 0xC0, 0x4F, 0xC2, 0x04, 0x0E]};
+ const IID IID_IVersionVector = {0x4EB01410, 0xDB1A, 0x11D1, [0xBA, 0x53, 0x00, 0xC0, 0x4F, 0xC2, 0x04, 0x0E]};
+ const IID IID_IViewChapter = {0x0C733A98, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IViewFilter = {0x0C733A9B, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IViewObject = {0x0000010D, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IViewObject2 = {0x00000127, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IViewObjectEx = {0x3AF24292, 0x0C96, 0x11CE, [0xA0, 0xCF, 0x00, 0xAA, 0x00, 0x60, 0x0A, 0xB8]};
+ const IID IID_IViewRowset = {0x0C733A97, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IViewSort = {0x0C733A9A, 0x2A1C, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID IID_IVirusScanEngine = {0x083DB180, 0xB4A8, 0x11CF, [0xAA, 0xFA, 0x00, 0xAA, 0x00, 0xB6, 0x01, 0x5C]};
+ const IID IID_IVirusScanner = {0x4589BEE0, 0xB4B1, 0x11CF, [0xAA, 0xFA, 0x00, 0xAA, 0x00, 0xB6, 0x01, 0x5C]};
+ const IID IID_IWaitMultiple = {0x0000002B, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IWbemAddressResolution = {0xF7CE2E12, 0x8C90, 0x11D1, [0x9E, 0x7B, 0x00, 0xC0, 0x4F, 0xC3, 0x24, 0xA8]};
+ const IID IID_IWbemBackupRestore = {0xC49E32C7, 0xBC8B, 0x11D2, [0x85, 0xD4, 0x00, 0x10, 0x5A, 0x1F, 0x83, 0x04]};
+ const IID IID_IWbemBackupRestoreEx = {0xA359DEC5, 0xE813, 0x4834, [0x8A, 0x2A, 0xBA, 0x7F, 0x1D, 0x77, 0x7D, 0x76]};
+ const IID IID_IWbemCallResult = {0x44ACA675, 0xE8FC, 0x11D0, [0xA0, 0x7C, 0x00, 0xC0, 0x4F, 0xB6, 0x88, 0x20]};
+ const IID IID_IWbemCallStatus = {0x4212DC47, 0x142E, 0x4C6C, [0xBC, 0x49, 0x6C, 0xA2, 0x32, 0xDD, 0x09, 0x59]};
+ const IID IID_IWbemClassObject = {0xDC12A681, 0x737F, 0x11CF, [0x88, 0x4D, 0x00, 0xAA, 0x00, 0x4B, 0x2E, 0x24]};
+ const IID IID_IWbemClientConnectionTransport = {0xA889C72A, 0xFCC1, 0x4A9E, [0xAF, 0x61, 0xED, 0x07, 0x13, 0x33, 0xFB, 0x5B]};
+ const IID IID_IWbemClientTransport = {0xF7CE2E11, 0x8C90, 0x11D1, [0x9E, 0x7B, 0x00, 0xC0, 0x4F, 0xC3, 0x24, 0xA8]};
+ const IID IID_IWbemConfigure = {0x9A368276, 0x26CF, 0x11D0, [0xAD, 0x3C, 0x00, 0xC0, 0x4F, 0xD8, 0xFD, 0xFF]};
+ const IID IID_IWbemConfigureRefresher = {0x49353C92, 0x516B, 0x11D1, [0xAE, 0xA6, 0x00, 0xC0, 0x4F, 0xB6, 0x88, 0x20]};
+ const IID IID_IWbemConnectorLogin = {0xD8EC9CB1, 0xB135, 0x4F10, [0x8B, 0x1B, 0xC7, 0x18, 0x8B, 0xB0, 0xD1, 0x86]};
+ const IID IID_IWbemConstructClassObject = {0x9EF76194, 0x70D5, 0x11D1, [0xAD, 0x90, 0x00, 0xC0, 0x4F, 0xD8, 0xFD, 0xFF]};
+ const IID IID_IWbemContext = {0x44ACA674, 0xE8FC, 0x11D0, [0xA0, 0x7C, 0x00, 0xC0, 0x4F, 0xB6, 0x88, 0x20]};
+ const IID IID_IWbemDecoupledBasicEventProvider = {0x86336D20, 0xCA11, 0x4786, [0x9E, 0xF1, 0xBC, 0x8A, 0x94, 0x6B, 0x42, 0xFC]};
+ const IID IID_IWbemDecoupledEventSink = {0xCD94EBF2, 0xE622, 0x11D2, [0x9C, 0xB3, 0x00, 0x10, 0x5A, 0x1F, 0x48, 0x01]};
+ const IID IID_IWbemDecoupledRegistrar = {0x1005CBCF, 0xE64F, 0x4646, [0xBC, 0xD3, 0x3A, 0x08, 0x9D, 0x8A, 0x84, 0xB4]};
+ const IID IID_IWbemEventConsumerProvider = {0xE246107A, 0xB06E, 0x11D0, [0xAD, 0x61, 0x00, 0xC0, 0x4F, 0xD8, 0xFD, 0xFF]};
+ const IID IID_IWbemEventConsumerProviderEx = {0x17CF534A, 0xD8A3, 0x4AD0, [0xAC, 0x92, 0x5E, 0x3D, 0x01, 0x71, 0x71, 0x51]};
+ const IID IID_IWbemEventProvider = {0xE245105B, 0xB06E, 0x11D0, [0xAD, 0x61, 0x00, 0xC0, 0x4F, 0xD8, 0xFD, 0xFF]};
+ const IID IID_IWbemEventProviderQuerySink = {0x580ACAF8, 0xFA1C, 0x11D0, [0xAD, 0x72, 0x00, 0xC0, 0x4F, 0xD8, 0xFD, 0xFF]};
+ const IID IID_IWbemEventProviderSecurity = {0x631F7D96, 0xD993, 0x11D2, [0xB3, 0x39, 0x00, 0x10, 0x5A, 0x1F, 0x4A, 0xAF]};
+ const IID IID_IWbemEventSink = {0x3AE0080A, 0x7E3A, 0x4366, [0xBF, 0x89, 0x0F, 0xEE, 0xDC, 0x93, 0x16, 0x59]};
+ const IID IID_IWbemHiPerfEnum = {0x2705C288, 0x79AE, 0x11D2, [0xB3, 0x48, 0x00, 0x10, 0x5A, 0x1F, 0x81, 0x77]};
+ const IID IID_IWbemHiPerfProvider = {0x49353C93, 0x516B, 0x11D1, [0xAE, 0xA6, 0x00, 0xC0, 0x4F, 0xB6, 0x88, 0x20]};
+ const IID IID_IWbemLevel1Login = {0xF309AD18, 0xD86A, 0x11D0, [0xA0, 0x75, 0x00, 0xC0, 0x4F, 0xB6, 0x88, 0x20]};
+ const IID IID_IWbemLocator = {0xDC12A687, 0x737F, 0x11CF, [0x88, 0x4D, 0x00, 0xAA, 0x00, 0x4B, 0x2E, 0x24]};
+ const IID IID_IWbemObjectAccess = {0x49353C9A, 0x516B, 0x11D1, [0xAE, 0xA6, 0x00, 0xC0, 0x4F, 0xB6, 0x88, 0x20]};
+ const IID IID_IWbemObjectSink = {0x7C857801, 0x7381, 0x11CF, [0x88, 0x4D, 0x00, 0xAA, 0x00, 0x4B, 0x2E, 0x24]};
+ const IID IID_IWbemObjectTextSrc = {0xBFBF883A, 0xCAD7, 0x11D3, [0xA1, 0x1B, 0x00, 0x10, 0x5A, 0x1F, 0x51, 0x5A]};
+ const IID IID_IWbemPath = {0x3BC15AF2, 0x736C, 0x477E, [0x9E, 0x51, 0x23, 0x8A, 0xF8, 0x66, 0x7D, 0xCC]};
+ const IID IID_IWbemPathKeyList = {0x9AE62877, 0x7544, 0x4BB0, [0xAA, 0x26, 0xA1, 0x38, 0x24, 0x65, 0x9E, 0xD6]};
+ const IID IID_IWbemPropertyProvider = {0xCE61E841, 0x65BC, 0x11D0, [0xB6, 0xBD, 0x00, 0xAA, 0x00, 0x32, 0x40, 0xC7]};
+ const IID IID_IWbemProviderIdentity = {0x631F7D97, 0xD993, 0x11D2, [0xB3, 0x39, 0x00, 0x10, 0x5A, 0x1F, 0x4A, 0xAF]};
+ const IID IID_IWbemProviderInit = {0x1BE41572, 0x91DD, 0x11D1, [0xAE, 0xB2, 0x00, 0xC0, 0x4F, 0xB6, 0x88, 0x20]};
+ const IID IID_IWbemProviderInitSink = {0x1BE41571, 0x91DD, 0x11D1, [0xAE, 0xB2, 0x00, 0xC0, 0x4F, 0xB6, 0x88, 0x20]};
+ const IID IID_IWbemQualifierSet = {0xDC12A680, 0x737F, 0x11CF, [0x88, 0x4D, 0x00, 0xAA, 0x00, 0x4B, 0x2E, 0x24]};
+ const IID IID_IWbemQuery = {0x81166F58, 0xDD98, 0x11D3, [0xA1, 0x20, 0x00, 0x10, 0x5A, 0x1F, 0x51, 0x5A]};
+ const IID IID_IWbemRawSdAccessor = {0xC1E2D759, 0xCABD, 0x11D3, [0xA1, 0x1B, 0x00, 0x10, 0x5A, 0x1F, 0x51, 0x5A]};
+ const IID IID_IWbemRefresher = {0x49353C99, 0x516B, 0x11D1, [0xAE, 0xA6, 0x00, 0xC0, 0x4F, 0xB6, 0x88, 0x20]};
+ const IID IID_IWbemServices = {0x9556DC99, 0x828C, 0x11CF, [0xA3, 0x7E, 0x00, 0xAA, 0x00, 0x32, 0x40, 0xC7]};
+ const IID IID_IWbemShutdown = {0xB7B31DF9, 0xD515, 0x11D3, [0xA1, 0x1C, 0x00, 0x10, 0x5A, 0x1F, 0x51, 0x5A]};
+ const IID IID_IWbemStatusCodeText = {0xEB87E1BC, 0x3233, 0x11D2, [0xAE, 0xC9, 0x00, 0xC0, 0x4F, 0xB6, 0x88, 0x20]};
+ const IID IID_IWbemTransport = {0x553FE584, 0x2156, 0x11D0, [0xB6, 0xAE, 0x00, 0xAA, 0x00, 0x32, 0x40, 0xC7]};
+ const IID IID_IWbemUnboundObjectSink = {0xE246107B, 0xB06E, 0x11D0, [0xAD, 0x61, 0x00, 0xC0, 0x4F, 0xD8, 0xFD, 0xFF]};
+ const IID IID_IWBScriptControl = {0xA5170870, 0x0CF8, 0x11D1, [0x8B, 0x91, 0x00, 0x80, 0xC7, 0x44, 0xF3, 0x89]};
+ const IID IID_IWCContextMenuCallback = {0x97DEDE64, 0xFC6B, 0x11CF, [0xB5, 0xF5, 0x00, 0xA0, 0xC9, 0x0A, 0xB5, 0x05]};
+ const IID IID_IWCPropertySheetCallback = {0x97DEDE60, 0xFC6B, 0x11CF, [0xB5, 0xF5, 0x00, 0xA0, 0xC9, 0x0A, 0xB5, 0x05]};
+ const IID IID_IWCWizard97Callback = {0x97DEDE67, 0xFC6B, 0x11CF, [0xB5, 0xF5, 0x00, 0xA0, 0xC9, 0x0A, 0xB5, 0x05]};
+ const IID IID_IWCWizardCallback = {0x97DEDE62, 0xFC6B, 0x11CF, [0xB5, 0xF5, 0x00, 0xA0, 0xC9, 0x0A, 0xB5, 0x05]};
+ const IID IID_IWebBridge = {0xAE24FDAD, 0x03C6, 0x11D1, [0x8B, 0x76, 0x00, 0x80, 0xC7, 0x44, 0xF3, 0x89]};
+ const IID IID_IWebBrowser = {0xEAB22AC1, 0x30C1, 0x11CF, [0xA7, 0xEB, 0x00, 0x00, 0xC0, 0x5B, 0xAE, 0x0B]};
+ const IID IID_IWebBrowser2 = {0xD30C1661, 0xCDAF, 0x11D0, [0x8A, 0x3E, 0x00, 0xC0, 0x4F, 0xC9, 0xE2, 0x6E]};
+ const IID IID_IWebBrowserApp = {0x0002DF05, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID IID_IWebWizardExtension = {0x0E6B3F66, 0x98D1, 0x48C0, [0xA2, 0x22, 0xFB, 0xDE, 0x74, 0xE2, 0xFB, 0xC5]};
+ const IID IID_IWebWizardHost = {0x18BCC359, 0x4990, 0x4BFB, [0xB9, 0x51, 0x3C, 0x83, 0x70, 0x2B, 0xE5, 0xF9]};
+ const IID IID_IWEExtendContextMenu = {0x97DEDE65, 0xFC6B, 0x11CF, [0xB5, 0xF5, 0x00, 0xA0, 0xC9, 0x0A, 0xB5, 0x05]};
+ const IID IID_IWEExtendPropertySheet = {0x97DEDE61, 0xFC6B, 0x11CF, [0xB5, 0xF5, 0x00, 0xA0, 0xC9, 0x0A, 0xB5, 0x05]};
+ const IID IID_IWEExtendWizard = {0x97DEDE63, 0xFC6B, 0x11CF, [0xB5, 0xF5, 0x00, 0xA0, 0xC9, 0x0A, 0xB5, 0x05]};
+ const IID IID_IWEExtendWizard97 = {0x97DEDE68, 0xFC6B, 0x11CF, [0xB5, 0xF5, 0x00, 0xA0, 0xC9, 0x0A, 0xB5, 0x05]};
+ const IID IID_IWEInvokeCommand = {0x97DEDE66, 0xFC6B, 0x11CF, [0xB5, 0xF5, 0x00, 0xA0, 0xC9, 0x0A, 0xB5, 0x05]};
+ const IID IID_Iwfolders = {0xBAE31F98, 0x1B81, 0x11D2, [0xA9, 0x7A, 0x00, 0xC0, 0x4F, 0x8E, 0xCB, 0x02]};
+ const IID IID_IWindowForBindingUI = {0x79EAC9D5, 0xBAFA, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IWinInetHttpInfo = {0x79EAC9D8, 0xBAFA, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IWinInetInfo = {0x79EAC9D6, 0xBAFA, 0x11CE, [0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B]};
+ const IID IID_IWizardExtension = {0xC02EA696, 0x86CC, 0x491E, [0x9B, 0x23, 0x74, 0x39, 0x4A, 0x04, 0x44, 0xA8]};
+ const IID IID_IWizardSite = {0x88960F5B, 0x422F, 0x4E7B, [0x80, 0x13, 0x73, 0x41, 0x53, 0x81, 0xC3, 0xC3]};
+ const IID IID_IWMIExtension = {0xADC1F06E, 0x5C7E, 0x11D2, [0x8B, 0x74, 0x00, 0x10, 0x4B, 0x2A, 0xFB, 0x41]};
+ const IID IID_IWordBreaker = {0xD53552C8, 0x77E3, 0x101A, [0xB5, 0x52, 0x08, 0x00, 0x2B, 0x33, 0xB0, 0xE6]};
+ const IID IID_IWordSink = {0xCC907054, 0xC058, 0x101A, [0xB5, 0x54, 0x08, 0x00, 0x2B, 0x33, 0xB0, 0xE6]};
+ const IID IID_IWrappedProtocol = {0x53C84785, 0x8425, 0x4DC5, [0x97, 0x1B, 0xE5, 0x8D, 0x9C, 0x19, 0xF9, 0xB6]};
+ const IID IID_IXMLAttribute = {0xD4D4A0FC, 0x3B73, 0x11D1, [0xB2, 0xB4, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0x96]};
+ const IID IID_IXMLDocument = {0xF52E2B61, 0x18A1, 0x11D1, [0xB1, 0x05, 0x00, 0x80, 0x5F, 0x49, 0x91, 0x6B]};
+ const IID IID_IXMLDocument2 = {0x2B8DE2FE, 0x8D2D, 0x11D1, [0xB2, 0xFC, 0x00, 0xC0, 0x4F, 0xD9, 0x15, 0xA9]};
+ const IID IID_IXMLDOMAttribute = {0x2933BF85, 0x7B36, 0x11D2, [0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60]};
+ const IID IID_IXMLDOMCDATASection = {0x2933BF8A, 0x7B36, 0x11D2, [0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60]};
+ const IID IID_IXMLDOMCharacterData = {0x2933BF84, 0x7B36, 0x11D2, [0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60]};
+ const IID IID_IXMLDOMComment = {0x2933BF88, 0x7B36, 0x11D2, [0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60]};
+ const IID IID_IXMLDOMDocument = {0x2933BF81, 0x7B36, 0x11D2, [0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60]};
+ const IID IID_IXMLDOMDocumentFragment = {0x3EFAA413, 0x272F, 0x11D2, [0x83, 0x6F, 0x00, 0x00, 0xF8, 0x7A, 0x77, 0x82]};
+ const IID IID_IXMLDOMDocumentType = {0x2933BF8B, 0x7B36, 0x11D2, [0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60]};
+ const IID IID_IXMLDOMElement = {0x2933BF86, 0x7B36, 0x11D2, [0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60]};
+ const IID IID_IXMLDOMEntity = {0x2933BF8D, 0x7B36, 0x11D2, [0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60]};
+ const IID IID_IXMLDOMEntityReference = {0x2933BF8E, 0x7B36, 0x11D2, [0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60]};
+ const IID IID_IXMLDOMImplementation = {0x2933BF8F, 0x7B36, 0x11D2, [0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60]};
+ const IID IID_IXMLDOMNamedNodeMap = {0x2933BF83, 0x7B36, 0x11D2, [0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60]};
+ const IID IID_IXMLDOMNode = {0x2933BF80, 0x7B36, 0x11D2, [0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60]};
+ const IID IID_IXMLDOMNodeList = {0x2933BF82, 0x7B36, 0x11D2, [0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60]};
+ const IID IID_IXMLDOMNotation = {0x2933BF8C, 0x7B36, 0x11D2, [0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60]};
+ const IID IID_IXMLDOMParseError = {0x3EFAA426, 0x272F, 0x11D2, [0x83, 0x6F, 0x00, 0x00, 0xF8, 0x7A, 0x77, 0x82]};
+ const IID IID_IXMLDOMProcessingInstruction = {0x2933BF89, 0x7B36, 0x11D2, [0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60]};
+ const IID IID_IXMLDOMText = {0x2933BF87, 0x7B36, 0x11D2, [0xB2, 0x0E, 0x00, 0xC0, 0x4F, 0x98, 0x3E, 0x60]};
+ const IID IID_IXMLDSOControl = {0x310AFA62, 0x0575, 0x11D2, [0x9C, 0xA9, 0x00, 0x60, 0xB0, 0xEC, 0x3D, 0x39]};
+ const IID IID_IXMLElement = {0x3F7F31AC, 0xE15F, 0x11D0, [0x9C, 0x25, 0x00, 0xC0, 0x4F, 0xC9, 0x9C, 0x8E]};
+ const IID IID_IXMLElement2 = {0x2B8DE2FF, 0x8D2D, 0x11D1, [0xB2, 0xFC, 0x00, 0xC0, 0x4F, 0xD9, 0x15, 0xA9]};
+ const IID IID_IXMLElementCollection = {0x65725580, 0x9B5D, 0x11D0, [0x9B, 0xFE, 0x00, 0xC0, 0x4F, 0xC9, 0x9C, 0x8E]};
+ const IID IID_IXMLError = {0x948C5AD3, 0xC58D, 0x11D0, [0x9C, 0x0B, 0x00, 0xC0, 0x4F, 0xC9, 0x9C, 0x8E]};
+ const IID IID_IXMLGenericParse = {0xE4E23071, 0x4D07, 0x11D2, [0xAE, 0x76, 0x00, 0x80, 0xC7, 0x3B, 0xC1, 0x99]};
+ const IID IID_IXMLHttpRequest = {0xED8C108D, 0x4349, 0x11D2, [0x91, 0xA4, 0x00, 0xC0, 0x4F, 0x79, 0x69, 0xE8]};
+ const IID IID_IXMLNodeFactory = {0xD242361F, 0x51A0, 0x11D2, [0x9C, 0xAF, 0x00, 0x60, 0xB0, 0xEC, 0x3D, 0x39]};
+ const IID IID_IXMLNodeSource = {0xD242361D, 0x51A0, 0x11D2, [0x9C, 0xAF, 0x00, 0x60, 0xB0, 0xEC, 0x3D, 0x39]};
+ const IID IID_IXMLParser = {0xD242361E, 0x51A0, 0x11D2, [0x9C, 0xAF, 0x00, 0x60, 0xB0, 0xEC, 0x3D, 0x39]};
+ const IID IID_IXTLRuntime = {0x3EFAA425, 0x272F, 0x11D2, [0x83, 0x6F, 0x00, 0x00, 0xF8, 0x7A, 0x77, 0x82]};
+ const IID IID_StdOle = {0x00020430, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID KSDATAFORMAT_SUBTYPE_DIRECTMUSIC = {0x1A82F8BC, 0x3F8B, 0x11D2, [0xB7, 0x74, 0x00, 0x60, 0x08, 0x33, 0x16, 0xC1]};
+ const IID KSDATAFORMAT_SUBTYPE_MIDI = {0x1D262760, 0xE957, 0x11CF, [0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00]};
+ const IID LIBID_Accessibility = {0x1EA4DBF0, 0x3C3B, 0x11CF, [0x81, 0x0C, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71]};
+ const IID LIBID_ActiveIMM = {0x4955DD30, 0xB159, 0x11D0, [0x8F, 0xCF, 0x00, 0xAA, 0x00, 0x6B, 0xCC, 0x59]};
+ const IID LIBID_ADs = {0x97D25DB0, 0x0363, 0x11CF, [0xAB, 0xC4, 0x02, 0x60, 0x8C, 0x9E, 0x75, 0x53]};
+ const IID LIBID_ALGLib = {0xB6D1D098, 0xE235, 0x4B99, [0xBA, 0x98, 0x7C, 0x62, 0x4F, 0xD8, 0x75, 0xDB]};
+ const IID LIBID_AutoDiscovery = {0x4EAFB888, 0x81CB, 0x4EBA, [0xBA, 0xC9, 0xDA, 0x25, 0x4E, 0x57, 0x21, 0xF1]};
+ const IID LIBID_BackgroundCopyManager = {0x1DEEB74F, 0x7915, 0x4560, [0xB5, 0x58, 0x91, 0x8C, 0x83, 0xF1, 0x76, 0xA6]};
+ const IID LIBID_BackgroundCopyManager1_5 = {0xEA9319EA, 0xC628, 0x480F, [0x83, 0x31, 0x76, 0x8F, 0xAC, 0x39, 0x7E, 0x4E]};
+ const IID LIBID_BackgroundCopyQMgr = {0xF5B26DCB, 0xB37E, 0x4D7C, [0xAE, 0x7A, 0x1C, 0xB3, 0xFB, 0xEB, 0x18, 0x3E]};
+ const IID LIBID_CHANNELMGR = {0x4804F2E0, 0xD16E, 0x11D0, [0x80, 0x2B, 0x00, 0xC0, 0x4F, 0xD7, 0x5D, 0x13]};
+ const IID LIBID_CLADMWIZLib = {0x24F97140, 0x6689, 0x11D1, [0x9A, 0xA7, 0x00, 0xC0, 0x4F, 0xB9, 0x3A, 0x80]};
+ const IID LIBID_ClusCfgWizard = {0x6D01FEDC, 0x8D34, 0x4728, [0xAD, 0x0B, 0xB3, 0xA2, 0x1A, 0x10, 0x3B, 0x42]};
+ const IID LIBID_CommonControlObjects = {0xBCADA15B, 0xB428, 0x420C, [0x8D, 0x28, 0x02, 0x35, 0x90, 0x92, 0x4C, 0x9F]};
+ const IID LIBID_DirectAnimation = {0xBCBB1F74, 0xE384, 0x11D0, [0x9B, 0x99, 0x00, 0xC0, 0x4F, 0xC2, 0xF5, 0x1D]};
+ const IID LIBID_DWbemServices_v3 = {0xCB7CA031, 0xF729, 0x11D0, [0x9E, 0x4D, 0x00, 0xC0, 0x4F, 0xC3, 0x24, 0xA8]};
+ const IID LIBID_DXTMSFTLib = {0x5E77EB03, 0x937C, 0x11D1, [0xB0, 0x47, 0x00, 0xAA, 0x00, 0x3B, 0x60, 0x61]};
+ const IID LIBID_DXTRANSLib = {0x54314D1D, 0x35FE, 0x11D1, [0x81, 0xA1, 0x00, 0x00, 0xF8, 0x75, 0x57, 0xDB]};
+ const IID LIBID_DXTRANSPLib = {0x527A4DA4, 0x7F2C, 0x11D2, [0xB1, 0x2D, 0x00, 0x00, 0xF8, 0x1F, 0x59, 0x95]};
+ const IID LIBID_EventQLib = {0xA70080F2, 0x403B, 0x11D1, [0x88, 0x36, 0x00, 0xA0, 0xC9, 0x49, 0xAC, 0x67]};
+ const IID LIBID_IASPolicyLib = {0x6BC096A5, 0x0CE6, 0x11D1, [0xBA, 0xAE, 0x00, 0xC0, 0x4F, 0xC2, 0xE2, 0x0D]};
+ const IID LIBID_IEXTagLib = {0x7E8BC440, 0xAEFF, 0x11D1, [0x89, 0xC2, 0x00, 0xC0, 0x4F, 0xB6, 0xBF, 0xC4]};
+ const IID LIBID_IMAPILib = {0xC49F2184, 0x50A7, 0x11D3, [0x91, 0x44, 0x00, 0x10, 0x4B, 0xA1, 0x1C, 0x5E]};
+ const IID LIBID_ImgUtilLib = {0xCF790840, 0x2DC4, 0x11D0, [0xB7, 0x24, 0x00, 0xAA, 0x00, 0x6C, 0x1A, 0x01]};
+ const IID LIBID_ITRKADMNLib = {0xA2531F35, 0xC67D, 0x11D0, [0x8C, 0xB1, 0x00, 0xC0, 0x4F, 0xD9, 0x0F, 0x85]};
+ const IID LIBID_McastLib = {0x64217CC0, 0xA285, 0x11D1, [0x86, 0x97, 0x00, 0x60, 0x08, 0xB0, 0xE5, 0xD2]};
+ const IID LIBID_MSHTML = {0x3050F1C5, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID LIBID_MSHTMLINTERNAL = {0x3050F7E1, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID LIBID_MSTIME = {0x87C96271, 0xADDB, 0x4745, [0xB2, 0xE8, 0xDF, 0x88, 0xA8, 0x47, 0x2F, 0xD1]};
+ const IID LIBID_MSXML = {0xD63E0CE2, 0xA0A2, 0x11D0, [0x9C, 0x02, 0x00, 0xC0, 0x4F, 0xC9, 0x9C, 0x8E]};
+ const IID LIBID_MultiLanguage = {0x275C23E0, 0x3747, 0x11D0, [0x9F, 0xEA, 0x00, 0xAA, 0x00, 0x3F, 0x86, 0x46]};
+ const IID LIBID_NATUPNPLib = {0x1C565858, 0xF302, 0x471E, [0xB4, 0x09, 0xF1, 0x80, 0xAA, 0x4A, 0xBE, 0xC6]};
+ const IID LIBID_NETCONLib = {0x43E734CA, 0x043D, 0x4A70, [0x9A, 0x2C, 0xA8, 0xF2, 0x54, 0x06, 0x3D, 0x91]};
+ const IID LIBID_PassiveSink = {0xE002EEEF, 0xE6EA, 0x11D2, [0x9C, 0xB3, 0x00, 0x10, 0x5A, 0x1F, 0x48, 0x01]};
+ const IID LIBID_ProcessDebugManagerLib = {0x78A51821, 0x51F4, 0x11D0, [0x8F, 0x20, 0x00, 0x80, 0x5F, 0x2C, 0xD0, 0x64]};
+ const IID LIBID_RENDLib = {0xF1029E4D, 0xCB5B, 0x11D0, [0x8D, 0x59, 0x00, 0xC0, 0x4F, 0xD9, 0x1A, 0xC0]};
+ const IID LIBID_RTCCORELib = {0xCD260094, 0xDE10, 0x4AEE, [0xAC, 0x73, 0xEF, 0x87, 0xF6, 0xE1, 0x26, 0x83]};
+ const IID LIBID_SDOIASLib = {0x81DDF732, 0x4AA8, 0x4A35, [0xBD, 0xFF, 0x8B, 0x42, 0xEF, 0xE7, 0xC6, 0x24]};
+ const IID LIBID_SDPBLBLib = {0xC259D79A, 0xC8AB, 0x11D0, [0x8D, 0x58, 0x00, 0xC0, 0x4F, 0xD9, 0x1A, 0xC0]};
+ const IID LIBID_SensEvents = {0xD597DEED, 0x5B9F, 0x11D1, [0x8D, 0xD2, 0x00, 0xAA, 0x00, 0x4A, 0xBD, 0x5E]};
+ const IID LIBID_SHDocVw = {0xEAB22AC0, 0x30C1, 0x11CF, [0xA7, 0xEB, 0x00, 0x00, 0xC0, 0x5B, 0xAE, 0x0B]};
+ const IID LIBID_Shell32 = {0x50A7E9B0, 0x70EF, 0x11D1, [0xB7, 0x5A, 0x00, 0xA0, 0xC9, 0x05, 0x64, 0xFE]};
+ const IID LIBID_ShellImageData = {0x0B8AFF06, 0x8DF0, 0x4F13, [0x8E, 0x25, 0x25, 0xB2, 0x31, 0x9C, 0x43, 0x6A]};
+ const IID LIBID_ShellObjects = {0x50A7E9B1, 0x70EF, 0x11D1, [0xB7, 0x5A, 0x00, 0xA0, 0xC9, 0x05, 0x64, 0xFE]};
+ const IID LIBID_SHGINALib = {0x0A055C02, 0xBABE, 0x4480, [0xBB, 0x7B, 0xA8, 0xEC, 0x72, 0x3C, 0xE9, 0xC0]};
+ const IID LIBID_SubscriptionMgr = {0xC54FD88A, 0xFFA1, 0x11D0, [0xBC, 0x5E, 0x00, 0xC0, 0x4F, 0xD9, 0x29, 0xDB]};
+ const IID LIBID_TAPI3Lib = {0x21D6D480, 0xA88B, 0x11D0, [0x83, 0xDD, 0x00, 0xAA, 0x00, 0x3C, 0xCA, 0xBD]};
+ const IID LIBID_TERMMGRLib = {0x28DCD85B, 0xACA4, 0x11D0, [0xA0, 0x28, 0x00, 0xAA, 0x00, 0xB6, 0x05, 0xA4]};
+ const IID LIBID_UPnPHostLib = {0x204810B3, 0x73B2, 0x11D4, [0xBF, 0x42, 0x00, 0xB0, 0xD0, 0x11, 0x8B, 0x56]};
+ const IID LIBID_UPNPLib = {0xDB3442A7, 0xA2E9, 0x4A59, [0x9C, 0xB5, 0xF5, 0xC1, 0xA5, 0xD9, 0x01, 0xE5]};
+ const IID LIBID_VIRUSSCAN = {0x5F47DB70, 0xD9FE, 0x11D0, [0x95, 0x64, 0x00, 0x60, 0x97, 0x97, 0xEA, 0x4F]};
+ const IID LIBID_WbemClient_v1 = {0x7EC196FE, 0x7005, 0x11D1, [0xAD, 0x90, 0x00, 0xC0, 0x4F, 0xD8, 0xFD, 0xFF]};
+ const IID LIBID_WbemProviders_v1 = {0x092DF710, 0x7010, 0x11D1, [0xAD, 0x90, 0x00, 0xC0, 0x4F, 0xD8, 0xFD, 0xFF]};
+ const IID LIBID_WbemScripting = {0x565783C6, 0xCB41, 0x11D1, [0x8B, 0x02, 0x00, 0x60, 0x08, 0x06, 0xD9, 0xB6]};
+ const IID LIBID_WbemTransports_v1 = {0x027947F3, 0xD731, 0x11CE, [0xA3, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01]};
+ const IID LIBID_WbemUtilities_v1 = {0x226C9290, 0xDD96, 0x11D3, [0xA1, 0x20, 0x00, 0x10, 0x5A, 0x1F, 0x51, 0x5A]};
+ const IID LIBID_WebCheck = {0x10BD2E25, 0xF235, 0x11CF, [0xB5, 0xDD, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xEC]};
+ const IID LIBID_WMIEXTENSIONLib = {0xE503D000, 0x5C7F, 0x11D2, [0x8B, 0x74, 0x00, 0x10, 0x4B, 0x2A, 0xFB, 0x41]};
+ const IID LIBID_XENROLLLib = {0x43F8F27B, 0x7A20, 0x11D0, [0x8F, 0x06, 0x00, 0xC0, 0x4F, 0xC2, 0x95, 0xE1]};
+ const IID LIBID_XMLPSR = {0xD242361C, 0x51A0, 0x11D2, [0x9C, 0xAF, 0x00, 0x60, 0xB0, 0xEC, 0x3D, 0x39]};
+ const IID MDGUID_MDX = {0xA07CCCD0, 0x8148, 0x11D0, [0x87, 0xBB, 0x00, 0xC0, 0x4F, 0xC3, 0x39, 0x42]};
+ const IID MDSCHEMA_ACTIONS = {0xA07CCD08, 0x8148, 0x11D0, [0x87, 0xBB, 0x00, 0xC0, 0x4F, 0xC3, 0x39, 0x42]};
+ const IID MDSCHEMA_COMMANDS = {0xA07CCD09, 0x8148, 0x11D0, [0x87, 0xBB, 0x00, 0xC0, 0x4F, 0xC3, 0x39, 0x42]};
+ const IID MDSCHEMA_CUBES = {0xC8B522D8, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID MDSCHEMA_DIMENSIONS = {0xC8B522D9, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID MDSCHEMA_FUNCTIONS = {0xA07CCD07, 0x8148, 0x11D0, [0x87, 0xBB, 0x00, 0xC0, 0x4F, 0xC3, 0x39, 0x42]};
+ const IID MDSCHEMA_HIERARCHIES = {0xC8B522DA, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID MDSCHEMA_LEVELS = {0xC8B522DB, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID MDSCHEMA_MEASURES = {0xC8B522DC, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID MDSCHEMA_MEMBERS = {0xC8B522DE, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID MDSCHEMA_PROPERTIES = {0xC8B522DD, 0x5CF3, 0x11CE, [0xAD, 0xE5, 0x00, 0xAA, 0x00, 0x44, 0x77, 0x3D]};
+ const IID MDSCHEMA_SETS = {0xA07CCD0B, 0x8148, 0x11D0, [0x87, 0xBB, 0x00, 0xC0, 0x4F, 0xC3, 0x39, 0x42]};
+ const IID NAMEDTIMER_DRAW = {0x3050F362, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID NOTFCOOKIE_SCHEDULE_GROUP_DAILY = {0xD34F18B0, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTFCOOKIE_SCHEDULE_GROUP_MANUAL = {0xD34F18B3, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTFCOOKIE_SCHEDULE_GROUP_MONTHLY = {0xD34F18B2, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTFCOOKIE_SCHEDULE_GROUP_WEEKLY = {0xD34F18B1, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_11 = {0xD34F17FB, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_12 = {0xD34F17FC, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_13 = {0xD34F17FD, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_14 = {0xD34F17FE, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_15 = {0xD34F17FF, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_AGENT_INIT = {0x1E4A7390, 0xC70B, 0x11D0, [0x95, 0xF8, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xEC]};
+ const IID NOTIFICATIONTYPE_AGENT_START = {0xD34F17EC, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_ALERT = {0xD34F17E3, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_ANOUNCMENT = {0xD34F17E1, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_BEGIN_REPORT = {0xD34F17EE, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_CONFIG_CHANGED = {0xD34F17F2, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_CONNECT_TO_INTERNET = {0xD34F17F0, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_d = {0xD34F17F8, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_DISCONNECT_FROM_INTE = {0xD34F17F1, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_e = {0xD34F17F9, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_END_REPORT = {0xD34F17EF, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_f = {0xD34F17FA, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_GROUP_DONE = {0xD34F1885, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_GROUP_RESTART = {0xD34F1884, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_GROUP_START = {0xD34F1883, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_i6 = {0xD34F1886, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_i7 = {0xD34F1887, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_i8 = {0xD34F1888, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_i9 = {0xD34F1889, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_iA = {0xD34F188A, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_iB = {0xD34F188B, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_iC = {0xD34F188C, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_iD = {0xD34F188D, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_iE = {0xD34F188E, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_iF = {0xD34F188F, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_INET_IDLE = {0xD34F17E4, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_INET_OFFLINE = {0xD34F17E5, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_INET_ONLINE = {0xD34F17E6, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_ITEM_DONE = {0xD34F1882, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_ITEM_RESTART = {0xD34F1881, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_ITEM_START = {0xD34F1880, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_NULL = {0xD34F17E0, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_PROGRESS_REPORT = {0xD34F17F3, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_START_0 = {0xD34F1800, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_START_1 = {0xD34F1801, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_START_2 = {0xD34F1802, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_START_3 = {0xD34F1803, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_START_4 = {0xD34F1804, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_START_5 = {0xD34F1805, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_START_6 = {0xD34F1806, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_START_7 = {0xD34F1807, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_START_8 = {0xD34F1808, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_START_9 = {0xD34F1809, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_START_A = {0xD34F180A, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_START_B = {0xD34F180B, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_START_C = {0xD34F180C, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_START_D = {0xD34F180D, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_START_E = {0xD34F180E, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_START_F = {0xD34F180F, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_TASK = {0xD34F17E2, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_TASKS_ABORT = {0xD34F17E9, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_TASKS_COMPLETED = {0xD34F17EA, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_TASKS_ERROR = {0xD34F17F7, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_TASKS_PROGRESS = {0xD34F17EB, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_TASKS_RESUME = {0xD34F17E8, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_TASKS_STARTED = {0xD34F17F6, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_TASKS_SUSPEND = {0xD34F17E7, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_USER_IDLE_BEGIN = {0xD34F17F4, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID NOTIFICATIONTYPE_USER_IDLE_END = {0xD34F17F5, 0x576E, 0x11D0, [0xB2, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0xCD, 0x22]};
+ const IID OLE_DATAPATH_ALLIMAGE = {0x0002DE0E, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_ALLMM = {0x0002DE18, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_ALLTEXT = {0x0002DE1E, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_ANSITEXT = {0x0002DE19, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_AVI = {0x0002DE0F, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_BASICAUDIO = {0x0002DE12, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_BIFF = {0x0002DE21, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_BMP = {0x0002DE01, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_CGM = {0x0002DE0B, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_COMMONIMAGE = {0x0002DE0D, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_DIB = {0x0002DE02, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_DIF = {0x0002DE1F, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_ENHMF = {0x0002DE04, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_EPS = {0x0002DE0C, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_GIF = {0x0002DE05, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_HTML = {0x0002DE1C, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_JPEG = {0x0002DE06, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_MIDI = {0x0002DE13, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_MPEG = {0x0002DE10, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_PALETTE = {0x0002DE22, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_PCX = {0x0002DE09, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_PENDATA = {0x0002DE23, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_PICT = {0x0002DE0A, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_POSTSCRIPT = {0x0002DE1D, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_QUICKTIME = {0x0002DE11, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_RIFF = {0x0002DE15, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_RTF = {0x0002DE1B, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_SOUND = {0x0002DE16, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_SYLK = {0x0002DE20, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_TIFF = {0x0002DE07, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_UNICODE = {0x0002DE1A, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_VIDEO = {0x0002DE17, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_WAV = {0x0002DE14, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_WMF = {0x0002DE03, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLE_DATAPATH_XBM = {0x0002DE08, 0x0000, 0x0000, [0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]};
+ const IID OLEDB_SVC_DSLPropertyPages = {0x51740C02, 0x7E8E, 0x11D2, [0xA0, 0x2D, 0x00, 0xC0, 0x4F, 0xA3, 0x73, 0x48]};
+ const IID PSGUID_QUERY = {0x49691C90, 0x7E17, 0x101A, [0xA9, 0x1C, 0x08, 0x00, 0x2B, 0x2E, 0xCD, 0xA9]};
+ const IID RESCLASSTYPE_IPAddress = {0x57A80E0F, 0x6F18, 0x458B, [0xA7, 0x2A, 0xD1, 0x17, 0x0C, 0x47, 0x93, 0x90]};
+ const IID RESCLASSTYPE_NetworkName = {0xBBA69EB9, 0xF5D0, 0x487B, [0x92, 0xAE, 0x1B, 0xA1, 0x0F, 0x39, 0x21, 0x58]};
+ const IID RESCLASSTYPE_StorageDevice = {0x12453A47, 0x8C5E, 0x4837, [0xBA, 0xC6, 0xB2, 0x54, 0xB8, 0xF2, 0x64, 0xCC]};
+ const IID RESTYPE_ClusterIPAddress = {0xE50DF832, 0x477C, 0x440C, [0xB7, 0xA3, 0x38, 0x23, 0xA6, 0xEF, 0x6C, 0xCB]};
+ const IID RESTYPE_ClusterNetName = {0xB2897CCF, 0x8D2C, 0x4BC1, [0xB4, 0x96, 0x6E, 0x2B, 0xC7, 0xA0, 0xBB, 0x38]};
+ const IID RESTYPE_ClusterQuorumDisk = {0xD9DDFB80, 0x0BDC, 0x40D4, [0xB3, 0x96, 0x1A, 0xFD, 0x77, 0xDD, 0xD1, 0x9C]};
+ const IID RESTYPE_GenericScript = {0xF372184D, 0xDFDB, 0x4370, [0xA0, 0x05, 0xE1, 0xEF, 0x30, 0x1B, 0x23, 0xA4]};
+ const IID RESTYPE_IPAddress = {0xE61ADE71, 0xC79A, 0x4FDA, [0xB1, 0xDB, 0xA9, 0xB8, 0xD2, 0x0C, 0x8B, 0x14]};
+ const IID RESTYPE_LocalQuorum = {0xF004656D, 0x5B48, 0x4580, [0xA1, 0xF4, 0xC3, 0xEC, 0x14, 0x98, 0x3D, 0x1E]};
+ const IID RESTYPE_MajorityNodeSet = {0x56BFAE11, 0xD2F7, 0x4F4F, [0x99, 0x52, 0x55, 0xAF, 0x19, 0xBA, 0xC3, 0xE9]};
+ const IID RESTYPE_NetworkName = {0xC1D2FE1E, 0xD332, 0x445F, [0x8D, 0xA1, 0x12, 0xE5, 0xE2, 0xD3, 0x7C, 0xBF]};
+ const IID RESTYPE_PhysicalDisk = {0xCC558763, 0x3386, 0x42EF, [0xB1, 0x50, 0xBE, 0x79, 0x33, 0x44, 0xD4, 0x5F]};
+ const IID SID_CtxQueryAssociations = {0xFAADFC40, 0xB777, 0x4B69, [0xAA, 0x81, 0x77, 0x03, 0x5E, 0xF0, 0xE6, 0xE8]};
+ const IID SID_SContainerDispatch = {0xB722BE00, 0x4E68, 0x101B, [0xA2, 0xBC, 0x00, 0xAA, 0x00, 0x40, 0x47, 0x70]};
+ const IID SID_SDataPathBrowser = {0xFC4801A5, 0x2BA9, 0x11CF, [0xA2, 0x29, 0x00, 0xAA, 0x00, 0x3D, 0x73, 0x52]};
+ const IID SID_SGetViewFromViewDual = {0x889A935D, 0x971E, 0x4B12, [0xB9, 0x0C, 0x24, 0xDF, 0xC9, 0xE1, 0xE5, 0xE8]};
+ const IID SID_SHTMLEditServices = {0x3050F7F9, 0x98B5, 0x11CF, [0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B]};
+ const IID SID_STopLevelBrowser = {0x4C96BE40, 0x915C, 0x11CF, [0x99, 0xD3, 0x00, 0xAA, 0x00, 0x4A, 0xE8, 0x37]};
+ const IID SID_STopWindow = {0x49E1B500, 0x4636, 0x11D3, [0x97, 0xF7, 0x00, 0xC0, 0x4F, 0x45, 0xD0, 0xB3]};
+ const IID SID_SVersionHost = {0x371EA634, 0xDC5C, 0x11D1, [0xBA, 0x57, 0x00, 0xC0, 0x4F, 0xC2, 0x04, 0x0E]};
+ const IID TAPIMEDIATYPE_Audio = {0x028ED8C2, 0xDC7A, 0x11D0, [0x8E, 0xD3, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID TAPIMEDIATYPE_DataModem = {0x028ED8C6, 0xDC7A, 0x11D0, [0x8E, 0xD3, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID TAPIMEDIATYPE_G3Fax = {0x028ED8C7, 0xDC7A, 0x11D0, [0x8E, 0xD3, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID TAPIMEDIATYPE_Video = {0x028ED8C4, 0xDC7A, 0x11D0, [0x8E, 0xD3, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID TAPIPROTOCOL_H323 = {0x831CE2D7, 0x83B5, 0x11D1, [0xBB, 0x5C, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID TAPIPROTOCOL_Multicast = {0x831CE2D8, 0x83B5, 0x11D1, [0xBB, 0x5C, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID TAPIPROTOCOL_PSTN = {0x831CE2D6, 0x83B5, 0x11D1, [0xBB, 0x5C, 0x00, 0xC0, 0x4F, 0xB6, 0x80, 0x9F]};
+ const IID TASK_AnalyzeCluster = {0x3140B5A6, 0x9AFA, 0x4588, [0x8C, 0xA0, 0x9B, 0xE8, 0xF8, 0xB6, 0x15, 0x06]};
+ const IID TASK_CommitClusterChanges = {0x2D03030B, 0xF084, 0x4807, [0xBB, 0xAC, 0x94, 0x26, 0x9E, 0x50, 0xB5, 0x6F]};
+ const IID TASKID_Major_Check_Cluster_Feasibili = {0xEBC8AEFF, 0x10C3, 0x4D5B, [0xAC, 0x17, 0xFC, 0x0F, 0x4C, 0x38, 0x71, 0xB7]};
+ const IID TASKID_Major_Check_Node_Feasibility = {0xCC5E57B1, 0x4520, 0x4672, [0xB4, 0xBA, 0xA2, 0x88, 0xEC, 0x42, 0x94, 0x6E]};
+ const IID TASKID_Major_Checking_For_Existing_Cl = {0xB8453B8F, 0x92FD, 0x4350, [0xA6, 0xD9, 0x55, 0x1F, 0xD0, 0x18, 0xB7, 0x91]};
+ const IID TASKID_Major_Client_And_Server_Log = {0xCD36919C, 0x9F31, 0x46B4, [0xA2, 0x9D, 0xAC, 0x87, 0xF4, 0xE6, 0xCC, 0x93]};
+ const IID TASKID_Major_Client_Log = {0x64ECA0EA, 0x9CB6, 0x4324, [0x97, 0x02, 0xDF, 0x15, 0xC6, 0x96, 0xC3, 0x0A]};
+ const IID TASKID_Major_Configure_Cluster_Servic = {0x7C5F0774, 0x1611, 0x42B5, [0xAF, 0x3C, 0x6E, 0x12, 0x4A, 0xC4, 0xD3, 0x6B]};
+ const IID TASKID_Major_Configure_Resource_Type = {0x6D47AF1F, 0x7F17, 0x4B80, [0x8F, 0xAB, 0x3A, 0x2D, 0x19, 0xB1, 0x23, 0x3D]};
+ const IID TASKID_Major_Configure_Resources = {0x411BCDEC, 0x69D3, 0x4485, [0x8D, 0x5D, 0xE1, 0x9E, 0xE7, 0x7A, 0x6D, 0xD4]};
+ const IID TASKID_Major_Establish_Connection = {0x93C32F99, 0x39CA, 0x4D38, [0x9D, 0x7F, 0x27, 0x07, 0xCA, 0x0E, 0xAF, 0x46]};
+ const IID TASKID_Major_Find_Devices = {0x036BF567, 0x2377, 0x4BB3, [0x8A, 0xE1, 0xE4, 0x10, 0x4E, 0x2E, 0xB3, 0xC5]};
+ const IID TASKID_Major_Reanalyze = {0xE25968DA, 0x9C7B, 0x42DB, [0xAD, 0xA9, 0xBC, 0x4E, 0x34, 0xF1, 0x7E, 0x6E]};
+ const IID TASKID_Major_Server_Log = {0x05AA0768, 0x5F49, 0x49CD, [0xAF, 0xDC, 0x96, 0xF9, 0xD5, 0x18, 0x02, 0xD4]};
+ const IID TASKID_Minor_Update_Progress = {0x2362D3DA, 0xA6A4, 0x4551, [0xB8, 0x46, 0x7B, 0xB3, 0xA1, 0x36, 0x5F, 0x56]};
+ const IID TID_D3DRMAnimation = {0x3D82AB4F, 0x62DA, 0x11CF, [0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33]};
+ const IID TID_D3DRMAnimationKey = {0x10DD46A8, 0x775B, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMAnimationOptions = {0xE2BF56C0, 0x840F, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMAnimationSet = {0x3D82AB50, 0x62DA, 0x11CF, [0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33]};
+ const IID TID_D3DRMAppData = {0xE5745280, 0xB24F, 0x11CF, [0x9D, 0xD5, 0x00, 0xAA, 0x00, 0xA7, 0x1A, 0x2F]};
+ const IID TID_D3DRMBoolean = {0x537DA6A0, 0xCA37, 0x11D0, [0x94, 0x1C, 0x00, 0x80, 0xC8, 0x0C, 0xFA, 0x7B]};
+ const IID TID_D3DRMBoolean2d = {0x4885AE63, 0x78E8, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMCamera = {0x3D82AB51, 0x62DA, 0x11CF, [0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33]};
+ const IID TID_D3DRMColorRGB = {0xD3E16E81, 0x7835, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMColorRGBA = {0x35FF44E0, 0x6C7C, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMCoords2d = {0xF6F23F44, 0x7686, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMExternalVisual = {0x98116AA0, 0xBDBA, 0x11D1, [0x82, 0xC0, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x71]};
+ const IID TID_D3DRMFloatKeys = {0x10DD46A9, 0x775B, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMFrame = {0x3D82AB46, 0x62DA, 0x11CF, [0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33]};
+ const IID TID_D3DRMFramePosition = {0xE2BF56C1, 0x840F, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMFrameRotation = {0xE2BF56C3, 0x840F, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMFrameTransformMatrix = {0xF6F23F41, 0x7686, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMFrameVelocity = {0xE2BF56C2, 0x840F, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMGuid = {0xA42790E0, 0x7810, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMIndexedColor = {0x1630B820, 0x7842, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMInfo = {0x2B957100, 0x9E9A, 0x11CF, [0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33]};
+ const IID TID_D3DRMInlineData = {0x3A23EEA0, 0x94B1, 0x11D0, [0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33]};
+ const IID TID_D3DRMLight = {0x3D82AB4A, 0x62DA, 0x11CF, [0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33]};
+ const IID TID_D3DRMLightAttenuation = {0xA8A98BA0, 0xC5E5, 0x11CF, [0xB9, 0x41, 0x00, 0x80, 0xC8, 0x0C, 0xFA, 0x7B]};
+ const IID TID_D3DRMLightPenumbra = {0xAED22741, 0xB31F, 0x11CF, [0x9D, 0xD5, 0x00, 0xAA, 0x00, 0xA7, 0x1A, 0x2F]};
+ const IID TID_D3DRMLightRange = {0xAED22742, 0xB31F, 0x11CF, [0x9D, 0xD5, 0x00, 0xAA, 0x00, 0xA7, 0x1A, 0x2F]};
+ const IID TID_D3DRMLightUmbra = {0xAED22740, 0xB31F, 0x11CF, [0x9D, 0xD5, 0x00, 0xAA, 0x00, 0xA7, 0x1A, 0x2F]};
+ const IID TID_D3DRMMaterial = {0x3D82AB4D, 0x62DA, 0x11CF, [0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33]};
+ const IID TID_D3DRMMaterialAmbientColor = {0x01411840, 0x7786, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMMaterialArray = {0x35FF44E1, 0x6C7C, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMMaterialDiffuseColor = {0x01411841, 0x7786, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMMaterialEmissiveColor = {0xD3E16E80, 0x7835, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMMaterialPower = {0x01411843, 0x7786, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMMaterialSpecularColor = {0x01411842, 0x7786, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMMaterialWrap = {0x4885AE60, 0x78E8, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMMatrix4x4 = {0xF6F23F45, 0x7686, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMMesh = {0x3D82AB44, 0x62DA, 0x11CF, [0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33]};
+ const IID TID_D3DRMMeshFace = {0x3D82AB5F, 0x62DA, 0x11CF, [0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33]};
+ const IID TID_D3DRMMeshFaceWraps = {0xED1EC5C0, 0xC0A8, 0x11D0, [0x94, 0x1C, 0x00, 0x80, 0xC8, 0x0C, 0xFA, 0x7B]};
+ const IID TID_D3DRMMeshMaterialList = {0xF6F23F42, 0x7686, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMMeshNormals = {0xF6F23F43, 0x7686, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMMeshTextureCoords = {0xF6F23F40, 0x7686, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMMeshVertexColors = {0x1630B821, 0x7842, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMProgressiveMesh = {0x8A63C360, 0x997D, 0x11D0, [0x94, 0x1C, 0x00, 0x80, 0xC8, 0x0C, 0xFA, 0x7B]};
+ const IID TID_D3DRMPropertyBag = {0x7F0F21E1, 0xBFE1, 0x11D1, [0x82, 0xC0, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x71]};
+ const IID TID_D3DRMRightHanded = {0x7F5D5EA0, 0xD53A, 0x11D1, [0x82, 0xC0, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x71]};
+ const IID TID_D3DRMStringProperty = {0x7F0F21E0, 0xBFE1, 0x11D1, [0x82, 0xC0, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x71]};
+ const IID TID_D3DRMTextureFilename = {0xA42790E1, 0x7810, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMTextureReference = {0xA42790E2, 0x7810, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMTimedFloatKeys = {0xF406B180, 0x7B3B, 0x11CF, [0x8F, 0x52, 0x00, 0x40, 0x33, 0x35, 0x94, 0xA3]};
+ const IID TID_D3DRMUrl = {0x3A23EEA1, 0x94B1, 0x11D0, [0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33]};
+ const IID TID_D3DRMVector = {0x3D82AB5E, 0x62DA, 0x11CF, [0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33]};
+ const IID TID_DXFILEHeader = {0x3D82AB43, 0x62DA, 0x11CF, [0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33]};
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/vfw.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,2394 @@
+/***********************************************************************\
+*                                 vfw.d                                 *
+*                                                                       *
+*                       Windows API header module                       *
+*                 written in the D programming language                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+
+module win32.vfw;
+pragma(lib, "vfw32.lib");
+
+private import
+	win32.commdlg,
+	win32.wingdi,
+	win32.mmsystem,
+	win32.unknwn,
+	win32.w32api,
+	win32.windef,
+	win32.winuser;
+
+extern(Windows) {
+	DWORD VideoForWindowsVersion();
+	LONG InitVFW();
+	LONG TermVFW();
+}
+
+DWORD MKFOURCC(char ch0, char ch1, char ch2, char ch3) {
+	return (cast(DWORD)ch0) | ((cast(DWORD)ch1) << 8) | ((cast(DWORD)ch2) << 16) | ((cast(DWORD)ch3) << 24);
+}
+
+/**
+ * COMPMAN - Installable Compression Manager.
+ */
+
+const ICVERSION = 0x0104;
+
+typedef HANDLE HIC;
+
+const BI_1632 = 0x32333631;
+
+template aviTWOCC(char c0, char c1) {
+	const WORD aviTWOCC = c0 | (c1 << 8);
+}
+
+const ICTYPE_VIDEO	= mmioFOURCC!('v', 'i', 'd', 'c');
+const ICTYPE_AUDIO	= mmioFOURCC!('a', 'u', 'd', 'c');
+
+enum {
+	ICERR_OK			= 0,
+	ICERR_DONTDRAW		= 1,
+	ICERR_NEWPALETTE	= 2,
+	ICERR_GOTOKEYFRAME	= 3,
+	ICERR_STOPDRAWING	= 4,
+}
+
+const ICERR_UNSUPPORTED	= -1;
+const ICERR_BADFORMAT	= -2;
+const ICERR_MEMORY		= -3;
+const ICERR_INTERNAL	= -4;
+const ICERR_BADFLAGS	= -5;
+const ICERR_BADPARAM	= -6;
+const ICERR_BADSIZE		= -7;
+const ICERR_BADHANDLE	= -8;
+const ICERR_CANTUPDATE	= -9;
+const ICERR_ABORT		= -10;
+const ICERR_ERROR		= -100;
+const ICERR_BADBITDEPTH	= -200;
+const ICERR_BADIMAGESIZE = -201;
+
+const ICERR_CUSTOM = -400;
+
+enum {
+	ICMODE_COMPRESS			= 1,
+	ICMODE_DECOMPRESS,
+	ICMODE_FASTDECOMPRESS,
+	ICMODE_QUERY,
+	ICMODE_FASTCOMPRESS,
+	ICMODE_DRAW				= 8,
+}
+
+const ICMODE_INTERNALF_FUNCTION32	= 0x8000;
+const ICMODE_INTERNALF_MASK			= 0x8000;
+
+enum {
+	AVIIF_LIST		= 0x00000001,
+	AVIIF_TWOCC		= 0x00000002,
+	AVIIF_KEYFRAME	= 0x00000010,
+}
+
+const ICQUALITY_LOW		= 0;
+const ICQUALITY_HIGH	= 10000;
+const ICQUALITY_DEFAULT = -1;
+
+enum {
+	ICM_USER			= DRV_USER + 0x0000,
+	ICM_RESERVED_LOW	= DRV_USER + 0x1000,
+	ICM_RESERVED_HIGH	= DRV_USER + 0x2000,
+	ICM_RESERVED		= ICM_RESERVED_LOW,
+}
+
+// messages
+
+enum {
+	ICM_GETSTATE			= ICM_RESERVED + 0,
+	ICM_SETSTATE			= ICM_RESERVED + 1,
+	ICM_GETINFO				= ICM_RESERVED + 2,
+	ICM_CONFIGURE			= ICM_RESERVED + 10,
+	ICM_ABOUT				= ICM_RESERVED + 11,
+	ICM_GETERRORTEXT		= ICM_RESERVED + 12,
+	ICM_GETFORMATNAME		= ICM_RESERVED + 20,
+	ICM_ENUMFORMATS			= ICM_RESERVED + 21,
+	ICM_GETDEFAULTQUALITY	= ICM_RESERVED + 30,
+	ICM_GETQUALITY			= ICM_RESERVED + 31,
+	ICM_SETQUALITY			= ICM_RESERVED + 32,
+	ICM_SET					= ICM_RESERVED + 40,
+	ICM_GET					= ICM_RESERVED + 41,
+}
+
+const ICM_FRAMERATE		= mmioFOURCC!('F','r','m','R');
+const ICM_KEYFRAMERATE	= mmioFOURCC!('K','e','y','R');
+
+// ICM specific messages.
+
+enum {
+	ICM_COMPRESS_GET_FORMAT		= ICM_USER + 4,
+	ICM_COMPRESS_GET_SIZE		= ICM_USER + 5,
+	ICM_COMPRESS_QUERY			= ICM_USER + 6,
+	ICM_COMPRESS_BEGIN			= ICM_USER + 7,
+	ICM_COMPRESS				= ICM_USER + 8,
+	ICM_COMPRESS_END			= ICM_USER + 9,
+	ICM_DECOMPRESS_GET_FORMAT	= ICM_USER + 10,
+	ICM_DECOMPRESS_QUERY		= ICM_USER + 11,
+	ICM_DECOMPRESS_BEGIN		= ICM_USER + 12,
+	ICM_DECOMPRESS				= ICM_USER + 13,
+	ICM_DECOMPRESS_END			= ICM_USER + 14,
+	ICM_DECOMPRESS_SET_PALETTE	= ICM_USER + 29,
+	ICM_DECOMPRESS_GET_PALETTE	= ICM_USER + 30,
+	ICM_DRAW_QUERY				= ICM_USER + 31,
+	ICM_DRAW_BEGIN				= ICM_USER + 15,
+	ICM_DRAW_GET_PALETTE		= ICM_USER + 16,
+	ICM_DRAW_UPDATE				= ICM_USER + 17,
+	ICM_DRAW_START				= ICM_USER + 18,
+	ICM_DRAW_STOP				= ICM_USER + 19,
+	ICM_DRAW_BITS				= ICM_USER + 20,
+	ICM_DRAW_END				= ICM_USER + 21,
+	ICM_DRAW_GETTIME			= ICM_USER + 32,
+	ICM_DRAW					= ICM_USER + 33,
+	ICM_DRAW_WINDOW				= ICM_USER + 34,
+	ICM_DRAW_SETTIME			= ICM_USER + 35,
+	ICM_DRAW_REALIZE			= ICM_USER + 36,
+	ICM_DRAW_FLUSH				= ICM_USER + 37,
+	ICM_DRAW_RENDERBUFFER		= ICM_USER + 38,
+	ICM_DRAW_START_PLAY			= ICM_USER + 39,
+	ICM_DRAW_STOP_PLAY			= ICM_USER + 40,
+	ICM_DRAW_SUGGESTFORMAT		= ICM_USER + 50,
+	ICM_DRAW_CHANGEPALETTE		= ICM_USER + 51,
+	ICM_DRAW_IDLE				= ICM_USER + 52,
+	ICM_GETBUFFERSWANTED		= ICM_USER + 41,
+	ICM_GETDEFAULTKEYFRAMERATE	= ICM_USER + 42,
+	ICM_DECOMPRESSEX_BEGIN		= ICM_USER + 60,
+	ICM_DECOMPRESSEX_QUERY		= ICM_USER + 61,
+	ICM_DECOMPRESSEX			= ICM_USER + 62,
+	ICM_DECOMPRESSEX_END		= ICM_USER + 63,
+	ICM_COMPRESS_FRAMES_INFO	= ICM_USER + 70,
+	ICM_COMPRESS_FRAMES			= ICM_USER + 71,
+	ICM_SET_STATUS_PROC			= ICM_USER + 72,
+}
+
+struct ICOPEN {
+	DWORD	dwSize;
+	DWORD	fccType;
+	DWORD	fccHandler;
+	DWORD	dwVersion;
+	DWORD	dwFlags;
+	LRESULT	dwError;
+	LPVOID	pV1Reserved;
+	LPVOID	pV2Reserved;
+	DWORD	dnDevNode;
+}
+
+struct ICINFO {
+	DWORD	dwSize;
+	DWORD	fccType;
+	DWORD	fccHandler;
+	DWORD	dwFlags;
+	DWORD	dwVersion;
+	DWORD	dwVersionICM;
+	WCHAR	szName[16];
+	WCHAR	szDescription[128];
+	WCHAR	szDriver[128];
+}
+
+enum {
+	VIDCF_QUALITY			= 0x0001,
+	VIDCF_CRUNCH			= 0x0002,
+	VIDCF_TEMPORAL			= 0x0004,
+	VIDCF_COMPRESSFRAMES	= 0x0008,
+	VIDCF_DRAW				= 0x0010,
+	VIDCF_FASTTEMPORALC		= 0x0020,
+	VIDCF_FASTTEMPORALD		= 0x0080,
+}
+
+const ICCOMPRESS_KEYFRAME = 0x00000001L;
+
+struct ICCOMPRESS {
+	DWORD				dwFlags;
+	LPBITMAPINFOHEADER	lpbiOutput;
+	LPVOID				lpOutput;
+	LPBITMAPINFOHEADER	lpbiInput;
+	LPVOID				lpInput;
+	LPDWORD				lpckid;
+	LPDWORD				lpdwFlags;
+	LONG				lFrameNum;
+	DWORD				dwFrameSize;
+	DWORD				dwQuality;
+	LPBITMAPINFOHEADER	lpbiPrev;
+	LPVOID				lpPrev;
+}
+
+const ICCOMPRESSFRAMES_PADDING = 0x00000001;
+
+struct ICCOMPRESSFRAMES {
+	DWORD				dwFlags;
+	LPBITMAPINFOHEADER	lpbiOutput;
+	LPARAM				lOutput;
+	LPBITMAPINFOHEADER	lpbiInput;
+	LPARAM				lInput;
+	LONG				lStartFrame;
+	LONG				lFrameCount;
+	LONG				lQuality;
+	LONG				lDataRate;
+	LONG				lKeyRate;
+	DWORD				dwRate;
+	DWORD				dwScale;    DWORD		dwOverheadPerFrame;
+	DWORD				dwReserved2;
+
+	LONG function(LPARAM lInput, LONG lFrame, LPVOID lpBits, LONG len) GetData;
+	LONG function(LPARAM lOutput, LONG lFrame, LPVOID lpBits, LONG len) PutData;
+}
+
+enum {
+	ICSTATUS_START	= 0,
+	ICSTATUS_STATUS	= 1,
+	ICSTATUS_END	= 2,
+	ICSTATUS_ERROR	= 3,
+	ICSTATUS_YIELD	= 4,
+}
+
+struct ICSETSTATUSPROC {
+	DWORD	dwFlags;
+	LPARAM	lParam;
+	LONG function(LPARAM lParam, UINT message, LONG l) Status;
+}
+
+enum {
+	ICDECOMPRESS_NOTKEYFRAME	= 0x08000000,
+	ICDECOMPRESS_NULLFRAME		= 0x10000000,
+	ICDECOMPRESS_PREROLL		= 0x20000000,
+	ICDECOMPRESS_UPDATE			= 0x40000000,
+	ICDECOMPRESS_HURRYUP		= 0x80000000,
+}
+
+struct ICDECOMPRESS {
+	DWORD				dwFlags;
+	LPBITMAPINFOHEADER	lpbiInput;
+	LPVOID				lpInput;
+	LPBITMAPINFOHEADER	lpbiOutput;
+	LPVOID				lpOutput;
+	DWORD				ckid;
+}
+
+struct ICDECOMPRESSEX {
+	DWORD				dwFlags;
+	LPBITMAPINFOHEADER  lpbiSrc;
+	LPVOID				lpSrc;
+	LPBITMAPINFOHEADER	lpbiDst;
+	LPVOID				lpDst;
+	int					xDst;
+	int					yDst;
+	int					dxDst;
+	int					dyDst;
+	int					xSrc;
+	int					ySrc;
+	int					dxSrc;
+	int					dySrc;
+}
+
+enum {
+	ICDRAW_QUERY		= 0x00000001,
+	ICDRAW_FULLSCREEN	= 0x00000002,
+	ICDRAW_HDC			= 0x00000004,
+	ICDRAW_ANIMATE		= 0x00000008,
+	ICDRAW_CONTINUE		= 0x00000010,
+	ICDRAW_MEMORYDC		= 0x00000020,
+	ICDRAW_UPDATING		= 0x00000040,
+	ICDRAW_RENDER		= 0x00000080,
+	ICDRAW_BUFFER		= 0x00000100,
+}
+
+struct ICDRAWBEGIN {
+	DWORD				dwFlags;
+	HPALETTE			hpal;
+	HWND				hwnd;
+	HDC					hdc;
+	int					xDst;
+	int					yDst;
+	int					dxDst;
+	int					dyDst;
+	LPBITMAPINFOHEADER	lpbi;
+	int					xSrc;
+	int					ySrc;
+	int					dxSrc;
+	int					dySrc;
+	DWORD				dwRate;
+	DWORD				dwScale;
+}
+
+enum {
+	ICDRAW_NOTKEYFRAME	= 0x08000000,
+	ICDRAW_NULLFRAME	= 0x10000000,
+	ICDRAW_PREROLL		= 0x20000000,
+	ICDRAW_UPDATE		= 0x40000000,
+	ICDRAW_HURRYUP		= 0x80000000,
+}
+
+struct ICDRAW {
+	DWORD			dwFlags;
+	LPVOID			lpFormat;
+	LPVOID			lpData;
+	DWORD			cbData;
+	LONG			lTime;
+}
+
+struct ICDRAWSUGGEST {
+	LPBITMAPINFOHEADER	lpbiIn;
+	LPBITMAPINFOHEADER	lpbiSuggest;
+	int					dxSrc;
+	int					dySrc;
+	int					dxDst;
+	int					dyDst;
+	HIC					hicDecompressor;
+}
+
+struct ICPALETTE {
+	DWORD			dwFlags;
+	int				iStart;
+	int				iLen;
+	LPPALETTEENTRY	lppe;
+}
+
+
+/**
+ * ICM function declarations
+ */
+
+extern (Windows) {
+	BOOL ICInfo(DWORD fccType, DWORD fccHandler, ICINFO *lpicinfo);
+	BOOL ICInstall(DWORD fccType, DWORD fccHandler, LPARAM lParam, LPSTR szDesc, UINT wFlags);
+	BOOL ICRemove(DWORD fccType, DWORD fccHandler, UINT wFlags);
+	LRESULT ICGetInfo(HIC hic, ICINFO *picinfo, DWORD cb);
+	HIC ICOpen(DWORD fccType, DWORD fccHandler, UINT wMode);
+	HIC ICOpenFunction(DWORD fccType, DWORD fccHandler, UINT wMode, FARPROC lpfnHandler);
+	LRESULT ICClose(HIC hic);
+	LRESULT ICSendMessage(HIC hic, UINT msg, DWORD_PTR dw1, DWORD_PTR dw2);
+}
+
+enum {
+	ICINSTALL_FUNCTION	= 0x0001,
+	ICINSTALL_DRIVER	= 0x0002,
+	ICINSTALL_HDRV		= 0x0004,
+	ICINSTALL_UNICODE	= 0x8000,
+	ICINSTALL_DRIVERW	= 0x8002,
+}
+
+// query macros
+
+const ICMF_CONFIGURE_QUERY	= 0x00000001;
+const ICMF_ABOUT_QUERY		= 0x00000001;
+
+DWORD ICQueryAbout(HIC hic) {
+	return ICSendMessage(hic, ICM_ABOUT, -1, ICMF_ABOUT_QUERY) == ICERR_OK;
+}
+
+DWORD ICAbout(HIC hic, HWND hwnd) {
+	return ICSendMessage(hic, ICM_ABOUT, cast(UINT)hwnd, 0);
+}
+
+DWORD ICQueryConfigure(HIC hic) {
+	return (ICSendMessage(hic, ICM_CONFIGURE, -1, ICMF_CONFIGURE_QUERY) == ICERR_OK);
+}
+
+DWORD ICConfigure(HIC hic, HWND hwnd) {
+	return ICSendMessage(hic, ICM_CONFIGURE, cast(UINT)hwnd, 0);
+}
+
+DWORD ICGetState(HIC hic, LPVOID pv, DWORD_PTR cb) {
+	return ICSendMessage(hic, ICM_GETSTATE, cast(DWORD)pv, cast(DWORD)cb);
+}
+
+DWORD ICSetState(HIC hic, LPVOID pv, DWORD_PTR cb) {
+	return ICSendMessage(hic, ICM_SETSTATE, cast(DWORD)pv, cast(DWORD)cb);
+}
+
+DWORD ICGetStateSize(HIC hic) {
+	return ICGetState(hic, null, 0);
+}
+
+DWORD dwICValue;
+
+DWORD ICGetDefaultQuality(HIC hic) {
+	ICSendMessage(hic, ICM_GETDEFAULTQUALITY, cast(DWORD_PTR)&dwICValue, DWORD.sizeof);
+	return dwICValue;
+}
+
+DWORD ICGetDefaultKeyFrameRate(HIC hic) {
+	ICSendMessage(hic, ICM_GETDEFAULTKEYFRAMERATE, cast(DWORD_PTR)&dwICValue, DWORD.sizeof);
+	return dwICValue;
+}
+
+DWORD ICDrawWindow(HIC hic, LPVOID prc) {
+	return ICSendMessage(hic, ICM_DRAW_WINDOW, cast(DWORD)prc, RECT.sizeof);
+}
+
+extern (Windows) {
+	DWORD ICCompress(HIC hic, DWORD dwFlags, LPBITMAPINFOHEADER lpbiOutput, LPVOID lpData,
+		LPBITMAPINFOHEADER lpbiInput, LPVOID lpBits, LPDWORD lpckid, LPDWORD lpdwFlags,
+		LONG lFrameNum, DWORD dwFrameSize, DWORD dwQuality, LPBITMAPINFOHEADER lpbiPrev, LPVOID lpPrev);
+}
+
+LRESULT ICCompressBegin(HIC hic, LPVOID lpbiInput, LPVOID lpbiOutput) {
+	return ICSendMessage(hic, ICM_COMPRESS_BEGIN, cast(DWORD_PTR)lpbiInput, cast(DWORD_PTR)lpbiOutput);
+}
+LRESULT ICCompressQuery(HIC hic, LPVOID lpbiInput, LPVOID lpbiOutput) {
+	return ICSendMessage(hic, ICM_COMPRESS_QUERY, cast(DWORD_PTR)lpbiInput, cast(DWORD_PTR)lpbiOutput);
+}
+LRESULT ICCompressGetFormat(HIC hic, LPVOID lpbiInput, LPVOID lpbiOutput) {
+	return ICSendMessage(hic, ICM_COMPRESS_GET_FORMAT, cast(DWORD_PTR)lpbiInput, cast(DWORD_PTR)lpbiOutput);
+}
+DWORD ICCompressGetFormatSize(HIC hic, LPVOID lpbi) {
+	return cast(DWORD)ICCompressGetFormat(hic, lpbi, null);
+}
+DWORD ICCompressGetSize(HIC hic, LPVOID lpbiInput, LPVOID lpbiOutput) {
+	return cast(DWORD)ICSendMessage(hic, ICM_COMPRESS_GET_SIZE, cast(DWORD_PTR)lpbiInput, cast(DWORD_PTR)lpbiOutput);
+}
+LRESULT ICCompressEnd(HIC hic) {
+	return ICSendMessage(hic, ICM_COMPRESS_END, 0, 0);
+}
+
+extern (Windows) {
+	DWORD ICDecompress(HIC hic, DWORD dwFlags, LPBITMAPINFOHEADER lpbiFormat, LPVOID lpData, LPBITMAPINFOHEADER lpbi, LPVOID lpBits);
+}
+
+LRESULT ICDecompressBegin(HIC hic, LPVOID lpbiInput, LPVOID lpbiOutput) {
+	return ICSendMessage(hic, ICM_DECOMPRESS_BEGIN, cast(DWORD_PTR)lpbiInput, cast(DWORD_PTR)lpbiOutput);
+}
+LRESULT ICDecompressQuery(HIC hic, LPVOID lpbiInput, LPVOID lpbiOutput) {
+	return ICSendMessage(hic, ICM_DECOMPRESS_QUERY, cast(DWORD_PTR)lpbiInput, cast(DWORD_PTR)lpbiOutput);
+}
+LONG ICDecompressGetFormat(HIC hic, LPVOID lpbiInput, LPVOID lpbiOutput) {
+	return cast(LONG)ICSendMessage(hic, ICM_DECOMPRESS_GET_FORMAT, cast(DWORD_PTR)lpbiInput, cast(DWORD_PTR)lpbiOutput);
+}
+LONG ICDecompressGetFormatSize(HIC hic, LPVOID lpbi) {
+	return ICDecompressGetFormat(hic, lpbi, null);
+}
+LRESULT ICDecompressGetPalette(HIC hic, LPVOID lpbiInput, LPVOID lpbiOutput) {
+	return ICSendMessage(hic, ICM_DECOMPRESS_GET_PALETTE, cast(DWORD_PTR)lpbiInput, cast(DWORD_PTR)lpbiOutput);
+}
+LRESULT ICDecompressSetPalette(HIC hic, LPVOID lpbiPalette) {
+	return ICSendMessage(hic, ICM_DECOMPRESS_SET_PALETTE, cast(DWORD_PTR)lpbiPalette, 0);
+}
+LRESULT ICDecompressEnd(HIC hic) {
+	return ICSendMessage(hic, ICM_DECOMPRESS_END, 0, 0);
+}
+
+LRESULT ICDecompressEx(HIC hic, DWORD dwFlags, LPBITMAPINFOHEADER lpbiSrc,
+	LPVOID lpSrc, int xSrc, int ySrc, int dxSrc, int dySrc,	LPBITMAPINFOHEADER lpbiDst,
+	LPVOID lpDst, int xDst, int yDst, int dxDst, int dyDst) {
+	ICDECOMPRESSEX ic;
+
+	ic.dwFlags = dwFlags;
+	ic.lpbiSrc = lpbiSrc;
+	ic.lpSrc = lpSrc;
+	ic.xSrc = xSrc;
+	ic.ySrc = ySrc;
+	ic.dxSrc = dxSrc;
+	ic.dySrc = dySrc;
+	ic.lpbiDst = lpbiDst;
+	ic.lpDst = lpDst;
+	ic.xDst = xDst;
+	ic.yDst = yDst;
+	ic.dxDst = dxDst;
+	ic.dyDst = dyDst;
+
+	return ICSendMessage(hic, ICM_DECOMPRESSEX, cast(DWORD_PTR)&ic, ic.sizeof);
+}
+
+LRESULT ICDecompressExBegin(HIC hic, DWORD dwFlags, LPBITMAPINFOHEADER lpbiSrc,
+	LPVOID lpSrc, int xSrc, int ySrc, int dxSrc, int dySrc, LPBITMAPINFOHEADER lpbiDst,
+	LPVOID lpDst, int xDst, int yDst, int dxDst, int dyDst) {
+	ICDECOMPRESSEX ic;
+
+	ic.dwFlags = dwFlags;
+	ic.lpbiSrc = lpbiSrc;
+	ic.lpSrc = lpSrc;
+	ic.xSrc = xSrc;
+	ic.ySrc = ySrc;
+	ic.dxSrc = dxSrc;
+	ic.dySrc = dySrc;
+	ic.lpbiDst = lpbiDst;
+	ic.lpDst = lpDst;
+	ic.xDst = xDst;
+	ic.yDst = yDst;
+	ic.dxDst = dxDst;
+	ic.dyDst = dyDst;
+
+	return ICSendMessage(hic, ICM_DECOMPRESSEX_BEGIN, cast(DWORD_PTR)&ic, ic.sizeof);
+}
+
+LRESULT ICDecompressExQuery(HIC hic, DWORD dwFlags, LPBITMAPINFOHEADER lpbiSrc,
+	LPVOID lpSrc, int xSrc, int ySrc, int dxSrc, int dySrc, LPBITMAPINFOHEADER lpbiDst,
+	LPVOID lpDst, int xDst, int yDst, int dxDst, int dyDst) {
+	ICDECOMPRESSEX ic;
+
+	ic.dwFlags = dwFlags;
+	ic.lpbiSrc = lpbiSrc;
+	ic.lpSrc = lpSrc;
+	ic.xSrc = xSrc;
+	ic.ySrc = ySrc;
+	ic.dxSrc = dxSrc;
+	ic.dySrc = dySrc;
+	ic.lpbiDst = lpbiDst;
+	ic.lpDst = lpDst;
+	ic.xDst = xDst;
+	ic.yDst = yDst;
+	ic.dxDst = dxDst;
+	ic.dyDst = dyDst;
+
+	return ICSendMessage(hic, ICM_DECOMPRESSEX_QUERY, cast(DWORD_PTR)&ic, ic.sizeof);
+}
+
+LRESULT ICDecompressExEnd(HIC hic) {
+	return ICSendMessage(hic, ICM_DECOMPRESSEX_END, 0, 0);
+}
+
+extern (Windows) {
+	DWORD ICDrawBegin(HIC hic, DWORD dwFlags, HPALETTE hpal, HWND hwnd, HDC hdc,
+		int xDst, int yDst, int dxDst, int dyDst, LPBITMAPINFOHEADER lpbi,
+		int xSrc, int ySrc, int dxSrc, int dySrc, DWORD dwRate, DWORD dwScale);
+}
+
+extern (Windows) {
+	DWORD ICDraw(HIC hic, DWORD dwFlags, LPVOID lpFormat, LPVOID lpData, DWORD cbData, LONG lTime);
+}
+
+LRESULT ICDrawSuggestFormat(HIC hic, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut,
+	int dxSrc, int dySrc, int dxDst, int dyDst, HIC hicDecomp) {
+	ICDRAWSUGGEST ic;
+
+	ic.lpbiIn = lpbiIn;
+	ic.lpbiSuggest = lpbiOut;
+	ic.dxSrc = dxSrc;
+	ic.dySrc = dySrc;
+	ic.dxDst = dxDst;
+	ic.dyDst = dyDst;
+	ic.hicDecompressor = hicDecomp;
+
+	return ICSendMessage(hic, ICM_DRAW_SUGGESTFORMAT, cast(DWORD_PTR)&ic, ic.sizeof);
+}
+
+LRESULT ICDrawQuery(HIC hic, LPVOID lpbiInput) {
+	return ICSendMessage(hic, ICM_DRAW_QUERY, cast(DWORD_PTR)lpbiInput, 0L);
+}
+LRESULT ICDrawChangePalette(HIC hic, LPVOID lpbiInput) {
+	return ICSendMessage(hic, ICM_DRAW_CHANGEPALETTE, cast(DWORD_PTR)lpbiInput, 0L);
+}
+LRESULT ICGetBuffersWanted(HIC hic, LPVOID lpdwBuffers) {
+	return ICSendMessage(hic, ICM_GETBUFFERSWANTED, cast(DWORD_PTR)lpdwBuffers, 0);
+}
+LRESULT ICDrawEnd(HIC hic) {
+	return ICSendMessage(hic, ICM_DRAW_END, 0, 0);
+}
+LRESULT ICDrawStart(HIC hic) {
+	return ICSendMessage(hic, ICM_DRAW_START, 0, 0);
+}
+LRESULT ICDrawStartPlay(HIC hic, DWORD lFrom, DWORD lTo) {
+	return ICSendMessage(hic, ICM_DRAW_START_PLAY, cast(DWORD_PTR)lFrom, cast(DWORD_PTR)lTo);
+}
+LRESULT ICDrawStop(HIC hic) {
+	return ICSendMessage(hic, ICM_DRAW_STOP, 0, 0);
+}
+LRESULT ICDrawStopPlay(HIC hic) {
+	return ICSendMessage(hic, ICM_DRAW_STOP_PLAY, 0, 0);
+}
+LRESULT ICDrawGetTime(HIC hic, LPVOID lplTime) {
+	return ICSendMessage(hic, ICM_DRAW_GETTIME, cast(DWORD_PTR)lplTime, 0);
+}
+LRESULT ICDrawSetTime(HIC hic, DWORD lTime) {
+	return ICSendMessage(hic, ICM_DRAW_SETTIME, cast(DWORD_PTR)lTime, 0);
+}
+LRESULT ICDrawRealize(HIC hic, HDC hdc, BOOL fBackground) {
+	return ICSendMessage(hic, ICM_DRAW_REALIZE, cast(DWORD_PTR)hdc, cast(DWORD_PTR)fBackground);
+}
+LRESULT ICDrawFlush(HIC hic) {
+	return ICSendMessage(hic, ICM_DRAW_FLUSH, 0, 0);
+}
+LRESULT ICDrawRenderBuffer(HIC hic) {
+	return ICSendMessage(hic, ICM_DRAW_RENDERBUFFER, 0, 0);
+}
+
+LRESULT ICSetStatusProc(HIC hic, DWORD dwFlags, LRESULT lParam, LONG function(LPARAM, UINT, LONG) fpfnStatus) {
+	ICSETSTATUSPROC ic;
+
+	ic.dwFlags = dwFlags;
+	ic.lParam = lParam;
+	ic.Status = fpfnStatus;
+
+	return ICSendMessage(hic, ICM_SET_STATUS_PROC, cast(DWORD_PTR)&ic, ic.sizeof);
+}
+
+HIC ICDecompressOpen(DWORD fccType, DWORD fccHandler, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut) {
+	return ICLocate(fccType, fccHandler, lpbiIn, lpbiOut, ICMODE_DECOMPRESS);
+}
+
+HIC ICDrawOpen(DWORD fccType, DWORD fccHandler, LPBITMAPINFOHEADER lpbiIn) {
+	return ICLocate(fccType, fccHandler, lpbiIn, null, ICMODE_DRAW);
+}
+
+extern (Windows) {
+	HIC ICLocate(DWORD fccType, DWORD fccHandler, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut, WORD wFlags);
+	HIC ICGetDisplayFormat(HIC hic, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut, int BitDepth, int dx, int dy);
+	HANDLE ICImageCompress(HIC hic, UINT uiFlags, LPBITMAPINFO lpbiIn, LPVOID lpBits, LPBITMAPINFO lpbiOut, LONG lQuality, LONG* plSize);
+	HANDLE ICImageDecompress(HIC hic, UINT uiFlags, LPBITMAPINFO lpbiIn, LPVOID lpBits, LPBITMAPINFO lpbiOut);
+}
+
+struct COMPVARS {
+	LONG		cbSize = this.sizeof;
+	DWORD		dwFlags;
+	HIC			hic;
+	DWORD               fccType;
+	DWORD               fccHandler;
+	LPBITMAPINFO	lpbiIn;
+	LPBITMAPINFO	lpbiOut;
+	LPVOID		lpBitsOut;
+	LPVOID		lpBitsPrev;
+	LONG		lFrame;
+	LONG		lKey;
+	LONG		lDataRate;
+	LONG		lQ;
+	LONG		lKeyCount;
+	LPVOID		lpState;
+	LONG		cbState;
+}
+alias COMPVARS* PCOMPVARS;
+
+const ICMF_COMPVARS_VALID = 0x00000001;
+
+extern (Windows) {
+	BOOL ICCompressorChoose(HWND hwnd, UINT uiFlags, LPVOID pvIn, LPVOID lpData, PCOMPVARS pc, LPSTR lpszTitle);
+}
+
+enum {
+	ICMF_CHOOSE_KEYFRAME		= 0x0001,
+	ICMF_CHOOSE_DATARATE		= 0x0002,
+	ICMF_CHOOSE_PREVIEW			= 0x0004,
+	ICMF_CHOOSE_ALLCOMPRESSORS	= 0x0008,
+}
+
+extern (Windows) {
+	BOOL ICSeqCompressFrameStart(PCOMPVARS pc, LPBITMAPINFO lpbiIn);
+	void ICSeqCompressFrameEnd(PCOMPVARS pc);
+	LPVOID ICSeqCompressFrame(PCOMPVARS pc, UINT uiFlags, LPVOID lpBits, BOOL* pfKey, LONG* plSize);
+	void ICCompressorFree(PCOMPVARS pc);
+}
+
+alias HANDLE HDRAWDIB;
+
+enum {
+	DDF_0001			= 0x0001,
+	DDF_UPDATE			= 0x0002,
+	DDF_SAME_HDC		= 0x0004,
+	DDF_SAME_DRAW		= 0x0008,
+	DDF_DONTDRAW		= 0x0010,
+	DDF_ANIMATE			= 0x0020,
+	DDF_BUFFER			= 0x0040,
+	DDF_JUSTDRAWIT		= 0x0080,
+	DDF_FULLSCREEN		= 0x0100,
+	DDF_BACKGROUNDPAL	= 0x0200,
+	DDF_NOTKEYFRAME		= 0x0400,
+	DDF_HURRYUP			= 0x0800,
+	DDF_HALFTONE		= 0x1000,
+	DDF_2000			= 0x2000,
+	DDF_PREROLL			= DDF_DONTDRAW,
+	DDF_SAME_DIB		= DDF_SAME_DRAW,
+	DDF_SAME_SIZE		= DDF_SAME_DRAW,
+}
+
+extern (Windows) {
+	BOOL DrawDibInit();
+	HDRAWDIB DrawDibOpen();
+	BOOL DrawDibClose(HDRAWDIB hdd);
+	LPVOID DrawDibGetBuffer(HDRAWDIB hdd, LPBITMAPINFOHEADER lpbi, DWORD dwSize, DWORD dwFlags);
+	UINT DrawDibError(HDRAWDIB hdd);
+	HPALETTE DrawDibGetPalette(HDRAWDIB hdd);
+	BOOL DrawDibSetPalette(HDRAWDIB hdd, HPALETTE hpal);
+	BOOL DrawDibChangePalette(HDRAWDIB hdd, int iStart, int iLen, LPPALETTEENTRY lppe);
+	UINT DrawDibRealize(HDRAWDIB hdd, HDC hdc, BOOL fBackground);
+	BOOL DrawDibStart(HDRAWDIB hdd, DWORD rate);
+	BOOL DrawDibStop(HDRAWDIB hdd);
+	BOOL DrawDibBegin(HDRAWDIB hdd, HDC hdc, int dxDst, int dyDst, LPBITMAPINFOHEADER lpbi, int dxSrc, int dySrc, UINT wFlags);
+	BOOL DrawDibDraw(HDRAWDIB hdd, HDC hdc, int xDst, int yDst, int dxDst, int dyDst, LPBITMAPINFOHEADER lpbi,
+		LPVOID lpBits, int xSrc, int ySrc, int dxSrc, int dySrc, UINT wFlags);
+}
+
+BOOL DrawDibUpdate(HDRAWDIB hdd, HDC hdc, int x, int y) {
+	return DrawDibDraw(hdd, hdc, x, y, 0, 0, null, null, 0, 0, 0, 0, DDF_UPDATE);
+}
+
+extern (Windows) {
+	BOOL DrawDibEnd(HDRAWDIB hdd);
+}
+
+struct DRAWDIBTIME {
+    LONG    timeCount;
+    LONG    timeDraw;
+    LONG    timeDecompress;
+    LONG    timeDither;
+    LONG    timeStretch;
+    LONG    timeBlt;
+    LONG    timeSetDIBits;
+}
+alias DRAWDIBTIME* LPDRAWDIBTIME;
+
+extern (Windows) {
+	BOOL DrawDibTime(HDRAWDIB hdd, LPDRAWDIBTIME lpddtime);
+}
+
+enum {
+	PD_CAN_DRAW_DIB			= 0x0001,
+	PD_CAN_STRETCHDIB		= 0x0002,
+	PD_STRETCHDIB_1_1_OK	= 0x0004,
+	PD_STRETCHDIB_1_2_OK	= 0x0008,
+	PD_STRETCHDIB_1_N_OK	= 0x0010,
+}
+
+extern (Windows) {
+	LRESULT DrawDibProfileDisplay(LPBITMAPINFOHEADER lpbi);
+	void StretchDIB(LPBITMAPINFOHEADER biDst, LPVOID lpDst, int	DstX, int DstY,
+		int DstXE, int DstYE, LPBITMAPINFOHEADER biSrc, LPVOID lpSrc,
+		int SrcX, int SrcY, int SrcXE, int SrcYE);
+} 	
+
+alias DWORD FOURCC;
+
+alias WORD TWOCC;
+
+const formtypeAVI			= mmioFOURCC!('A', 'V', 'I', ' ');
+const listtypeAVIHEADER		= mmioFOURCC!('h', 'd', 'r', 'l');
+const ckidAVIMAINHDR		= mmioFOURCC!('a', 'v', 'i', 'h');
+const listtypeSTREAMHEADER	= mmioFOURCC!('s', 't', 'r', 'l');
+const ckidSTREAMHEADER		= mmioFOURCC!('s', 't', 'r', 'h');
+const ckidSTREAMFORMAT		= mmioFOURCC!('s', 't', 'r', 'f');
+const ckidSTREAMHANDLERDATA	= mmioFOURCC!('s', 't', 'r', 'd');
+const ckidSTREAMNAME		= mmioFOURCC!('s', 't', 'r', 'n');
+const listtypeAVIMOVIE		= mmioFOURCC!('m', 'o', 'v', 'i');
+const listtypeAVIRECORD		= mmioFOURCC!('r', 'e', 'c', ' ');
+const ckidAVINEWINDEX		= mmioFOURCC!('i', 'd', 'x', '1');
+const streamtypeVIDEO		= mmioFOURCC!('v', 'i', 'd', 's');
+const streamtypeAUDIO		= mmioFOURCC!('a', 'u', 'd', 's');
+const streamtypeMIDI		= mmioFOURCC!('m', 'i', 'd', 's');
+const streamtypeTEXT		= mmioFOURCC!('t', 'x', 't', 's');
+
+const cktypeDIBbits			= aviTWOCC!('d', 'b');
+const cktypeDIBcompressed	= aviTWOCC!('d', 'c');
+const cktypePALchange		= aviTWOCC!('p', 'c');
+const cktypeWAVEbytes		= aviTWOCC!('w', 'b');
+
+const ckidAVIPADDING		= mmioFOURCC!('J', 'U', 'N', 'K');
+
+DWORD FromHex(char n) {
+	return (n >= 'A') ? n + 10 - 'A' : n - '0';
+}
+
+WORD StreamFromFOURCC(DWORD fcc) {
+	return cast(WORD)((FromHex(LOBYTE(LOWORD(fcc))) << 4) + (FromHex(HIBYTE(LOWORD(fcc)))));
+}
+
+WORD TWOCCFromFOURCC(DWORD fcc) {
+	return HIWORD(fcc);
+}
+
+BYTE ToHex(DWORD n) {
+	return cast(BYTE)((n > 9) ? n - 10 + 'A' : n + '0');
+}
+
+DWORD MAKEAVICKID(WORD tcc, WORD stream) {
+	return MAKELONG(cast(WORD)((ToHex(stream & 0x0f) << 8) | (ToHex((stream & 0xf0) >> 4))), tcc);
+}
+
+enum {
+	AVIF_HASINDEX		= 0x00000010,
+	AVIF_MUSTUSEINDEX	= 0x00000020,
+	AVIF_ISINTERLEAVED	= 0x00000100,
+	AVIF_WASCAPTUREFILE	= 0x00010000,
+	AVIF_COPYRIGHTED	= 0x00020000,
+}
+
+const AVI_HEADERSIZE = 2048;
+
+struct MainAVIHeader {
+	DWORD dwMicroSecPerFrame;
+	DWORD dwMaxBytesPerSec;
+	DWORD dwPaddingGranularity;
+	DWORD dwFlags;
+	DWORD dwTotalFrames;
+	DWORD dwInitialFrames;
+	DWORD dwStreams;
+	DWORD dwSuggestedBufferSize;
+	DWORD dwWidth;
+	DWORD dwHeight;
+	DWORD dwReserved[4];
+}
+
+const AVISF_DISABLED = 0x00000001;
+
+const AVISF_VIDEO_PALCHANGES = 0x00010000;
+
+struct AVIStreamHeader {
+	FOURCC		fccType;
+	FOURCC		fccHandler;
+	DWORD		dwFlags;
+	WORD		wPriority;
+	WORD		wLanguage;
+	DWORD		dwInitialFrames;
+	DWORD		dwScale;	
+	DWORD		dwRate;
+	DWORD		dwStart;
+	DWORD		dwLength;
+	DWORD		dwSuggestedBufferSize;
+	DWORD		dwQuality;
+	DWORD		dwSampleSize;
+	RECT		rcFrame;
+}
+
+enum {
+	AVIIF_FIRSTPART	= 0x00000020L,
+	AVIIF_LASTPART	= 0x00000040L,
+	AVIIF_MIDPART	= (AVIIF_LASTPART|AVIIF_FIRSTPART),
+	AVIIF_NOTIME	= 0x00000100L,
+	AVIIF_COMPUSE	= 0x0FFF0000L,
+}
+
+struct AVIINDEXENTRY {
+	DWORD		ckid;
+	DWORD		dwFlags;
+	DWORD		dwChunkOffset;
+	DWORD		dwChunkLength;
+}
+
+struct AVIPALCHANGE {
+	BYTE		bFirstEntry;
+	BYTE		bNumEntries;
+	WORD		wFlags;
+	PALETTEENTRY	peNew[];
+}
+
+const AVIGETFRAMEF_BESTDISPLAYFMT = 1;
+
+struct AVISTREAMINFOW {
+	DWORD	fccType;
+	DWORD	fccHandler;
+	DWORD	dwFlags;
+	DWORD	dwCaps;
+	WORD	wPriority;
+	WORD	wLanguage;
+	DWORD	dwScale;
+	DWORD	dwRate;
+	DWORD	dwStart;
+	DWORD	dwLength;
+	DWORD	dwInitialFrames;
+	DWORD	dwSuggestedBufferSize;
+	DWORD	dwQuality;
+	DWORD	dwSampleSize;
+	RECT	rcFrame;
+	DWORD	dwEditCount;
+	DWORD	dwFormatChangeCount;
+	WCHAR	szName[64];
+}
+alias AVISTREAMINFOW* LPAVISTREAMINFOW;
+
+struct AVISTREAMINFOA {
+	DWORD	fccType;
+	DWORD	fccHandler;
+	DWORD	dwFlags;
+	DWORD	dwCaps;
+	WORD	wPriority;
+	WORD	wLanguage;
+	DWORD	dwScale;
+	DWORD	dwRate;
+	DWORD	dwStart;
+	DWORD	dwLength;
+	DWORD	dwInitialFrames;
+	DWORD	dwSuggestedBufferSize;
+	DWORD	dwQuality;
+	DWORD	dwSampleSize;
+	RECT	rcFrame;
+	DWORD	dwEditCount;
+	DWORD	dwFormatChangeCount;
+	char	szName[64];
+}
+alias AVISTREAMINFOA* LPAVISTREAMINFOA;
+
+version(Unicode) {
+	alias AVISTREAMINFOW	AVISTREAMINFO;
+	alias LPAVISTREAMINFOW	LPAVISTREAMINFO;
+} else { // Unicode
+	alias AVISTREAMINFOA	AVISTREAMINFO;
+	alias LPAVISTREAMINFOA	LPAVISTREAMINFO;
+}
+
+const AVISTREAMINFO_DISABLED		= 0x00000001;
+const AVISTREAMINFO_FORMATCHANGES	= 0x00010000;
+
+struct AVIFILEINFOW {
+	DWORD	dwMaxBytesPerSec;
+	DWORD	dwFlags;
+	DWORD	dwCaps;
+	DWORD	dwStreams;
+	DWORD	dwSuggestedBufferSize;
+	DWORD	dwWidth;
+	DWORD	dwHeight;
+	DWORD	dwScale;	
+	DWORD	dwRate;
+	DWORD	dwLength;
+	DWORD	dwEditCount;
+	WCHAR	szFileType[64];
+}
+alias AVIFILEINFOW* LPAVIFILEINFOW;
+
+struct AVIFILEINFOA {
+	DWORD	dwMaxBytesPerSec;
+	DWORD	dwFlags;
+	DWORD	dwCaps;
+	DWORD	dwStreams;
+	DWORD	dwSuggestedBufferSize;
+	DWORD	dwWidth;
+	DWORD	dwHeight;
+	DWORD	dwScale;	
+	DWORD	dwRate;
+	DWORD	dwLength;
+	DWORD	dwEditCount;
+	char	szFileType[64];
+}
+alias AVIFILEINFOA* LPAVIFILEINFOA;
+
+version(Unicode) {
+	alias AVIFILEINFOW	AVIFILEINFO;
+	alias LPAVIFILEINFOW	LPAVIFILEINFO;
+} else { // Unicode
+	alias AVIFILEINFOA	AVIFILEINFO;
+	alias LPAVIFILEINFOA	LPAVIFILEINFO;
+}
+
+enum {
+	AVIFILEINFO_HASINDEX		= 0x00000010,
+	AVIFILEINFO_MUSTUSEINDEX	= 0x00000020,
+	AVIFILEINFO_ISINTERLEAVED	= 0x00000100,
+	AVIFILEINFO_WASCAPTUREFILE	= 0x00010000,
+	AVIFILEINFO_COPYRIGHTED		= 0x00020000,
+}
+
+enum {
+	AVIFILECAPS_CANREAD			= 0x00000001,
+	AVIFILECAPS_CANWRITE		= 0x00000002,
+	AVIFILECAPS_ALLKEYFRAMES	= 0x00000010,
+	AVIFILECAPS_NOCOMPRESSION	= 0x00000020,
+}
+
+extern (Windows) {
+	alias BOOL function(int) AVISAVECALLBACK;
+}
+
+struct AVICOMPRESSOPTIONS {
+	DWORD	fccType;
+	DWORD	fccHandler;
+	DWORD	dwKeyFrameEvery;
+	DWORD	dwQuality;
+	DWORD	dwBytesPerSecond;
+	DWORD	dwFlags;
+	LPVOID	lpFormat;
+	DWORD	cbFormat;
+	LPVOID	lpParms;
+	DWORD	cbParms;
+	DWORD	dwInterleaveEvery;
+}
+alias AVICOMPRESSOPTIONS* LPAVICOMPRESSOPTIONS;
+
+enum {
+	AVICOMPRESSF_INTERLEAVE	= 0x00000001,
+	AVICOMPRESSF_DATARATE	= 0x00000002,
+	AVICOMPRESSF_KEYFRAMES	= 0x00000004,
+	AVICOMPRESSF_VALID		= 0x00000008,
+}
+
+/+ TODO:
+DECLARE_INTERFACE_(IAVIStream, IUnknown)
+{
+    STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+    STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
+    STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+    STDMETHOD(Create)      (THIS_ LPARAM lParam1, LPARAM lParam2) PURE ;
+    STDMETHOD(Info)        (THIS_ AVISTREAMINFOW FAR * psi, LONG lSize) PURE ;
+    STDMETHOD_(LONG, FindSample)(THIS_ LONG lPos, LONG lFlags) PURE ;
+    STDMETHOD(ReadFormat)  (THIS_ LONG lPos,
+			    LPVOID lpFormat, LONG FAR *lpcbFormat) PURE ;
+    STDMETHOD(SetFormat)   (THIS_ LONG lPos,
+			    LPVOID lpFormat, LONG cbFormat) PURE ;
+    STDMETHOD(Read)        (THIS_ LONG lStart, LONG lSamples,
+			    LPVOID lpBuffer, LONG cbBuffer,
+			    LONG FAR * plBytes, LONG FAR * plSamples) PURE ;
+    STDMETHOD(Write)       (THIS_ LONG lStart, LONG lSamples,
+			    LPVOID lpBuffer, LONG cbBuffer,
+			    DWORD dwFlags,
+			    LONG FAR *plSampWritten,
+			    LONG FAR *plBytesWritten) PURE ;
+    STDMETHOD(Delete)      (THIS_ LONG lStart, LONG lSamples) PURE;
+    STDMETHOD(ReadData)    (THIS_ DWORD fcc, LPVOID lp, LONG FAR *lpcb) PURE ;
+    STDMETHOD(WriteData)   (THIS_ DWORD fcc, LPVOID lp, LONG cb) PURE ;
+#ifdef _WIN32
+    STDMETHOD(SetInfo) (THIS_ AVISTREAMINFOW FAR * lpInfo,
+			    LONG cbInfo) PURE;
+#else
+    STDMETHOD(Reserved1)            (THIS) PURE;
+    STDMETHOD(Reserved2)            (THIS) PURE;
+    STDMETHOD(Reserved3)            (THIS) PURE;
+    STDMETHOD(Reserved4)            (THIS) PURE;
+    STDMETHOD(Reserved5)            (THIS) PURE;
+#endif
+};
+
+typedef       IAVIStream FAR* PAVISTREAM;
+
+#undef  INTERFACE
+#define INTERFACE   IAVIStreaming
+
+DECLARE_INTERFACE_(IAVIStreaming, IUnknown)
+{
+    STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+    STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
+    STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+    STDMETHOD(Begin) (THIS_
+		      LONG  lStart,
+		      LONG  lEnd,
+		      LONG  lRate) PURE;
+    STDMETHOD(End)   (THIS) PURE;
+};
+
+typedef       IAVIStreaming FAR* PAVISTREAMING;
+
+
+#undef  INTERFACE
+#define INTERFACE   IAVIEditStream
+
+DECLARE_INTERFACE_(IAVIEditStream, IUnknown)
+{
+    STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+    STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
+    STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+    STDMETHOD(Cut) (THIS_ LONG FAR *plStart,
+			  LONG FAR *plLength,
+			  PAVISTREAM FAR * ppResult) PURE;
+    STDMETHOD(Copy) (THIS_ LONG FAR *plStart,
+			   LONG FAR *plLength,
+			   PAVISTREAM FAR * ppResult) PURE;
+    STDMETHOD(Paste) (THIS_ LONG FAR *plPos,
+			    LONG FAR *plLength,
+			    PAVISTREAM pstream,
+			    LONG lStart,
+			    LONG lEnd) PURE;
+    STDMETHOD(Clone) (THIS_ PAVISTREAM FAR *ppResult) PURE;
+    STDMETHOD(SetInfo) (THIS_ AVISTREAMINFOW FAR * lpInfo,
+			    LONG cbInfo) PURE;
+};
+
+typedef       IAVIEditStream FAR* PAVIEDITSTREAM;
+
+#undef  INTERFACE
+#define INTERFACE   IAVIPersistFile
+
+DECLARE_INTERFACE_(IAVIPersistFile, IPersistFile)
+{
+    STDMETHOD(Reserved1)(THIS) PURE;
+};
+
+typedef IAVIPersistFile FAR* PAVIPERSISTFILE;
+
+#undef  INTERFACE
+#define INTERFACE   IAVIFile
+#define PAVIFILE IAVIFile FAR*
+
+DECLARE_INTERFACE_(IAVIFile, IUnknown)
+{
+    STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+    STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
+    STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+    STDMETHOD(Info)                 (THIS_
+                                     AVIFILEINFOW FAR * pfi,
+                                     LONG lSize) PURE;
+    STDMETHOD(GetStream)            (THIS_
+                                     PAVISTREAM FAR * ppStream,
+				     DWORD fccType,
+                                     LONG lParam) PURE;
+    STDMETHOD(CreateStream)         (THIS_
+                                     PAVISTREAM FAR * ppStream,
+                                     AVISTREAMINFOW FAR * psi) PURE;
+    STDMETHOD(WriteData)            (THIS_
+                                     DWORD ckid,
+                                     LPVOID lpData,
+                                     LONG cbData) PURE;
+    STDMETHOD(ReadData)             (THIS_
+                                     DWORD ckid,
+                                     LPVOID lpData,
+                                     LONG FAR *lpcbData) PURE;
+    STDMETHOD(EndRecord)            (THIS) PURE;
+    STDMETHOD(DeleteStream)         (THIS_
+				     DWORD fccType,
+                                     LONG lParam) PURE;
+};
+
+#undef PAVIFILE
+typedef       IAVIFile FAR* PAVIFILE;
+
+#undef  INTERFACE
+#define INTERFACE   IGetFrame
+#define PGETFRAME   IGetFrame FAR*
+
+DECLARE_INTERFACE_(IGetFrame, IUnknown)
+{
+    STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
+    STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
+    STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+    STDMETHOD_(LPVOID,GetFrame) (THIS_ LONG lPos) PURE;
+
+    STDMETHOD(Begin) (THIS_ LONG lStart, LONG lEnd, LONG lRate) PURE;
+    STDMETHOD(End) (THIS) PURE;
+
+    STDMETHOD(SetFormat) (THIS_ LPBITMAPINFOHEADER lpbi, LPVOID lpBits, int x, int y, int dx, int dy) PURE;
+};
+
+#undef PGETFRAME
+typedef IGetFrame FAR* PGETFRAME;
+
+#define DEFINE_AVIGUID(name, l, w1, w2)    DEFINE_GUID(name, l, w1, w2, 0xC0,0,0,0,0,0,0,0x46)
+
+DEFINE_AVIGUID(IID_IAVIFile,            0x00020020, 0, 0);
+DEFINE_AVIGUID(IID_IAVIStream,          0x00020021, 0, 0);
+DEFINE_AVIGUID(IID_IAVIStreaming,       0x00020022, 0, 0);
+DEFINE_AVIGUID(IID_IGetFrame,           0x00020023, 0, 0);
+DEFINE_AVIGUID(IID_IAVIEditStream,      0x00020024, 0, 0);
+DEFINE_AVIGUID(IID_IAVIPersistFile,     0x00020025, 0, 0);
+#ifndef UNICODE
+DEFINE_AVIGUID(CLSID_AVISimpleUnMarshal,        0x00020009, 0, 0);
+#endif
+
+DEFINE_AVIGUID(CLSID_AVIFile,           0x00020000, 0, 0);
+
+#define	AVIFILEHANDLER_CANREAD		0x0001
+#define	AVIFILEHANDLER_CANWRITE		0x0002
+#define	AVIFILEHANDLER_CANACCEPTNONRGB	0x0004
+
+STDAPI_(void) AVIFileInit(void);
+STDAPI_(void) AVIFileExit(void);
+
+STDAPI_(ULONG) AVIFileAddRef       (PAVIFILE pfile);
+STDAPI_(ULONG) AVIFileRelease      (PAVIFILE pfile);
+
+#ifdef _WIN32
+STDAPI AVIFileOpenA       (PAVIFILE FAR * ppfile, LPCSTR szFile,
+			  UINT uMode, LPCLSID lpHandler);
+STDAPI AVIFileOpenW       (PAVIFILE FAR * ppfile, LPCWSTR szFile,
+			  UINT uMode, LPCLSID lpHandler);
+#ifdef UNICODE
+#define AVIFileOpen	  AVIFileOpenW	
+#else
+#define AVIFileOpen	  AVIFileOpenA	
+#endif
+#else
+STDAPI AVIFileOpen       (PAVIFILE FAR * ppfile, LPCSTR szFile,
+			  UINT uMode, LPCLSID lpHandler);
+#define AVIFileOpenW	AVIFileOpen
+#endif
+
+#ifdef _WIN32
+STDAPI AVIFileInfoW (PAVIFILE pfile, LPAVIFILEINFOW pfi, LONG lSize);
+STDAPI AVIFileInfoA (PAVIFILE pfile, LPAVIFILEINFOA pfi, LONG lSize);
+#ifdef UNICODE
+#define AVIFileInfo	AVIFileInfoW
+#else
+#define AVIFileInfo	AVIFileInfoA
+#endif
+#else
+STDAPI AVIFileInfo (PAVIFILE pfile, LPAVIFILEINFO pfi, LONG lSize);
+#define AVIFileInfoW AVIFileInfo
+#endif
+
+
+STDAPI AVIFileGetStream     (PAVIFILE pfile, PAVISTREAM FAR * ppavi, DWORD fccType, LONG lParam);
+
+
+#ifdef _WIN32
+STDAPI AVIFileCreateStreamW (PAVIFILE pfile, PAVISTREAM FAR *ppavi, AVISTREAMINFOW FAR * psi);
+STDAPI AVIFileCreateStreamA (PAVIFILE pfile, PAVISTREAM FAR *ppavi, AVISTREAMINFOA FAR * psi);
+#ifdef UNICODE
+#define AVIFileCreateStream	AVIFileCreateStreamW
+#else
+#define AVIFileCreateStream	AVIFileCreateStreamA
+#endif
+#else
+STDAPI AVIFileCreateStream(PAVIFILE pfile, PAVISTREAM FAR *ppavi, AVISTREAMINFO FAR * psi);
+#define AVIFileCreateStreamW AVIFileCreateStream
+#endif
+
+STDAPI AVIFileWriteData	(PAVIFILE pfile,
+					 DWORD ckid,
+					 LPVOID lpData,
+					 LONG cbData);
+STDAPI AVIFileReadData	(PAVIFILE pfile,
+					 DWORD ckid,
+					 LPVOID lpData,
+					 LONG FAR *lpcbData);
+STDAPI AVIFileEndRecord	(PAVIFILE pfile);
+
+STDAPI_(ULONG) AVIStreamAddRef       (PAVISTREAM pavi);
+STDAPI_(ULONG) AVIStreamRelease      (PAVISTREAM pavi);
+
+STDAPI AVIStreamInfoW (PAVISTREAM pavi, LPAVISTREAMINFOW psi, LONG lSize);
+STDAPI AVIStreamInfoA (PAVISTREAM pavi, LPAVISTREAMINFOA psi, LONG lSize);
+#ifdef UNICODE
+#define AVIStreamInfo	AVIStreamInfoW
+#else
+#define AVIStreamInfo	AVIStreamInfoA
+#endif
+
+STDAPI_(LONG) AVIStreamFindSample(PAVISTREAM pavi, LONG lPos, LONG lFlags);
+STDAPI AVIStreamReadFormat   (PAVISTREAM pavi, LONG lPos,LPVOID lpFormat,LONG FAR *lpcbFormat);
+STDAPI AVIStreamSetFormat    (PAVISTREAM pavi, LONG lPos,LPVOID lpFormat,LONG cbFormat);
+STDAPI AVIStreamReadData     (PAVISTREAM pavi, DWORD fcc, LPVOID lp, LONG FAR *lpcb);
+STDAPI AVIStreamWriteData    (PAVISTREAM pavi, DWORD fcc, LPVOID lp, LONG cb);
+
+STDAPI AVIStreamRead         (PAVISTREAM pavi,
+			      LONG lStart,
+			      LONG lSamples,
+			      LPVOID lpBuffer,
+			      LONG cbBuffer,
+			      LONG FAR * plBytes,
+			      LONG FAR * plSamples);
+#define AVISTREAMREAD_CONVENIENT	(-1L)
+
+STDAPI AVIStreamWrite        (PAVISTREAM pavi,
+			      LONG lStart, LONG lSamples,
+			      LPVOID lpBuffer, LONG cbBuffer, DWORD dwFlags,
+			      LONG FAR *plSampWritten,
+			      LONG FAR *plBytesWritten);
+
+STDAPI_(LONG) AVIStreamStart        (PAVISTREAM pavi);
+STDAPI_(LONG) AVIStreamLength       (PAVISTREAM pavi);
+STDAPI_(LONG) AVIStreamTimeToSample (PAVISTREAM pavi, LONG lTime);
+STDAPI_(LONG) AVIStreamSampleToTime (PAVISTREAM pavi, LONG lSample);
+
+
+STDAPI AVIStreamBeginStreaming(PAVISTREAM pavi, LONG lStart, LONG lEnd, LONG lRate);
+STDAPI AVIStreamEndStreaming(PAVISTREAM pavi);
+
+STDAPI_(PGETFRAME) AVIStreamGetFrameOpen(PAVISTREAM pavi,
+					 LPBITMAPINFOHEADER lpbiWanted);
+STDAPI_(LPVOID) AVIStreamGetFrame(PGETFRAME pg, LONG lPos);
+STDAPI AVIStreamGetFrameClose(PGETFRAME pg);
+
+STDAPI AVIStreamOpenFromFileA(PAVISTREAM FAR *ppavi, LPCSTR szFile,
+			     DWORD fccType, LONG lParam,
+			     UINT mode, CLSID FAR *pclsidHandler);
+STDAPI AVIStreamOpenFromFileW(PAVISTREAM FAR *ppavi, LPCWSTR szFile,
+			     DWORD fccType, LONG lParam,
+			     UINT mode, CLSID FAR *pclsidHandler);
+#ifdef UNICODE
+#define AVIStreamOpenFromFile	AVIStreamOpenFromFileW
+#else
+#define AVIStreamOpenFromFile	AVIStreamOpenFromFileA
+#endif
+
+STDAPI AVIStreamCreate(PAVISTREAM FAR *ppavi, LONG lParam1, LONG lParam2,
+		       CLSID FAR *pclsidHandler);
+
+
+
+#define FIND_DIR        0x0000000FL
+#define FIND_NEXT       0x00000001L
+#define FIND_PREV       0x00000004L
+#define FIND_FROM_START 0x00000008L
+
+#define FIND_TYPE       0x000000F0L
+#define FIND_KEY        0x00000010L
+#define FIND_ANY        0x00000020L
+#define FIND_FORMAT     0x00000040L
+
+#define FIND_RET        0x0000F000L
+#define FIND_POS        0x00000000L
+#define FIND_LENGTH     0x00001000L
+#define FIND_OFFSET     0x00002000L
+#define FIND_SIZE       0x00003000L
+#define FIND_INDEX      0x00004000L
+
+#define AVIStreamFindKeyFrame AVIStreamFindSample
+#define FindKeyFrame	FindSample
+
+#define AVIStreamClose AVIStreamRelease
+#define AVIFileClose   AVIFileRelease
+#define AVIStreamInit  AVIFileInit
+#define AVIStreamExit  AVIFileExit
+
+#define SEARCH_NEAREST  FIND_PREV
+#define SEARCH_BACKWARD FIND_PREV
+#define SEARCH_FORWARD  FIND_NEXT
+#define SEARCH_KEY      FIND_KEY
+#define SEARCH_ANY      FIND_ANY
+
+#define     AVIStreamSampleToSample(pavi1, pavi2, l)            AVIStreamTimeToSample(pavi1,AVIStreamSampleToTime(pavi2, l))
+
+#define     AVIStreamNextSample(pavi, l)            AVIStreamFindSample(pavi,l+1,FIND_NEXT|FIND_ANY)
+
+#define     AVIStreamPrevSample(pavi, l)            AVIStreamFindSample(pavi,l-1,FIND_PREV|FIND_ANY)
+
+#define     AVIStreamNearestSample(pavi, l)            AVIStreamFindSample(pavi,l,FIND_PREV|FIND_ANY)
+
+#define     AVIStreamNextKeyFrame(pavi,l)            AVIStreamFindSample(pavi,l+1,FIND_NEXT|FIND_KEY)
+
+#define     AVIStreamPrevKeyFrame(pavi, l)            AVIStreamFindSample(pavi,l-1,FIND_PREV|FIND_KEY)
+
+#define     AVIStreamNearestKeyFrame(pavi, l)            AVIStreamFindSample(pavi,l,FIND_PREV|FIND_KEY)
+
+#define     AVIStreamIsKeyFrame(pavi, l)            (AVIStreamNearestKeyFrame(pavi,l) == l)
+
+#define     AVIStreamPrevSampleTime(pavi, t)            AVIStreamSampleToTime(pavi, AVIStreamPrevSample(pavi,AVIStreamTimeToSample(pavi,t)))
+
+#define     AVIStreamNextSampleTime(pavi, t)            AVIStreamSampleToTime(pavi, AVIStreamNextSample(pavi,AVIStreamTimeToSample(pavi,t)))
+
+#define     AVIStreamNearestSampleTime(pavi, t)            AVIStreamSampleToTime(pavi, AVIStreamNearestSample(pavi,AVIStreamTimeToSample(pavi,t)))
+
+#define     AVIStreamNextKeyFrameTime(pavi, t)            AVIStreamSampleToTime(pavi, AVIStreamNextKeyFrame(pavi,AVIStreamTimeToSample(pavi, t)))
+
+#define     AVIStreamPrevKeyFrameTime(pavi, t)            AVIStreamSampleToTime(pavi, AVIStreamPrevKeyFrame(pavi,AVIStreamTimeToSample(pavi, t)))
+
+#define     AVIStreamNearestKeyFrameTime(pavi, t)            AVIStreamSampleToTime(pavi, AVIStreamNearestKeyFrame(pavi,AVIStreamTimeToSample(pavi, t)))
+
+#define     AVIStreamStartTime(pavi)            AVIStreamSampleToTime(pavi, AVIStreamStart(pavi))
+
+#define     AVIStreamLengthTime(pavi)            AVIStreamSampleToTime(pavi, AVIStreamLength(pavi))
+
+#define     AVIStreamEnd(pavi)            (AVIStreamStart(pavi) + AVIStreamLength(pavi))
+
+#define     AVIStreamEndTime(pavi)            AVIStreamSampleToTime(pavi, AVIStreamEnd(pavi))
+
+#define     AVIStreamSampleSize(pavi, lPos, plSize)	    AVIStreamRead(pavi,lPos,1,NULL,0,plSize,NULL)
+
+#define     AVIStreamFormatSize(pavi, lPos, plSize)            AVIStreamReadFormat(pavi,lPos,NULL,plSize)
+
+#define     AVIStreamDataSize(pavi, fcc, plSize)            AVIStreamReadData(pavi,fcc,NULL,plSize)
+
+#ifndef comptypeDIB
+#define comptypeDIB         mmioFOURCC('D', 'I', 'B', ' ')
+#endif
+
+STDAPI AVIMakeCompressedStream(
+		PAVISTREAM FAR *	    ppsCompressed,
+		PAVISTREAM		    ppsSource,
+		AVICOMPRESSOPTIONS FAR *    lpOptions,
+		CLSID FAR *pclsidHandler);
+
+EXTERN_C HRESULT CDECL AVISaveA (LPCSTR               szFile,
+		CLSID FAR *pclsidHandler,
+		AVISAVECALLBACK     lpfnCallback,
+		int                 nStreams,
+		PAVISTREAM	    pfile,
+		LPAVICOMPRESSOPTIONS lpOptions,
+		...);
+
+STDAPI AVISaveVA(LPCSTR               szFile,
+		CLSID FAR *pclsidHandler,
+		AVISAVECALLBACK     lpfnCallback,
+		int                 nStreams,
+		PAVISTREAM FAR *    ppavi,
+		LPAVICOMPRESSOPTIONS FAR *plpOptions);
+EXTERN_C HRESULT CDECL AVISaveW (LPCWSTR               szFile,
+		CLSID FAR *pclsidHandler,
+		AVISAVECALLBACK     lpfnCallback,
+		int                 nStreams,
+		PAVISTREAM	    pfile,
+		LPAVICOMPRESSOPTIONS lpOptions,
+		...);
+
+STDAPI AVISaveVW(LPCWSTR               szFile,
+		CLSID FAR *pclsidHandler,
+		AVISAVECALLBACK     lpfnCallback,
+		int                 nStreams,
+		PAVISTREAM FAR *    ppavi,
+		LPAVICOMPRESSOPTIONS FAR *plpOptions);
+#ifdef UNICODE
+#define AVISave		AVISaveW
+#define AVISaveV	AVISaveVW
+#else
+#define AVISave		AVISaveA
+#define AVISaveV	AVISaveVA
+#endif
+
+
+
+STDAPI_(INT_PTR) AVISaveOptions(HWND hwnd,
+			     UINT	uiFlags,
+			     int	nStreams,
+			     PAVISTREAM FAR *ppavi,
+			     LPAVICOMPRESSOPTIONS FAR *plpOptions);
+
+STDAPI AVISaveOptionsFree(int nStreams,
+			     LPAVICOMPRESSOPTIONS FAR *plpOptions);
+
+STDAPI AVIBuildFilterW(LPWSTR lpszFilter, LONG cbFilter, BOOL fSaving);
+STDAPI AVIBuildFilterA(LPSTR lpszFilter, LONG cbFilter, BOOL fSaving);
+#ifdef UNICODE
+#define AVIBuildFilter	AVIBuildFilterW
+#else
+#define AVIBuildFilter	AVIBuildFilterA
+#endif
+STDAPI AVIMakeFileFromStreams(PAVIFILE FAR *	ppfile,
+			       int		nStreams,
+			       PAVISTREAM FAR *	papStreams);
+
+STDAPI AVIMakeStreamFromClipboard(UINT cfFormat, HANDLE hGlobal, PAVISTREAM FAR *ppstream);
+
+STDAPI AVIPutFileOnClipboard(PAVIFILE pf);
+
+STDAPI AVIGetFromClipboard(PAVIFILE FAR * lppf);
+
+STDAPI AVIClearClipboard(void);
+
+STDAPI CreateEditableStream(
+		PAVISTREAM FAR *	    ppsEditable,
+		PAVISTREAM		    psSource);
+
+STDAPI EditStreamCut(PAVISTREAM pavi, LONG FAR *plStart, LONG FAR *plLength, PAVISTREAM FAR * ppResult);
+
+STDAPI EditStreamCopy(PAVISTREAM pavi, LONG FAR *plStart, LONG FAR *plLength, PAVISTREAM FAR * ppResult);
+
+STDAPI EditStreamPaste(PAVISTREAM pavi, LONG FAR *plPos, LONG FAR *plLength, PAVISTREAM pstream, LONG lStart, LONG lEnd);
+
+STDAPI EditStreamClone(PAVISTREAM pavi, PAVISTREAM FAR *ppResult);
+
+
+STDAPI EditStreamSetNameA(PAVISTREAM pavi, LPCSTR lpszName);
+STDAPI EditStreamSetNameW(PAVISTREAM pavi, LPCWSTR lpszName);
+STDAPI EditStreamSetInfoW(PAVISTREAM pavi, LPAVISTREAMINFOW lpInfo, LONG cbInfo);
+STDAPI EditStreamSetInfoA(PAVISTREAM pavi, LPAVISTREAMINFOA lpInfo, LONG cbInfo);
+#ifdef UNICODE
+#define EditStreamSetInfo	EditStreamSetInfoW
+#define EditStreamSetName	EditStreamSetNameW
+#else
+#define EditStreamSetInfo	EditStreamSetInfoA
+#define EditStreamSetName	EditStreamSetNameA
+#endif
++/
+const AVIERR_OK = 0L;
+
+SCODE MAKE_AVIERR(DWORD error) {
+	return MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x4000 + error);
+}
+
+const AVIERR_UNSUPPORTED	= MAKE_AVIERR(101);
+const AVIERR_BADFORMAT		= MAKE_AVIERR(102);
+const AVIERR_MEMORY			= MAKE_AVIERR(103);
+const AVIERR_INTERNAL		= MAKE_AVIERR(104);
+const AVIERR_BADFLAGS		= MAKE_AVIERR(105);
+const AVIERR_BADPARAM		= MAKE_AVIERR(106);
+const AVIERR_BADSIZE		= MAKE_AVIERR(107);
+const AVIERR_BADHANDLE		= MAKE_AVIERR(108);
+const AVIERR_FILEREAD		= MAKE_AVIERR(109);
+const AVIERR_FILEWRITE		= MAKE_AVIERR(110);
+const AVIERR_FILEOPEN		= MAKE_AVIERR(111);
+const AVIERR_COMPRESSOR		= MAKE_AVIERR(112);
+const AVIERR_NOCOMPRESSOR	= MAKE_AVIERR(113);
+const AVIERR_READONLY		= MAKE_AVIERR(114);
+const AVIERR_NODATA			= MAKE_AVIERR(115);
+const AVIERR_BUFFERTOOSMALL	= MAKE_AVIERR(116);
+const AVIERR_CANTCOMPRESS	= MAKE_AVIERR(117);
+const AVIERR_USERABORT		= MAKE_AVIERR(198);
+const AVIERR_ERROR			= MAKE_AVIERR(199);
+
+const TCHAR[] MCIWND_WINDOW_CLASS = "MCIWndClass";
+
+extern (Windows) {
+	HWND MCIWndCreateA(HWND hwndParent, HINSTANCE hInstance, DWORD dwStyle, LPCSTR szFile);
+	HWND MCIWndCreateW(HWND hwndParent, HINSTANCE hInstance, DWORD dwStyle, LPCWSTR szFile);
+}
+
+version(Unicode) {
+	alias MCIWndCreateW	MCIWndCreate;
+} else { // Unicode
+	alias MCIWndCreateA	MCIWndCreate;
+}
+
+extern(Windows) {
+	BOOL MCIWndRegisterClass();
+}
+
+enum {
+	MCIWNDOPENF_NEW				= 0x0001,
+	MCIWNDF_NOAUTOSIZEWINDOW	= 0x0001,
+	MCIWNDF_NOPLAYBAR			= 0x0002,
+	MCIWNDF_NOAUTOSIZEMOVIE		= 0x0004,
+	MCIWNDF_NOMENU				= 0x0008,
+	MCIWNDF_SHOWNAME			= 0x0010,
+	MCIWNDF_SHOWPOS				= 0x0020,
+	MCIWNDF_SHOWMODE			= 0x0040,
+	MCIWNDF_SHOWALL				= 0x0070,
+	MCIWNDF_NOTIFYMODE			= 0x0100,
+	MCIWNDF_NOTIFYPOS			= 0x0200,
+	MCIWNDF_NOTIFYSIZE			= 0x0400,
+	MCIWNDF_NOTIFYERROR			= 0x1000,
+	MCIWNDF_NOTIFYALL			= 0x1F00,
+	MCIWNDF_NOTIFYANSI			= 0x0080,
+	MCIWNDF_NOTIFYMEDIAA		= 0x0880,
+	MCIWNDF_NOTIFYMEDIAW		= 0x0800,
+}
+
+version(Unicode) {
+	alias MCIWNDF_NOTIFYMEDIAW	MCIWNDF_NOTIFYMEDIA;
+} else { // Unicode
+	alias MCIWNDF_NOTIFYMEDIAA	MCIWNDF_NOTIFYMEDIA;
+}
+
+enum {
+	MCIWNDF_RECORD		= 0x2000,
+	MCIWNDF_NOERRORDLG	= 0x4000,
+	MCIWNDF_NOOPEN		= 0x8000,
+}
+
+// can macros
+
+BOOL MCIWndCanPlay(HWND hwnd)
+	{ return cast(BOOL)SendMessage(hwnd, MCIWNDM_CAN_PLAY, 0, 0); }
+BOOL MCIWndCanRecord(HWND hwnd)
+	{ return cast(BOOL)SendMessage(hwnd, MCIWNDM_CAN_RECORD, 0, 0); }
+BOOL MCIWndCanSave(HWND hwnd)
+	{ return cast(BOOL)SendMessage(hwnd, MCIWNDM_CAN_SAVE, 0, 0); }
+BOOL MCIWndCanWindow(HWND hwnd)
+	{ return cast(BOOL)SendMessage(hwnd, MCIWNDM_CAN_WINDOW, 0, 0); }
+BOOL MCIWndCanEject(HWND hwnd)
+	{ return cast(BOOL)SendMessage(hwnd, MCIWNDM_CAN_EJECT, 0, 0); }
+BOOL MCIWndCanConfig(HWND hwnd)
+	{ return cast(BOOL)SendMessage(hwnd, MCIWNDM_CAN_CONFIG, 0, 0); }
+BOOL MCIWndPaletteKick(HWND hwnd)
+	{ return cast(BOOL)SendMessage(hwnd, MCIWNDM_PALETTEKICK, 0, 0); }
+LONG MCIWndSave(HWND hwnd, LPVOID szFile)
+	{ return cast(LONG)SendMessage(hwnd, MCI_SAVE, 0, cast(LPARAM)szFile); }
+LONG MCIWndSaveDialog(HWND hwnd)
+	{ return MCIWndSave(hwnd, cast(LPVOID)-1); }
+LONG MCIWndNew(HWND hwnd, LPVOID lp)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_NEW, 0, cast(LPARAM)lp); }
+LONG MCIWndRecord(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCI_RECORD, 0, 0); }
+LONG MCIWndOpen(HWND hwnd, LPVOID sz, UINT f)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_OPEN, cast(WPARAM)f, cast(LPARAM)sz); }
+LONG MCIWndOpenDialog(HWND hwnd)
+	{ return MCIWndOpen(hwnd, cast(LPVOID)-1, 0); }
+LONG MCIWndClose(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCI_CLOSE, 0, 0); }
+LONG MCIWndPlay(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCI_PLAY, 0, 0); }
+LONG MCIWndStop(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCI_STOP, 0, 0); }
+LONG MCIWndPause(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCI_PAUSE, 0, 0); }
+LONG MCIWndResume(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCI_RESUME, 0, 0); }
+LONG MCIWndSeek(HWND hwnd, LONG lPos)
+	{ return cast(LONG)SendMessage(hwnd, MCI_SEEK, 0, cast(LPARAM)lPos); }
+LONG MCIWndHome(HWND hwnd)
+	{ return MCIWndSeek(hwnd, MCIWND_START); }
+LONG MCIWndEnd(HWND hwnd)
+	{ return MCIWndSeek(hwnd, MCIWND_END); }
+LONG MCIWndEject(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_EJECT, 0, 0); }
+LONG MCIWndGetSource(HWND hwnd, LPRECT prc)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GET_SOURCE, 0, cast(LPARAM)prc); }
+LONG MCIWndPutSource(HWND hwnd, LPRECT prc)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_PUT_SOURCE, 0, cast(LPARAM)prc); }
+LONG MCIWndGetDest(HWND hwnd, LPRECT prc)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GET_DEST, 0, cast(LPARAM)prc); }
+LONG MCIWndPutDest(HWND hwnd, LPRECT prc)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_PUT_DEST, 0, cast(LPARAM)prc); }
+LONG MCIWndPlayReverse(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_PLAYREVERSE, 0, 0); }
+LONG MCIWndPlayFrom(HWND hwnd, LONG lPos)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_PLAYFROM, 0, cast(LPARAM)lPos); }
+LONG MCIWndPlayTo(HWND hwnd, LONG lPos)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_PLAYTO, 0, cast(LPARAM)lPos); }
+LONG MCIWndPlayFromTo(HWND hwnd, LONG lStart, LONG lEnd)
+	{ MCIWndSeek(hwnd, lStart); return MCIWndPlayTo(hwnd, lEnd); }
+UINT MCIWndGetDeviceID(HWND hwnd)
+	{ return cast(UINT)SendMessage(hwnd, MCIWNDM_GETDEVICEID, 0, 0); }
+UINT MCIWndGetAlias(HWND hwnd)
+	{ return cast(UINT)SendMessage(hwnd, MCIWNDM_GETALIAS, 0, 0); }
+LONG MCIWndGetMode(HWND hwnd, LPTSTR lp, UINT len)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GETMODE, cast(WPARAM)len, cast(LPARAM)lp); }
+LONG MCIWndGetPosition(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GETPOSITION, 0, 0); }
+LONG MCIWndGetPositionString(HWND hwnd, LPTSTR lp, UINT len)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GETPOSITION, cast(WPARAM)len, cast(LPARAM)lp); }
+LONG MCIWndGetStart(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GETSTART, 0, 0); }
+LONG MCIWndGetLength(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GETLENGTH, 0, 0); }
+LONG MCIWndGetEnd(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GETEND, 0, 0); }
+LONG MCIWndStep(HWND hwnd, LONG n)
+	{ return cast(LONG)SendMessage(hwnd, MCI_STEP, 0, cast(LPARAM)n); }
+void MCIWndDestroy(HWND hwnd)
+	{ SendMessage(hwnd, WM_CLOSE, 0, 0); }
+void MCIWndSetZoom(HWND hwnd, UINT iZoom)
+	{ SendMessage(hwnd, MCIWNDM_SETZOOM, 0, cast(LPARAM)iZoom); }
+UINT MCIWndGetZoom(HWND hwnd)
+	{ return cast(UINT)SendMessage(hwnd, MCIWNDM_GETZOOM, 0, 0); }
+LONG MCIWndSetVolume(HWND hwnd, UINT iVol)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_SETVOLUME, 0, cast(LPARAM)iVol); }
+LONG MCIWndGetVolume(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GETVOLUME, 0, 0); }
+LONG MCIWndSetSpeed(HWND hwnd, UINT iSpeed)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_SETSPEED, 0, cast(LPARAM)iSpeed); }
+LONG MCIWndGetSpeed(HWND hwnd)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GETSPEED, 0, 0); }
+LONG MCIWndSetTimeFormat(HWND hwnd, LPTSTR lp)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_SETTIMEFORMAT, 0, cast(LPARAM)lp); }
+LONG MCIWndUseFrames(HWND hwnd)
+	{ return MCIWndSetTimeFormat(hwnd, (cast(TCHAR[])"frames").ptr); }
+LONG MCIWndUseTime(HWND hwnd)
+	{ return MCIWndSetTimeFormat(hwnd, (cast(TCHAR[])"ms").ptr); }
+LONG MCIWndGetTimeFormat(HWND hwnd, LPTSTR lp, UINT len)
+	{ return cast(LONG)SendMessage(hwnd, MCIWNDM_GETTIMEFORMAT, cast(WPARAM)len, cast(LPARAM)lp); }
+void MCIWndValidateMedia(HWND hwnd)
+	{ SendMessage(hwnd, MCIWNDM_VALIDATEMEDIA, 0, 0); }
+void MCIWndSetRepeat(HWND hwnd, BOOL f)
+	{ SendMessage(hwnd, MCIWNDM_SETREPEAT, 0, cast(LPARAM)f); }
+BOOL MCIWndGetRepeat(HWND hwnd)
+	{ return cast(BOOL)SendMessage(hwnd, MCIWNDM_GETREPEAT, 0, 0); }
+void MCIWndSetActiveTimer(HWND hwnd, UINT active)
+	{ SendMessage(hwnd, MCIWNDM_SETACTIVETIMER, cast(WPARAM)active, 0); }
+void MCIWndSetInactiveTimer(HWND hwnd, UINT inactive)
+	{ SendMessage(hwnd, MCIWNDM_SETINACTIVETIMER, cast(WPARAM)inactive, 0); }
+void MCIWndSetTimers(HWND hwnd, UINT active, UINT inactive)
+	{ SendMessage(hwnd, MCIWNDM_SETTIMERS, cast(WPARAM)active, cast(LPARAM)inactive); }
+UINT MCIWndGetActiveTimer(HWND hwnd)
+	{ return cast(UINT)SendMessage(hwnd, MCIWNDM_GETACTIVETIMER, 0, 0); }
+UINT MCIWndGetInactiveTimer(HWND hwnd)
+	{ return cast(UINT)SendMessage(hwnd, MCIWNDM_GETINACTIVETIMER, 0, 0); }
+LONG MCIWndRealize(HWND hwnd, BOOL fBkgnd)
+	{ return SendMessage(hwnd, MCIWNDM_REALIZE, cast(WPARAM)fBkgnd, 0); }
+LONG MCIWndSendString(HWND hwnd, LPTSTR sz)
+	{ return SendMessage(hwnd, MCIWNDM_SENDSTRING, 0, cast(LPARAM)sz); }
+LONG MCIWndReturnString(HWND hwnd, LPVOID lp, UINT len)
+	{ return SendMessage(hwnd, MCIWNDM_RETURNSTRING, cast(WPARAM)len, cast(LPARAM)lp); }
+LONG MCIWndGetError(HWND hwnd, LPVOID lp, UINT len)
+	{ return SendMessage(hwnd, MCIWNDM_GETERROR, cast(WPARAM)len, cast(LPARAM)lp); }
+HPALETTE MCIWndGetPalette(HWND hwnd)
+	{ return cast(HPALETTE)SendMessage(hwnd, MCIWNDM_GETPALETTE, 0, 0); }
+LONG MCIWndSetPalette(HWND hwnd, HPALETTE hpal)
+	{ return SendMessage(hwnd, MCIWNDM_SETPALETTE, cast(WPARAM)hpal, 0); }
+LONG MCIWndGetFileName(HWND hwnd, LPVOID lp, UINT len)
+	{ return SendMessage(hwnd, MCIWNDM_GETFILENAME, cast(WPARAM)len, cast(LPARAM)lp); }
+LONG MCIWndGetDevice(HWND hwnd, LPVOID lp, UINT len)
+	{ return SendMessage(hwnd, MCIWNDM_GETDEVICE, cast(WPARAM)len, cast(LPARAM)lp); }
+UINT MCIWndGetStyles(HWND hwnd)
+	{ return SendMessage(hwnd, MCIWNDM_GETSTYLES, 0, 0); }
+LONG MCIWndChangeStyles(HWND hwnd, UINT mask, LONG value)
+	{ return SendMessage(hwnd, MCIWNDM_CHANGESTYLES, cast(WPARAM)mask, cast(LPARAM)value); }
+LONG MCIWndOpenInterface(HWND hwnd, LPUNKNOWN pUnk)
+	{ return SendMessage(hwnd, MCIWNDM_OPENINTERFACE, 0, cast(LPARAM)cast(void*)pUnk); }
+LONG MCIWndSetOwner(HWND hwnd, HWND hwndP)
+	{ return SendMessage(hwnd, MCIWNDM_SETOWNER, cast(WPARAM)hwndP, 0); }
+
+enum {
+	MCIWNDM_GETDEVICEID			= WM_USER + 100,
+	MCIWNDM_SENDSTRINGA			= WM_USER + 101,
+	MCIWNDM_GETPOSITIONA		= WM_USER + 102,
+	MCIWNDM_GETSTART			= WM_USER + 103,
+	MCIWNDM_GETLENGTH			= WM_USER + 104,
+	MCIWNDM_GETEND				= WM_USER + 105,
+	MCIWNDM_GETMODEA			= WM_USER + 106,
+	MCIWNDM_EJECT				= WM_USER + 107,
+	MCIWNDM_SETZOOM				= WM_USER + 108,
+	MCIWNDM_GETZOOM				= WM_USER + 109,
+	MCIWNDM_SETVOLUME			= WM_USER + 110,
+	MCIWNDM_GETVOLUME			= WM_USER + 111,
+	MCIWNDM_SETSPEED			= WM_USER + 112,
+	MCIWNDM_GETSPEED			= WM_USER + 113,
+	MCIWNDM_SETREPEAT			= WM_USER + 114,
+	MCIWNDM_GETREPEAT			= WM_USER + 115,
+	MCIWNDM_REALIZE				= WM_USER + 118,
+	MCIWNDM_SETTIMEFORMATA		= WM_USER + 119,
+	MCIWNDM_GETTIMEFORMATA		= WM_USER + 120,
+	MCIWNDM_VALIDATEMEDIA		= WM_USER + 121,
+	MCIWNDM_PLAYFROM			= WM_USER + 122,
+	MCIWNDM_PLAYTO				= WM_USER + 123,
+	MCIWNDM_GETFILENAMEA		= WM_USER + 124,
+	MCIWNDM_GETDEVICEA			= WM_USER + 125,
+	MCIWNDM_GETPALETTE			= WM_USER + 126,
+	MCIWNDM_SETPALETTE			= WM_USER + 127,
+	MCIWNDM_GETERRORA			= WM_USER + 128,
+	MCIWNDM_SETTIMERS			= WM_USER + 129,
+	MCIWNDM_SETACTIVETIMER		= WM_USER + 130,
+	MCIWNDM_SETINACTIVETIMER	= WM_USER + 131,
+	MCIWNDM_GETACTIVETIMER		= WM_USER + 132,
+	MCIWNDM_GETINACTIVETIMER	= WM_USER + 133,
+	MCIWNDM_NEWA				= WM_USER + 134,
+	MCIWNDM_CHANGESTYLES		= WM_USER + 135,
+	MCIWNDM_GETSTYLES			= WM_USER + 136,
+	MCIWNDM_GETALIAS			= WM_USER + 137,
+	MCIWNDM_RETURNSTRINGA		= WM_USER + 138,
+	MCIWNDM_PLAYREVERSE			= WM_USER + 139,
+	MCIWNDM_GET_SOURCE			= WM_USER + 140,
+	MCIWNDM_PUT_SOURCE			= WM_USER + 141,
+	MCIWNDM_GET_DEST			= WM_USER + 142,
+	MCIWNDM_PUT_DEST			= WM_USER + 143,
+	MCIWNDM_CAN_PLAY			= WM_USER + 144,
+	MCIWNDM_CAN_WINDOW			= WM_USER + 145,
+	MCIWNDM_CAN_RECORD			= WM_USER + 146,
+	MCIWNDM_CAN_SAVE			= WM_USER + 147,
+	MCIWNDM_CAN_EJECT			= WM_USER + 148,
+	MCIWNDM_CAN_CONFIG			= WM_USER + 149,
+	MCIWNDM_PALETTEKICK			= WM_USER + 150,
+	MCIWNDM_OPENINTERFACE		= WM_USER + 151,
+	MCIWNDM_SETOWNER			= WM_USER + 152,
+	MCIWNDM_OPENA				= WM_USER + 153,
+	MCIWNDM_SENDSTRINGW			= WM_USER + 201,
+	MCIWNDM_GETPOSITIONW		= WM_USER + 202,
+	MCIWNDM_GETMODEW			= WM_USER + 206,
+	MCIWNDM_SETTIMEFORMATW		= WM_USER + 219,
+	MCIWNDM_GETTIMEFORMATW		= WM_USER + 220,
+	MCIWNDM_GETFILENAMEW		= WM_USER + 224,
+	MCIWNDM_GETDEVICEW			= WM_USER + 225,
+	MCIWNDM_GETERRORW			= WM_USER + 228,
+	MCIWNDM_NEWW				= WM_USER + 234,
+	MCIWNDM_RETURNSTRINGW		= WM_USER + 238,
+	MCIWNDM_OPENW				= WM_USER + 252,
+}
+
+version(Unicode) {
+	alias MCIWNDM_SENDSTRINGW		MCIWNDM_SENDSTRING;
+	alias MCIWNDM_GETPOSITIONW		MCIWNDM_GETPOSITION;
+	alias MCIWNDM_GETMODEW			MCIWNDM_GETMODE;
+	alias MCIWNDM_SETTIMEFORMATW	MCIWNDM_SETTIMEFORMAT;
+	alias MCIWNDM_GETTIMEFORMATW	MCIWNDM_GETTIMEFORMAT;
+	alias MCIWNDM_GETFILENAMEW		MCIWNDM_GETFILENAME;
+	alias MCIWNDM_GETDEVICEW		MCIWNDM_GETDEVICE;
+	alias MCIWNDM_GETERRORW			MCIWNDM_GETERROR;
+	alias MCIWNDM_NEWW				MCIWNDM_NEW;
+	alias MCIWNDM_RETURNSTRINGW		MCIWNDM_RETURNSTRING;
+	alias MCIWNDM_OPENW				MCIWNDM_OPEN;
+} else { // Unicode
+	alias MCIWNDM_SENDSTRINGA		MCIWNDM_SENDSTRING;
+	alias MCIWNDM_GETPOSITIONA		MCIWNDM_GETPOSITION;
+	alias MCIWNDM_GETMODEA			MCIWNDM_GETMODE;
+	alias MCIWNDM_SETTIMEFORMATA	MCIWNDM_SETTIMEFORMAT;
+	alias MCIWNDM_GETTIMEFORMATA	MCIWNDM_GETTIMEFORMAT;
+	alias MCIWNDM_GETFILENAMEA		MCIWNDM_GETFILENAME;
+	alias MCIWNDM_GETDEVICEA		MCIWNDM_GETDEVICE;
+	alias MCIWNDM_GETERRORA			MCIWNDM_GETERROR;
+	alias MCIWNDM_NEWA				MCIWNDM_NEW;
+	alias MCIWNDM_RETURNSTRINGA		MCIWNDM_RETURNSTRING;
+	alias MCIWNDM_OPENA				MCIWNDM_OPEN;
+}
+
+enum {
+	MCIWNDM_NOTIFYMODE	= WM_USER + 200,
+	MCIWNDM_NOTIFYPOS	= WM_USER + 201,
+	MCIWNDM_NOTIFYSIZE	= WM_USER + 202,
+	MCIWNDM_NOTIFYMEDIA	= WM_USER + 203,
+	MCIWNDM_NOTIFYERROR	= WM_USER + 205,
+}
+
+const MCIWND_START	= -1;
+const MCIWND_END	= -2;
+
+enum {
+	MCI_CLOSE	= 0x0804,
+	MCI_PLAY	= 0x0806,
+	MCI_SEEK	= 0x0807,
+	MCI_STOP	= 0x0808,
+	MCI_PAUSE	= 0x0809,
+	MCI_STEP	= 0x080E,
+	MCI_RECORD	= 0x080F,
+	MCI_SAVE	= 0x0813,
+	MCI_CUT		= 0x0851,
+	MCI_COPY	= 0x0852,
+	MCI_PASTE	= 0x0853,
+	MCI_RESUME	= 0x0855,
+	MCI_DELETE	= 0x0856,
+}
+
+enum {
+	MCI_MODE_NOT_READY	= 524,
+	MCI_MODE_STOP,
+	MCI_MODE_PLAY,
+	MCI_MODE_RECORD,
+	MCI_MODE_SEEK,
+	MCI_MODE_PAUSE,
+	MCI_MODE_OPEN,
+}
+
+typedef HANDLE HVIDEO;
+alias HVIDEO* LPHVIDEO;
+
+// Error Return Values
+
+enum {
+	DV_ERR_OK				= 0,
+	DV_ERR_BASE				= 1,
+	DV_ERR_NONSPECIFIC		= DV_ERR_BASE,
+	DV_ERR_BADFORMAT		= DV_ERR_BASE + 1,
+	DV_ERR_STILLPLAYING		= DV_ERR_BASE + 2,
+	DV_ERR_UNPREPARED		= DV_ERR_BASE + 3,
+	DV_ERR_SYNC				= DV_ERR_BASE + 4,
+	DV_ERR_TOOMANYCHANNELS	= DV_ERR_BASE + 5,
+	DV_ERR_NOTDETECTED		= DV_ERR_BASE + 6,
+	DV_ERR_BADINSTALL		= DV_ERR_BASE + 7,
+	DV_ERR_CREATEPALETTE	= DV_ERR_BASE + 8,
+	DV_ERR_SIZEFIELD		= DV_ERR_BASE + 9,
+	DV_ERR_PARAM1			= DV_ERR_BASE + 10,
+	DV_ERR_PARAM2			= DV_ERR_BASE + 11,
+	DV_ERR_CONFIG1			= DV_ERR_BASE + 12,
+	DV_ERR_CONFIG2			= DV_ERR_BASE + 13,
+	DV_ERR_FLAGS			= DV_ERR_BASE + 14,
+	DV_ERR_13				= DV_ERR_BASE + 15,
+	DV_ERR_NOTSUPPORTED		= DV_ERR_BASE + 16,
+	DV_ERR_NOMEM			= DV_ERR_BASE + 17,
+	DV_ERR_ALLOCATED		= DV_ERR_BASE + 18,
+	DV_ERR_BADDEVICEID		= DV_ERR_BASE + 19,
+	DV_ERR_INVALHANDLE		= DV_ERR_BASE + 20,
+	DV_ERR_BADERRNUM		= DV_ERR_BASE + 21,
+	DV_ERR_NO_BUFFERS		= DV_ERR_BASE + 22,
+	DV_ERR_MEM_CONFLICT		= DV_ERR_BASE + 23,
+	DV_ERR_IO_CONFLICT		= DV_ERR_BASE + 24,
+	DV_ERR_DMA_CONFLICT		= DV_ERR_BASE + 25,
+	DV_ERR_INT_CONFLICT		= DV_ERR_BASE + 26,
+	DV_ERR_PROTECT_ONLY		= DV_ERR_BASE + 27,
+	DV_ERR_LASTERROR		= DV_ERR_BASE + 27,
+	DV_ERR_USER_MSG			= DV_ERR_BASE + 1000,
+}
+
+// Callback Messages
+
+enum {
+	MM_DRVM_OPEN	= 0x3D0,
+	MM_DRVM_CLOSE,
+	MM_DRVM_DATA,
+	MM_DRVM_ERROR,
+}
+
+enum {
+	DV_VM_OPEN	= MM_DRVM_OPEN,
+	DV_VM_CLOSE	= MM_DRVM_CLOSE,
+	DV_VM_DATA	= MM_DRVM_DATA,
+	DV_VM_ERROR	= MM_DRVM_ERROR,
+}
+
+/**
+ * Structures
+ */
+
+struct VIDEOHDR {
+	LPBYTE		lpData;
+	DWORD		dwBufferLength;
+	DWORD		dwBytesUsed;
+	DWORD		dwTimeCaptured;
+	DWORD_PTR	dwUser;
+	DWORD		dwFlags;
+    DWORD_PTR   dwReserved[4];
+}
+alias VIDEOHDR* PVIDEOHDR, LPVIDEOHDR;
+
+enum {
+	VHDR_DONE		= 0x00000001,
+	VHDR_PREPARED	= 0x00000002,
+	VHDR_INQUEUE	= 0x00000004,
+	VHDR_KEYFRAME	= 0x00000008,
+	VHDR_VALID		= 0x0000000F,
+}
+
+struct CHANNEL_CAPS {
+	DWORD	dwFlags;
+	DWORD	dwSrcRectXMod;
+	DWORD	dwSrcRectYMod;
+	DWORD	dwSrcRectWidthMod;
+	DWORD	dwSrcRectHeightMod;
+	DWORD	dwDstRectXMod;
+	DWORD	dwDstRectYMod;
+	DWORD	dwDstRectWidthMod;
+	DWORD	dwDstRectHeightMod;
+}
+alias CHANNEL_CAPS* PCHANNEL_CAPS, LPCHANNEL_CAPS;
+
+enum {
+	VCAPS_OVERLAY		= 0x00000001,
+	VCAPS_SRC_CAN_CLIP	= 0x00000002,
+	VCAPS_DST_CAN_CLIP	= 0x00000004,
+	VCAPS_CAN_SCALE		= 0x00000008,
+}
+
+/**
+ * API Flags
+ */
+
+enum {
+	VIDEO_EXTERNALIN			= 0x0001,
+	VIDEO_EXTERNALOUT			= 0x0002,
+	VIDEO_IN					= 0x0004,
+	VIDEO_OUT					= 0x0008,
+	VIDEO_DLG_QUERY				= 0x0010,
+}
+
+enum {
+	VIDEO_CONFIGURE_QUERYSIZE	= 0x0001,
+	VIDEO_CONFIGURE_CURRENT		= 0x0010,
+	VIDEO_CONFIGURE_NOMINAL		= 0x0020,
+	VIDEO_CONFIGURE_MIN			= 0x0040,
+	VIDEO_CONFIGURE_MAX			= 0x0080,
+	VIDEO_CONFIGURE_SET			= 0x1000,
+	VIDEO_CONFIGURE_GET			= 0x2000,
+	VIDEO_CONFIGURE_QUERY		= 0x8000,
+}
+
+/**
+ * CONFIGURE MESSAGES
+ */
+
+enum {
+	DVM_USER			= 0x4000,
+	DVM_CONFIGURE_START	= 0x1000,
+	DVM_CONFIGURE_END	= 0x1FFF,
+	DVM_PALETTE			= DVM_CONFIGURE_START + 1,
+	DVM_FORMAT			= DVM_CONFIGURE_START + 2,
+	DVM_PALETTERGB555	= DVM_CONFIGURE_START + 3,
+	DVM_SRC_RECT		= DVM_CONFIGURE_START + 4,
+	DVM_DST_RECT		= DVM_CONFIGURE_START + 5,
+}
+
+/**
+ * AVICap window class
+ */
+
+LRESULT AVICapSM(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
+	if (IsWindow(hWnd)) {
+		return SendMessage(hWnd, msg, wParam, lParam);
+	}
+	return 0;
+}
+
+enum {
+	WM_CAP_START				= WM_USER,
+	WM_CAP_UNICODE_START		= WM_USER + 100,
+
+	WM_CAP_GET_CAPSTREAMPTR		= WM_CAP_START + 1,
+	WM_CAP_SET_CALLBACK_ERRORA	= WM_CAP_START + 2,
+	WM_CAP_SET_CALLBACK_STATUSA	= WM_CAP_START + 3,
+
+	WM_CAP_SET_CALLBACK_ERRORW	= WM_CAP_UNICODE_START + 2,
+	WM_CAP_SET_CALLBACK_STATUSW	= WM_CAP_UNICODE_START + 3,
+}
+
+version(Unicode) {
+	alias WM_CAP_SET_CALLBACK_ERRORW	WM_CAP_SET_CALLBACK_ERROR;
+	alias WM_CAP_SET_CALLBACK_STATUSW	WM_CAP_SET_CALLBACK_STATUS;
+} else { // Unicode
+	alias WM_CAP_SET_CALLBACK_ERRORA	WM_CAP_SET_CALLBACK_ERROR;
+	alias WM_CAP_SET_CALLBACK_STATUSA	WM_CAP_SET_CALLBACK_STATUS;
+}
+
+enum {
+	WM_CAP_SET_CALLBACK_YIELD		= WM_CAP_START + 4,
+	WM_CAP_SET_CALLBACK_FRAME		= WM_CAP_START + 5,
+	WM_CAP_SET_CALLBACK_VIDEOSTREAM	= WM_CAP_START + 6,
+	WM_CAP_SET_CALLBACK_WAVESTREAM	= WM_CAP_START + 7,
+	WM_CAP_GET_USER_DATA			= WM_CAP_START + 8,
+	WM_CAP_SET_USER_DATA			= WM_CAP_START + 9,
+	WM_CAP_DRIVER_CONNECT			= WM_CAP_START + 10,
+	WM_CAP_DRIVER_DISCONNECT		= WM_CAP_START + 11,
+	WM_CAP_DRIVER_GET_NAMEA			= WM_CAP_START + 12,
+	WM_CAP_DRIVER_GET_VERSIONA		= WM_CAP_START + 13,
+
+	WM_CAP_DRIVER_GET_NAMEW			= WM_CAP_UNICODE_START + 12,
+	WM_CAP_DRIVER_GET_VERSIONW		= WM_CAP_UNICODE_START + 13,
+}
+
+version(Unicode) {
+	alias WM_CAP_DRIVER_GET_NAMEW		WM_CAP_DRIVER_GET_NAME;
+	alias WM_CAP_DRIVER_GET_VERSIONW	WM_CAP_DRIVER_GET_VERSION;
+} else { // Unicode
+	alias WM_CAP_DRIVER_GET_NAMEA		WM_CAP_DRIVER_GET_NAME;
+	alias WM_CAP_DRIVER_GET_VERSIONA	WM_CAP_DRIVER_GET_VERSION;
+}
+
+enum {
+	WM_CAP_DRIVER_GET_CAPS			= WM_CAP_START + 14,
+	WM_CAP_FILE_SET_CAPTURE_FILEA	= WM_CAP_START + 20,
+	WM_CAP_FILE_GET_CAPTURE_FILEA	= WM_CAP_START + 21,
+	WM_CAP_FILE_SAVEASA				= WM_CAP_START + 23,
+	WM_CAP_FILE_SAVEDIBA			= WM_CAP_START + 25,
+
+	WM_CAP_FILE_SET_CAPTURE_FILEW	= WM_CAP_UNICODE_START + 20,
+	WM_CAP_FILE_GET_CAPTURE_FILEW	= WM_CAP_UNICODE_START + 21,
+	WM_CAP_FILE_SAVEASW				= WM_CAP_UNICODE_START + 23,
+	WM_CAP_FILE_SAVEDIBW			= WM_CAP_UNICODE_START + 25,
+}
+
+version(Unicode) {
+	alias WM_CAP_FILE_SET_CAPTURE_FILEW	WM_CAP_FILE_SET_CAPTURE_FILE;
+	alias WM_CAP_FILE_GET_CAPTURE_FILEW	WM_CAP_FILE_GET_CAPTURE_FILE;
+	alias WM_CAP_FILE_SAVEASW			WM_CAP_FILE_SAVEAS;
+	alias WM_CAP_FILE_SAVEDIBW			WM_CAP_FILE_SAVEDIB;
+} else { // Unicode
+	alias WM_CAP_FILE_SET_CAPTURE_FILEA	WM_CAP_FILE_SET_CAPTURE_FILE;
+	alias WM_CAP_FILE_GET_CAPTURE_FILEA	WM_CAP_FILE_GET_CAPTURE_FILE;
+	alias WM_CAP_FILE_SAVEASA			WM_CAP_FILE_SAVEAS;
+	alias WM_CAP_FILE_SAVEDIBA			WM_CAP_FILE_SAVEDIB;
+}
+
+enum {
+	WM_CAP_FILE_ALLOCATE		= WM_CAP_START + 22,
+	WM_CAP_FILE_SET_INFOCHUNK	= WM_CAP_START + 24,
+	WM_CAP_EDIT_COPY			= WM_CAP_START + 30,
+	WM_CAP_SET_AUDIOFORMAT		= WM_CAP_START + 35,
+	WM_CAP_GET_AUDIOFORMAT		= WM_CAP_START + 36,
+	WM_CAP_DLG_VIDEOFORMAT		= WM_CAP_START + 41,
+	WM_CAP_DLG_VIDEOSOURCE		= WM_CAP_START + 42,
+	WM_CAP_DLG_VIDEODISPLAY		= WM_CAP_START + 43,
+	WM_CAP_GET_VIDEOFORMAT		= WM_CAP_START + 44,
+	WM_CAP_SET_VIDEOFORMAT		= WM_CAP_START + 45,
+	WM_CAP_DLG_VIDEOCOMPRESSION	= WM_CAP_START + 46,
+	WM_CAP_SET_PREVIEW			= WM_CAP_START + 50,
+	WM_CAP_SET_OVERLAY			= WM_CAP_START + 51,
+	WM_CAP_SET_PREVIEWRATE		= WM_CAP_START + 52,
+	WM_CAP_SET_SCALE			= WM_CAP_START + 53,
+	WM_CAP_GET_STATUS			= WM_CAP_START + 54,
+	WM_CAP_SET_SCROLL			= WM_CAP_START + 55,
+	WM_CAP_GRAB_FRAME			= WM_CAP_START + 60,
+	WM_CAP_GRAB_FRAME_NOSTOP	= WM_CAP_START + 61,
+	WM_CAP_SEQUENCE				= WM_CAP_START + 62,
+	WM_CAP_SEQUENCE_NOFILE		= WM_CAP_START + 63,
+	WM_CAP_SET_SEQUENCE_SETUP	= WM_CAP_START + 64,
+	WM_CAP_GET_SEQUENCE_SETUP	= WM_CAP_START + 65,
+	WM_CAP_SET_MCI_DEVICEA		= WM_CAP_START + 66,
+	WM_CAP_GET_MCI_DEVICEA		= WM_CAP_START + 67,
+
+	WM_CAP_SET_MCI_DEVICEW		= WM_CAP_UNICODE_START + 66,
+	WM_CAP_GET_MCI_DEVICEW		= WM_CAP_UNICODE_START + 67,
+}
+
+version(Unicode) {
+	alias WM_CAP_SET_MCI_DEVICEW	WM_CAP_SET_MCI_DEVICE;
+	alias WM_CAP_GET_MCI_DEVICEW	WM_CAP_GET_MCI_DEVICE;
+} else { // Unicode
+	alias WM_CAP_SET_MCI_DEVICEA	WM_CAP_SET_MCI_DEVICE;
+	alias WM_CAP_GET_MCI_DEVICEA	WM_CAP_GET_MCI_DEVICE;
+}
+
+enum {
+	WM_CAP_STOP					= WM_CAP_START + 68,
+	WM_CAP_ABORT				= WM_CAP_START + 69,
+	WM_CAP_SINGLE_FRAME_OPEN	= WM_CAP_START + 70,
+	WM_CAP_SINGLE_FRAME_CLOSE	= WM_CAP_START + 71,
+	WM_CAP_SINGLE_FRAME			= WM_CAP_START + 72,
+	WM_CAP_PAL_OPENA			= WM_CAP_START + 80,
+	WM_CAP_PAL_SAVEA			= WM_CAP_START + 81,
+
+	WM_CAP_PAL_OPENW			= WM_CAP_UNICODE_START + 80,
+	WM_CAP_PAL_SAVEW			= WM_CAP_UNICODE_START + 81,
+}
+
+version(Unicode) {
+	alias WM_CAP_PAL_OPENW	WM_CAP_PAL_OPEN;
+	alias WM_CAP_PAL_SAVEW	WM_CAP_PAL_SAVE;
+} else { // Unicode
+	alias WM_CAP_PAL_OPENA	WM_CAP_PAL_OPEN;
+	alias WM_CAP_PAL_SAVEA	WM_CAP_PAL_SAVE;
+}
+
+enum {
+	WM_CAP_PAL_PASTE				= WM_CAP_START + 82,
+	WM_CAP_PAL_AUTOCREATE			= WM_CAP_START + 83,
+	WM_CAP_PAL_MANUALCREATE			= WM_CAP_START + 84,
+	WM_CAP_SET_CALLBACK_CAPCONTROL	= WM_CAP_START + 85,
+	WM_CAP_UNICODE_END				= WM_CAP_PAL_SAVEW,
+	WM_CAP_END						= WM_CAP_UNICODE_END,
+}
+
+/**
+ * message wrapper
+ */
+
+BOOL capSetCallbackOnError(HWND hWnd, LPVOID fpProc)				{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_ERROR, 0, cast(LPARAM)fpProc); }
+BOOL capSetCallbackOnStatus(HWND hWnd, LPVOID fpProc)				{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_STATUS, 0, cast(LPARAM)fpProc); }
+BOOL capSetCallbackOnYield(HWND hWnd, LPVOID fpProc)				{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_YIELD, 0, cast(LPARAM)fpProc); }
+BOOL capSetCallbackOnFrame(HWND hWnd, LPVOID fpProc)				{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_FRAME, 0, cast(LPARAM)fpProc); }
+BOOL capSetCallbackOnVideoStream(HWND hWnd, LPVOID fpProc)			{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, cast(LPARAM)fpProc); }
+BOOL capSetCallbackOnWaveStream(HWND hWnd, LPVOID fpProc)			{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_WAVESTREAM, 0, cast(LPARAM)fpProc); }
+BOOL capSetCallbackOnCapControl(HWND hWnd, LPVOID fpProc)			{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_CALLBACK_CAPCONTROL, 0, cast(LPARAM)fpProc); }
+
+BOOL capSetUserData(HWND hWnd, LPARAM lUser)						{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_USER_DATA, 0, lUser); }
+BOOL capGetUserData(HWND hWnd)										{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_GET_USER_DATA, 0, 0); }
+
+BOOL capDriverConnect(HWND hWnd, WPARAM i)							{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_DRIVER_CONNECT, i, 0); }
+BOOL capDriverDisconnect(HWND hWnd)									{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_DRIVER_DISCONNECT, 0, 0); }
+BOOL capDriverGetName(HWND hWnd, LPTSTR szName, WPARAM wSize)		{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_DRIVER_GET_NAME, wSize, cast(LPARAM)szName); }
+BOOL capDriverGetVersion(HWND hWnd, LPTSTR szVer, WPARAM wSize)		{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_DRIVER_GET_VERSION, wSize, cast(LPARAM)szVer); }
+BOOL capDriverGetCaps(HWND hWnd, LPCAPDRIVERCAPS s, WPARAM wSize)	{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_DRIVER_GET_CAPS, wSize, cast(LPARAM)s); }
+
+BOOL capFileSetCaptureFile(HWND hWnd, LPTSTR szName)				{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_SET_CAPTURE_FILE, 0, cast(LPARAM)szName); }
+BOOL capFileGetCaptureFile(HWND hWnd, LPTSTR szName, WPARAM wSize)	{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_GET_CAPTURE_FILE, wSize, cast(LPARAM)szName); }
+BOOL capFileAlloc(HWND hWnd, WPARAM wSize)							{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_ALLOCATE, wSize, 0); }
+BOOL capFileSaveAs(HWND hWnd, LPTSTR szName)						{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_SAVEAS, 0, cast(LPARAM)szName); }
+BOOL capFileSetInfoChunk(HWND hWnd, LPCAPINFOCHUNK lpInfoChunk)		{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_SET_INFOCHUNK, 0, cast(LPARAM)lpInfoChunk); }
+BOOL capFileSaveDIB(HWND hWnd, LPTSTR szName)						{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_FILE_SAVEDIB, 0, cast(LPARAM)szName); }
+
+BOOL capEditCopy(HWND hWnd)											{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_EDIT_COPY, 0, 0); }
+
+BOOL capSetAudioFormat(HWND hWnd, LPWAVEFORMATEX s, WPARAM wSize)	{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_AUDIOFORMAT, wSize, cast(LPARAM)s); }
+DWORD capGetAudioFormat(HWND hWnd, LPWAVEFORMATEX s, WPARAM wSize)	{ return cast(DWORD)AVICapSM(hWnd, WM_CAP_GET_AUDIOFORMAT, wSize, cast(LPARAM)s); }
+DWORD capGetAudioFormatSize(HWND hWnd)								{ return cast(DWORD)AVICapSM(hWnd, WM_CAP_GET_AUDIOFORMAT, 0, 0); }
+
+BOOL capDlgVideoFormat(HWND hWnd)									{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_DLG_VIDEOFORMAT, 0, 0); }
+BOOL capDlgVideoSource(HWND hWnd)									{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_DLG_VIDEOSOURCE, 0, 0); }
+BOOL capDlgVideoDisplay(HWND hWnd)									{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_DLG_VIDEODISPLAY, 0, 0); }
+BOOL capDlgVideoCompression(HWND hWnd)								{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_DLG_VIDEOCOMPRESSION, 0, 0); }
+
+DWORD capGetVideoFormat(HWND hWnd, void* s, WPARAM wSize)			{ return cast(DWORD)AVICapSM(hWnd, WM_CAP_GET_VIDEOFORMAT, wSize, cast(LPARAM)s); }
+DWORD capGetVideoFormatSize(HWND hWnd)								{ return cast(DWORD)AVICapSM(hWnd, WM_CAP_GET_VIDEOFORMAT, 0, 0); }
+BOOL capSetVideoFormat(HWND hWnd, void* s, WPARAM wSize)			{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_VIDEOFORMAT, wSize, cast(LPARAM)s); }
+
+BOOL capPreview(HWND hWnd, BOOL f)									{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_PREVIEW, cast(WPARAM)f, 0); }
+BOOL capPreviewRate(HWND hWnd, WPARAM wMS)							{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_PREVIEWRATE, wMS, 0); }
+BOOL capOverlay(HWND hWnd, BOOL f)									{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_OVERLAY, cast(WPARAM)f, 0); }
+BOOL capPreviewScale(HWND hWnd, BOOL f)								{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_SCALE, cast(WPARAM)f, 0); }
+BOOL capGetStatus(HWND hWnd, LPCAPSTATUS s, WPARAM wSize)			{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_GET_STATUS, wSize, cast(LPARAM)s); }
+BOOL capSetScrollPos(HWND hWnd, LPPOINT lpP)						{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_SCROLL, 0, cast(LPARAM)lpP); }
+
+BOOL capGrabFrame(HWND hWnd)										{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_GRAB_FRAME, 0, 0); }
+BOOL capGrabFrameNoStop(HWND hWnd)									{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_GRAB_FRAME_NOSTOP, 0, 0); }
+
+BOOL capCaptureSequence(HWND hWnd)									{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SEQUENCE, 0, 0); }
+BOOL capCaptureSequenceNoFile(HWND hWnd)							{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SEQUENCE_NOFILE, 0, 0); }
+BOOL capCaptureStop(HWND hWnd)										{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_STOP, 0, 0); }
+BOOL capCaptureAbort(HWND hWnd)										{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_ABORT, 0, 0); }
+
+BOOL capCaptureSingleFrameOpen(HWND hWnd)							{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SINGLE_FRAME_OPEN, 0, 0); }
+BOOL capCaptureSingleFrameClose(HWND hWnd)							{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SINGLE_FRAME_CLOSE, 0, 0); }
+BOOL capCaptureSingleFrame(HWND hWnd)								{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SINGLE_FRAME, 0, 0); }
+
+BOOL capCaptureGetSetup(HWND hWnd, LPCAPTUREPARMS s, WPARAM wSize)	{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_GET_SEQUENCE_SETUP, wSize, cast(LPARAM)s); }
+BOOL capCaptureSetSetup(HWND hWnd, LPCAPTUREPARMS s, WPARAM wSize)	{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_SEQUENCE_SETUP, wSize, cast(LPARAM)s); }
+
+BOOL capSetMCIDeviceName(HWND hWnd, LPTSTR szName)					{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_SET_MCI_DEVICE, 0, cast(LPARAM)szName); }
+BOOL capGetMCIDeviceName(HWND hWnd, LPTSTR szName, WPARAM wSize)	{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_GET_MCI_DEVICE, wSize, cast(LPARAM)szName); }
+
+BOOL capPaletteOpen(HWND hWnd, LPTSTR szName)						{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_PAL_OPEN, 0, cast(LPARAM)szName); }
+BOOL capPaletteSave(HWND hWnd, LPTSTR szName)						{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_PAL_SAVE, 0, cast(LPARAM)szName); }
+BOOL capPalettePaste(HWND hWnd)										{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_PAL_PASTE, 0, 0); }
+BOOL capPaletteAuto(HWND hWnd, WPARAM iFrames, LPARAM iColors)		{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_PAL_AUTOCREATE, iFrames, iColors); }
+BOOL capPaletteManual(HWND hWnd, WPARAM fGrab, LPARAM iColors)		{ return cast(BOOL)AVICapSM(hWnd, WM_CAP_PAL_MANUALCREATE, fGrab, iColors); }
+
+/**
+ * structs
+ */
+
+struct CAPDRIVERCAPS {
+	UINT	wDeviceIndex;
+	BOOL	fHasOverlay;
+	BOOL	fHasDlgVideoSource;
+	BOOL	fHasDlgVideoFormat;
+	BOOL	fHasDlgVideoDisplay;
+	BOOL	fCaptureInitialized;
+	BOOL	fDriverSuppliesPalettes;
+	HANDLE	hVideoIn;
+	HANDLE	hVideoOut;
+	HANDLE	hVideoExtIn;
+	HANDLE	hVideoExtOut;
+}
+alias CAPDRIVERCAPS* PCAPDRIVERCAPS, LPCAPDRIVERCAPS;
+
+struct CAPSTATUS {
+	UINT		uiImageWidth;
+	UINT		uiImageHeight;
+	BOOL		fLiveWindow;
+	BOOL		fOverlayWindow;
+	BOOL		fScale;
+	POINT		ptScroll;
+	BOOL		fUsingDefaultPalette;
+	BOOL		fAudioHardware;
+	BOOL		fCapFileExists;
+	DWORD		dwCurrentVideoFrame;
+	DWORD		dwCurrentVideoFramesDropped;
+	DWORD		dwCurrentWaveSamples;
+	DWORD		dwCurrentTimeElapsedMS;
+	HPALETTE	hPalCurrent;
+	BOOL		fCapturingNow;
+	DWORD		dwReturn;
+	UINT		wNumVideoAllocated;
+	UINT		wNumAudioAllocated;
+}
+alias CAPSTATUS* PCAPSTATUS, LPCAPSTATUS;
+
+struct CAPTUREPARMS {
+	DWORD	dwRequestMicroSecPerFrame;
+	BOOL	fMakeUserHitOKToCapture;
+	UINT	wPercentDropForError;
+	BOOL	fYield;
+	DWORD	dwIndexSize;
+	UINT	wChunkGranularity;
+	BOOL	fUsingDOSMemory;
+	UINT	wNumVideoRequested;
+	BOOL	fCaptureAudio;
+	UINT	wNumAudioRequested;
+	UINT	vKeyAbort;
+	BOOL	fAbortLeftMouse;
+	BOOL	fAbortRightMouse;
+	BOOL	fLimitEnabled;
+	UINT	wTimeLimit;
+	BOOL	fMCIControl;
+	BOOL	fStepMCIDevice;
+	DWORD	dwMCIStartTime;
+	DWORD	dwMCIStopTime;
+	BOOL	fStepCaptureAt2x;
+	UINT	wStepCaptureAverageFrames;
+	DWORD	dwAudioBufferSize;
+	BOOL	fDisableWriteCache;
+	UINT	AVStreamMaster;
+}
+alias CAPTUREPARMS* PCAPTUREPARMS, LPCAPTUREPARMS;
+
+const AVSTREAMMASTER_AUDIO = 0;
+const AVSTREAMMASTER_NONE  = 1;
+
+struct CAPINFOCHUNK {
+	FOURCC	fccInfoID;
+	LPVOID	lpData;
+	LONG	cbData;
+}
+alias CAPINFOCHUNK* PCAPINFOCHUNK, LPCAPINFOCHUNK;
+
+// Callback Definitions
+
+extern (Windows) {
+	alias LRESULT function(HWND hWnd) CAPYIELDCALLBACK;
+	alias LRESULT function(HWND hWnd, int nID, LPCWSTR lpsz) CAPSTATUSCALLBACKW;
+	alias LRESULT function(HWND hWnd, int nID, LPCWSTR lpsz) CAPERRORCALLBACKW;
+	alias LRESULT function(HWND hWnd, int nID, LPCSTR lpsz) CAPSTATUSCALLBACKA;
+	alias LRESULT function(HWND hWnd, int nID, LPCSTR lpsz) CAPERRORCALLBACKA;
+}
+
+version(Unicode) {
+	alias CAPSTATUSCALLBACKW	CAPSTATUSCALLBACK;
+	alias CAPERRORCALLBACKW		CAPERRORCALLBACK;
+} else { // Unicode
+	alias CAPSTATUSCALLBACKA	CAPSTATUSCALLBACK;
+	alias CAPERRORCALLBACKA		CAPERRORCALLBACK;
+}
+
+extern (Windows) {
+	alias LRESULT function(HWND hWnd, LPVIDEOHDR lpVHdr) CAPVIDEOCALLBACK;
+	alias LRESULT function(HWND hWnd, LPWAVEHDR lpWHdr) CAPWAVECALLBACK;
+	alias LRESULT function(HWND hWnd, int nState) CAPCONTROLCALLBACK;
+}
+
+//  CapControlCallback states
+const CONTROLCALLBACK_PREROLL	= 1;
+const CONTROLCALLBACK_CAPTURING	= 2;
+
+extern (Windows) {
+	HWND capCreateCaptureWindowA(LPCSTR lpszWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hwndParent, int nID);
+	BOOL capGetDriverDescriptionA(UINT wDriverIndex, LPSTR lpszName, int cbName, LPSTR lpszVer, int cbVer);
+	HWND capCreateCaptureWindowW(LPCWSTR lpszWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hwndParent, int nID);
+	BOOL capGetDriverDescriptionW(UINT wDriverIndex, LPWSTR lpszName, int cbName, LPWSTR lpszVer, int cbVer);
+}
+
+version(Unicode) {
+	alias capCreateCaptureWindowW	capCreateCaptureWindow;
+	alias capGetDriverDescriptionW	capGetDriverDescription;
+} else { // Unicode
+	alias capCreateCaptureWindowA	capCreateCaptureWindow;
+	alias capGetDriverDescriptionA	capGetDriverDescription;
+}
+
+// New Information chunk IDs
+const infotypeDIGITIZATION_TIME	= mmioFOURCC!('I', 'D', 'I', 'T');
+const infotypeSMPTE_TIME		= mmioFOURCC!('I', 'S', 'M', 'P');
+
+// status and error callbacks
+enum {
+	IDS_CAP_BEGIN					= 300,
+	IDS_CAP_END						= 301,
+
+	IDS_CAP_INFO					= 401,
+	IDS_CAP_OUTOFMEM				= 402,
+	IDS_CAP_FILEEXISTS				= 403,
+	IDS_CAP_ERRORPALOPEN			= 404,
+	IDS_CAP_ERRORPALSAVE			= 405,
+	IDS_CAP_ERRORDIBSAVE			= 406,
+	IDS_CAP_DEFAVIEXT				= 407,
+	IDS_CAP_DEFPALEXT				= 408,
+	IDS_CAP_CANTOPEN				= 409,
+	IDS_CAP_SEQ_MSGSTART			= 410,
+	IDS_CAP_SEQ_MSGSTOP				= 411,
+
+	IDS_CAP_VIDEDITERR				= 412,
+	IDS_CAP_READONLYFILE			= 413,
+	IDS_CAP_WRITEERROR				= 414,
+	IDS_CAP_NODISKSPACE				= 415,
+	IDS_CAP_SETFILESIZE				= 416,
+	IDS_CAP_SAVEASPERCENT			= 417,
+
+	IDS_CAP_DRIVER_ERROR			= 418,
+
+	IDS_CAP_WAVE_OPEN_ERROR			= 419,
+	IDS_CAP_WAVE_ALLOC_ERROR		= 420,
+	IDS_CAP_WAVE_PREPARE_ERROR		= 421,
+	IDS_CAP_WAVE_ADD_ERROR			= 422,
+	IDS_CAP_WAVE_SIZE_ERROR			= 423,
+
+	IDS_CAP_VIDEO_OPEN_ERROR		= 424,
+	IDS_CAP_VIDEO_ALLOC_ERROR		= 425,
+	IDS_CAP_VIDEO_PREPARE_ERROR		= 426,
+	IDS_CAP_VIDEO_ADD_ERROR			= 427,
+	IDS_CAP_VIDEO_SIZE_ERROR		= 428,
+
+	IDS_CAP_FILE_OPEN_ERROR			= 429,
+	IDS_CAP_FILE_WRITE_ERROR		= 430,
+	IDS_CAP_RECORDING_ERROR			= 431,
+	IDS_CAP_RECORDING_ERROR2		= 432,
+	IDS_CAP_AVI_INIT_ERROR			= 433,
+	IDS_CAP_NO_FRAME_CAP_ERROR		= 434,
+	IDS_CAP_NO_PALETTE_WARN			= 435,
+	IDS_CAP_MCI_CONTROL_ERROR		= 436,
+	IDS_CAP_MCI_CANT_STEP_ERROR		= 437,
+	IDS_CAP_NO_AUDIO_CAP_ERROR		= 438,
+	IDS_CAP_AVI_DRAWDIB_ERROR		= 439,
+	IDS_CAP_COMPRESSOR_ERROR		= 440,
+	IDS_CAP_AUDIO_DROP_ERROR		= 441,
+	IDS_CAP_AUDIO_DROP_COMPERROR	= 442,
+
+	IDS_CAP_STAT_LIVE_MODE			= 500,
+	IDS_CAP_STAT_OVERLAY_MODE		= 501,
+	IDS_CAP_STAT_CAP_INIT			= 502,
+	IDS_CAP_STAT_CAP_FINI			= 503,
+	IDS_CAP_STAT_PALETTE_BUILD		= 504,
+	IDS_CAP_STAT_OPTPAL_BUILD		= 505,
+	IDS_CAP_STAT_I_FRAMES			= 506,
+	IDS_CAP_STAT_L_FRAMES			= 507,
+	IDS_CAP_STAT_CAP_L_FRAMES		= 508,
+	IDS_CAP_STAT_CAP_AUDIO			= 509,
+	IDS_CAP_STAT_VIDEOCURRENT		= 510,
+	IDS_CAP_STAT_VIDEOAUDIO			= 511,
+	IDS_CAP_STAT_VIDEOONLY			= 512,
+	IDS_CAP_STAT_FRAMESDROPPED		= 513,
+}
+
+/**
+ * FilePreview dialog.
+ */
+
+extern (Windows) {
+	BOOL GetOpenFileNamePreviewA(LPOPENFILENAMEA lpofn);
+	BOOL GetSaveFileNamePreviewA(LPOPENFILENAMEA lpofn);
+	BOOL GetOpenFileNamePreviewW(LPOPENFILENAMEW lpofn);
+	BOOL GetSaveFileNamePreviewW(LPOPENFILENAMEW lpofn);
+}
+
+version(Unicode) {
+	alias GetOpenFileNamePreviewW	GetOpenFileNamePreview;
+	alias GetSaveFileNamePreviewW	GetSaveFileNamePreview;
+} else { // Unicode
+	alias GetOpenFileNamePreviewA	GetOpenFileNamePreview;
+	alias GetSaveFileNamePreviewA	GetSaveFileNamePreview;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/w32api.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,106 @@
+/***********************************************************************\
+*                                w32api.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*             Translated from MinGW API for MS-Windows 3.12             *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.w32api;
+
+const __W32API_VERSION = 3.12;
+const __W32API_MAJOR_VERSION = 3;
+const __W32API_MINOR_VERSION = 12;
+
+/*	These version identifiers are used to specify the minimum version of
+ *	Windows that an application will support.
+ *
+ *	The programmer should set two version identifiers: one for the
+ *	minimum Windows NT version and one for the minimum Windows 9x
+ *	version.  If no Windows NT version is specified, Windows NT 4 is
+ *	assumed.  If no Windows 9x version is specified, Windows 95 is
+ *	assumed, unless WindowsNTonly, WindowsXP, Windows2003 or WindowsVista
+ *	is specified, implying that the application supports only the NT line of
+ *	versions.
+ */
+
+/*	For Windows XP and later, assume no Windows 9x support.
+ *	API features new to Windows Vista are not yet included in this
+ *	translation or in MinGW, but this is here ready to start adding them.
+ */
+version (WindowsVista) {
+	const uint
+		_WIN32_WINNT   = 0x600,
+		_WIN32_WINDOWS = uint.max;
+
+} else version (Windows2003) {
+	const uint
+		_WIN32_WINNT   = 0x502,
+		_WIN32_WINDOWS = uint.max;
+
+} else version (WindowsXP) {
+	const uint
+		_WIN32_WINNT   = 0x501,
+		_WIN32_WINDOWS = uint.max;
+
+} else {
+	/*	for earlier Windows versions, separate version identifiers into
+	 *	the NT and 9x lines
+	 */
+	version (Windows2000) {
+		const uint _WIN32_WINNT = 0x500;
+	} else {
+		const uint _WIN32_WINNT = 0x400;
+	}
+
+	version (WindowsNTonly) {
+		const uint _WIN32_WINDOWS = uint.max;
+	} else version (WindowsME) {
+		const uint _WIN32_WINDOWS = 0x500;
+	} else version (Windows98) {
+		const uint _WIN32_WINDOWS = 0x410;
+	} else {
+		const uint _WIN32_WINDOWS = 0x400;
+	}
+}
+
+// Just a bit of syntactic sugar for the static ifs
+const uint WINVER = _WIN32_WINDOWS < _WIN32_WINNT ?
+                    _WIN32_WINDOWS : _WIN32_WINNT;
+const bool _WIN32_WINNT_ONLY = _WIN32_WINDOWS == uint.max;
+
+version (IE7) {
+	const uint _WIN32_IE = 0x700;
+} else version (IE602) {
+	const uint _WIN32_IE = 0x603;
+} else version (IE601) {
+	const uint _WIN32_IE = 0x601;
+} else version (IE6) {
+	const uint _WIN32_IE = 0x600;
+} else version (IE56) {
+	const uint _WIN32_IE = 0x560;
+} else version (IE501) {
+	const uint _WIN32_IE = 0x501;
+} else version (IE5) {
+	const uint _WIN32_IE = 0x500;
+} else version (IE401) {
+	const uint _WIN32_IE = 0x401;
+} else version (IE4) {
+	const uint _WIN32_IE = 0x400;
+} else version (IE3) {
+	const uint _WIN32_IE = 0x300;
+} else static if (WINVER >= 0x410) {
+	const uint _WIN32_IE = 0x400;
+} else {
+	const uint _WIN32_IE = 0;
+}
+
+debug (WindowsUnitTest) {
+	unittest {
+		printf("Windows NT version: %03x\n", _WIN32_WINNT);
+		printf("Windows 9x version: %03x\n", _WIN32_WINDOWS);
+		printf("IE version:         %03x\n", _WIN32_IE);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/winbase.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,2817 @@
+/***********************************************************************\
+*                               winbase.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*             Translated from MinGW API for MS-Windows 3.10             *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.winbase;
+pragma(lib, "kernel32.lib");
+
+/**
+Translation Notes:
+The following macros are obsolete, and have no effect.
+
+LockSegment(w), MakeProcInstance(p, i), UnlockResource(h), UnlockSegment(w)
+FreeModule(m), FreeProcInstance(p), GetFreeSpace(w), DefineHandleTable(w)
+SetSwapAreaSize(w), LimitEmsPages(n), Yield()
+
+// The following Win16 functions are obselete in Win32.
+
+ int _hread(HFILE, LPVOID, int);
+ int _hwrite(HFILE, LPCSTR, int);
+ HFILE _lclose(HFILE);
+ HFILE _lcreat(LPCSTR, int);
+ LONG _llseek(HFILE, LONG, int);
+ HFILE _lopen(LPCSTR, int);
+ UINT _lread(HFILE, LPVOID, UINT);
+ UINT _lwrite(HFILE, LPCSTR, UINT);
+ SIZE_T GlobalCompact(DWORD);
+ VOID GlobalFix(HGLOBAL);
+* MSDN contradicts itself on GlobalFlags:
+* "This function is provided only for compatibility with 16-bit versions of Windows."
+* but also requires Windows 2000 or above
+ UINT GlobalFlags(HGLOBAL);
+ VOID GlobalUnfix(HGLOBAL);
+ BOOL GlobalUnWire(HGLOBAL);
+ PVOID GlobalWire(HGLOBAL);
+ SIZE_T LocalCompact(UINT);
+ UINT LocalFlags(HLOCAL);
+ SIZE_T LocalShrink(HLOCAL, UINT);
+
+// These are not required for DMD.
+
+//FIXME:
+// #ifndef UNDER_CE
+	int WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
+#else
+	int WinMain(HINSTANCE, HINSTANCE, LPWSTR, int);
+#endif
+int wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int);
+
+*/
+
+import win32.windef, win32.winver;
+private import win32.basetyps, win32.w32api, win32.winnt;
+
+// FIXME:
+alias void va_list;
+
+
+/+
+//--------------------------------------
+// These functions are problematic
+
+version(UseNtoSKernel) {}else {
+	/* CAREFUL: These are exported from ntoskrnl.exe and declared in winddk.h
+	   as __fastcall functions, but are  exported from kernel32.dll as __stdcall */
+	static if (_WIN32_WINNT >= 0x0501) {
+	 VOID InitializeSListHead(PSLIST_HEADER);
+	}
+	LONG InterlockedCompareExchange(LPLONG, LONG, LONG);
+	// PVOID WINAPI InterlockedCompareExchangePointer(PVOID*, PVOID, PVOID);
+	(PVOID)InterlockedCompareExchange((LPLONG)(d)    (PVOID)InterlockedCompareExchange((LPLONG)(d), (LONG)(e), (LONG)(c))
+	LONG InterlockedDecrement(LPLONG);
+	LONG InterlockedExchange(LPLONG, LONG);
+	// PVOID WINAPI InterlockedExchangePointer(PVOID*, PVOID);
+	(PVOID)InterlockedExchange((LPLONG)((PVOID)InterlockedExchange((LPLONG)(t), (LONG)(v))
+	LONG InterlockedExchangeAdd(LPLONG, LONG);
+
+	static if (_WIN32_WINNT >= 0x0501) {
+	PSLIST_ENTRY InterlockedFlushSList(PSLIST_HEADER);
+	}
+	LONG InterlockedIncrement(LPLONG);
+	static if (_WIN32_WINNT >= 0x0501) {
+	PSLIST_ENTRY InterlockedPopEntrySList(PSLIST_HEADER);
+	PSLIST_ENTRY InterlockedPushEntrySList(PSLIST_HEADER, PSLIST_ENTRY);
+	}
+} // #endif //  __USE_NTOSKRNL__
+//--------------------------------------
++/
+
+// COMMPROP structure, used by GetCommProperties()
+// -----------------------------------------------
+
+// Communications provider type
+enum : DWORD {
+	PST_UNSPECIFIED,
+	PST_RS232,
+	PST_PARALLELPORT,
+	PST_RS422,
+	PST_RS423,
+	PST_RS449,
+	PST_MODEM,      // =      6
+	PST_FAX            = 0x0021,
+	PST_SCANNER        = 0x0022,
+	PST_NETWORK_BRIDGE = 0x0100,
+	PST_LAT            = 0x0101,
+	PST_TCPIP_TELNET   = 0x0102,
+	PST_X25            = 0x0103
+}
+
+// Max baud rate
+enum : DWORD {
+	BAUD_075    = 0x00000001,
+	BAUD_110    = 0x00000002,
+	BAUD_134_5  = 0x00000004,
+	BAUD_150    = 0x00000008,
+	BAUD_300    = 0x00000010,
+	BAUD_600    = 0x00000020,
+	BAUD_1200   = 0x00000040,
+	BAUD_1800   = 0x00000080,
+	BAUD_2400   = 0x00000100,
+	BAUD_4800   = 0x00000200,
+	BAUD_7200   = 0x00000400,
+	BAUD_9600   = 0x00000800,
+	BAUD_14400  = 0x00001000,
+	BAUD_19200  = 0x00002000,
+	BAUD_38400  = 0x00004000,
+	BAUD_56K    = 0x00008000,
+	BAUD_128K   = 0x00010000,
+	BAUD_115200 = 0x00020000,
+	BAUD_57600  = 0x00040000,
+	BAUD_USER   = 0x10000000
+}
+
+// Comm capabilities
+enum : DWORD {
+	PCF_DTRDSR        = 0x0001,
+	PCF_RTSCTS        = 0x0002,
+	PCF_RLSD          = 0x0004,
+	PCF_PARITY_CHECK  = 0x0008,
+	PCF_XONXOFF       = 0x0010,
+	PCF_SETXCHAR      = 0x0020,
+	PCF_TOTALTIMEOUTS = 0x0040,
+	PCF_INTTIMEOUTS   = 0x0080,
+	PCF_SPECIALCHARS  = 0x0100,
+	PCF_16BITMODE     = 0x0200
+}
+
+enum  : DWORD {
+	SP_PARITY       = 1,
+	SP_BAUD         = 2,
+	SP_DATABITS     = 4,
+	SP_STOPBITS     = 8,
+	SP_HANDSHAKING  = 16,
+	SP_PARITY_CHECK = 32,
+	SP_RLSD         = 64
+}
+
+enum : DWORD {
+	DATABITS_5   = 1,
+	DATABITS_6   = 2,
+	DATABITS_7   = 4,
+	DATABITS_8   = 8,
+	DATABITS_16  = 16,
+	DATABITS_16X = 32
+}
+
+enum : WORD {
+	STOPBITS_10  = 0x0001,
+	STOPBITS_15  = 0x0002,
+	STOPBITS_20  = 0x0004,
+	PARITY_NONE  = 0x0100,
+	PARITY_ODD   = 0x0200,
+	PARITY_EVEN  = 0x0400,
+	PARITY_MARK  = 0x0800,
+	PARITY_SPACE = 0x1000
+}
+
+// used by dwServiceMask
+const SP_SERIALCOMM = 1;
+
+struct COMMPROP {
+	WORD  wPacketLength;
+	WORD  wPacketVersion;
+	DWORD dwServiceMask;
+	DWORD dwReserved1;
+	DWORD dwMaxTxQueue;
+	DWORD dwMaxRxQueue;
+	DWORD dwMaxBaud;
+	DWORD dwProvSubType;
+	DWORD dwProvCapabilities;
+	DWORD dwSettableParams;
+	DWORD dwSettableBaud;
+	WORD  wSettableData;
+	WORD  wSettableStopParity;
+	DWORD dwCurrentTxQueue;
+	DWORD dwCurrentRxQueue;
+	DWORD dwProvSpec1;
+	DWORD dwProvSpec2;
+	WCHAR _wcProvChar;
+
+	WCHAR* wcProvChar() { return &_wcProvChar; }
+}
+alias COMMPROP* LPCOMMPROP;
+
+// ----------
+
+// for DEBUG_EVENT
+enum : DWORD {
+	EXCEPTION_DEBUG_EVENT = 1,
+	CREATE_THREAD_DEBUG_EVENT,
+	CREATE_PROCESS_DEBUG_EVENT,
+	EXIT_THREAD_DEBUG_EVENT,
+	EXIT_PROCESS_DEBUG_EVENT,
+	LOAD_DLL_DEBUG_EVENT,
+	UNLOAD_DLL_DEBUG_EVENT,
+	OUTPUT_DEBUG_STRING_EVENT,
+	RIP_EVENT
+}
+
+const HFILE HFILE_ERROR = cast(HFILE) (-1);
+
+// for SetFilePointer()
+enum : DWORD {
+	FILE_BEGIN   = 0,
+	FILE_CURRENT = 1,
+	FILE_END     = 2
+}
+const DWORD INVALID_SET_FILE_POINTER = -1;
+
+
+// for OpenFile()
+deprecated enum : UINT {
+	OF_READ             = 0,
+	OF_WRITE            = 0x0001,
+	OF_READWRITE        = 0x0002,
+	OF_SHARE_COMPAT     = 0,
+	OF_SHARE_EXCLUSIVE  = 0x0010,
+	OF_SHARE_DENY_WRITE = 0x0020,
+	OF_SHARE_DENY_READ  = 0x0030,
+	OF_SHARE_DENY_NONE  = 0x0040,
+	OF_PARSE            = 0x0100,
+	OF_DELETE           = 0x0200,
+	OF_VERIFY           = 0x0400,
+	OF_CANCEL           = 0x0800,
+	OF_CREATE           = 0x1000,
+	OF_PROMPT           = 0x2000,
+	OF_EXIST            = 0x4000,
+	OF_REOPEN           = 0x8000
+}
+
+enum : DWORD {
+	NMPWAIT_NOWAIT           =  1,
+	NMPWAIT_WAIT_FOREVER     = -1,
+	NMPWAIT_USE_DEFAULT_WAIT =  0
+}
+
+// for ClearCommError()
+const DWORD
+	CE_RXOVER   = 0x0001,
+	CE_OVERRUN  = 0x0002,
+	CE_RXPARITY = 0x0004,
+	CE_FRAME    = 0x0008,
+	CE_BREAK    = 0x0010,
+	CE_TXFULL   = 0x0100,
+	CE_PTO      = 0x0200,
+	CE_IOE      = 0x0400,
+	CE_DNS      = 0x0800,
+	CE_OOP      = 0x1000,
+	CE_MODE     = 0x8000;
+
+// for CopyProgressRoutine callback.
+enum : DWORD {
+	PROGRESS_CONTINUE = 0,
+	PROGRESS_CANCEL   = 1,
+	PROGRESS_STOP     = 2,
+	PROGRESS_QUIET    = 3
+}
+
+enum : DWORD {
+	CALLBACK_CHUNK_FINISHED = 0,
+	CALLBACK_STREAM_SWITCH  = 1
+}
+
+// CopyFileEx()
+enum : DWORD {
+	COPY_FILE_FAIL_IF_EXISTS = 1,
+	COPY_FILE_RESTARTABLE    = 2
+}
+
+enum : DWORD {
+	FILE_MAP_COPY       = 1,
+	FILE_MAP_WRITE      = 2,
+	FILE_MAP_READ       = 4,
+	FILE_MAP_ALL_ACCESS = 0x000F001F
+}
+
+enum : DWORD {
+	MUTEX_ALL_ACCESS       = 0x001f0001,
+	MUTEX_MODIFY_STATE     = 0x00000001,
+	SEMAPHORE_ALL_ACCESS   = 0x001f0003,
+	SEMAPHORE_MODIFY_STATE = 0x00000002,
+	EVENT_ALL_ACCESS       = 0x001f0003,
+	EVENT_MODIFY_STATE     = 0x00000002
+}
+
+// CreateNamedPipe()
+enum : DWORD {
+	PIPE_ACCESS_INBOUND  = 1,
+	PIPE_ACCESS_OUTBOUND = 2,
+	PIPE_ACCESS_DUPLEX   = 3
+}
+
+const DWORD
+	PIPE_TYPE_BYTE        = 0,
+	PIPE_TYPE_MESSAGE     = 4,
+	PIPE_READMODE_BYTE    = 0,
+	PIPE_READMODE_MESSAGE = 2,
+	PIPE_WAIT             = 0,
+	PIPE_NOWAIT           = 1;
+
+// GetNamedPipeInfo()
+const DWORD
+	PIPE_CLIENT_END  = 0,
+	PIPE_SERVER_END  = 1;
+
+const DWORD PIPE_UNLIMITED_INSTANCES = 255;
+
+// dwCreationFlags for CreateProcess() and CreateProcessAsUser()
+enum : DWORD {
+	DEBUG_PROCESS               = 0x00000001,
+	DEBUG_ONLY_THIS_PROCESS     = 0x00000002,
+	CREATE_SUSPENDED            = 0x00000004,
+	DETACHED_PROCESS            = 0x00000008,
+	CREATE_NEW_CONSOLE          = 0x00000010,
+	NORMAL_PRIORITY_CLASS       = 0x00000020,
+	IDLE_PRIORITY_CLASS         = 0x00000040,
+	HIGH_PRIORITY_CLASS         = 0x00000080,
+	REALTIME_PRIORITY_CLASS     = 0x00000100,
+	CREATE_NEW_PROCESS_GROUP    = 0x00000200,
+	CREATE_UNICODE_ENVIRONMENT  = 0x00000400,
+	CREATE_SEPARATE_WOW_VDM     = 0x00000800,
+	CREATE_SHARED_WOW_VDM       = 0x00001000,
+	CREATE_FORCEDOS             = 0x00002000,
+	BELOW_NORMAL_PRIORITY_CLASS = 0x00004000,
+	ABOVE_NORMAL_PRIORITY_CLASS = 0x00008000,
+	CREATE_BREAKAWAY_FROM_JOB   = 0x01000000,
+	CREATE_WITH_USERPROFILE     = 0x02000000,
+	CREATE_DEFAULT_ERROR_MODE   = 0x04000000,
+	CREATE_NO_WINDOW            = 0x08000000,
+	PROFILE_USER                = 0x10000000,
+	PROFILE_KERNEL              = 0x20000000,
+	PROFILE_SERVER              = 0x40000000
+}
+
+const DWORD CONSOLE_TEXTMODE_BUFFER = 1;
+
+// CreateFile()
+enum : DWORD {
+	CREATE_NEW = 1,
+	CREATE_ALWAYS,
+	OPEN_EXISTING,
+	OPEN_ALWAYS,
+	TRUNCATE_EXISTING
+}
+
+// CreateFile()
+const DWORD
+	FILE_FLAG_WRITE_THROUGH      = 0x80000000,
+	FILE_FLAG_OVERLAPPED         = 0x40000000,
+	FILE_FLAG_NO_BUFFERING       = 0x20000000,
+	FILE_FLAG_RANDOM_ACCESS      = 0x10000000,
+	FILE_FLAG_SEQUENTIAL_SCAN    = 0x08000000,
+	FILE_FLAG_DELETE_ON_CLOSE    = 0x04000000,
+	FILE_FLAG_BACKUP_SEMANTICS   = 0x02000000,
+	FILE_FLAG_POSIX_SEMANTICS    = 0x01000000,
+	FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000,
+	FILE_FLAG_OPEN_NO_RECALL     = 0x00100000;
+
+static if (_WIN32_WINNT_ONLY && _WIN32_WINNT >= 0x500) {
+	const DWORD FILE_FLAG_FIRST_PIPE_INSTANCE = 0x00080000;
+}
+
+// for CreateFile()
+const DWORD
+	SECURITY_ANONYMOUS        = SECURITY_IMPERSONATION_LEVEL.SecurityAnonymous<<16,
+	SECURITY_IDENTIFICATION   = SECURITY_IMPERSONATION_LEVEL.SecurityIdentification<<16,
+	SECURITY_IMPERSONATION    = SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation<<16,
+	SECURITY_DELEGATION       = SECURITY_IMPERSONATION_LEVEL.SecurityDelegation<<16,
+	SECURITY_CONTEXT_TRACKING = 0x00040000,
+	SECURITY_EFFECTIVE_ONLY   = 0x00080000,
+	SECURITY_SQOS_PRESENT     = 0x00100000,
+	SECURITY_VALID_SQOS_FLAGS = 0x001F0000;
+
+
+// Thread exit code
+const DWORD STILL_ACTIVE = 0x103;
+
+/*	??? The only documentation of this seems to be about Windows CE and to
+ *	state what _doesn't_ support it.
+ */
+const DWORD FIND_FIRST_EX_CASE_SENSITIVE = 1;
+
+// GetBinaryType()
+enum : DWORD {
+	SCS_32BIT_BINARY = 0,
+	SCS_DOS_BINARY,
+	SCS_WOW_BINARY,
+	SCS_PIF_BINARY,
+	SCS_POSIX_BINARY,
+	SCS_OS216_BINARY
+}
+
+const size_t
+	MAX_COMPUTERNAME_LENGTH = 15,
+	HW_PROFILE_GUIDLEN      = 39,
+	MAX_PROFILE_LEN         = 80;
+
+// HW_PROFILE_INFO
+const DWORD
+	DOCKINFO_UNDOCKED      = 1,
+	DOCKINFO_DOCKED        = 2,
+	DOCKINFO_USER_SUPPLIED = 4,
+	DOCKINFO_USER_UNDOCKED = DOCKINFO_USER_SUPPLIED | DOCKINFO_UNDOCKED,
+	DOCKINFO_USER_DOCKED   = DOCKINFO_USER_SUPPLIED | DOCKINFO_DOCKED;
+
+// DriveType(), RealDriveType()
+enum : int {
+	DRIVE_UNKNOWN = 0,
+	DRIVE_NO_ROOT_DIR,
+	DRIVE_REMOVABLE,
+	DRIVE_FIXED,
+	DRIVE_REMOTE,
+	DRIVE_CDROM,
+	DRIVE_RAMDISK
+}
+
+// GetFileType()
+enum : DWORD {
+	FILE_TYPE_UNKNOWN = 0,
+	FILE_TYPE_DISK,
+	FILE_TYPE_CHAR,
+	FILE_TYPE_PIPE,
+	FILE_TYPE_REMOTE = 0x8000
+}
+
+// Get/SetHandleInformation()
+const DWORD
+	HANDLE_FLAG_INHERIT            = 0x01,
+	HANDLE_FLAG_PROTECT_FROM_CLOSE = 0x02;
+
+enum : DWORD {
+	STD_INPUT_HANDLE  = 0xFFFFFFF6,
+	STD_OUTPUT_HANDLE = 0xFFFFFFF5,
+	STD_ERROR_HANDLE  = 0xFFFFFFF4
+}
+
+const HANDLE INVALID_HANDLE_VALUE = cast(HANDLE) (-1);
+
+enum : DWORD {
+	GET_TAPE_MEDIA_INFORMATION = 0,
+	GET_TAPE_DRIVE_INFORMATION = 1
+}
+
+enum : DWORD {
+	SET_TAPE_MEDIA_INFORMATION = 0,
+	SET_TAPE_DRIVE_INFORMATION = 1
+}
+
+// SetThreadPriority()/GetThreadPriority()
+enum : int {
+	THREAD_PRIORITY_IDLE          = -15,
+	THREAD_PRIORITY_LOWEST        =  -2,
+	THREAD_PRIORITY_BELOW_NORMAL  =  -1,
+	THREAD_PRIORITY_NORMAL        =   0,
+	THREAD_PRIORITY_ABOVE_NORMAL  =   1,
+	THREAD_PRIORITY_HIGHEST       =   2,
+	THREAD_PRIORITY_TIME_CRITICAL =  15,
+	THREAD_PRIORITY_ERROR_RETURN  = 2147483647
+}
+
+enum : DWORD {
+	TIME_ZONE_ID_UNKNOWN,
+	TIME_ZONE_ID_STANDARD,
+	TIME_ZONE_ID_DAYLIGHT,
+	TIME_ZONE_ID_INVALID = 0xFFFFFFFF
+}
+
+const DWORD
+	FS_CASE_SENSITIVE         =     1,
+	FS_CASE_IS_PRESERVED      =     2,
+	FS_UNICODE_STORED_ON_DISK =     4,
+	FS_PERSISTENT_ACLS        =     8,
+	FS_FILE_COMPRESSION       =    16,
+	FS_VOL_IS_COMPRESSED      = 32768;
+
+// Flags for GlobalAlloc
+const UINT
+	GMEM_FIXED       = 0,
+	GMEM_MOVEABLE    = 0x0002,
+	GMEM_ZEROINIT    = 0x0040,
+	GPTR             = 0x0040,
+	GHND             = 0x0042,
+	GMEM_MODIFY      = 0x0080,  // used only for GlobalRealloc
+	GMEM_VALID_FLAGS = 0x7F72;
+
+/+  // Obselete flags (Win16 only)
+	GMEM_NOCOMPACT=16;
+	GMEM_NODISCARD=32;
+	GMEM_DISCARDABLE=256;
+	GMEM_NOT_BANKED=4096;
+	GMEM_LOWER=4096;
+	GMEM_SHARE=8192;
+	GMEM_DDESHARE=8192;
+
+	GMEM_LOCKCOUNT=255;
+
+// for GlobalFlags()
+	GMEM_DISCARDED      = 16384;
+	GMEM_INVALID_HANDLE = 32768;
+
+	GMEM_NOTIFY         = 16384;
++/
+
+const UINT
+	LMEM_FIXED          = 0,
+	LMEM_MOVEABLE       = 0x0002,
+	LMEM_NONZEROLPTR    = 0,
+	NONZEROLPTR         = 0,
+	LMEM_NONZEROLHND    = 0x0002,
+	NONZEROLHND         = 0x0002,
+	LMEM_DISCARDABLE    = 0x0F00,
+	LMEM_NOCOMPACT      = 0x0010,
+	LMEM_NODISCARD      = 0x0020,
+	LMEM_ZEROINIT       = 0x0040,
+	LPTR                = 0x0040,
+	LHND                = 0x0042,
+	LMEM_MODIFY         = 0x0080,
+	LMEM_LOCKCOUNT      = 0x00FF,
+	LMEM_DISCARDED      = 0x4000,
+	LMEM_INVALID_HANDLE = 0x8000;
+
+
+
+// used in EXCEPTION_RECORD
+enum : DWORD {
+	STATUS_WAIT_0                      = 0,
+	STATUS_ABANDONED_WAIT_0            = 0x00000080,
+	STATUS_USER_APC                    = 0x000000C0,
+	STATUS_TIMEOUT                     = 0x00000102,
+	STATUS_PENDING                     = 0x00000103,
+
+	STATUS_SEGMENT_NOTIFICATION        = 0x40000005,
+	STATUS_GUARD_PAGE_VIOLATION        = 0x80000001,
+	STATUS_DATATYPE_MISALIGNMENT       = 0x80000002,
+	STATUS_BREAKPOINT                  = 0x80000003,
+	STATUS_SINGLE_STEP                 = 0x80000004,
+
+	STATUS_ACCESS_VIOLATION            = 0xC0000005,
+	STATUS_IN_PAGE_ERROR               = 0xC0000006,
+	STATUS_INVALID_HANDLE              = 0xC0000008,
+
+	STATUS_NO_MEMORY                   = 0xC0000017,
+	STATUS_ILLEGAL_INSTRUCTION         = 0xC000001D,
+	STATUS_NONCONTINUABLE_EXCEPTION    = 0xC0000025,
+	STATUS_INVALID_DISPOSITION         = 0xC0000026,
+	STATUS_ARRAY_BOUNDS_EXCEEDED       = 0xC000008C,
+	STATUS_FLOAT_DENORMAL_OPERAND      = 0xC000008D,
+	STATUS_FLOAT_DIVIDE_BY_ZERO        = 0xC000008E,
+	STATUS_FLOAT_INEXACT_RESULT        = 0xC000008F,
+	STATUS_FLOAT_INVALID_OPERATION     = 0xC0000090,
+	STATUS_FLOAT_OVERFLOW              = 0xC0000091,
+	STATUS_FLOAT_STACK_CHECK           = 0xC0000092,
+	STATUS_FLOAT_UNDERFLOW             = 0xC0000093,
+	STATUS_INTEGER_DIVIDE_BY_ZERO      = 0xC0000094,
+	STATUS_INTEGER_OVERFLOW            = 0xC0000095,
+	STATUS_PRIVILEGED_INSTRUCTION      = 0xC0000096,
+	STATUS_STACK_OVERFLOW              = 0xC00000FD,
+	STATUS_CONTROL_C_EXIT              = 0xC000013A,
+	STATUS_DLL_INIT_FAILED             = 0xC0000142,
+	STATUS_DLL_INIT_FAILED_LOGOFF      = 0xC000026B,
+
+	CONTROL_C_EXIT                     = STATUS_CONTROL_C_EXIT,
+
+	EXCEPTION_ACCESS_VIOLATION         = STATUS_ACCESS_VIOLATION,
+	EXCEPTION_DATATYPE_MISALIGNMENT    = STATUS_DATATYPE_MISALIGNMENT,
+	EXCEPTION_BREAKPOINT               = STATUS_BREAKPOINT,
+	EXCEPTION_SINGLE_STEP              = STATUS_SINGLE_STEP,
+	EXCEPTION_ARRAY_BOUNDS_EXCEEDED    = STATUS_ARRAY_BOUNDS_EXCEEDED,
+	EXCEPTION_FLT_DENORMAL_OPERAND     = STATUS_FLOAT_DENORMAL_OPERAND,
+	EXCEPTION_FLT_DIVIDE_BY_ZERO       = STATUS_FLOAT_DIVIDE_BY_ZERO,
+	EXCEPTION_FLT_INEXACT_RESULT       = STATUS_FLOAT_INEXACT_RESULT,
+	EXCEPTION_FLT_INVALID_OPERATION    = STATUS_FLOAT_INVALID_OPERATION,
+	EXCEPTION_FLT_OVERFLOW             = STATUS_FLOAT_OVERFLOW,
+	EXCEPTION_FLT_STACK_CHECK          = STATUS_FLOAT_STACK_CHECK,
+	EXCEPTION_FLT_UNDERFLOW            = STATUS_FLOAT_UNDERFLOW,
+	EXCEPTION_INT_DIVIDE_BY_ZERO       = STATUS_INTEGER_DIVIDE_BY_ZERO,
+	EXCEPTION_INT_OVERFLOW             = STATUS_INTEGER_OVERFLOW,
+	EXCEPTION_PRIV_INSTRUCTION         = STATUS_PRIVILEGED_INSTRUCTION,
+	EXCEPTION_IN_PAGE_ERROR            = STATUS_IN_PAGE_ERROR,
+	EXCEPTION_ILLEGAL_INSTRUCTION      = STATUS_ILLEGAL_INSTRUCTION,
+	EXCEPTION_NONCONTINUABLE_EXCEPTION = STATUS_NONCONTINUABLE_EXCEPTION,
+	EXCEPTION_STACK_OVERFLOW           = STATUS_STACK_OVERFLOW,
+	EXCEPTION_INVALID_DISPOSITION      = STATUS_INVALID_DISPOSITION,
+	EXCEPTION_GUARD_PAGE               = STATUS_GUARD_PAGE_VIOLATION,
+	EXCEPTION_INVALID_HANDLE           = STATUS_INVALID_HANDLE
+}
+
+// for PROCESS_HEAP_ENTRY
+const WORD
+	PROCESS_HEAP_REGION            =  1,
+	PROCESS_HEAP_UNCOMMITTED_RANGE =  2,
+	PROCESS_HEAP_ENTRY_BUSY        =  4,
+	PROCESS_HEAP_ENTRY_MOVEABLE    = 16,
+	PROCESS_HEAP_ENTRY_DDESHARE    = 32;
+
+// for LoadLibraryEx()
+const DWORD
+	DONT_RESOLVE_DLL_REFERENCES   = 0x01, // not for WinME and earlier
+	LOAD_LIBRARY_AS_DATAFILE      = 0x02,
+	LOAD_WITH_ALTERED_SEARCH_PATH = 0x08,
+	LOAD_IGNORE_CODE_AUTHZ_LEVEL  = 0x10; // only for XP and later
+
+// for LockFile()
+const DWORD
+	LOCKFILE_FAIL_IMMEDIATELY = 1,
+	LOCKFILE_EXCLUSIVE_LOCK   = 2;
+
+const MAXIMUM_WAIT_OBJECTS  = 64;
+const MAXIMUM_SUSPEND_COUNT = 0x7F;
+
+const WAIT_OBJECT_0    = 0;
+const WAIT_ABANDONED_0 = 128;
+
+//const WAIT_TIMEOUT=258;  // also in winerror.h
+
+enum : DWORD {
+	WAIT_IO_COMPLETION = 0x000000C0,
+	WAIT_ABANDONED     = 0x00000080,
+	WAIT_FAILED        = 0xFFFFFFFF
+}
+
+// PurgeComm()
+const DWORD
+	PURGE_TXABORT = 1,
+	PURGE_RXABORT = 2,
+	PURGE_TXCLEAR = 4,
+	PURGE_RXCLEAR = 8;
+
+// ReadEventLog()
+const DWORD
+	EVENTLOG_SEQUENTIAL_READ = 1,
+	EVENTLOG_SEEK_READ       = 2,
+	EVENTLOG_FORWARDS_READ   = 4,
+	EVENTLOG_BACKWARDS_READ  = 8;
+
+// ReportEvent()
+enum : WORD {
+	EVENTLOG_SUCCESS          = 0,
+	EVENTLOG_ERROR_TYPE       = 1,
+	EVENTLOG_WARNING_TYPE     = 2,
+	EVENTLOG_INFORMATION_TYPE = 4,
+	EVENTLOG_AUDIT_SUCCESS    = 8,
+	EVENTLOG_AUDIT_FAILURE    = 16
+}
+
+// FormatMessage()
+const DWORD
+	FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x0100,
+	FORMAT_MESSAGE_IGNORE_INSERTS  = 0x0200,
+	FORMAT_MESSAGE_FROM_STRING     = 0x0400,
+	FORMAT_MESSAGE_FROM_HMODULE    = 0x0800,
+	FORMAT_MESSAGE_FROM_SYSTEM     = 0x1000,
+	FORMAT_MESSAGE_ARGUMENT_ARRAY  = 0x2000;
+
+const DWORD FORMAT_MESSAGE_MAX_WIDTH_MASK = 255;
+
+// also in ddk/ntapi.h
+// To restore default error mode, call SetErrorMode(0)
+enum {
+	SEM_FAILCRITICALERRORS     = 0x0001,
+	SEM_NOGPFAULTERRORBOX      = 0x0002,
+	SEM_NOALIGNMENTFAULTEXCEPT = 0x0004,
+	SEM_NOOPENFILEERRORBOX     = 0x8000
+}
+// end ntapi.h
+
+enum {
+	SLE_ERROR = 1,
+	SLE_MINORERROR,
+	SLE_WARNING
+}
+
+const SHUTDOWN_NORETRY = 1;
+
+// Return type for exception filters.
+enum : LONG {
+	EXCEPTION_EXECUTE_HANDLER    =  1,
+	EXCEPTION_CONTINUE_EXECUTION = -1,
+	EXCEPTION_CONTINUE_SEARCH    =  0
+}
+
+enum  : ATOM {
+	MAXINTATOM   = 0xC000,
+	INVALID_ATOM = 0
+}
+
+const IGNORE   = 0;
+const INFINITE = 0xFFFFFFFF;
+
+// EscapeCommFunction()
+enum {
+	SETXOFF    = 1,
+	SETXON,
+	SETRTS,
+	CLRRTS,
+	SETDTR,
+	CLRDTR, // = 6
+	SETBREAK   = 8,
+	CLRBREAK   = 9
+}
+
+
+// for SetCommMask()
+const DWORD
+	EV_RXCHAR   = 0x0001,
+	EV_RXFLAG   = 0x0002,
+	EV_TXEMPTY  = 0x0004,
+	EV_CTS      = 0x0008,
+	EV_DSR      = 0x0010,
+	EV_RLSD     = 0x0020,
+	EV_BREAK    = 0x0040,
+	EV_ERR      = 0x0080,
+	EV_RING     = 0x0100,
+	EV_PERR     = 0x0200,
+	EV_RX80FULL = 0x0400,
+	EV_EVENT1   = 0x0800,
+	EV_EVENT2   = 0x1000;
+
+// GetCommModemStatus()
+const DWORD
+	MS_CTS_ON  = 0x0010,
+	MS_DSR_ON  = 0x0020,
+	MS_RING_ON = 0x0040,
+	MS_RLSD_ON = 0x0080;
+
+
+// DCB
+enum : BYTE {
+	NOPARITY = 0,
+	ODDPARITY,
+	EVENPARITY,
+	MARKPARITY,
+	SPACEPARITY
+}
+// DCB
+enum : BYTE {
+	ONESTOPBIT = 0,
+	ONE5STOPBITS,
+	TWOSTOPBITS
+}
+// DCB
+enum : DWORD {
+	CBR_110    =    110,
+	CBR_300    =    300,
+	CBR_600    =    600,
+	CBR_1200   =   1200,
+	CBR_2400   =   2400,
+	CBR_4800   =   4800,
+	CBR_9600   =   9600,
+	CBR_14400  =  14400,
+	CBR_19200  =  19200,
+	CBR_38400  =  38400,
+	CBR_56000  =  56000,
+	CBR_57600  =  57600,
+	CBR_115200 = 115200,
+	CBR_128000 = 128000,
+	CBR_256000 = 256000
+}
+// DCB, 2-bit bitfield
+enum {
+	DTR_CONTROL_DISABLE = 0,
+	DTR_CONTROL_ENABLE,
+	DTR_CONTROL_HANDSHAKE
+}
+
+// DCB, 2-bit bitfield
+enum {
+	RTS_CONTROL_DISABLE = 0,
+	RTS_CONTROL_ENABLE,
+	RTS_CONTROL_HANDSHAKE,
+	RTS_CONTROL_TOGGLE,
+}
+
+// WIN32_STREAM_ID
+enum : DWORD {
+	BACKUP_INVALID = 0,
+	BACKUP_DATA,
+	BACKUP_EA_DATA,
+	BACKUP_SECURITY_DATA,
+	BACKUP_ALTERNATE_DATA,
+	BACKUP_LINK,
+	BACKUP_PROPERTY_DATA,
+	BACKUP_OBJECT_ID,
+	BACKUP_REPARSE_DATA,
+	BACKUP_SPARSE_BLOCK
+}
+
+// WIN32_STREAM_ID
+enum : DWORD {
+	STREAM_NORMAL_ATTRIBUTE    = 0,
+	STREAM_MODIFIED_WHEN_READ  = 1,
+	STREAM_CONTAINS_SECURITY   = 2,
+	STREAM_CONTAINS_PROPERTIES = 4
+}
+
+// STARTUPINFO
+const DWORD
+	STARTF_USESHOWWINDOW    = 0x0001,
+	STARTF_USESIZE          = 0x0002,
+	STARTF_USEPOSITION      = 0x0004,
+	STARTF_USECOUNTCHARS    = 0x0008,
+	STARTF_USEFILLATTRIBUTE = 0x0010,
+	STARTF_RUNFULLSCREEN    = 0x0020,
+	STARTF_FORCEONFEEDBACK  = 0x0040,
+	STARTF_FORCEOFFFEEDBACK = 0x0080,
+	STARTF_USESTDHANDLES    = 0x0100,
+	STARTF_USEHOTKEY        = 0x0200;
+
+// ???
+enum {
+	TC_NORMAL  = 0,
+	TC_HARDERR = 1,
+	TC_GP_TRAP = 2,
+	TC_SIGNAL  = 3
+}
+
+/+ These seem to be Windows CE-specific
+enum {
+	AC_LINE_OFFLINE      = 0,
+	AC_LINE_ONLINE       = 1,
+	AC_LINE_BACKUP_POWER = 2,
+	AC_LINE_UNKNOWN      = 255
+}
+
+enum {
+	BATTERY_FLAG_HIGH          = 1,
+	BATTERY_FLAG_LOW           = 2,
+	BATTERY_FLAG_CRITICAL      = 4,
+	BATTERY_FLAG_CHARGING      = 8,
+	BATTERY_FLAG_NO_BATTERY    = 128,
+	BATTERY_FLAG_UNKNOWN       = 255,
+	BATTERY_PERCENTAGE_UNKNOWN = 255,
+	BATTERY_LIFE_UNKNOWN       = 0xFFFFFFFF
+}
++/
+
+// ???
+const HINSTANCE_ERROR = 32;
+
+// returned from GetFileSize()
+const DWORD INVALID_FILE_SIZE = 0xFFFFFFFF;
+
+const DWORD TLS_OUT_OF_INDEXES = 0xFFFFFFFF;
+
+// GetWriteWatch()
+const DWORD WRITE_WATCH_FLAG_RESET = 1;
+
+static if (_WIN32_WINNT_ONLY) {
+	// for LogonUser()
+	enum : DWORD {
+		LOGON32_LOGON_INTERACTIVE = 2,
+		LOGON32_LOGON_NETWORK     = 3,
+		LOGON32_LOGON_BATCH       = 4,
+		LOGON32_LOGON_SERVICE     = 5,
+		LOGON32_LOGON_UNLOCK      = 7
+	}
+
+	// for LogonUser()
+	enum : DWORD {
+		LOGON32_PROVIDER_DEFAULT,
+		LOGON32_PROVIDER_WINNT35,
+		LOGON32_PROVIDER_WINNT40,
+		LOGON32_PROVIDER_WINNT50
+	}
+
+	// for MoveFileEx()
+	const DWORD
+		MOVEFILE_REPLACE_EXISTING   = 1,
+		MOVEFILE_COPY_ALLOWED       = 2,
+		MOVEFILE_DELAY_UNTIL_REBOOT = 4,
+		MOVEFILE_WRITE_THROUGH      = 8;
+
+	// DefineDosDevice()
+	const DWORD
+		DDD_RAW_TARGET_PATH       = 1,
+		DDD_REMOVE_DEFINITION     = 2,
+		DDD_EXACT_MATCH_ON_REMOVE = 4;
+
+	static if (_WIN32_WINNT >= 0x500) {
+		enum : DWORD {
+			LOGON32_LOGON_NETWORK_CLEARTEXT = 8,
+			LOGON32_LOGON_NEW_CREDENTIALS   = 9
+		}
+
+		// ReplaceFile()
+		const DWORD
+			REPLACEFILE_WRITE_THROUGH       = 1,
+			REPLACEFILE_IGNORE_MERGE_ERRORS = 2;
+	}
+
+	static if (_WIN32_WINNT >= 0x501) {
+		const DWORD
+			GET_MODULE_HANDLE_EX_FLAG_PIN                = 1,
+			GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT = 2,
+			GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS       = 4;
+
+		// for ACTCTX
+		const DWORD
+			ACTCTX_FLAG_PROCESSOR_ARCHITECTURE_VALID = 0x01,
+			ACTCTX_FLAG_LANGID_VALID                 = 0x02,
+			ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID     = 0x04,
+			ACTCTX_FLAG_RESOURCE_NAME_VALID          = 0x08,
+			ACTCTX_FLAG_SET_PROCESS_DEFAULT          = 0x10,
+			ACTCTX_FLAG_APPLICATION_NAME_VALID       = 0x20,
+			ACTCTX_FLAG_HMODULE_VALID                = 0x80;
+
+		// DeactivateActCtx()
+		const DWORD DEACTIVATE_ACTCTX_FLAG_FORCE_EARLY_DEACTIVATION = 1;
+		// FindActCtxSectionString()
+		const DWORD FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX          = 1;
+		// QueryActCtxW()
+		const DWORD
+			QUERY_ACTCTX_FLAG_USE_ACTIVE_ACTCTX             = 0x04,
+			QUERY_ACTCTX_FLAG_ACTCTX_IS_HMODULE             = 0x08,
+			QUERY_ACTCTX_FLAG_ACTCTX_IS_ADDRESS             = 0x10;
+
+		enum {
+			LOGON_WITH_PROFILE        = 1,
+			LOGON_NETCREDENTIALS_ONLY
+		}
+	}
+}
+
+// ----
+
+struct FILETIME {
+	DWORD dwLowDateTime;
+	DWORD dwHighDateTime;
+}
+alias FILETIME* PFILETIME, LPFILETIME;
+
+struct BY_HANDLE_FILE_INFORMATION {
+	DWORD    dwFileAttributes;
+	FILETIME ftCreationTime;
+	FILETIME ftLastAccessTime;
+	FILETIME ftLastWriteTime;
+	DWORD    dwVolumeSerialNumber;
+	DWORD    nFileSizeHigh;
+	DWORD    nFileSizeLow;
+	DWORD    nNumberOfLinks;
+	DWORD    nFileIndexHigh;
+	DWORD    nFileIndexLow;
+}
+alias BY_HANDLE_FILE_INFORMATION* LPBY_HANDLE_FILE_INFORMATION;
+
+struct DCB {
+	DWORD DCBlength = DCB.sizeof;
+	DWORD BaudRate;
+/+
+	DWORD fBinary:1;              // Binary Mode (skip EOF check)
+	DWORD fParity:1;              // Enable parity checking
+	DWORD fOutxCtsFlow:1;         // CTS handshaking on output
+	DWORD fOutxDsrFlow:1;         // DSR handshaking on output
+	DWORD fDtrControl:2;          // DTR Flow control
+	DWORD fDsrSensitivity:1;      // DSR Sensitivity
+	DWORD fTXContinueOnXoff:1;    // Continue TX when Xoff sent
+	DWORD fOutX:1;                // Enable output X-ON/X-OFF
+	DWORD fInX:1;                 // Enable input X-ON/X-OFF
+	DWORD fErrorChar:1;           // Enable Err Replacement
+	DWORD fNull:1;                // Enable Null stripping
+	DWORD fRtsControl:2;          // Rts Flow control
+	DWORD fAbortOnError:1;        // Abort all reads and writes on Error
+	DWORD fDummy2:17;             // Reserved
++/
+	uint _bf;
+	bool fBinary(bool f)           { _bf = (_bf & ~0x0001) | f; return f; }
+	bool fParity(bool f)           { _bf = (_bf & ~0x0002) | (f<<1); return f; }
+	bool fOutxCtsFlow(bool f)      { _bf = (_bf & ~0x0004) | (f<<2); return f; }
+	bool fOutxDsrFlow(bool f)      { _bf = (_bf & ~0x0008) | (f<<3); return f; }
+	byte fDtrControl(byte x)       { _bf = (_bf & ~0x0030) | (x<<4); return cast(byte)(x & 3); }
+	bool fDsrSensitivity(bool f)   { _bf = (_bf & ~0x0040) | (f<<6); return f; }
+	bool fTXContinueOnXoff(bool f) { _bf = (_bf & ~0x0080) | (f<<7); return f; }
+	bool fOutX(bool f)             { _bf = (_bf & ~0x0100) | (f<<8); return f; }
+	bool fInX(bool f)              { _bf = (_bf & ~0x0200) | (f<<9); return f; }
+	bool fErrorChar(bool f)        { _bf = (_bf & ~0x0400) | (f<<10); return f; }
+	bool fNull(bool f)             { _bf = (_bf & ~0x0800) | (f<<11); return f; }
+	byte fRtsControl(byte x)       { _bf = (_bf & ~0x3000) | (x<<12); return cast(byte)(x & 3); }
+	bool fAbortOnError(bool f)     { _bf = (_bf & ~0x4000) | (f<<14); return f; }
+
+	bool fBinary()           { return cast(bool) (_bf & 1); }
+	bool fParity()           { return cast(bool) (_bf & 2); }
+	bool fOutxCtsFlow()      { return cast(bool) (_bf & 4); }
+	bool fOutxDsrFlow()      { return cast(bool) (_bf & 8); }
+	byte fDtrControl()       { return cast(byte) ((_bf & (32+16))>>4); }
+	bool fDsrSensitivity()   { return cast(bool) (_bf & 64); }
+	bool fTXContinueOnXoff() { return cast(bool) (_bf & 128); }
+	bool fOutX()             { return cast(bool) (_bf & 256); }
+	bool fInX()              { return cast(bool) (_bf & 512); }
+	bool fErrorChar()        { return cast(bool) (_bf & 1024); }
+	bool fNull()             { return cast(bool) (_bf & 2048); }
+	byte fRtsControl()       { return cast(byte) ((_bf & (4096+8192))>>12); }
+	bool fAbortOnError()     { return cast(bool) (_bf & 16384); }
+
+	WORD wReserved;
+	WORD XonLim;
+	WORD XoffLim;
+	BYTE ByteSize;
+	BYTE Parity;
+	BYTE StopBits;
+	char XonChar;
+	char XoffChar;
+	char ErrorChar;
+	char EofChar;
+	char EvtChar;
+	WORD wReserved1;
+}
+alias DCB* LPDCB;
+
+struct COMMCONFIG {
+	DWORD dwSize = COMMCONFIG.sizeof;
+	WORD  wVersion;
+	WORD  wReserved;
+	DCB   dcb;
+	DWORD dwProviderSubType;
+	DWORD dwProviderOffset;
+	DWORD dwProviderSize;
+	WCHAR _wcProviderData;
+
+	WCHAR* wcProviderData() { return &_wcProviderData; }
+}
+alias COMMCONFIG* LPCOMMCONFIG;
+
+struct COMMTIMEOUTS {
+	DWORD ReadIntervalTimeout;
+	DWORD ReadTotalTimeoutMultiplier;
+	DWORD ReadTotalTimeoutConstant;
+	DWORD WriteTotalTimeoutMultiplier;
+	DWORD WriteTotalTimeoutConstant;
+}
+alias COMMTIMEOUTS* LPCOMMTIMEOUTS;
+
+struct COMSTAT {
+/+
+	DWORD fCtsHold:1;
+	DWORD fDsrHold:1;
+	DWORD fRlsdHold:1;
+	DWORD fXoffHold:1;
+	DWORD fXoffSent:1;
+	DWORD fEof:1;
+	DWORD fTxim:1;
+	DWORD fReserved:25;
++/
+	DWORD _bf;
+    bool fCtsHold(bool f)  { _bf = (_bf & ~1) | f; return f; }
+	bool fDsrHold(bool f)  { _bf = (_bf & ~2) | (f<<1); return f; }
+	bool fRlsdHold(bool f) { _bf = (_bf & ~4) | (f<<2); return f; }
+	bool fXoffHold(bool f) { _bf = (_bf & ~8) | (f<<3); return f; }
+	bool fXoffSent(bool f) { _bf = (_bf & ~16) | (f<<4); return f; }
+	bool fEof(bool f)      { _bf = (_bf & ~32) | (f<<5); return f; }
+	bool fTxim(bool f)     { _bf = (_bf & ~64) | (f<<6); return f; }
+
+    bool fCtsHold()  { return cast(bool) (_bf & 1); }
+	bool fDsrHold()  { return cast(bool) (_bf & 2); }
+	bool fRlsdHold() { return cast(bool) (_bf & 4); }
+	bool fXoffHold() { return cast(bool) (_bf & 8); }
+	bool fXoffSent() { return cast(bool) (_bf & 16); }
+	bool fEof()      { return cast(bool) (_bf & 32); }
+	bool fTxim()     { return cast(bool) (_bf & 64); }
+
+	DWORD cbInQue;
+	DWORD cbOutQue;
+}
+alias COMSTAT* LPCOMSTAT;
+
+struct CREATE_PROCESS_DEBUG_INFO {
+	HANDLE hFile;
+	HANDLE hProcess;
+	HANDLE hThread;
+	LPVOID lpBaseOfImage;
+	DWORD  dwDebugInfoFileOffset;
+	DWORD  nDebugInfoSize;
+	LPVOID lpThreadLocalBase;
+	LPTHREAD_START_ROUTINE lpStartAddress;
+	LPVOID lpImageName;
+	WORD   fUnicode;
+}
+alias CREATE_PROCESS_DEBUG_INFO* LPCREATE_PROCESS_DEBUG_INFO;
+
+struct CREATE_THREAD_DEBUG_INFO {
+	HANDLE hThread;
+	LPVOID lpThreadLocalBase;
+	LPTHREAD_START_ROUTINE lpStartAddress;
+}
+alias CREATE_THREAD_DEBUG_INFO* LPCREATE_THREAD_DEBUG_INFO;
+
+struct EXCEPTION_DEBUG_INFO {
+	EXCEPTION_RECORD ExceptionRecord;
+	DWORD            dwFirstChance;
+}
+alias EXCEPTION_DEBUG_INFO* LPEXCEPTION_DEBUG_INFO;
+
+struct EXIT_THREAD_DEBUG_INFO {
+	DWORD dwExitCode;
+}
+alias EXIT_THREAD_DEBUG_INFO* LPEXIT_THREAD_DEBUG_INFO;
+
+struct EXIT_PROCESS_DEBUG_INFO {
+	DWORD dwExitCode;
+}
+alias EXIT_PROCESS_DEBUG_INFO* LPEXIT_PROCESS_DEBUG_INFO;
+
+struct LOAD_DLL_DEBUG_INFO {
+	HANDLE hFile;
+	LPVOID lpBaseOfDll;
+	DWORD  dwDebugInfoFileOffset;
+	DWORD  nDebugInfoSize;
+	LPVOID lpImageName;
+	WORD   fUnicode;
+}
+alias LOAD_DLL_DEBUG_INFO* LPLOAD_DLL_DEBUG_INFO;
+
+struct UNLOAD_DLL_DEBUG_INFO {
+	LPVOID lpBaseOfDll;
+}
+alias UNLOAD_DLL_DEBUG_INFO* LPUNLOAD_DLL_DEBUG_INFO;
+
+struct OUTPUT_DEBUG_STRING_INFO {
+	LPSTR lpDebugStringData;
+	WORD  fUnicode;
+	WORD  nDebugStringLength;
+}
+alias OUTPUT_DEBUG_STRING_INFO* LPOUTPUT_DEBUG_STRING_INFO;
+
+struct RIP_INFO {
+	DWORD dwError;
+	DWORD dwType;
+}
+alias RIP_INFO* LPRIP_INFO;
+
+struct DEBUG_EVENT {
+	DWORD dwDebugEventCode;
+	DWORD dwProcessId;
+	DWORD dwThreadId;
+	union {
+		EXCEPTION_DEBUG_INFO      Exception;
+		CREATE_THREAD_DEBUG_INFO  CreateThread;
+		CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
+		EXIT_THREAD_DEBUG_INFO    ExitThread;
+		EXIT_PROCESS_DEBUG_INFO   ExitProcess;
+		LOAD_DLL_DEBUG_INFO       LoadDll;
+		UNLOAD_DLL_DEBUG_INFO     UnloadDll;
+		OUTPUT_DEBUG_STRING_INFO  DebugString;
+		RIP_INFO                  RipInfo;
+	}
+}
+alias DEBUG_EVENT* LPDEBUG_EVENT;
+
+struct OVERLAPPED {
+	ULONG_PTR Internal;
+	ULONG_PTR InternalHigh;
+	union {
+		struct {
+			DWORD     Offset;
+			DWORD     OffsetHigh;
+		}
+		PVOID     Pointer;
+	}
+	HANDLE    hEvent;
+}
+alias OVERLAPPED* POVERLAPPED, LPOVERLAPPED;
+
+struct STARTUPINFOA {
+	DWORD  cb = STARTUPINFOA.sizeof;
+	LPSTR  lpReserved;
+	LPSTR  lpDesktop;
+	LPSTR  lpTitle;
+	DWORD  dwX;
+	DWORD  dwY;
+	DWORD  dwXSize;
+	DWORD  dwYSize;
+	DWORD  dwXCountChars;
+	DWORD  dwYCountChars;
+	DWORD  dwFillAttribute;
+	DWORD  dwFlags;
+	WORD   wShowWindow;
+	WORD   cbReserved2;
+	PBYTE  lpReserved2;
+	HANDLE hStdInput;
+	HANDLE hStdOutput;
+	HANDLE hStdError;
+}
+alias STARTUPINFOA* LPSTARTUPINFOA;
+
+struct STARTUPINFOW {
+	DWORD  cb = STARTUPINFOW.sizeof;
+	LPWSTR lpReserved;
+	LPWSTR lpDesktop;
+	LPWSTR lpTitle;
+	DWORD  dwX;
+	DWORD  dwY;
+	DWORD  dwXSize;
+	DWORD  dwYSize;
+	DWORD  dwXCountChars;
+	DWORD  dwYCountChars;
+	DWORD  dwFillAttribute;
+	DWORD  dwFlags;
+	WORD   wShowWindow;
+	WORD   cbReserved2;
+	PBYTE  lpReserved2;
+	HANDLE hStdInput;
+	HANDLE hStdOutput;
+	HANDLE hStdError;
+}
+alias STARTUPINFOW* LPSTARTUPINFOW;
+
+struct PROCESS_INFORMATION {
+	HANDLE hProcess;
+	HANDLE hThread;
+	DWORD  dwProcessId;
+	DWORD  dwThreadId;
+}
+alias PROCESS_INFORMATION* PPROCESS_INFORMATION, LPPROCESS_INFORMATION;
+
+struct CRITICAL_SECTION_DEBUG {
+	WORD              Type;
+	WORD              CreatorBackTraceIndex;
+	CRITICAL_SECTION* CriticalSection;
+	LIST_ENTRY        ProcessLocksList;
+	DWORD             EntryCount;
+	DWORD             ContentionCount;
+	DWORD[2]          Spare;
+}
+alias CRITICAL_SECTION_DEBUG* PCRITICAL_SECTION_DEBUG;
+
+struct CRITICAL_SECTION {
+	PCRITICAL_SECTION_DEBUG DebugInfo;
+	LONG   LockCount;
+	LONG   RecursionCount;
+	HANDLE OwningThread;
+	HANDLE LockSemaphore;
+	DWORD  SpinCount;
+}
+alias CRITICAL_SECTION* PCRITICAL_SECTION, LPCRITICAL_SECTION;
+
+struct SYSTEMTIME {
+	WORD wYear;
+	WORD wMonth;
+	WORD wDayOfWeek;
+	WORD wDay;
+	WORD wHour;
+	WORD wMinute;
+	WORD wSecond;
+	WORD wMilliseconds;
+}
+alias SYSTEMTIME* LPSYSTEMTIME;
+
+static if (_WIN32_WINDOWS >= 0x410) {
+	struct WIN32_FILE_ATTRIBUTE_DATA {
+		DWORD    dwFileAttributes;
+		FILETIME ftCreationTime;
+		FILETIME ftLastAccessTime;
+		FILETIME ftLastWriteTime;
+		DWORD    nFileSizeHigh;
+		DWORD    nFileSizeLow;
+	}
+	alias WIN32_FILE_ATTRIBUTE_DATA* LPWIN32_FILE_ATTRIBUTE_DATA;
+}
+
+struct WIN32_FIND_DATAA {
+	DWORD          dwFileAttributes;
+	FILETIME       ftCreationTime;
+	FILETIME       ftLastAccessTime;
+	FILETIME       ftLastWriteTime;
+	DWORD          nFileSizeHigh;
+	DWORD          nFileSizeLow;
+// #ifdef _WIN32_WCE
+//	DWORD dwOID;
+// #else
+	DWORD          dwReserved0;
+	DWORD          dwReserved1;
+// #endif
+	CHAR[MAX_PATH] cFileName;
+// #ifndef _WIN32_WCE
+	CHAR[14]       cAlternateFileName;
+// #endif
+}
+alias WIN32_FIND_DATAA* PWIN32_FIND_DATAA, LPWIN32_FIND_DATAA;
+
+struct WIN32_FIND_DATAW {
+	DWORD           dwFileAttributes;
+	FILETIME        ftCreationTime;
+	FILETIME        ftLastAccessTime;
+	FILETIME        ftLastWriteTime;
+	DWORD           nFileSizeHigh;
+	DWORD           nFileSizeLow;
+// #ifdef _WIN32_WCE
+// 	DWORD dwOID;
+// #else
+	DWORD           dwReserved0;
+	DWORD           dwReserved1;
+// #endif
+	WCHAR[MAX_PATH] cFileName;
+// #ifndef _WIN32_WCE
+	WCHAR[14]       cAlternateFileName;
+// #endif
+}
+alias WIN32_FIND_DATAW* PWIN32_FIND_DATAW, LPWIN32_FIND_DATAW;
+
+static if (_WIN32_WINNT_ONLY) {
+	struct WIN32_STREAM_ID {
+		DWORD         dwStreamId;
+		DWORD         dwStreamAttributes;
+		LARGE_INTEGER Size;
+		DWORD         dwStreamNameSize;
+		WCHAR         _cStreamName;
+
+		WCHAR* cStreamName() { return &_cStreamName; }
+	}
+	alias WIN32_STREAM_ID* LPWIN32_STREAM_ID;
+
+	enum FINDEX_INFO_LEVELS {
+		FindExInfoStandard,
+		FindExInfoMaxInfoLevel
+	}
+
+	enum FINDEX_SEARCH_OPS {
+		FindExSearchNameMatch,
+		FindExSearchLimitToDirectories,
+		FindExSearchLimitToDevices,
+		FindExSearchMaxSearchOp
+	}
+
+	enum ACL_INFORMATION_CLASS {
+		AclRevisionInformation = 1,
+		AclSizeInformation
+	}
+
+	struct HW_PROFILE_INFOA {
+		DWORD dwDockInfo;
+		CHAR[HW_PROFILE_GUIDLEN] szHwProfileGuid;
+		CHAR[MAX_PROFILE_LEN]    szHwProfileName;
+	}
+	alias HW_PROFILE_INFOA* LPHW_PROFILE_INFOA;
+
+	struct HW_PROFILE_INFOW {
+		DWORD dwDockInfo;
+		WCHAR[HW_PROFILE_GUIDLEN] szHwProfileGuid;
+		WCHAR[MAX_PROFILE_LEN]    szHwProfileName;
+	}
+	alias HW_PROFILE_INFOW* LPHW_PROFILE_INFOW;
+}
+
+/*	??? MSDN documents this only for Windows CE/Mobile, but it's used by
+ *	GetFileAttributesEx, which is in desktop Windows.
+ */
+enum GET_FILEEX_INFO_LEVELS {
+	GetFileExInfoStandard,
+	GetFileExMaxInfoLevel
+}
+
+struct SYSTEM_INFO {
+	union {
+		DWORD dwOemId;
+		struct {
+			WORD wProcessorArchitecture;
+			WORD wReserved;
+		}
+	}
+	DWORD dwPageSize;
+	PVOID lpMinimumApplicationAddress;
+	PVOID lpMaximumApplicationAddress;
+	DWORD dwActiveProcessorMask;
+	DWORD dwNumberOfProcessors;
+	DWORD dwProcessorType;
+	DWORD dwAllocationGranularity;
+	WORD  wProcessorLevel;
+	WORD  wProcessorRevision;
+}
+alias SYSTEM_INFO* LPSYSTEM_INFO;
+
+static if (_WIN32_WINNT_ONLY && _WIN32_WINNT >= 0x500) {
+	struct SYSTEM_POWER_STATUS {
+		BYTE ACLineStatus;
+		BYTE BatteryFlag;
+		BYTE BatteryLifePercent;
+		BYTE Reserved1;
+		DWORD BatteryLifeTime;
+		DWORD BatteryFullLifeTime;
+	}
+	alias SYSTEM_POWER_STATUS* LPSYSTEM_POWER_STATUS;
+}
+
+struct TIME_ZONE_INFORMATION {
+	LONG       Bias;
+	WCHAR[32]  StandardName;
+	SYSTEMTIME StandardDate;
+	LONG       StandardBias;
+	WCHAR[32]  DaylightName;
+	SYSTEMTIME DaylightDate;
+	LONG       DaylightBias;
+}
+alias TIME_ZONE_INFORMATION* LPTIME_ZONE_INFORMATION;
+
+// MSDN documents this, possibly erroneously, as Win2000+.
+struct MEMORYSTATUS {
+	DWORD dwLength;
+	DWORD dwMemoryLoad;
+	DWORD dwTotalPhys;
+	DWORD dwAvailPhys;
+	DWORD dwTotalPageFile;
+	DWORD dwAvailPageFile;
+	DWORD dwTotalVirtual;
+	DWORD dwAvailVirtual;
+}
+alias MEMORYSTATUS* LPMEMORYSTATUS;
+
+static if (_WIN32_WINNT >= 0x500) {
+	struct MEMORYSTATUSEX {
+		DWORD     dwLength;
+		DWORD     dwMemoryLoad;
+		DWORDLONG ullTotalPhys;
+		DWORDLONG ullAvailPhys;
+		DWORDLONG ullTotalPageFile;
+		DWORDLONG ullAvailPageFile;
+		DWORDLONG ullTotalVirtual;
+		DWORDLONG ullAvailVirtual;
+		DWORDLONG ullAvailExtendedVirtual;
+	}
+	alias MEMORYSTATUSEX* LPMEMORYSTATUSEX;
+}
+
+struct LDT_ENTRY {
+	WORD LimitLow;
+	WORD BaseLow;
+	struct {
+		BYTE BaseMid;
+		BYTE Flags1;
+		BYTE Flags2;
+		BYTE BaseHi;
+
+		byte Type(byte f)        { Flags1 = cast(BYTE) ((Flags1 & 0xE0) | f); return cast(byte)(f & 0x1F); }
+		byte Dpl(byte f)         { Flags1 = cast(BYTE) ((Flags1 & 0x9F) | (f<<5)); return cast(byte)(f & 3); }
+		bool Pres(bool f)        { Flags1 = cast(BYTE) ((Flags1 & 0x7F) | (f<<7)); return f; }
+
+		byte LimitHi(byte f)     { Flags2 = cast(BYTE) ((Flags2 & 0xF0) | (f&0x0F)); return cast(byte)(f & 0x0F); }
+		bool Sys(bool f)         { Flags2 = cast(BYTE) ((Flags2 & 0xEF) | (f<<4)); return f; }
+		// Next bit is reserved
+		bool Default_Big(bool f) { Flags2 = cast(BYTE) ((Flags2 & 0xBF) | (f<<6)); return f; }
+		bool Granularity(bool f) { Flags2 = cast(BYTE) ((Flags2 & 0x7F) | (f<<7)); return f; }
+
+		byte Type()        { return cast(byte) (Flags1 & 0x1F); }
+		byte Dpl()         { return cast(byte) ((Flags1 & 0x60)>>5); }
+		bool Pres()        { return cast(bool) (Flags1 & 0x80); }
+
+		byte LimitHi()     { return cast(byte) (Flags2 & 0x0F); }
+		bool Sys()         { return cast(bool) (Flags2 & 0x10); }
+		bool Default_Big() { return cast(bool) (Flags2 & 0x40); }
+		bool Granularity() { return cast(bool) (Flags2 & 0x80); }
+	}
+/+
+	union  HighWord {
+		struct Bytes {
+			BYTE BaseMid;
+			BYTE Flags1;
+			BYTE Flags2;
+			BYTE BaseHi;
+		}
+	struct Bits {
+		DWORD BaseMid:8;
+		DWORD Type:5;
+		DWORD Dpl:2;
+		DWORD Pres:1;
+		DWORD LimitHi:4;
+		DWORD Sys:1;
+		DWORD Reserved_0:1;
+		DWORD Default_Big:1;
+		DWORD Granularity:1;
+		DWORD BaseHi:8;
+	}
+	}
++/
+}
+alias LDT_ENTRY* PLDT_ENTRY, LPLDT_ENTRY;
+
+/*	As with the other memory management functions and structures, MSDN's
+ *	Windows version info shall be taken with a cup of salt.
+ */
+struct PROCESS_HEAP_ENTRY {
+	PVOID lpData;
+	DWORD cbData;
+	BYTE  cbOverhead;
+	BYTE  iRegionIndex;
+	WORD  wFlags;
+	union {
+		struct Block {
+			HANDLE   hMem;
+			DWORD[3] dwReserved;
+		}
+		struct Region {
+			DWORD    dwCommittedSize;
+			DWORD    dwUnCommittedSize;
+			LPVOID   lpFirstBlock;
+			LPVOID   lpLastBlock;
+		}
+	}
+}
+alias PROCESS_HEAP_ENTRY* LPPROCESS_HEAP_ENTRY;
+
+struct OFSTRUCT {
+	BYTE      cBytes = OFSTRUCT.sizeof;
+	BYTE      fFixedDisk;
+	WORD      nErrCode;
+	WORD      Reserved1;
+	WORD      Reserved2;
+	CHAR[128] szPathName; // const OFS_MAXPATHNAME = 128;
+}
+alias OFSTRUCT* LPOFSTRUCT, POFSTRUCT;
+
+/*	??? MSDN documents this only for Windows CE, but it's used by
+ *	ImageGetCertificateData, which is in desktop Windows.
+ */
+struct WIN_CERTIFICATE {
+	DWORD dwLength;
+	WORD  wRevision;
+	WORD  wCertificateType;
+	BYTE  _bCertificate;
+
+	BYTE* bCertificate() { return &_bCertificate; }
+}
+alias WIN_CERTIFICATE* LPWIN_CERTIFICATE;
+
+static if (_WIN32_WINNT >= 0x500) {
+	enum COMPUTER_NAME_FORMAT {
+		ComputerNameNetBIOS,
+		ComputerNameDnsHostname,
+		ComputerNameDnsDomain,
+		ComputerNameDnsFullyQualified,
+		ComputerNamePhysicalNetBIOS,
+		ComputerNamePhysicalDnsHostname,
+		ComputerNamePhysicalDnsDomain,
+		ComputerNamePhysicalDnsFullyQualified,
+		ComputerNameMax
+	}
+}
+
+static if (_WIN32_WINNT >= 0x501) {
+	struct ACTCTXA {
+		ULONG cbSize = this.sizeof;
+		DWORD dwFlags;
+		LPCSTR lpSource;
+		USHORT wProcessorArchitecture;
+		LANGID wLangId;
+		LPCSTR lpAssemblyDirectory;
+		LPCSTR lpResourceName;
+		LPCSTR lpApplicationName;
+		HMODULE hModule;
+	}
+	alias ACTCTXA* PACTCTXA, PCACTCTXA;
+
+	struct ACTCTXW {
+		ULONG cbSize = this.sizeof;
+		DWORD dwFlags;
+		LPCWSTR lpSource;
+		USHORT wProcessorArchitecture;
+		LANGID wLangId;
+		LPCWSTR lpAssemblyDirectory;
+		LPCWSTR lpResourceName;
+		LPCWSTR lpApplicationName;
+		HMODULE hModule;
+	}
+	alias ACTCTXW* PACTCTXW, PCACTCTXW;
+
+	struct ACTCTX_SECTION_KEYED_DATA {
+		ULONG cbSize = this.sizeof;
+		ULONG ulDataFormatVersion;
+		PVOID lpData;
+		ULONG ulLength;
+		PVOID lpSectionGlobalData;
+		ULONG ulSectionGlobalDataLength;
+		PVOID lpSectionBase;
+		ULONG ulSectionTotalLength;
+		HANDLE hActCtx;
+		HANDLE ulAssemblyRosterIndex;
+	}
+	alias ACTCTX_SECTION_KEYED_DATA* PACTCTX_SECTION_KEYED_DATA, PCACTCTX_SECTION_KEYED_DATA;
+
+	enum MEMORY_RESOURCE_NOTIFICATION_TYPE {
+		LowMemoryResourceNotification,
+		HighMemoryResourceNotification
+	}
+
+} // (_WIN32_WINNT >= 0x0501)
+
+static if (WINVER >= 0x410) {
+	/*	apparently used only by SetThreadExecutionState (Win2000+)
+	 *	and DDK functions (version compatibility not established)
+	 */
+	alias DWORD EXECUTION_STATE;
+}
+
+// Callbacks
+extern (Windows) {
+	alias DWORD function(LPVOID) LPTHREAD_START_ROUTINE;
+	alias DWORD function(LARGE_INTEGER, LARGE_INTEGER, LARGE_INTEGER, LARGE_INTEGER,
+		DWORD, DWORD, HANDLE, HANDLE, LPVOID)  LPPROGRESS_ROUTINE;
+	alias void function(PVOID) LPFIBER_START_ROUTINE;
+
+	alias BOOL function(HMODULE, LPCSTR, LPCSTR, WORD, LONG) ENUMRESLANGPROCA;
+	alias BOOL function(HMODULE, LPCWSTR, LPCWSTR, WORD, LONG) ENUMRESLANGPROCW;
+	alias BOOL function(HMODULE, LPCSTR, LPSTR, LONG) ENUMRESNAMEPROCA;
+	alias BOOL function(HMODULE, LPCWSTR, LPWSTR, LONG) ENUMRESNAMEPROCW;
+	alias BOOL function(HMODULE, LPSTR, LONG) ENUMRESTYPEPROCA;
+	alias BOOL function(HMODULE, LPWSTR, LONG) ENUMRESTYPEPROCW;
+	alias void function(DWORD, DWORD, LPOVERLAPPED) LPOVERLAPPED_COMPLETION_ROUTINE;
+	alias LONG function(LPEXCEPTION_POINTERS) PTOP_LEVEL_EXCEPTION_FILTER;
+	alias PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;
+
+	alias void function(ULONG_PTR) PAPCFUNC;
+	alias void function(PVOID, DWORD, DWORD) PTIMERAPCROUTINE;
+
+	static if (_WIN32_WINNT_ONLY && _WIN32_WINNT >= 0x500) {
+		alias void function(PVOID, BOOLEAN) WAITORTIMERCALLBACK;
+	}
+}
+
+LPTSTR MAKEINTATOM(short i) {
+	return cast(LPTSTR) i;
+}
+
+extern (Windows) {
+	ATOM AddAtomA(LPCSTR);
+	ATOM AddAtomW(LPCWSTR);
+	BOOL AreFileApisANSI();
+	BOOL Beep(DWORD, DWORD);
+	HANDLE BeginUpdateResourceA(LPCSTR, BOOL);
+	HANDLE BeginUpdateResourceW(LPCWSTR, BOOL);
+	BOOL BuildCommDCBA(LPCSTR, LPDCB);
+	BOOL BuildCommDCBW(LPCWSTR, LPDCB);
+	BOOL BuildCommDCBAndTimeoutsA(LPCSTR, LPDCB, LPCOMMTIMEOUTS);
+	BOOL BuildCommDCBAndTimeoutsW(LPCWSTR, LPDCB, LPCOMMTIMEOUTS);
+	BOOL CallNamedPipeA(LPCSTR, PVOID, DWORD, PVOID, DWORD, PDWORD, DWORD);
+	BOOL CallNamedPipeW(LPCWSTR, PVOID, DWORD, PVOID, DWORD, PDWORD, DWORD);
+	BOOL CancelDeviceWakeupRequest(HANDLE);
+	BOOL CheckTokenMembership(HANDLE, PSID, PBOOL);
+	BOOL ClearCommBreak(HANDLE);
+	BOOL ClearCommError(HANDLE, PDWORD, LPCOMSTAT);
+	BOOL CloseHandle(HANDLE);
+	BOOL CommConfigDialogA(LPCSTR, HWND, LPCOMMCONFIG);
+	BOOL CommConfigDialogW(LPCWSTR, HWND, LPCOMMCONFIG);
+	LONG CompareFileTime(FILETIME*, FILETIME*);
+	BOOL ContinueDebugEvent(DWORD, DWORD, DWORD);
+	BOOL CopyFileA(LPCSTR, LPCSTR, BOOL);
+	BOOL CopyFileW(LPCWSTR, LPCWSTR, BOOL);
+	BOOL CopyFileExA(LPCSTR, LPCSTR, LPPROGRESS_ROUTINE, LPVOID, LPBOOL, DWORD);
+	BOOL CopyFileExW(LPCWSTR, LPCWSTR, LPPROGRESS_ROUTINE, LPVOID, LPBOOL, DWORD);
+
+	/+ FIXME
+	alias memmove RtlMoveMemory;
+	alias memcpy RtlCopyMemory;
+
+	void RtlFillMemory(PVOID dest, SIZE_T len, BYTE fill) {
+		memset(dest, fill, len);
+	}
+
+	void RtlZeroMemory(PVOID dest, SIZE_T len) {
+		RtlFillMemory(dest, len , 0);
+	}
+
+	alias RtlMoveMemory MoveMemory;
+	alias RtlCopyMemory CopyMemory;
+	alias RtlFillMemory FillMemory;
+	alias RtlZeroMemory ZeroMemory;
+	+/
+	BOOL CreateDirectoryA(LPCSTR, LPSECURITY_ATTRIBUTES);
+	BOOL CreateDirectoryW(LPCWSTR, LPSECURITY_ATTRIBUTES);
+	BOOL CreateDirectoryExA(LPCSTR, LPCSTR, LPSECURITY_ATTRIBUTES);
+	BOOL CreateDirectoryExW(LPCWSTR, LPCWSTR, LPSECURITY_ATTRIBUTES);
+	HANDLE CreateEventA(LPSECURITY_ATTRIBUTES, BOOL, BOOL, LPCSTR);
+	HANDLE CreateEventW(LPSECURITY_ATTRIBUTES, BOOL, BOOL, LPCWSTR);
+	HANDLE CreateFileA(LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);
+	HANDLE CreateFileW(LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);
+	HANDLE CreateIoCompletionPort(HANDLE, HANDLE, ULONG_PTR, DWORD);
+	HANDLE CreateMailslotA(LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES);
+	HANDLE CreateMailslotW(LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES);
+	HANDLE CreateMutexA(LPSECURITY_ATTRIBUTES, BOOL, LPCSTR);
+	HANDLE CreateMutexW(LPSECURITY_ATTRIBUTES, BOOL, LPCWSTR);
+	BOOL CreatePipe(PHANDLE, PHANDLE, LPSECURITY_ATTRIBUTES, DWORD);
+	BOOL CreateProcessA(LPCSTR, LPSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, BOOL, DWORD, PVOID, LPCSTR, LPSTARTUPINFOA, LPPROCESS_INFORMATION);
+	BOOL CreateProcessW(LPCWSTR, LPWSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, BOOL, DWORD, PVOID, LPCWSTR, LPSTARTUPINFOW, LPPROCESS_INFORMATION);
+	HANDLE CreateSemaphoreA(LPSECURITY_ATTRIBUTES, LONG, LONG, LPCSTR);
+	HANDLE CreateSemaphoreW(LPSECURITY_ATTRIBUTES, LONG, LONG, LPCWSTR);
+	HANDLE CreateThread(LPSECURITY_ATTRIBUTES, DWORD, LPTHREAD_START_ROUTINE, PVOID, DWORD, PDWORD);
+	BOOL DebugActiveProcess(DWORD);
+	void DebugBreak();
+	ATOM DeleteAtom(ATOM);
+	void DeleteCriticalSection(PCRITICAL_SECTION);
+	BOOL DeleteFileA(LPCSTR);
+	BOOL DeleteFileW(LPCWSTR);
+	BOOL DisableThreadLibraryCalls(HMODULE);
+	BOOL DosDateTimeToFileTime(WORD, WORD, LPFILETIME);
+	BOOL DuplicateHandle(HANDLE, HANDLE, HANDLE, PHANDLE, DWORD, BOOL, DWORD);
+	BOOL EndUpdateResourceA(HANDLE, BOOL);
+	BOOL EndUpdateResourceW(HANDLE, BOOL);
+	void EnterCriticalSection(LPCRITICAL_SECTION);
+	BOOL EnumResourceLanguagesA(HMODULE, LPCSTR, LPCSTR, ENUMRESLANGPROC, LONG_PTR);
+	BOOL EnumResourceLanguagesW(HMODULE, LPCWSTR, LPCWSTR, ENUMRESLANGPROC, LONG_PTR);
+	BOOL EnumResourceNamesA(HMODULE, LPCSTR, ENUMRESNAMEPROC, LONG_PTR);
+	BOOL EnumResourceNamesW(HMODULE, LPCWSTR, ENUMRESNAMEPROC, LONG_PTR);
+	BOOL EnumResourceTypesA(HMODULE, ENUMRESTYPEPROC, LONG_PTR);
+	BOOL EnumResourceTypesW(HMODULE, ENUMRESTYPEPROC, LONG_PTR);
+	BOOL EscapeCommFunction(HANDLE, DWORD);
+	void ExitProcess(UINT); // Never returns
+	void ExitThread(DWORD); // Never returns
+	DWORD ExpandEnvironmentStringsA(LPCSTR, LPSTR, DWORD);
+	DWORD ExpandEnvironmentStringsW(LPCWSTR, LPWSTR, DWORD);
+	void FatalAppExitA(UINT, LPCSTR);
+	void FatalAppExitW(UINT, LPCWSTR);
+	void FatalExit(int);
+	BOOL FileTimeToDosDateTime(FILETIME* , LPWORD, LPWORD);
+	BOOL FileTimeToLocalFileTime(FILETIME* , LPFILETIME);
+	BOOL FileTimeToSystemTime(FILETIME* , LPSYSTEMTIME);
+	ATOM FindAtomA(LPCSTR);
+	ATOM FindAtomW(LPCWSTR);
+	BOOL FindClose(HANDLE);
+	BOOL FindCloseChangeNotification(HANDLE);
+	HANDLE FindFirstChangeNotificationA(LPCSTR, BOOL, DWORD);
+	HANDLE FindFirstChangeNotificationW(LPCWSTR, BOOL, DWORD);
+	HANDLE FindFirstFileA(LPCSTR, LPWIN32_FIND_DATAA);
+	HANDLE FindFirstFileW(LPCWSTR, LPWIN32_FIND_DATAW);
+	BOOL FindNextChangeNotification(HANDLE);
+	BOOL FindNextFileA(HANDLE, LPWIN32_FIND_DATAA);
+	BOOL FindNextFileW(HANDLE, LPWIN32_FIND_DATAW);
+	HRSRC FindResourceA(HMODULE, LPCSTR, LPCSTR);
+	HRSRC FindResourceW(HINSTANCE, LPCWSTR, LPCWSTR);
+	HRSRC FindResourceExA(HINSTANCE, LPCSTR, LPCSTR, WORD);
+	HRSRC FindResourceExW(HINSTANCE, LPCWSTR, LPCWSTR, WORD);
+	BOOL FlushFileBuffers(HANDLE);
+	BOOL FlushInstructionCache(HANDLE, PCVOID, DWORD);
+	DWORD FormatMessageA(DWORD, PCVOID, DWORD, DWORD, LPSTR, DWORD, va_list*);
+	DWORD FormatMessageW(DWORD, PCVOID, DWORD, DWORD, LPWSTR, DWORD, va_list*);
+	BOOL FreeEnvironmentStringsA(LPSTR);
+	BOOL FreeEnvironmentStringsW(LPWSTR);
+	BOOL FreeLibrary(HMODULE);
+	void FreeLibraryAndExitThread(HMODULE, DWORD); // never returns
+	BOOL FreeResource(HGLOBAL);
+	UINT GetAtomNameA(ATOM, LPSTR, int);
+	UINT GetAtomNameW(ATOM, LPWSTR, int);
+	LPSTR GetCommandLineA();
+	LPWSTR GetCommandLineW();
+	BOOL GetCommConfig(HANDLE, LPCOMMCONFIG, PDWORD);
+	BOOL GetCommMask(HANDLE, PDWORD);
+	BOOL GetCommModemStatus(HANDLE, PDWORD);
+	BOOL GetCommProperties(HANDLE, LPCOMMPROP);
+	BOOL GetCommState(HANDLE, LPDCB);
+	BOOL GetCommTimeouts(HANDLE, LPCOMMTIMEOUTS);
+	BOOL GetComputerNameA(LPSTR, PDWORD);
+	BOOL GetComputerNameW(LPWSTR, PDWORD);
+	DWORD GetCurrentDirectoryA(DWORD, LPSTR);
+	DWORD GetCurrentDirectoryW(DWORD, LPWSTR);
+	HANDLE GetCurrentProcess();
+	DWORD GetCurrentProcessId();
+	HANDLE GetCurrentThread();
+/* In MinGW:
+#ifdef _WIN32_WCE
+extern DWORD GetCurrentThreadId(void);
+#else
+WINBASEAPI DWORD WINAPI GetCurrentThreadId(void);
+#endif
+*/
+	DWORD GetCurrentThreadId();
+
+	alias GetTickCount GetCurrentTime;
+
+	BOOL GetDefaultCommConfigA(LPCSTR, LPCOMMCONFIG, PDWORD);
+	BOOL GetDefaultCommConfigW(LPCWSTR, LPCOMMCONFIG, PDWORD);
+	BOOL GetDiskFreeSpaceA(LPCSTR, PDWORD, PDWORD, PDWORD, PDWORD);
+	BOOL GetDiskFreeSpaceW(LPCWSTR, PDWORD, PDWORD, PDWORD, PDWORD);
+	BOOL GetDiskFreeSpaceExA(LPCSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER);
+	BOOL GetDiskFreeSpaceExW(LPCWSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER);
+	UINT GetDriveTypeA(LPCSTR);
+	UINT GetDriveTypeW(LPCWSTR);
+	LPSTR GetEnvironmentStrings(); // ???
+	LPSTR GetEnvironmentStringsA();
+	LPWSTR GetEnvironmentStringsW();
+	DWORD GetEnvironmentVariableA(LPCSTR, LPSTR, DWORD);
+	DWORD GetEnvironmentVariableW(LPCWSTR, LPWSTR, DWORD);
+	BOOL GetExitCodeProcess(HANDLE, PDWORD);
+	BOOL GetExitCodeThread(HANDLE, PDWORD);
+	DWORD GetFileAttributesA(LPCSTR);
+	DWORD GetFileAttributesW(LPCWSTR);
+	BOOL GetFileInformationByHandle(HANDLE, LPBY_HANDLE_FILE_INFORMATION);
+	DWORD GetFileSize(HANDLE, PDWORD);
+	BOOL GetFileTime(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME);
+	DWORD GetFileType(HANDLE);
+	DWORD GetFullPathNameA(LPCSTR, DWORD, LPSTR, LPSTR*);
+	DWORD GetFullPathNameW(LPCWSTR, DWORD, LPWSTR, LPWSTR*);
+	DWORD GetLastError();
+	void GetLocalTime(LPSYSTEMTIME);
+	DWORD GetLogicalDrives();
+	DWORD GetLogicalDriveStringsA(DWORD, LPSTR);
+	DWORD GetLogicalDriveStringsW(DWORD, LPWSTR);
+	BOOL GetMailslotInfo(HANDLE, PDWORD, PDWORD, PDWORD, PDWORD);
+	DWORD GetModuleFileNameA(HINSTANCE, LPSTR, DWORD);
+	DWORD GetModuleFileNameW(HINSTANCE, LPWSTR, DWORD);
+	HMODULE GetModuleHandleA(LPCSTR);
+	HMODULE GetModuleHandleW(LPCWSTR);
+	BOOL GetNamedPipeHandleStateA(HANDLE, PDWORD, PDWORD, PDWORD, PDWORD, LPSTR, DWORD);
+	BOOL GetNamedPipeHandleStateW(HANDLE, PDWORD, PDWORD, PDWORD, PDWORD, LPWSTR, DWORD);
+	BOOL GetNamedPipeInfo(HANDLE, PDWORD, PDWORD, PDWORD, PDWORD);
+	BOOL GetOverlappedResult(HANDLE, LPOVERLAPPED, PDWORD, BOOL);
+	DWORD GetPriorityClass(HANDLE);
+	UINT GetPrivateProfileIntA(LPCSTR, LPCSTR, INT, LPCSTR);
+	UINT GetPrivateProfileIntW(LPCWSTR, LPCWSTR, INT, LPCWSTR);
+	DWORD GetPrivateProfileSectionA(LPCSTR, LPSTR, DWORD, LPCSTR);
+	DWORD GetPrivateProfileSectionW(LPCWSTR, LPWSTR, DWORD, LPCWSTR);
+	DWORD GetPrivateProfileSectionNamesA(LPSTR, DWORD, LPCSTR);
+	DWORD GetPrivateProfileSectionNamesW(LPWSTR, DWORD, LPCWSTR);
+	DWORD GetPrivateProfileStringA(LPCSTR, LPCSTR, LPCSTR, LPSTR, DWORD, LPCSTR);
+	DWORD GetPrivateProfileStringW(LPCWSTR, LPCWSTR, LPCWSTR, LPWSTR, DWORD, LPCWSTR);
+	BOOL GetPrivateProfileStructA(LPCSTR, LPCSTR, LPVOID, UINT, LPCSTR);
+	BOOL GetPrivateProfileStructW(LPCWSTR, LPCWSTR, LPVOID, UINT, LPCWSTR);
+	FARPROC GetProcAddress(HINSTANCE, LPCSTR);
+	BOOL GetProcessAffinityMask(HANDLE, PDWORD, PDWORD);
+	DWORD GetProcessVersion(DWORD);
+	UINT GetProfileIntA(LPCSTR, LPCSTR, INT);
+	UINT GetProfileIntW(LPCWSTR, LPCWSTR, INT);
+	DWORD GetProfileSectionA(LPCSTR, LPSTR, DWORD);
+	DWORD GetProfileSectionW(LPCWSTR, LPWSTR, DWORD);
+	DWORD GetProfileStringA(LPCSTR, LPCSTR, LPCSTR, LPSTR, DWORD);
+	DWORD GetProfileStringW(LPCWSTR, LPCWSTR, LPCWSTR, LPWSTR, DWORD);
+	DWORD GetShortPathNameA(LPCSTR, LPSTR, DWORD);
+	DWORD GetShortPathNameW(LPCWSTR, LPWSTR, DWORD);
+	VOID GetStartupInfoA(LPSTARTUPINFOA);
+	VOID GetStartupInfoW(LPSTARTUPINFOW);
+	HANDLE GetStdHandle(DWORD);
+	UINT GetSystemDirectoryA(LPSTR, UINT);
+	UINT GetSystemDirectoryW(LPWSTR, UINT);
+	VOID GetSystemInfo(LPSYSTEM_INFO);
+	VOID GetSystemTime(LPSYSTEMTIME);
+	BOOL GetSystemTimeAdjustment(PDWORD, PDWORD, PBOOL);
+	void GetSystemTimeAsFileTime(LPFILETIME);
+	UINT GetTempFileNameA(LPCSTR, LPCSTR, UINT, LPSTR);
+	UINT GetTempFileNameW(LPCWSTR, LPCWSTR, UINT, LPWSTR);
+	DWORD GetTempPathA(DWORD, LPSTR);
+	DWORD GetTempPathW(DWORD, LPWSTR);
+	BOOL GetThreadContext(HANDLE, LPCONTEXT);
+	int GetThreadPriority(HANDLE);
+	BOOL GetThreadSelectorEntry(HANDLE, DWORD, LPLDT_ENTRY);
+	DWORD GetTickCount();
+	DWORD GetTimeZoneInformation(LPTIME_ZONE_INFORMATION);
+	BOOL GetUserNameA (LPSTR, PDWORD);
+	BOOL GetUserNameW(LPWSTR, PDWORD);
+	DWORD GetVersion();
+	BOOL GetVersionExA(LPOSVERSIONINFOA);
+	BOOL GetVersionExW(LPOSVERSIONINFOW);
+	BOOL GetVolumeInformationA(LPCSTR, LPSTR, DWORD, PDWORD, PDWORD, PDWORD, LPSTR, DWORD);
+	BOOL GetVolumeInformationW(LPCWSTR, LPWSTR, DWORD, PDWORD, PDWORD, PDWORD, LPWSTR, DWORD);
+	UINT GetWindowsDirectoryA(LPSTR, UINT);
+	UINT GetWindowsDirectoryW(LPWSTR, UINT);
+	DWORD GetWindowThreadProcessId(HWND, PDWORD);
+	ATOM GlobalAddAtomA(LPCSTR);
+	ATOM GlobalAddAtomW(LPCWSTR);
+	ATOM GlobalDeleteAtom(ATOM);
+	ATOM GlobalFindAtomA(LPCSTR);
+	ATOM GlobalFindAtomW(LPCWSTR);
+	UINT GlobalGetAtomNameA(ATOM, LPSTR, int);
+	UINT GlobalGetAtomNameW(ATOM, LPWSTR, int);
+
+	bool HasOverlappedIoCompleted(LPOVERLAPPED lpOverlapped) {
+		return lpOverlapped.Internal != STATUS_PENDING;
+	}
+
+	BOOL InitAtomTable(DWORD);
+	VOID InitializeCriticalSection(LPCRITICAL_SECTION);
+	/*	??? The next two are allegedly obsolete and "supported only for
+	 *	backward compatibility with the 16-bit Windows API".  Yet the
+	 *	replacements IsBadReadPtr and IsBadWritePtr are apparently Win2000+
+	 *	only.  Where's the mistake?
+	 */
+	BOOL IsBadHugeReadPtr(PCVOID, UINT);
+	BOOL IsBadHugeWritePtr(PVOID, UINT);
+	BOOL IsBadReadPtr(PCVOID, UINT);
+	BOOL IsBadStringPtrA(LPCSTR, UINT);
+	BOOL IsBadStringPtrW(LPCWSTR, UINT);
+	BOOL IsBadWritePtr(PVOID, UINT);
+	void LeaveCriticalSection(LPCRITICAL_SECTION);
+	HINSTANCE LoadLibraryA(LPCSTR);
+	HINSTANCE LoadLibraryW(LPCWSTR);
+	HINSTANCE LoadLibraryExA(LPCSTR, HANDLE, DWORD);
+	HINSTANCE LoadLibraryExW(LPCWSTR, HANDLE, DWORD);
+	DWORD LoadModule(LPCSTR, PVOID);
+	HGLOBAL LoadResource(HINSTANCE, HRSRC);
+	BOOL LocalFileTimeToFileTime(FILETIME* , LPFILETIME);
+	BOOL LockFile(HANDLE, DWORD, DWORD, DWORD, DWORD);
+	PVOID LockResource(HGLOBAL);
+
+	LPSTR lstrcatA(LPSTR, LPCSTR);
+	LPWSTR lstrcatW(LPWSTR, LPCWSTR);
+	int lstrcmpA(LPCSTR, LPCSTR);
+	int lstrcmpiA(LPCSTR, LPCSTR);
+	int lstrcmpiW(LPCWSTR, LPCWSTR);
+	int lstrcmpW(LPCWSTR, LPCWSTR);
+	LPSTR lstrcpyA(LPSTR, LPCSTR);
+	LPSTR lstrcpynA(LPSTR, LPCSTR, int);
+	LPWSTR lstrcpynW(LPWSTR, LPCWSTR, int);
+	LPWSTR lstrcpyW(LPWSTR, LPCWSTR);
+	int lstrlenA(LPCSTR);
+	int lstrlenW(LPCWSTR);
+
+	BOOL MoveFileA(LPCSTR, LPCSTR);
+	BOOL MoveFileW(LPCWSTR, LPCWSTR);
+	int MulDiv(int, int, int);
+	HANDLE OpenEventA(DWORD, BOOL, LPCSTR);
+	HANDLE OpenEventW(DWORD, BOOL, LPCWSTR);
+	deprecated HFILE OpenFile(LPCSTR, LPOFSTRUCT, UINT);
+	HANDLE OpenMutexA(DWORD, BOOL, LPCSTR);
+	HANDLE OpenMutexW(DWORD, BOOL, LPCWSTR);
+	HANDLE OpenProcess(DWORD, BOOL, DWORD);
+	HANDLE OpenSemaphoreA(DWORD, BOOL, LPCSTR);
+	HANDLE OpenSemaphoreW(DWORD, BOOL, LPCWSTR);
+	void OutputDebugStringA(LPCSTR);
+	void OutputDebugStringW(LPCWSTR);
+	BOOL PeekNamedPipe(HANDLE, PVOID, DWORD, PDWORD, PDWORD, PDWORD);
+	BOOL PulseEvent(HANDLE);
+	BOOL PurgeComm(HANDLE, DWORD);
+	BOOL QueryPerformanceCounter(PLARGE_INTEGER);
+	BOOL QueryPerformanceFrequency(PLARGE_INTEGER);
+	DWORD QueueUserAPC(PAPCFUNC, HANDLE, ULONG_PTR);
+	void RaiseException(DWORD, DWORD, DWORD, DWORD*);
+	BOOL ReadFile(HANDLE, PVOID, DWORD, PDWORD, LPOVERLAPPED);
+	BOOL ReadFileEx(HANDLE, PVOID, DWORD, LPOVERLAPPED, LPOVERLAPPED_COMPLETION_ROUTINE);
+	BOOL ReadProcessMemory(HANDLE, PCVOID, PVOID, DWORD, PDWORD);
+	BOOL ReleaseMutex(HANDLE);
+	BOOL ReleaseSemaphore(HANDLE, LONG, LPLONG);
+	BOOL RemoveDirectoryA(LPCSTR);
+	BOOL RemoveDirectoryW(LPCWSTR);
+/* In MinGW:
+#ifdef _WIN32_WCE
+extern BOOL ResetEvent(HANDLE);
+#else
+WINBASEAPI BOOL WINAPI ResetEvent(HANDLE);
+#endif
+*/
+	BOOL ResetEvent(HANDLE);
+	DWORD ResumeThread(HANDLE);
+	DWORD SearchPathA(LPCSTR, LPCSTR, LPCSTR, DWORD, LPSTR, LPSTR*);
+	DWORD SearchPathW(LPCWSTR, LPCWSTR, LPCWSTR, DWORD, LPWSTR, LPWSTR*);
+	BOOL SetCommBreak(HANDLE);
+	BOOL SetCommConfig(HANDLE, LPCOMMCONFIG, DWORD);
+	BOOL SetCommMask(HANDLE, DWORD);
+	BOOL SetCommState(HANDLE, LPDCB);
+	BOOL SetCommTimeouts(HANDLE, LPCOMMTIMEOUTS);
+	BOOL SetComputerNameA(LPCSTR);
+	BOOL SetComputerNameW(LPCWSTR);
+	BOOL SetCurrentDirectoryA(LPCSTR);
+	BOOL SetCurrentDirectoryW(LPCWSTR);
+	BOOL SetDefaultCommConfigA(LPCSTR, LPCOMMCONFIG, DWORD);
+	BOOL SetDefaultCommConfigW(LPCWSTR, LPCOMMCONFIG, DWORD);
+	BOOL SetEndOfFile(HANDLE);
+	BOOL SetEnvironmentVariableA(LPCSTR, LPCSTR);
+	BOOL SetEnvironmentVariableW(LPCWSTR, LPCWSTR);
+	UINT SetErrorMode(UINT);
+/* In MinGW:
+#ifdef _WIN32_WCE
+extern BOOL SetEvent(HANDLE);
+#else
+WINBASEAPI BOOL WINAPI SetEvent(HANDLE);
+#endif
+*/
+	BOOL SetEvent(HANDLE);
+	VOID SetFileApisToANSI();
+	VOID SetFileApisToOEM();
+	BOOL SetFileAttributesA(LPCSTR, DWORD);
+	BOOL SetFileAttributesW(LPCWSTR, DWORD);
+	DWORD SetFilePointer(HANDLE, LONG, PLONG, DWORD);
+	BOOL SetFileTime(HANDLE, FILETIME*, FILETIME*, FILETIME*);
+	deprecated UINT SetHandleCount(UINT);
+	void SetLastError(DWORD);
+	void SetLastErrorEx(DWORD, DWORD);
+	BOOL SetLocalTime(SYSTEMTIME*);
+	BOOL SetMailslotInfo(HANDLE, DWORD);
+	BOOL SetNamedPipeHandleState(HANDLE, PDWORD, PDWORD, PDWORD);
+	BOOL SetPriorityClass(HANDLE, DWORD);
+	BOOL SetStdHandle(DWORD, HANDLE);
+	BOOL SetSystemTime(SYSTEMTIME*);
+	DWORD SetThreadAffinityMask(HANDLE, DWORD);
+	BOOL SetThreadContext(HANDLE, CONTEXT*);
+	BOOL SetThreadPriority(HANDLE, int);
+	BOOL SetTimeZoneInformation(TIME_ZONE_INFORMATION*);
+	LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER);
+	BOOL SetupComm(HANDLE, DWORD, DWORD);
+	BOOL SetVolumeLabelA(LPCSTR, LPCSTR);
+	BOOL SetVolumeLabelW(LPCWSTR, LPCWSTR);
+
+	DWORD SizeofResource(HINSTANCE, HRSRC);
+	void Sleep(DWORD);
+	DWORD SleepEx(DWORD, BOOL);
+	DWORD SuspendThread(HANDLE);
+	BOOL SystemTimeToFileTime(SYSTEMTIME*, LPFILETIME);
+	BOOL TerminateProcess(HANDLE, UINT);
+	BOOL TerminateThread(HANDLE, DWORD);
+	DWORD TlsAlloc();
+	BOOL TlsFree(DWORD);
+	PVOID TlsGetValue(DWORD);
+	BOOL TlsSetValue(DWORD, PVOID);
+	BOOL TransactNamedPipe(HANDLE, PVOID, DWORD, PVOID, DWORD, PDWORD, LPOVERLAPPED);
+	BOOL TransmitCommChar(HANDLE, char);
+	LONG UnhandledExceptionFilter(LPEXCEPTION_POINTERS);
+	BOOL UnlockFile(HANDLE, DWORD, DWORD, DWORD, DWORD);
+	BOOL WaitCommEvent(HANDLE, PDWORD, LPOVERLAPPED);
+	BOOL WaitForDebugEvent(LPDEBUG_EVENT, DWORD);
+	DWORD WaitForMultipleObjects(DWORD, HANDLE*, BOOL, DWORD);
+	DWORD WaitForMultipleObjectsEx(DWORD, HANDLE*, BOOL, DWORD, BOOL);
+	DWORD WaitForSingleObject(HANDLE, DWORD);
+	DWORD WaitForSingleObjectEx(HANDLE, DWORD, BOOL);
+	BOOL WaitNamedPipeA(LPCSTR, DWORD);
+	BOOL WaitNamedPipeW(LPCWSTR, DWORD);
+	// undocumented on MSDN
+	BOOL WinLoadTrustProvider(GUID*);
+	BOOL WriteFile(HANDLE, PCVOID, DWORD, PDWORD, LPOVERLAPPED);
+	BOOL WriteFileEx(HANDLE, PCVOID, DWORD, LPOVERLAPPED, LPOVERLAPPED_COMPLETION_ROUTINE);
+	BOOL WritePrivateProfileSectionA(LPCSTR, LPCSTR, LPCSTR);
+	BOOL WritePrivateProfileSectionW(LPCWSTR, LPCWSTR, LPCWSTR);
+	BOOL WritePrivateProfileStringA(LPCSTR, LPCSTR, LPCSTR, LPCSTR);
+	BOOL WritePrivateProfileStringW(LPCWSTR, LPCWSTR, LPCWSTR, LPCWSTR);
+	BOOL WritePrivateProfileStructA(LPCSTR, LPCSTR, LPVOID, UINT, LPCSTR);
+	BOOL WritePrivateProfileStructW(LPCWSTR, LPCWSTR, LPVOID, UINT, LPCWSTR);
+	BOOL WriteProcessMemory(HANDLE, LPVOID, LPCVOID, SIZE_T, SIZE_T*);
+	BOOL WriteProfileSectionA(LPCSTR, LPCSTR);
+	BOOL WriteProfileSectionW(LPCWSTR, LPCWSTR);
+	BOOL WriteProfileStringA(LPCSTR, LPCSTR, LPCSTR);
+	BOOL WriteProfileStringW(LPCWSTR, LPCWSTR, LPCWSTR);
+
+	/*	Memory allocation functions.
+	 *	MSDN documents these erroneously as Win2000+; thus it is uncertain what
+	 *	version compatibility they really have.
+	 */
+	HGLOBAL GlobalAlloc(UINT, DWORD);
+	HGLOBAL GlobalDiscard(HGLOBAL);
+	HGLOBAL GlobalFree(HGLOBAL);
+	HGLOBAL GlobalHandle(PCVOID);
+	LPVOID GlobalLock(HGLOBAL);
+	VOID GlobalMemoryStatus(LPMEMORYSTATUS);
+	HGLOBAL GlobalReAlloc(HGLOBAL, DWORD, UINT);
+	DWORD GlobalSize(HGLOBAL);
+	BOOL GlobalUnlock(HGLOBAL);
+	PVOID HeapAlloc(HANDLE, DWORD, DWORD);
+	SIZE_T HeapCompact(HANDLE, DWORD);
+	HANDLE HeapCreate(DWORD, DWORD, DWORD);
+	BOOL HeapDestroy(HANDLE);
+	BOOL HeapFree(HANDLE, DWORD, PVOID);
+	BOOL HeapLock(HANDLE);
+	PVOID HeapReAlloc(HANDLE, DWORD, PVOID, DWORD);
+	DWORD HeapSize(HANDLE, DWORD, PCVOID);
+	BOOL HeapUnlock(HANDLE);
+	BOOL HeapValidate(HANDLE, DWORD, PCVOID);
+	BOOL HeapWalk(HANDLE, LPPROCESS_HEAP_ENTRY);
+	HLOCAL LocalAlloc(UINT, SIZE_T);
+	HLOCAL LocalDiscard(HLOCAL);
+	HLOCAL LocalFree(HLOCAL);
+	HLOCAL LocalHandle(LPCVOID);
+	PVOID LocalLock(HLOCAL);
+	HLOCAL LocalReAlloc(HLOCAL, SIZE_T, UINT);
+	UINT LocalSize(HLOCAL);
+	BOOL LocalUnlock(HLOCAL);
+	PVOID VirtualAlloc(PVOID, DWORD, DWORD, DWORD);
+	PVOID VirtualAllocEx(HANDLE, PVOID, DWORD, DWORD, DWORD);
+	BOOL VirtualFree(PVOID, DWORD, DWORD);
+	BOOL VirtualFreeEx(HANDLE, PVOID, DWORD, DWORD);
+	BOOL VirtualLock(PVOID, DWORD);
+	BOOL VirtualProtect(PVOID, DWORD, DWORD, PDWORD);
+	BOOL VirtualProtectEx(HANDLE, PVOID, DWORD, DWORD, PDWORD);
+	DWORD VirtualQuery(LPCVOID, PMEMORY_BASIC_INFORMATION, DWORD);
+	DWORD VirtualQueryEx(HANDLE, LPCVOID, PMEMORY_BASIC_INFORMATION, DWORD);
+	BOOL VirtualUnlock(PVOID, DWORD);
+
+	static if (_WIN32_WINDOWS >= 0x600) {
+		BOOL CancelIoEx(HANDLE, LPOVERLAPPED);
+	}
+
+	static if (_WIN32_WINDOWS >= 0x410) {
+		BOOL CancelIo(HANDLE);
+		BOOL CancelWaitableTimer(HANDLE);
+		PVOID ConvertThreadToFiber(PVOID);
+		LPVOID CreateFiber(SIZE_T, LPFIBER_START_ROUTINE, LPVOID);
+		HANDLE CreateWaitableTimerA(LPSECURITY_ATTRIBUTES, BOOL, LPCSTR);
+		HANDLE CreateWaitableTimerW(LPSECURITY_ATTRIBUTES, BOOL, LPCWSTR);
+		void DeleteFiber(PVOID);
+		BOOL GetFileAttributesExA(LPCSTR, GET_FILEEX_INFO_LEVELS, PVOID);
+		BOOL GetFileAttributesExW(LPCWSTR, GET_FILEEX_INFO_LEVELS, PVOID);
+		DWORD GetLongPathNameA(LPCSTR, LPSTR, DWORD);
+		DWORD GetLongPathNameW(LPCWSTR, LPWSTR, DWORD);
+		BOOL InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION, DWORD);
+		BOOL IsDebuggerPresent();
+		HANDLE OpenWaitableTimerA(DWORD, BOOL, LPCSTR);
+		HANDLE OpenWaitableTimerW(DWORD, BOOL, LPCWSTR);
+		DWORD QueryDosDeviceA(LPCSTR, LPSTR, DWORD);
+		DWORD QueryDosDeviceW(LPCWSTR, LPWSTR, DWORD);
+		BOOL SetWaitableTimer(HANDLE, LARGE_INTEGER*, LONG, PTIMERAPCROUTINE, PVOID, BOOL);
+		void SwitchToFiber(PVOID);
+	}
+
+	static if (WINVER >= 0x500) {
+		HANDLE OpenThread(DWORD, BOOL, DWORD);
+	}
+
+	static if (_WIN32_WINNT_ONLY) {
+		BOOL AccessCheck(PSECURITY_DESCRIPTOR, HANDLE, DWORD, PGENERIC_MAPPING, PPRIVILEGE_SET, PDWORD, PDWORD, PBOOL);
+		BOOL AccessCheckAndAuditAlarmA(LPCSTR, LPVOID, LPSTR, LPSTR, PSECURITY_DESCRIPTOR, DWORD, PGENERIC_MAPPING, BOOL, PDWORD, PBOOL, PBOOL);
+		BOOL AccessCheckAndAuditAlarmW(LPCWSTR, LPVOID, LPWSTR, LPWSTR, PSECURITY_DESCRIPTOR, DWORD, PGENERIC_MAPPING, BOOL, PDWORD, PBOOL, PBOOL);
+		BOOL AddAccessAllowedAce(PACL, DWORD, DWORD, PSID);
+		BOOL AddAccessDeniedAce(PACL, DWORD, DWORD, PSID);
+		BOOL AddAce(PACL, DWORD, DWORD, PVOID, DWORD);
+		BOOL AddAuditAccessAce(PACL, DWORD, DWORD, PSID, BOOL, BOOL);
+		BOOL AdjustTokenGroups(HANDLE, BOOL, PTOKEN_GROUPS, DWORD, PTOKEN_GROUPS, PDWORD);
+		BOOL AdjustTokenPrivileges(HANDLE, BOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, PDWORD);
+		BOOL AllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY, BYTE, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, PSID*);
+		BOOL AllocateLocallyUniqueId(PLUID);
+		BOOL AreAllAccessesGranted(DWORD, DWORD);
+		BOOL AreAnyAccessesGranted(DWORD, DWORD);
+		BOOL BackupEventLogA(HANDLE, LPCSTR);
+		BOOL BackupEventLogW(HANDLE, LPCWSTR);
+		BOOL BackupRead(HANDLE, LPBYTE, DWORD, LPDWORD, BOOL, BOOL, LPVOID*);
+		BOOL BackupSeek(HANDLE, DWORD, DWORD, LPDWORD, LPDWORD, LPVOID*);
+		BOOL BackupWrite(HANDLE, LPBYTE, DWORD, LPDWORD, BOOL, BOOL, LPVOID*);
+		BOOL ClearEventLogA(HANDLE, LPCSTR);
+		BOOL ClearEventLogW(HANDLE, LPCWSTR);
+		BOOL CloseEventLog(HANDLE);
+		BOOL ConnectNamedPipe(HANDLE, LPOVERLAPPED);
+		BOOL CopySid(DWORD, PSID, PSID);
+		HANDLE CreateNamedPipeA(LPCSTR, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPSECURITY_ATTRIBUTES);
+		HANDLE CreateNamedPipeW(LPCWSTR, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPSECURITY_ATTRIBUTES);
+		BOOL CreatePrivateObjectSecurity(PSECURITY_DESCRIPTOR, PSECURITY_DESCRIPTOR, PSECURITY_DESCRIPTOR*, BOOL, HANDLE, PGENERIC_MAPPING);
+		BOOL CreateProcessAsUserA(HANDLE, LPCSTR, LPSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, BOOL, DWORD, PVOID, LPCSTR, LPSTARTUPINFOA, LPPROCESS_INFORMATION);
+		BOOL CreateProcessAsUserW(HANDLE, LPCWSTR, LPWSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, BOOL, DWORD, PVOID, LPCWSTR, LPSTARTUPINFOW, LPPROCESS_INFORMATION);
+		HANDLE CreateRemoteThread(HANDLE, LPSECURITY_ATTRIBUTES, DWORD, LPTHREAD_START_ROUTINE, LPVOID, DWORD, LPDWORD);
+		DWORD CreateTapePartition(HANDLE, DWORD, DWORD, DWORD);
+		BOOL DefineDosDeviceA(DWORD, LPCSTR, LPCSTR);
+		BOOL DefineDosDeviceW(DWORD, LPCWSTR, LPCWSTR);
+		BOOL DeleteAce(PACL, DWORD);
+		BOOL DeregisterEventSource(HANDLE);
+		BOOL DestroyPrivateObjectSecurity(PSECURITY_DESCRIPTOR*);
+		BOOL DeviceIoControl(HANDLE, DWORD, PVOID, DWORD, PVOID, DWORD, PDWORD, POVERLAPPED);
+		BOOL DisconnectNamedPipe(HANDLE);
+		BOOL DuplicateToken(HANDLE, SECURITY_IMPERSONATION_LEVEL, PHANDLE);
+		BOOL DuplicateTokenEx(HANDLE, DWORD, LPSECURITY_ATTRIBUTES, SECURITY_IMPERSONATION_LEVEL, TOKEN_TYPE, PHANDLE);
+		BOOL EqualPrefixSid(PSID, PSID);
+		BOOL EqualSid(PSID, PSID);
+		DWORD EraseTape(HANDLE, DWORD, BOOL);
+		HANDLE FindFirstFileExA(LPCSTR, FINDEX_INFO_LEVELS, PVOID, FINDEX_SEARCH_OPS, PVOID, DWORD);
+		HANDLE FindFirstFileExW(LPCWSTR, FINDEX_INFO_LEVELS, PVOID, FINDEX_SEARCH_OPS, PVOID, DWORD);
+		BOOL FindFirstFreeAce(PACL, PVOID*);
+		PVOID FreeSid(PSID);
+		BOOL GetAce(PACL, DWORD, LPVOID*);
+		BOOL GetAclInformation(PACL, PVOID, DWORD, ACL_INFORMATION_CLASS);
+		BOOL GetBinaryTypeA(LPCSTR, PDWORD);
+		BOOL GetBinaryTypeW(LPCWSTR, PDWORD);
+		DWORD GetCompressedFileSizeA(LPCSTR, PDWORD);
+		DWORD GetCompressedFileSizeW(LPCWSTR, PDWORD);
+		BOOL GetCurrentHwProfileA(LPHW_PROFILE_INFOA);
+		BOOL GetCurrentHwProfileW(LPHW_PROFILE_INFOW);
+		BOOL GetFileSecurityA(LPCSTR, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, DWORD, PDWORD);
+		BOOL GetFileSecurityW(LPCWSTR, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, DWORD, PDWORD);
+		BOOL GetHandleInformation(HANDLE, PDWORD);
+		BOOL GetKernelObjectSecurity(HANDLE, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, DWORD, PDWORD);
+		DWORD GetLengthSid(PSID);
+		BOOL GetNumberOfEventLogRecords(HANDLE, PDWORD);
+		BOOL GetOldestEventLogRecord(HANDLE, PDWORD);
+		BOOL GetPrivateObjectSecurity(PSECURITY_DESCRIPTOR, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, DWORD, PDWORD);
+		BOOL GetProcessPriorityBoost(HANDLE, PBOOL);
+		BOOL GetProcessShutdownParameters(PDWORD, PDWORD);
+		BOOL GetProcessTimes(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME);
+		HWINSTA GetProcessWindowStation();
+		BOOL GetProcessWorkingSetSize(HANDLE, PSIZE_T, PSIZE_T);
+		BOOL GetQueuedCompletionStatus(HANDLE, PDWORD, PULONG_PTR, LPOVERLAPPED*, DWORD);
+		BOOL GetSecurityDescriptorControl(PSECURITY_DESCRIPTOR, PSECURITY_DESCRIPTOR_CONTROL, PDWORD);
+		BOOL GetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR, LPBOOL, PACL*, LPBOOL);
+		BOOL GetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR, PSID*, LPBOOL);
+		DWORD GetSecurityDescriptorLength(PSECURITY_DESCRIPTOR);
+		BOOL GetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR, PSID*, LPBOOL);
+		BOOL GetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR, LPBOOL, PACL*, LPBOOL);
+		PSID_IDENTIFIER_AUTHORITY GetSidIdentifierAuthority(PSID);
+		DWORD GetSidLengthRequired(UCHAR);
+		PDWORD GetSidSubAuthority(PSID, DWORD);
+		PUCHAR GetSidSubAuthorityCount(PSID);
+		DWORD GetTapeParameters(HANDLE, DWORD, PDWORD, PVOID);
+		DWORD GetTapePosition(HANDLE, DWORD, PDWORD, PDWORD, PDWORD);
+		DWORD GetTapeStatus(HANDLE);
+		BOOL GetThreadPriorityBoost(HANDLE, PBOOL);
+		BOOL GetThreadTimes(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME);
+		BOOL GetTokenInformation(HANDLE, TOKEN_INFORMATION_CLASS, PVOID, DWORD, PDWORD);
+		BOOL ImpersonateLoggedOnUser(HANDLE);
+		BOOL ImpersonateNamedPipeClient(HANDLE);
+		BOOL ImpersonateSelf(SECURITY_IMPERSONATION_LEVEL);
+		BOOL InitializeAcl(PACL, DWORD, DWORD);
+		DWORD SetCriticalSectionSpinCount(LPCRITICAL_SECTION, DWORD);
+		BOOL InitializeSecurityDescriptor(PSECURITY_DESCRIPTOR, DWORD);
+		BOOL InitializeSid(PSID, PSID_IDENTIFIER_AUTHORITY, BYTE);
+		BOOL IsProcessorFeaturePresent(DWORD);
+		BOOL IsTextUnicode(PCVOID, int, LPINT);
+		BOOL IsValidAcl(PACL);
+		BOOL IsValidSecurityDescriptor(PSECURITY_DESCRIPTOR);
+		BOOL IsValidSid(PSID);
+		BOOL LockFileEx(HANDLE, DWORD, DWORD, DWORD, DWORD, LPOVERLAPPED);
+		BOOL LogonUserA(LPSTR, LPSTR, LPSTR, DWORD, DWORD, PHANDLE);
+		BOOL LogonUserW(LPWSTR, LPWSTR, LPWSTR, DWORD, DWORD, PHANDLE);
+		BOOL LookupAccountNameA(LPCSTR, LPCSTR, PSID, PDWORD, LPSTR, PDWORD, PSID_NAME_USE);
+		BOOL LookupAccountNameW(LPCWSTR, LPCWSTR, PSID, PDWORD, LPWSTR, PDWORD, PSID_NAME_USE);
+		BOOL LookupAccountSidA(LPCSTR, PSID, LPSTR, PDWORD, LPSTR, PDWORD, PSID_NAME_USE);
+		BOOL LookupAccountSidW(LPCWSTR, PSID, LPWSTR, PDWORD, LPWSTR, PDWORD, PSID_NAME_USE);
+		BOOL LookupPrivilegeDisplayNameA(LPCSTR, LPCSTR, LPSTR, PDWORD, PDWORD);
+		BOOL LookupPrivilegeDisplayNameW(LPCWSTR, LPCWSTR, LPWSTR, PDWORD, PDWORD);
+		BOOL LookupPrivilegeNameA(LPCSTR, PLUID, LPSTR, PDWORD);
+		BOOL LookupPrivilegeNameW(LPCWSTR, PLUID, LPWSTR, PDWORD);
+		BOOL LookupPrivilegeValueA(LPCSTR, LPCSTR, PLUID);
+		BOOL LookupPrivilegeValueW(LPCWSTR, LPCWSTR, PLUID);
+		BOOL MakeAbsoluteSD(PSECURITY_DESCRIPTOR, PSECURITY_DESCRIPTOR, PDWORD, PACL, PDWORD, PACL, PDWORD, PSID, PDWORD, PSID, PDWORD);
+		BOOL MakeSelfRelativeSD(PSECURITY_DESCRIPTOR, PSECURITY_DESCRIPTOR, PDWORD);
+		VOID MapGenericMask(PDWORD, PGENERIC_MAPPING);
+		BOOL MoveFileExA(LPCSTR, LPCSTR, DWORD);
+		BOOL MoveFileExW(LPCWSTR, LPCWSTR, DWORD);
+		BOOL NotifyChangeEventLog(HANDLE, HANDLE);
+		BOOL ObjectCloseAuditAlarmA(LPCSTR, PVOID, BOOL);
+		BOOL ObjectCloseAuditAlarmW(LPCWSTR, PVOID, BOOL);
+		BOOL ObjectDeleteAuditAlarmA(LPCSTR, PVOID, BOOL);
+		BOOL ObjectDeleteAuditAlarmW(LPCWSTR, PVOID, BOOL);
+		BOOL ObjectOpenAuditAlarmA(LPCSTR, PVOID, LPSTR, LPSTR, PSECURITY_DESCRIPTOR, HANDLE, DWORD, DWORD, PPRIVILEGE_SET, BOOL, BOOL, PBOOL);
+		BOOL ObjectOpenAuditAlarmW(LPCWSTR, PVOID, LPWSTR, LPWSTR, PSECURITY_DESCRIPTOR, HANDLE, DWORD, DWORD, PPRIVILEGE_SET, BOOL, BOOL, PBOOL);
+		BOOL ObjectPrivilegeAuditAlarmA(LPCSTR, PVOID, HANDLE, DWORD, PPRIVILEGE_SET, BOOL);
+		BOOL ObjectPrivilegeAuditAlarmW(LPCWSTR, PVOID, HANDLE, DWORD, PPRIVILEGE_SET, BOOL);
+		HANDLE OpenBackupEventLogA(LPCSTR, LPCSTR);
+		HANDLE OpenBackupEventLogW(LPCWSTR, LPCWSTR);
+		HANDLE OpenEventLogA(LPCSTR, LPCSTR);
+		HANDLE OpenEventLogW(LPCWSTR, LPCWSTR);
+		BOOL OpenProcessToken(HANDLE, DWORD, PHANDLE);
+		BOOL OpenThreadToken(HANDLE, DWORD, BOOL, PHANDLE);
+		BOOL PostQueuedCompletionStatus(HANDLE, DWORD, ULONG_PTR, LPOVERLAPPED);
+		DWORD PrepareTape(HANDLE, DWORD, BOOL);
+		BOOL PrivilegeCheck(HANDLE, PPRIVILEGE_SET, PBOOL);
+		BOOL PrivilegedServiceAuditAlarmA(LPCSTR, LPCSTR, HANDLE, PPRIVILEGE_SET, BOOL);
+		BOOL PrivilegedServiceAuditAlarmW(LPCWSTR, LPCWSTR, HANDLE, PPRIVILEGE_SET, BOOL);
+		BOOL ReadDirectoryChangesW(HANDLE, PVOID, DWORD, BOOL, DWORD, PDWORD, LPOVERLAPPED, LPOVERLAPPED_COMPLETION_ROUTINE);
+		BOOL ReadEventLogA(HANDLE, DWORD, DWORD, PVOID, DWORD, DWORD*, DWORD*);
+		BOOL ReadEventLogW(HANDLE, DWORD, DWORD, PVOID, DWORD, DWORD*, DWORD*);
+		BOOL ReadFileScatter(HANDLE, FILE_SEGMENT_ELEMENT*, DWORD, LPDWORD, LPOVERLAPPED);
+		HANDLE RegisterEventSourceA (LPCSTR, LPCSTR);
+		HANDLE RegisterEventSourceW(LPCWSTR, LPCWSTR);
+		BOOL ReportEventA(HANDLE, WORD, WORD, DWORD, PSID, WORD, DWORD, LPCSTR*, PVOID);
+		BOOL ReportEventW(HANDLE, WORD, WORD, DWORD, PSID, WORD, DWORD, LPCWSTR*, PVOID);
+		BOOL RevertToSelf();
+		BOOL SetAclInformation(PACL, PVOID, DWORD, ACL_INFORMATION_CLASS);
+		BOOL SetFileSecurityA(LPCSTR, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR);
+		BOOL SetFileSecurityW(LPCWSTR, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR);
+		BOOL SetHandleInformation(HANDLE, DWORD, DWORD);
+		BOOL SetKernelObjectSecurity(HANDLE, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR);
+		BOOL SetPrivateObjectSecurity(SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, PSECURITY_DESCRIPTOR* , PGENERIC_MAPPING, HANDLE);
+		BOOL SetProcessAffinityMask(HANDLE, DWORD);
+		BOOL SetProcessPriorityBoost(HANDLE, BOOL);
+		BOOL SetProcessShutdownParameters(DWORD, DWORD);
+		BOOL SetProcessWorkingSetSize(HANDLE, SIZE_T, SIZE_T);
+		BOOL SetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR, BOOL, PACL, BOOL);
+		BOOL SetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR, PSID, BOOL);
+		BOOL SetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR, PSID, BOOL);
+		BOOL SetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR, BOOL, PACL, BOOL);
+		BOOL SetSystemTimeAdjustment(DWORD, BOOL);
+		DWORD SetTapeParameters(HANDLE, DWORD, PVOID);
+		DWORD SetTapePosition(HANDLE, DWORD, DWORD, DWORD, DWORD, BOOL);
+		BOOL SetThreadPriorityBoost(HANDLE, BOOL);
+		BOOL SetThreadToken(PHANDLE, HANDLE);
+		BOOL SetTokenInformation(HANDLE, TOKEN_INFORMATION_CLASS, PVOID, DWORD);
+		DWORD SignalObjectAndWait(HANDLE, HANDLE, DWORD, BOOL);
+		BOOL SwitchToThread();
+		BOOL SystemTimeToTzSpecificLocalTime(LPTIME_ZONE_INFORMATION, LPSYSTEMTIME, LPSYSTEMTIME);
+		BOOL TryEnterCriticalSection(LPCRITICAL_SECTION);
+		BOOL UnlockFileEx(HANDLE, DWORD, DWORD, DWORD, LPOVERLAPPED);
+		BOOL UpdateResourceA(HANDLE, LPCSTR, LPCSTR, WORD, PVOID, DWORD);
+		BOOL UpdateResourceW(HANDLE, LPCWSTR, LPCWSTR, WORD, PVOID, DWORD);
+		BOOL WriteFileGather(HANDLE, FILE_SEGMENT_ELEMENT*, DWORD, LPDWORD, LPOVERLAPPED);
+		DWORD WriteTapemark(HANDLE, DWORD, DWORD, BOOL);
+
+		static if (_WIN32_WINNT >= 0x500) {
+			BOOL AddAccessAllowedAceEx(PACL, DWORD, DWORD, DWORD, PSID);
+			BOOL AddAccessDeniedAceEx(PACL, DWORD, DWORD, DWORD, PSID);
+			PVOID AddVectoredExceptionHandler(ULONG, PVECTORED_EXCEPTION_HANDLER);
+			BOOL AllocateUserPhysicalPages(HANDLE, PULONG_PTR, PULONG_PTR);
+			BOOL AssignProcessToJobObject(HANDLE, HANDLE);
+			BOOL ChangeTimerQueueTimer(HANDLE,HANDLE,ULONG,ULONG);
+			LPVOID CreateFiberEx(SIZE_T, SIZE_T, DWORD, LPFIBER_START_ROUTINE, LPVOID);
+			HANDLE CreateFileMappingA(HANDLE, LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD, LPCSTR);
+			HANDLE CreateFileMappingW(HANDLE, LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD, LPCWSTR);
+			BOOL CreateHardLinkA(LPCSTR, LPCSTR, LPSECURITY_ATTRIBUTES);
+			BOOL CreateHardLinkW(LPCWSTR, LPCWSTR, LPSECURITY_ATTRIBUTES);
+			HANDLE CreateJobObjectA(LPSECURITY_ATTRIBUTES, LPCSTR);
+			HANDLE CreateJobObjectW(LPSECURITY_ATTRIBUTES, LPCWSTR);
+			BOOL CreateProcessWithLogonW(LPCWSTR, LPCWSTR, LPCWSTR, DWORD, LPCWSTR, LPWSTR, DWORD, LPVOID, LPCWSTR, LPSTARTUPINFOW, LPPROCESS_INFORMATION);
+			HANDLE CreateTimerQueue();
+			BOOL CreateTimerQueueTimer(PHANDLE, HANDLE, WAITORTIMERCALLBACK, PVOID, DWORD, DWORD, ULONG);
+			BOOL DeleteTimerQueue(HANDLE);
+			BOOL DeleteTimerQueueEx(HANDLE, HANDLE);
+			BOOL DeleteTimerQueueTimer(HANDLE, HANDLE, HANDLE);
+			BOOL DeleteVolumeMountPointA(LPCSTR);
+			BOOL DeleteVolumeMountPointW(LPCWSTR);
+			BOOL DnsHostnameToComputerNameA(LPCSTR, LPSTR, LPDWORD);
+			BOOL DnsHostnameToComputerNameW(LPCWSTR, LPWSTR, LPDWORD);
+			BOOL EncryptFileA(LPCSTR);
+			BOOL EncryptFileW(LPCWSTR);
+			BOOL FileEncryptionStatusA(LPCSTR, LPDWORD);
+			BOOL FileEncryptionStatusW(LPCWSTR, LPDWORD);
+			HANDLE FindFirstVolumeA(LPCSTR, DWORD);
+			HANDLE FindFirstVolumeMountPointA(LPSTR, LPSTR, DWORD);
+			HANDLE FindFirstVolumeMountPointW(LPWSTR, LPWSTR, DWORD);
+			HANDLE FindFirstVolumeW(LPCWSTR, DWORD);
+			BOOL FindNextVolumeA(HANDLE, LPCSTR, DWORD);
+			BOOL FindNextVolumeW(HANDLE, LPWSTR, DWORD);
+			BOOL FindNextVolumeMountPointA(HANDLE, LPSTR, DWORD);
+			BOOL FindNextVolumeMountPointW(HANDLE, LPWSTR, DWORD);
+			BOOL FindVolumeClose(HANDLE);
+			BOOL FindVolumeMountPointClose(HANDLE);
+			BOOL FlushViewOfFile(PCVOID, DWORD);
+			BOOL FreeUserPhysicalPages(HANDLE, PULONG_PTR, PULONG_PTR);
+			BOOL GetComputerNameExA(COMPUTER_NAME_FORMAT, LPSTR, LPDWORD);
+			BOOL GetComputerNameExW(COMPUTER_NAME_FORMAT, LPWSTR, LPDWORD);
+			BOOL GetFileSizeEx(HANDLE, PLARGE_INTEGER);
+			BOOL GetModuleHandleExA(DWORD, LPCSTR, HMODULE*);
+			BOOL GetModuleHandleExW(DWORD, LPCWSTR, HMODULE*);
+			HANDLE GetProcessHeap();
+			DWORD GetProcessHeaps(DWORD, PHANDLE);
+			BOOL GetProcessIoCounters(HANDLE, PIO_COUNTERS);
+			BOOL GetSystemPowerStatus(LPSYSTEM_POWER_STATUS);
+			UINT GetSystemWindowsDirectoryA(LPSTR, UINT);
+			UINT GetSystemWindowsDirectoryW(LPWSTR, UINT);
+			BOOL GetVolumeNameForVolumeMountPointA(LPCSTR, LPSTR, DWORD);
+			BOOL GetVolumeNameForVolumeMountPointW(LPCWSTR, LPWSTR, DWORD);
+			BOOL GetVolumePathNameA(LPCSTR, LPSTR, DWORD);
+			BOOL GetVolumePathNameW(LPCWSTR, LPWSTR, DWORD);
+			BOOL GlobalMemoryStatusEx(LPMEMORYSTATUSEX);
+			BOOL IsBadCodePtr(FARPROC);
+			BOOL IsSystemResumeAutomatic();
+			BOOL MapUserPhysicalPages(PVOID, ULONG_PTR, PULONG_PTR);
+			BOOL MapUserPhysicalPagesScatter(PVOID*, ULONG_PTR, PULONG_PTR);
+			PVOID MapViewOfFile(HANDLE, DWORD, DWORD, DWORD, DWORD);
+			PVOID MapViewOfFileEx(HANDLE, DWORD, DWORD, DWORD, DWORD, PVOID);
+			HANDLE OpenFileMappingA(DWORD, BOOL, LPCSTR);
+			HANDLE OpenFileMappingW(DWORD, BOOL, LPCWSTR);
+			BOOL ProcessIdToSessionId(DWORD, DWORD*);
+			BOOL QueryInformationJobObject(HANDLE, JOBOBJECTINFOCLASS, LPVOID, DWORD, LPDWORD);
+			ULONG RemoveVectoredExceptionHandler(PVOID);
+			BOOL ReplaceFileA(LPCSTR, LPCSTR, LPCSTR, DWORD, LPVOID, LPVOID);
+			BOOL ReplaceFileW(LPCWSTR, LPCWSTR, LPCWSTR, DWORD, LPVOID, LPVOID);
+			BOOL SetComputerNameExA(COMPUTER_NAME_FORMAT, LPCSTR);
+			BOOL SetComputerNameExW(COMPUTER_NAME_FORMAT, LPCWSTR);
+			BOOL SetFilePointerEx(HANDLE, LARGE_INTEGER, PLARGE_INTEGER, DWORD);
+			BOOL SetInformationJobObject(HANDLE, JOBOBJECTINFOCLASS, LPVOID, DWORD);
+			BOOL SetSecurityDescriptorControl(PSECURITY_DESCRIPTOR, SECURITY_DESCRIPTOR_CONTROL, SECURITY_DESCRIPTOR_CONTROL);
+			BOOL SetSystemPowerState(BOOL, BOOL);
+			EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE);
+			DWORD SetThreadIdealProcessor(HANDLE, DWORD);
+			BOOL SetVolumeMountPointA(LPCSTR, LPCSTR);
+			BOOL SetVolumeMountPointW(LPCWSTR, LPCWSTR);
+			BOOL TerminateJobObject(HANDLE, UINT);
+			BOOL UnmapViewOfFile(PVOID);
+			BOOL UnregisterWait(HANDLE);
+			BOOL UnregisterWaitEx(HANDLE, HANDLE);
+			BOOL VerifyVersionInfoA(LPOSVERSIONINFOEXA, DWORD, DWORDLONG);
+			BOOL VerifyVersionInfoW(LPOSVERSIONINFOEXW, DWORD, DWORDLONG);
+		}
+
+		static if (_WIN32_WINNT >= 0x501) {
+			BOOL ActivateActCtx(HANDLE, ULONG_PTR*);
+			void AddRefActCtx(HANDLE);
+			BOOL CheckNameLegalDOS8Dot3A(LPCSTR, LPSTR, DWORD, PBOOL, PBOOL);
+			BOOL CheckNameLegalDOS8Dot3W(LPCWSTR, LPSTR, DWORD, PBOOL, PBOOL);
+			BOOL CheckRemoteDebuggerPresent(HANDLE, PBOOL);
+			BOOL ConvertFiberToThread();
+			HANDLE CreateActCtxA(PCACTCTXA);
+			HANDLE CreateActCtxW(PCACTCTXW);
+			HANDLE CreateMemoryResourceNotification(MEMORY_RESOURCE_NOTIFICATION_TYPE);
+			BOOL DeactivateActCtx(DWORD, ULONG_PTR);
+			BOOL DebugActiveProcessStop(DWORD);
+			BOOL DebugBreakProcess(HANDLE);
+			BOOL DebugSetProcessKillOnExit(BOOL);
+			BOOL FindActCtxSectionGuid(DWORD, GUID*, ULONG, GUID*,
+			  PACTCTX_SECTION_KEYED_DATA);
+			BOOL FindActCtxSectionStringA(DWORD, GUID*, ULONG, LPCSTR,
+			  PACTCTX_SECTION_KEYED_DATA);
+			BOOL FindActCtxSectionStringW(DWORD, GUID*, ULONG, LPCWSTR,
+			  PACTCTX_SECTION_KEYED_DATA);
+			BOOL GetCurrentActCtx(HANDLE*);
+			VOID GetNativeSystemInfo(LPSYSTEM_INFO);
+			BOOL GetProcessHandleCount(HANDLE, PDWORD);
+			BOOL GetSystemRegistryQuota(PDWORD, PDWORD);
+			BOOL GetSystemTimes(LPFILETIME, LPFILETIME, LPFILETIME);
+			UINT GetSystemWow64DirectoryA(LPSTR, UINT);
+			UINT GetSystemWow64DirectoryW(LPWSTR, UINT);
+			BOOL GetThreadIOPendingFlag(HANDLE, PBOOL);
+			BOOL GetVolumePathNamesForVolumeNameA(LPCSTR, LPSTR, DWORD, PDWORD);
+			BOOL GetVolumePathNamesForVolumeNameW(LPCWSTR, LPWSTR, DWORD, PDWORD);
+			UINT GetWriteWatch(DWORD, PVOID, SIZE_T, PVOID*, PULONG_PTR, PULONG);
+			BOOL HeapQueryInformation(HANDLE, HEAP_INFORMATION_CLASS, PVOID, SIZE_T, PSIZE_T);
+			BOOL HeapSetInformation(HANDLE, HEAP_INFORMATION_CLASS, PVOID, SIZE_T);
+			BOOL IsProcessInJob(HANDLE, HANDLE, PBOOL);
+			BOOL IsWow64Process(HANDLE, PBOOL);
+			BOOL QueryActCtxW(DWORD, HANDLE, PVOID, ULONG, PVOID, SIZE_T, SIZE_T*);
+			BOOL QueryMemoryResourceNotification(HANDLE, PBOOL);
+			void ReleaseActCtx(HANDLE);
+			UINT ResetWriteWatch(LPVOID, SIZE_T);
+			BOOL SetFileShortNameA(HANDLE, LPCSTR);
+			BOOL SetFileShortNameW(HANDLE, LPCWSTR);
+			BOOL SetFileValidData(HANDLE, LONGLONG);
+			BOOL ZombifyActCtx(HANDLE);
+		}
+
+		static if (_WIN32_WINNT >= 0x502) {
+			DWORD GetFirmwareEnvironmentVariableA(LPCSTR, LPCSTR, PVOID, DWORD);
+			DWORD GetFirmwareEnvironmentVariableW(LPCWSTR, LPCWSTR, PVOID, DWORD);
+			DWORD GetDllDirectoryA(DWORD, LPSTR);
+			DWORD GetDllDirectoryW(DWORD, LPWSTR);
+			DWORD GetProcessId(HANDLE);
+			HANDLE ReOpenFile(HANDLE, DWORD, DWORD, DWORD);
+			BOOL SetDllDirectoryA(LPCSTR);
+			BOOL SetDllDirectoryW(LPCWSTR);
+			BOOL SetFirmwareEnvironmentVariableA(LPCSTR, LPCSTR, PVOID, DWORD);
+			BOOL SetFirmwareEnvironmentVariableW(LPCWSTR, LPCWSTR, PVOID, DWORD);
+		}
+	}
+
+	// ???
+	static if (_WIN32_WINNT >= 0x510) {
+		VOID RestoreLastError(DWORD);
+	}
+}
+
+
+version (Unicode) {
+	alias STARTUPINFOW STARTUPINFO;
+	alias WIN32_FIND_DATAW WIN32_FIND_DATA;
+	alias ENUMRESLANGPROCW ENUMRESLANGPROC;
+	alias ENUMRESNAMEPROCW ENUMRESNAMEPROC;
+	alias ENUMRESTYPEPROCW ENUMRESTYPEPROC;
+	alias AddAtomW AddAtom;
+	alias BeginUpdateResourceW BeginUpdateResource;
+	alias BuildCommDCBW BuildCommDCB;
+	alias BuildCommDCBAndTimeoutsW BuildCommDCBAndTimeouts;
+	alias CallNamedPipeW CallNamedPipe;
+	alias CommConfigDialogW CommConfigDialog;
+	alias CopyFileW CopyFile;
+	alias CopyFileExW CopyFileEx;
+	alias CreateDirectoryW CreateDirectory;
+	alias CreateDirectoryExW CreateDirectoryEx;
+	alias CreateEventW CreateEvent;
+	alias CreateFileW CreateFile;
+	alias CreateMailslotW CreateMailslot;
+	alias CreateMutexW CreateMutex;
+	alias CreateProcessW CreateProcess;
+	alias CreateSemaphoreW CreateSemaphore;
+	alias DeleteFileW DeleteFile;
+	alias EndUpdateResourceW EndUpdateResource;
+	alias EnumResourceLanguagesW EnumResourceLanguages;
+	alias EnumResourceNamesW EnumResourceNames;
+	alias EnumResourceTypesW EnumResourceTypes;
+	alias ExpandEnvironmentStringsW ExpandEnvironmentStrings;
+	alias FatalAppExitW FatalAppExit;
+	alias FindAtomW FindAtom;
+	alias FindFirstChangeNotificationW FindFirstChangeNotification;
+	alias FindFirstFileW FindFirstFile;
+	alias FindNextFileW FindNextFile;
+	alias FindResourceW FindResource;
+	alias FindResourceExW FindResourceEx;
+	alias FormatMessageW FormatMessage;
+	alias FreeEnvironmentStringsW FreeEnvironmentStrings;
+	alias GetAtomNameW GetAtomName;
+	alias GetCommandLineW GetCommandLine;
+	alias GetComputerNameW GetComputerName;
+	alias GetCurrentDirectoryW GetCurrentDirectory;
+	alias GetDefaultCommConfigW GetDefaultCommConfig;
+	alias GetDiskFreeSpaceW GetDiskFreeSpace;
+	alias GetDiskFreeSpaceExW GetDiskFreeSpaceEx;
+	alias GetDriveTypeW GetDriveType;
+	alias GetEnvironmentStringsW GetEnvironmentStrings;
+	alias GetEnvironmentVariableW GetEnvironmentVariable;
+	alias GetFileAttributesW GetFileAttributes;
+	alias GetFullPathNameW GetFullPathName;
+	alias GetLogicalDriveStringsW GetLogicalDriveStrings;
+	alias GetModuleFileNameW GetModuleFileName;
+	alias GetModuleHandleW GetModuleHandle;
+	alias GetNamedPipeHandleStateW GetNamedPipeHandleState;
+	alias GetPrivateProfileIntW GetPrivateProfileInt;
+	alias GetPrivateProfileSectionW GetPrivateProfileSection;
+	alias GetPrivateProfileSectionNamesW GetPrivateProfileSectionNames;
+	alias GetPrivateProfileStringW GetPrivateProfileString;
+	alias GetPrivateProfileStructW GetPrivateProfileStruct;
+	alias GetProfileIntW GetProfileInt;
+	alias GetProfileSectionW GetProfileSection;
+	alias GetProfileStringW GetProfileString;
+	alias GetShortPathNameW GetShortPathName;
+	alias GetStartupInfoW GetStartupInfo;
+	alias GetSystemDirectoryW GetSystemDirectory;
+	alias GetTempFileNameW GetTempFileName;
+	alias GetTempPathW GetTempPath;
+	alias GetUserNameW GetUserName;
+	alias GetVersionExW GetVersionEx;
+	alias GetVolumeInformationW GetVolumeInformation;
+	alias GetWindowsDirectoryW GetWindowsDirectory;
+	alias GlobalAddAtomW GlobalAddAtom;
+	alias GlobalFindAtomW GlobalFindAtom;
+	alias GlobalGetAtomNameW GlobalGetAtomName;
+	alias IsBadStringPtrW IsBadStringPtr;
+	alias LoadLibraryW LoadLibrary;
+	alias LoadLibraryExW LoadLibraryEx;
+	alias lstrcatW lstrcat;
+	alias lstrcmpW lstrcmp;
+	alias lstrcmpiW lstrcmpi;
+	alias lstrcpyW lstrcpy;
+	alias lstrcpynW lstrcpyn;
+	alias lstrlenW lstrlen;
+	alias MoveFileW MoveFile;
+	alias OpenEventW OpenEvent;
+	alias OpenMutexW OpenMutex;
+	alias OpenSemaphoreW OpenSemaphore;
+	alias OutputDebugStringW OutputDebugString;
+	alias RemoveDirectoryW RemoveDirectory;
+	alias SearchPathW SearchPath;
+	alias SetComputerNameW SetComputerName;
+	alias SetCurrentDirectoryW SetCurrentDirectory;
+	alias SetDefaultCommConfigW SetDefaultCommConfig;
+	alias SetEnvironmentVariableW SetEnvironmentVariable;
+	alias SetFileAttributesW SetFileAttributes;
+	alias SetVolumeLabelW SetVolumeLabel;
+	alias WaitNamedPipeW WaitNamedPipe;
+	alias WritePrivateProfileSectionW WritePrivateProfileSection;
+	alias WritePrivateProfileStringW WritePrivateProfileString;
+	alias WritePrivateProfileStructW WritePrivateProfileStruct;
+	alias WriteProfileSectionW WriteProfileSection;
+	alias WriteProfileStringW WriteProfileString;
+
+	static if (_WIN32_WINDOWS >= 0x410) {
+		alias CreateWaitableTimerW CreateWaitableTimer;
+		alias GetFileAttributesExW GetFileAttributesEx;
+		alias GetLongPathNameW GetLongPathName;
+		alias QueryDosDeviceW QueryDosDevice;
+	}
+
+	static if (_WIN32_WINNT_ONLY) {
+		alias HW_PROFILE_INFOW HW_PROFILE_INFO;
+		alias AccessCheckAndAuditAlarmW AccessCheckAndAuditAlarm;
+		alias BackupEventLogW BackupEventLog;
+		alias ClearEventLogW ClearEventLog;
+		alias CreateNamedPipeW CreateNamedPipe;
+		alias CreateProcessAsUserW CreateProcessAsUser;
+		alias DefineDosDeviceW DefineDosDevice;
+		alias FindFirstFileExW FindFirstFileEx;
+		alias GetBinaryTypeW GetBinaryType;
+		alias GetCompressedFileSizeW GetCompressedFileSize;
+		alias GetFileSecurityW GetFileSecurity;
+		alias LogonUserW LogonUser;
+		alias LookupAccountNameW LookupAccountName;
+		alias LookupAccountSidW LookupAccountSid;
+		alias LookupPrivilegeDisplayNameW LookupPrivilegeDisplayName;
+		alias LookupPrivilegeNameW LookupPrivilegeName;
+		alias LookupPrivilegeValueW LookupPrivilegeValue;
+		alias MoveFileExW MoveFileEx;
+		alias ObjectCloseAuditAlarmW ObjectCloseAuditAlarm;
+		alias ObjectDeleteAuditAlarmW ObjectDeleteAuditAlarm;
+		alias ObjectOpenAuditAlarmW ObjectOpenAuditAlarm;
+		alias ObjectPrivilegeAuditAlarmW ObjectPrivilegeAuditAlarm;
+		alias OpenBackupEventLogW OpenBackupEventLog;
+		alias OpenEventLogW OpenEventLog;
+		alias PrivilegedServiceAuditAlarmW PrivilegedServiceAuditAlarm;
+		alias ReadEventLogW ReadEventLog;
+		alias RegisterEventSourceW RegisterEventSource;
+		alias ReportEventW ReportEvent;
+		alias SetFileSecurityW SetFileSecurity;
+		alias UpdateResourceW UpdateResource;
+
+		static if (_WIN32_WINNT >= 0x500) {
+			alias CreateFileMappingW CreateFileMapping;
+			alias CreateHardLinkW CreateHardLink;
+			alias CreateJobObjectW CreateJobObject;
+			alias DeleteVolumeMountPointW DeleteVolumeMountPoint;
+			alias DnsHostnameToComputerNameW DnsHostnameToComputerName;
+			alias EncryptFileW EncryptFile;
+			alias FileEncryptionStatusW FileEncryptionStatus;
+			alias FindFirstVolumeW FindFirstVolume;
+			alias FindFirstVolumeMountPointW FindFirstVolumeMountPoint;
+			alias FindNextVolumeW FindNextVolume;
+			alias FindNextVolumeMountPointW FindNextVolumeMountPoint;
+			alias GetModuleHandleExW GetModuleHandleEx;
+			alias GetSystemWindowsDirectoryW GetSystemWindowsDirectory;
+			alias GetVolumeNameForVolumeMountPointW GetVolumeNameForVolumeMountPoint;
+			alias GetVolumePathNameW GetVolumePathName;
+			alias OpenFileMappingW OpenFileMapping;
+			alias ReplaceFileW ReplaceFile;
+			alias SetVolumeMountPointW SetVolumeMountPoint;
+			alias VerifyVersionInfoW VerifyVersionInfo;
+		}
+
+		static if (_WIN32_WINNT >= 0x501) {
+			alias ACTCTXW ACTCTX;
+			alias CheckNameLegalDOS8Dot3W CheckNameLegalDOS8Dot3;
+			alias CreateActCtxW CreateActCtx;
+			alias FindActCtxSectionStringW FindActCtxSectionString;
+			alias GetSystemWow64DirectoryW GetSystemWow64Directory;
+			alias GetVolumePathNamesForVolumeNameW GetVolumePathNamesForVolumeName;
+			alias SetFileShortNameW SetFileShortName;
+		}
+
+		static if (_WIN32_WINNT >= 0x502) {
+			alias SetFirmwareEnvironmentVariableW SetFirmwareEnvironmentVariable;
+			alias SetDllDirectoryW SetDllDirectory;
+			alias GetDllDirectoryW GetDllDirectory;
+		}
+	}
+
+} else {
+	alias STARTUPINFOA STARTUPINFO;
+	alias WIN32_FIND_DATAA WIN32_FIND_DATA;
+	alias ENUMRESLANGPROCW ENUMRESLANGPROC;
+	alias ENUMRESNAMEPROCW ENUMRESNAMEPROC;
+	alias ENUMRESTYPEPROCW ENUMRESTYPEPROC;
+	alias AddAtomA AddAtom;
+	alias BeginUpdateResourceA BeginUpdateResource;
+	alias BuildCommDCBA BuildCommDCB;
+	alias BuildCommDCBAndTimeoutsA BuildCommDCBAndTimeouts;
+	alias CallNamedPipeA CallNamedPipe;
+	alias CommConfigDialogA CommConfigDialog;
+	alias CopyFileA CopyFile;
+	alias CopyFileExA CopyFileEx;
+	alias CreateDirectoryA CreateDirectory;
+	alias CreateDirectoryExA CreateDirectoryEx;
+	alias CreateEventA CreateEvent;
+	alias CreateFileA CreateFile;
+	alias CreateMailslotA CreateMailslot;
+	alias CreateMutexA CreateMutex;
+	alias CreateProcessA CreateProcess;
+	alias CreateSemaphoreA CreateSemaphore;
+	alias DeleteFileA DeleteFile;
+	alias EndUpdateResourceA EndUpdateResource;
+	alias EnumResourceLanguagesA EnumResourceLanguages;
+	alias EnumResourceNamesA EnumResourceNames;
+	alias EnumResourceTypesA EnumResourceTypes;
+	alias ExpandEnvironmentStringsA ExpandEnvironmentStrings;
+	alias FatalAppExitA FatalAppExit;
+	alias FindAtomA FindAtom;
+	alias FindFirstChangeNotificationA FindFirstChangeNotification;
+	alias FindFirstFileA FindFirstFile;
+	alias FindNextFileA FindNextFile;
+	alias FindResourceA FindResource;
+	alias FindResourceExA FindResourceEx;
+	alias FormatMessageA FormatMessage;
+	alias FreeEnvironmentStringsA FreeEnvironmentStrings;
+	alias GetAtomNameA GetAtomName;
+	alias GetCommandLineA GetCommandLine;
+	alias GetComputerNameA GetComputerName;
+	alias GetCurrentDirectoryA GetCurrentDirectory;
+	alias GetDefaultCommConfigA GetDefaultCommConfig;
+	alias GetDiskFreeSpaceA GetDiskFreeSpace;
+	alias GetDiskFreeSpaceExA GetDiskFreeSpaceEx;
+	alias GetDriveTypeA GetDriveType;
+	alias GetEnvironmentVariableA GetEnvironmentVariable;
+	alias GetFileAttributesA GetFileAttributes;
+	alias GetFullPathNameA GetFullPathName;
+	alias GetLogicalDriveStringsA GetLogicalDriveStrings;
+	alias GetNamedPipeHandleStateA GetNamedPipeHandleState;
+	alias GetModuleHandleA GetModuleHandle;
+	alias GetModuleFileNameA GetModuleFileName;
+	alias GetPrivateProfileIntA GetPrivateProfileInt;
+	alias GetPrivateProfileSectionA GetPrivateProfileSection;
+	alias GetPrivateProfileSectionNamesA GetPrivateProfileSectionNames;
+	alias GetPrivateProfileStringA GetPrivateProfileString;
+	alias GetPrivateProfileStructA GetPrivateProfileStruct;
+	alias GetProfileIntA GetProfileInt;
+	alias GetProfileSectionA GetProfileSection;
+	alias GetProfileStringA GetProfileString;
+	alias GetShortPathNameA GetShortPathName;
+	alias GetStartupInfoA GetStartupInfo;
+	alias GetSystemDirectoryA GetSystemDirectory;
+	alias GetTempFileNameA GetTempFileName;
+	alias GetTempPathA GetTempPath;
+	alias GetUserNameA GetUserName;
+	alias GetVersionExA GetVersionEx;
+	alias GetVolumeInformationA GetVolumeInformation;
+	alias GetWindowsDirectoryA GetWindowsDirectory;
+	alias GlobalAddAtomA GlobalAddAtom;
+	alias GlobalFindAtomA GlobalFindAtom;
+	alias GlobalGetAtomNameA GlobalGetAtomName;
+	alias IsBadStringPtrA IsBadStringPtr;
+	alias LoadLibraryA LoadLibrary;
+	alias LoadLibraryExA LoadLibraryEx;
+	alias lstrcatA lstrcat;
+	alias lstrcmpA lstrcmp;
+	alias lstrcmpiA lstrcmpi;
+	alias lstrcpyA lstrcpy;
+	alias lstrcpynA lstrcpyn;
+	alias lstrlenA lstrlen;
+	alias MoveFileA MoveFile;
+	alias OpenEventA OpenEvent;
+	alias OpenMutexA OpenMutex;
+	alias OpenSemaphoreA OpenSemaphore;
+	alias OutputDebugStringA OutputDebugString;
+	alias RemoveDirectoryA RemoveDirectory;
+	alias SearchPathA SearchPath;
+	alias SetComputerNameA SetComputerName;
+	alias SetCurrentDirectoryA SetCurrentDirectory;
+	alias SetDefaultCommConfigA SetDefaultCommConfig;
+	alias SetEnvironmentVariableA SetEnvironmentVariable;
+	alias SetFileAttributesA SetFileAttributes;
+	alias SetVolumeLabelA SetVolumeLabel;
+	alias WaitNamedPipeA WaitNamedPipe;
+	alias WritePrivateProfileSectionA WritePrivateProfileSection;
+	alias WritePrivateProfileStringA WritePrivateProfileString;
+	alias WritePrivateProfileStructA WritePrivateProfileStruct;
+	alias WriteProfileSectionA WriteProfileSection;
+	alias WriteProfileStringA WriteProfileString;
+
+	static if (_WIN32_WINDOWS >= 0x410) {
+		alias CreateWaitableTimerA CreateWaitableTimer;
+		alias GetFileAttributesExA GetFileAttributesEx;
+		alias GetLongPathNameA GetLongPathName;
+		alias QueryDosDeviceA QueryDosDevice;
+	}
+
+	static if (_WIN32_WINNT_ONLY) {
+		alias HW_PROFILE_INFOA HW_PROFILE_INFO;
+		alias AccessCheckAndAuditAlarmA AccessCheckAndAuditAlarm;
+		alias BackupEventLogA BackupEventLog;
+		alias ClearEventLogA ClearEventLog;
+		alias CreateNamedPipeA CreateNamedPipe;
+		alias CreateProcessAsUserA CreateProcessAsUser;
+		alias DefineDosDeviceA DefineDosDevice;
+		alias FindFirstFileExA FindFirstFileEx;
+		alias GetBinaryTypeA GetBinaryType;
+		alias GetCompressedFileSizeA GetCompressedFileSize;
+		alias GetFileSecurityA GetFileSecurity;
+		alias LogonUserA LogonUser;
+		alias LookupAccountNameA LookupAccountName;
+		alias LookupAccountSidA LookupAccountSid;
+		alias LookupPrivilegeDisplayNameA LookupPrivilegeDisplayName;
+		alias LookupPrivilegeNameA LookupPrivilegeName;
+		alias LookupPrivilegeValueA LookupPrivilegeValue;
+		alias MoveFileExA MoveFileEx;
+		alias ObjectCloseAuditAlarmA ObjectCloseAuditAlarm;
+		alias ObjectDeleteAuditAlarmA ObjectDeleteAuditAlarm;
+		alias ObjectOpenAuditAlarmA ObjectOpenAuditAlarm;
+		alias ObjectPrivilegeAuditAlarmA ObjectPrivilegeAuditAlarm;
+		alias OpenBackupEventLogA OpenBackupEventLog;
+		alias OpenEventLogA OpenEventLog;
+		alias PrivilegedServiceAuditAlarmA PrivilegedServiceAuditAlarm;
+		alias ReadEventLogA ReadEventLog;
+		alias RegisterEventSourceA RegisterEventSource;
+		alias ReportEventA ReportEvent;
+		alias SetFileSecurityA SetFileSecurity;
+		alias UpdateResourceA UpdateResource;
+
+		static if (_WIN32_WINNT >= 0x500) {
+			alias CreateFileMappingA CreateFileMapping;
+			alias CreateHardLinkA CreateHardLink;
+			alias CreateJobObjectA CreateJobObject;
+			alias DeleteVolumeMountPointA DeleteVolumeMountPoint;
+			alias DnsHostnameToComputerNameA DnsHostnameToComputerName;
+			alias EncryptFileA EncryptFile;
+			alias FileEncryptionStatusA FileEncryptionStatus;
+			alias FindFirstVolumeA FindFirstVolume;
+			alias FindFirstVolumeMountPointA FindFirstVolumeMountPoint;
+			alias FindNextVolumeA FindNextVolume;
+			alias FindNextVolumeMountPointA FindNextVolumeMountPoint;
+			alias GetModuleHandleExA GetModuleHandleEx;
+			alias GetSystemWindowsDirectoryA GetSystemWindowsDirectory;
+			alias GetVolumeNameForVolumeMountPointA GetVolumeNameForVolumeMountPoint;
+			alias GetVolumePathNameA GetVolumePathName;
+			alias OpenFileMappingA OpenFileMapping;
+			alias ReplaceFileA ReplaceFile;
+			alias SetVolumeMountPointA SetVolumeMountPoint;
+			alias VerifyVersionInfoA VerifyVersionInfo;
+		}
+
+		static if (_WIN32_WINNT >= 0x501) {
+			alias ACTCTXA ACTCTX;
+			alias CheckNameLegalDOS8Dot3A CheckNameLegalDOS8Dot3;
+			alias CreateActCtxA CreateActCtx;
+			alias FindActCtxSectionStringA FindActCtxSectionString;
+			alias GetSystemWow64DirectoryA GetSystemWow64Directory;
+			alias GetVolumePathNamesForVolumeNameA GetVolumePathNamesForVolumeName;
+			alias SetFileShortNameA SetFileShortName;
+		}
+
+		static if (_WIN32_WINNT >= 0x502) {
+			alias GetDllDirectoryA GetDllDirectory;
+			alias SetDllDirectoryA SetDllDirectory;
+			alias SetFirmwareEnvironmentVariableA SetFirmwareEnvironmentVariable;
+		}
+	}
+}
+
+alias STARTUPINFO* LPSTARTUPINFO;
+alias WIN32_FIND_DATA* LPWIN32_FIND_DATA;
+
+static if (_WIN32_WINNT_ONLY) {
+	alias HW_PROFILE_INFO* LPHW_PROFILE_INFO;
+
+	static if (_WIN32_WINNT >= 0x501) {
+		alias ACTCTX* PACTCTX, PCACTCTX;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/winber.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,68 @@
+/***********************************************************************\
+*                                winber.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.winber;
+
+/* Comment from MinGW
+  winber.h - Header file for the Windows LDAP Basic Encoding Rules API
+
+  Written by Filip Navara <xnavara@volny.cz>
+
+  References:
+    The C LDAP Application Program Interface
+    http://www.watersprings.org/pub/id/draft-ietf-ldapext-ldap-c-api-05.txt
+
+    Lightweight Directory Access Protocol Reference
+    http://msdn.microsoft.com/library/en-us/netdir/ldap/ldap_reference.asp
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+/* Opaque structure
+ *	http://msdn.microsoft.com/library/en-us/ldap/ldap/berelement.asp
+ */
+struct BerElement;
+
+alias int ber_int_t, ber_slen_t;
+alias uint ber_uint_t, ber_len_t, ber_tag_t;
+
+align(4):
+struct BerValue {
+	ber_len_t bv_len;
+	char*     bv_val;
+}
+alias BerValue LDAP_BERVAL, BERVAL;
+alias BerValue* PLDAP_BERVAL, PBERVAL;
+
+const ber_tag_t
+	LBER_ERROR   = -1,
+	LBER_DEFAULT = -1,
+	LBER_USE_DER =  1;
+
+/*	FIXME: In MinGW, these are WINBERAPI == DECLSPEC_IMPORT.  Linkage
+ *	attribute?
+ */
+extern (C) {
+	BerElement* ber_init(BerValue*);
+	int ber_printf(BerElement*, char*, ...);
+	int ber_flatten(BerElement*, BerValue**);
+	ber_tag_t ber_scanf(BerElement*, char*, ...);
+	ber_tag_t ber_peek_tag(BerElement*, ber_len_t*);
+	ber_tag_t ber_skip_tag(BerElement*, ber_len_t*);
+	ber_tag_t ber_first_element(BerElement*, ber_len_t*, char**);
+	ber_tag_t ber_next_element(BerElement*, ber_len_t*, char*);
+	void ber_bvfree(BerValue*);
+	void ber_bvecfree(BerValue**);
+	void ber_free(BerElement*, int);
+	BerValue* ber_bvdup(BerValue*);
+	BerElement* ber_alloc_t(int);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/wincon.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,277 @@
+/***********************************************************************\
+*                                wincon.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.wincon;
+pragma(lib, "kernel32.lib");
+
+private import win32.w32api, win32.windef;
+
+// FIXME: clean up Windows version support
+
+enum {
+	FOREGROUND_BLUE      = 1,
+	FOREGROUND_GREEN     = 2,
+	FOREGROUND_RED       = 4,
+	FOREGROUND_INTENSITY = 8,
+	BACKGROUND_BLUE      = 16,
+	BACKGROUND_GREEN     = 32,
+	BACKGROUND_RED       = 64,
+	BACKGROUND_INTENSITY = 128
+}
+
+static if (_WIN32_WINNT >= 0x0501) {
+	enum {
+		CONSOLE_FULLSCREEN_MODE = 1,
+		CONSOLE_WINDOWED_MODE   = 0
+	}
+}
+
+enum {
+	CTRL_C_EVENT        = 0,
+	CTRL_BREAK_EVENT    = 1,
+	CTRL_CLOSE_EVENT    = 2,
+	CTRL_LOGOFF_EVENT   = 5,
+	CTRL_SHUTDOWN_EVENT = 6
+}
+
+enum {
+	ENABLE_PROCESSED_INPUT  = 1,
+	ENABLE_LINE_INPUT       = 2,
+	ENABLE_ECHO_INPUT       = 4,
+	ENABLE_WINDOW_INPUT     = 8,
+	ENABLE_MOUSE_INPUT      = 16
+}
+
+enum {
+	ENABLE_PROCESSED_OUTPUT    = 1,
+	ENABLE_WRAP_AT_EOL_OUTPUT  = 2
+}
+
+enum {
+	KEY_EVENT                 = 1,
+	MOUSE_EVENT               = 2,
+	WINDOW_BUFFER_SIZE_EVENT  = 4,
+	MENU_EVENT                = 8,
+	FOCUS_EVENT               = 16
+}
+enum {
+	RIGHT_ALT_PRESSED  = 1,
+	LEFT_ALT_PRESSED   = 2,
+	RIGHT_CTRL_PRESSED = 4,
+	LEFT_CTRL_PRESSED  = 8,
+	SHIFT_PRESSED      = 16,
+	NUMLOCK_ON         = 32,
+	SCROLLLOCK_ON      = 64,
+	CAPSLOCK_ON        = 128,
+	ENHANCED_KEY       = 256
+}
+enum {
+	FROM_LEFT_1ST_BUTTON_PRESSED  = 1,
+	RIGHTMOST_BUTTON_PRESSED      = 2,
+	FROM_LEFT_2ND_BUTTON_PRESSED  = 4,
+	FROM_LEFT_3RD_BUTTON_PRESSED  = 8,
+	FROM_LEFT_4TH_BUTTON_PRESSED  = 16
+}
+
+enum {
+	MOUSE_MOVED   = 1,
+	DOUBLE_CLICK  = 2,
+	MOUSE_WHEELED = 4
+}
+
+struct CHAR_INFO {
+	union _Char {
+		WCHAR UnicodeChar;
+		CHAR AsciiChar;
+	}
+	_Char Char;	
+	WORD Attributes;
+}
+alias CHAR_INFO* PCHAR_INFO;
+
+struct SMALL_RECT {
+	SHORT Left;
+	SHORT Top;
+	SHORT Right;
+	SHORT Bottom;
+}
+alias SMALL_RECT* PSMALL_RECT;
+
+struct CONSOLE_CURSOR_INFO {
+	DWORD dwSize;
+	BOOL  bVisible;
+}
+alias CONSOLE_CURSOR_INFO* PCONSOLE_CURSOR_INFO;
+
+struct COORD {
+	SHORT X;
+	SHORT Y;
+}
+alias COORD* PCOORD;
+
+struct CONSOLE_FONT_INFO {
+	DWORD nFont;
+	COORD dwFontSize;
+}
+alias CONSOLE_FONT_INFO* PCONSOLE_FONT_INFO;
+
+struct CONSOLE_SCREEN_BUFFER_INFO {
+	COORD      dwSize;
+	COORD      dwCursorPosition;
+	WORD       wAttributes;
+	SMALL_RECT srWindow;
+	COORD      dwMaximumWindowSize;
+}
+alias CONSOLE_SCREEN_BUFFER_INFO* PCONSOLE_SCREEN_BUFFER_INFO;
+
+alias BOOL function(DWORD) PHANDLER_ROUTINE;
+
+struct KEY_EVENT_RECORD {
+	BOOL  bKeyDown;
+	WORD  wRepeatCount;
+	WORD  wVirtualKeyCode;
+	WORD  wVirtualScanCode;
+	union _uChar {
+		WCHAR UnicodeChar;
+		CHAR  AsciiChar;
+	}
+	_uChar uChar;	
+	DWORD dwControlKeyState;
+}
+
+struct MOUSE_EVENT_RECORD {
+	COORD dwMousePosition;
+	DWORD dwButtonState;
+	DWORD dwControlKeyState;
+	DWORD dwEventFlags;
+}
+
+struct WINDOW_BUFFER_SIZE_RECORD {
+	COORD dwSize;
+}
+
+struct MENU_EVENT_RECORD {
+	UINT dwCommandId;
+}
+alias MENU_EVENT_RECORD* PMENU_EVENT_RECORD;
+
+struct FOCUS_EVENT_RECORD {
+	BOOL bSetFocus;
+}
+
+struct INPUT_RECORD {
+	WORD EventType;
+	union _Event {
+		KEY_EVENT_RECORD KeyEvent;
+		MOUSE_EVENT_RECORD MouseEvent;
+		WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;
+		MENU_EVENT_RECORD MenuEvent;
+		FOCUS_EVENT_RECORD FocusEvent;
+	}
+	_Event Event;	
+}
+alias INPUT_RECORD* PINPUT_RECORD;
+
+extern (Windows):
+
+BOOL AllocConsole();
+HANDLE CreateConsoleScreenBuffer(DWORD, DWORD, SECURITY_ATTRIBUTES*, DWORD, LPVOID);
+BOOL FillConsoleOutputAttribute(HANDLE, WORD, DWORD, COORD, PDWORD);
+BOOL FillConsoleOutputCharacterA(HANDLE, CHAR, DWORD, COORD, PDWORD);
+BOOL FillConsoleOutputCharacterW(HANDLE, WCHAR, DWORD, COORD, PDWORD);
+BOOL FlushConsoleInputBuffer(HANDLE);
+BOOL FreeConsole();
+BOOL GenerateConsoleCtrlEvent(DWORD, DWORD);
+UINT GetConsoleCP();
+BOOL GetConsoleCursorInfo(HANDLE, PCONSOLE_CURSOR_INFO);
+BOOL GetConsoleMode(HANDLE,PDWORD);
+UINT GetConsoleOutputCP();
+BOOL GetConsoleScreenBufferInfo(HANDLE, PCONSOLE_SCREEN_BUFFER_INFO);
+DWORD GetConsoleTitleA(LPSTR, DWORD);
+DWORD GetConsoleTitleW(LPWSTR, DWORD);
+COORD GetLargestConsoleWindowSize(HANDLE);
+BOOL GetNumberOfConsoleInputEvents(HANDLE, PDWORD);
+BOOL GetNumberOfConsoleMouseButtons(PDWORD);
+BOOL PeekConsoleInputA(HANDLE, PINPUT_RECORD, DWORD, PDWORD);
+BOOL PeekConsoleInputW(HANDLE, PINPUT_RECORD, DWORD, PDWORD);
+BOOL ReadConsoleA(HANDLE, PVOID, DWORD, PDWORD, PVOID);
+BOOL ReadConsoleW(HANDLE, PVOID, DWORD, PDWORD, PVOID);
+BOOL ReadConsoleInputA(HANDLE, PINPUT_RECORD, DWORD, PDWORD);
+BOOL ReadConsoleInputW(HANDLE, PINPUT_RECORD, DWORD, PDWORD);
+BOOL ReadConsoleOutputAttribute(HANDLE, LPWORD, DWORD, COORD, LPDWORD);
+BOOL ReadConsoleOutputCharacterA(HANDLE, LPSTR, DWORD, COORD, PDWORD);
+BOOL ReadConsoleOutputCharacterW(HANDLE, LPWSTR, DWORD, COORD, PDWORD);
+BOOL ReadConsoleOutputA(HANDLE, PCHAR_INFO, COORD, COORD, PSMALL_RECT);
+BOOL ReadConsoleOutputW(HANDLE, PCHAR_INFO, COORD, COORD, PSMALL_RECT);
+BOOL ScrollConsoleScreenBufferA(HANDLE, SMALL_RECT*, SMALL_RECT*, COORD, CHAR_INFO*);
+BOOL ScrollConsoleScreenBufferW(HANDLE, SMALL_RECT*, SMALL_RECT*, COORD, CHAR_INFO*);
+BOOL SetConsoleActiveScreenBuffer(HANDLE);
+BOOL SetConsoleCP(UINT);
+BOOL SetConsoleCtrlHandler(PHANDLER_ROUTINE, BOOL);
+BOOL SetConsoleCursorInfo(HANDLE, CONSOLE_CURSOR_INFO*);
+BOOL SetConsoleCursorPosition(HANDLE, COORD);
+
+
+static if (_WIN32_WINNT >= 0x0500) {
+BOOL GetConsoleDisplayMode(LPDWORD);
+HWND GetConsoleWindow();
+}
+
+static if (_WIN32_WINNT >= 0x0501) {
+BOOL AttachConsole(DWORD);
+BOOL SetConsoleDisplayMode(HANDLE, DWORD, PCOORD);
+const DWORD ATTACH_PARENT_PROCESS = cast(DWORD)-1;
+}
+
+BOOL SetConsoleMode(HANDLE, DWORD);
+BOOL SetConsoleOutputCP(UINT);
+BOOL SetConsoleScreenBufferSize(HANDLE, COORD);
+BOOL SetConsoleTextAttribute(HANDLE, WORD);
+BOOL SetConsoleTitleA(LPCSTR);
+BOOL SetConsoleTitleW(LPCWSTR);
+BOOL SetConsoleWindowInfo(HANDLE, BOOL, SMALL_RECT*);
+BOOL WriteConsoleA(HANDLE, PCVOID, DWORD, PDWORD, PVOID);
+BOOL WriteConsoleW(HANDLE, PCVOID, DWORD, PDWORD, PVOID);
+BOOL WriteConsoleInputA(HANDLE, INPUT_RECORD*, DWORD, PDWORD);
+BOOL WriteConsoleInputW(HANDLE, INPUT_RECORD*, DWORD, PDWORD);
+BOOL WriteConsoleOutputA(HANDLE, CHAR_INFO*, COORD, COORD, PSMALL_RECT);
+BOOL WriteConsoleOutputW(HANDLE, CHAR_INFO*, COORD, COORD, PSMALL_RECT);
+BOOL WriteConsoleOutputAttribute(HANDLE, WORD*, DWORD, COORD, PDWORD);
+BOOL WriteConsoleOutputCharacterA(HANDLE, LPCSTR, DWORD, COORD, PDWORD);
+BOOL WriteConsoleOutputCharacterW(HANDLE, LPCWSTR, DWORD, COORD, PDWORD);
+
+version (Unicode) {
+	alias FillConsoleOutputCharacterW FillConsoleOutputCharacter;
+	alias GetConsoleTitleW GetConsoleTitle;
+	alias PeekConsoleInputW PeekConsoleInput;
+	alias ReadConsoleW ReadConsole;
+	alias ReadConsoleInputW ReadConsoleInput;
+	alias ReadConsoleOutputW ReadConsoleOutput;
+	alias ReadConsoleOutputCharacterW ReadConsoleOutputCharacter;
+	alias ScrollConsoleScreenBufferW ScrollConsoleScreenBuffer;
+	alias SetConsoleTitleW SetConsoleTitle;
+	alias WriteConsoleW WriteConsole;
+	alias WriteConsoleInputW WriteConsoleInput;
+	alias WriteConsoleOutputW WriteConsoleOutput;
+	alias WriteConsoleOutputCharacterW WriteConsoleOutputCharacter;
+} else {
+	alias FillConsoleOutputCharacterA FillConsoleOutputCharacter;
+	alias GetConsoleTitleA GetConsoleTitle;
+	alias PeekConsoleInputA PeekConsoleInput;
+	alias ReadConsoleA ReadConsole;
+	alias ReadConsoleInputA ReadConsoleInput;
+	alias ReadConsoleOutputA ReadConsoleOutput;
+	alias ReadConsoleOutputCharacterA ReadConsoleOutputCharacter;
+	alias ScrollConsoleScreenBufferA ScrollConsoleScreenBuffer;
+	alias SetConsoleTitleA SetConsoleTitle;
+	alias WriteConsoleA WriteConsole;
+	alias WriteConsoleInputA WriteConsoleInput;
+	alias WriteConsoleOutputA WriteConsoleOutput;
+	alias WriteConsoleOutputCharacterA WriteConsoleOutputCharacter;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/wincrypt.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,786 @@
+/***********************************************************************\
+*                               wincrypt.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.wincrypt;
+
+private import win32.w32api, win32.winbase, win32.windef;
+
+/* FIXME:
+ *	Types of some constants
+ *	Types of macros
+ *	Inits of various "size" and "version" members
+ *	Why are some #ifdefs commented out?
+ */
+
+const TCHAR[]
+	MS_DEF_PROV = "Microsoft Base Cryptographic Provider v1.0",
+	MS_ENHANCED_PROV = "Microsoft Enhanced Cryptographic Provider v1.0",
+	MS_STRONG_PROV = "Microsoft Strong Cryptographic Provider",
+	MS_DEF_RSA_SIG_PROV = "Microsoft RSA Signature Cryptographic Provider",
+	MS_DEF_RSA_SCHANNEL_PROV = "Microsoft RSA SChannel Cryptographic Provider",
+	MS_DEF_DSS_PROV = "Microsoft Base DSS Cryptographic Provider",
+	MS_DEF_DSS_DH_PROV
+	  = "Microsoft Base DSS and Diffie-Hellman Cryptographic Provider",
+	MS_ENH_DSS_DH_PROV
+	  = "Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider",
+	MS_DEF_DH_SCHANNEL_PROV = "Microsoft DH SChannel Cryptographic Provider",
+	MS_SCARD_PROV = "Microsoft Base Smart Card Crypto Provider";
+
+static if (WINVER > 0x501) {
+	const TCHAR[] MS_ENH_RSA_AES_PROV
+	  = "Microsoft Enhanced RSA and AES Cryptographic Provider";
+} else static if (WINVER == 0x501) {
+	const TCHAR[] MS_ENH_RSA_AES_PROV
+	  = "Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype)";
+}
+
+ALG_ID GET_ALG_CLASS(ALG_ID x) { return x & 0xE000; }
+ALG_ID GET_ALG_TYPE (ALG_ID x) { return x & 0x1E00; }
+ALG_ID GET_ALG_SID  (ALG_ID x) { return x & 0x01FF; }
+
+enum : ALG_ID {
+	ALG_CLASS_ANY           = 0,
+	ALG_CLASS_SIGNATURE     = 0x2000,
+	ALG_CLASS_MSG_ENCRYPT   = 0x4000,
+	ALG_CLASS_DATA_ENCRYPT  = 0x6000,
+	ALG_CLASS_HASH          = 0x8000,
+	ALG_CLASS_KEY_EXCHANGE  = 0xA000,
+	ALG_CLASS_ALL           = 0xE000
+}
+
+enum : ALG_ID {
+	ALG_TYPE_ANY           = 0,
+	ALG_TYPE_DSS           = 0x0200,
+	ALG_TYPE_RSA           = 0x0400,
+	ALG_TYPE_BLOCK         = 0x0600,
+	ALG_TYPE_STREAM        = 0x0800,
+	ALG_TYPE_DH            = 0x0A00,
+	ALG_TYPE_SECURECHANNEL = 0x0C00
+}
+
+enum : ALG_ID {
+	ALG_SID_ANY          =  0,
+	ALG_SID_RSA_ANY      =  0,
+	ALG_SID_RSA_PKCS,
+	ALG_SID_RSA_MSATWORK,
+	ALG_SID_RSA_ENTRUST,
+	ALG_SID_RSA_PGP,  // =  4
+	ALG_SID_DSS_ANY      =  0,
+	ALG_SID_DSS_PKCS,
+	ALG_SID_DSS_DMS,  // =  2
+	ALG_SID_DES          =  1,
+	ALG_SID_3DES         =  3,
+	ALG_SID_DESX,
+	ALG_SID_IDEA,
+	ALG_SID_CAST,
+	ALG_SID_SAFERSK64,
+	ALG_SID_SAFERSK128,
+	ALG_SID_3DES_112,
+	ALG_SID_SKIPJACK,
+	ALG_SID_TEK,
+	ALG_SID_CYLINK_MEK,
+	ALG_SID_RC5,      // = 13
+	ALG_SID_RC2          =  2,
+	ALG_SID_RC4          =  1,
+	ALG_SID_SEAL         =  2,
+	ALG_SID_MD2          =  1,
+	ALG_SID_MD4,
+	ALG_SID_MD5,
+	ALG_SID_SHA,
+	ALG_SID_MAC,
+	ALG_SID_RIPEMD,
+	ALG_SID_RIPEMD160,
+	ALG_SID_SSL3SHAMD5,
+	ALG_SID_HMAC,
+	ALG_SID_TLS1PRF,  // = 10
+	ALG_SID_AES_128      = 14,
+	ALG_SID_AES_192,
+	ALG_SID_AES_256,
+	ALG_SID_AES,      // = 17
+	ALG_SID_EXAMPLE      = 80
+}
+
+enum : ALG_ID {
+	CALG_MD2        = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD2,
+	CALG_MD4        = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD4,
+	CALG_MD5        = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD5,
+	CALG_SHA        = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA,
+	CALG_SHA1       = CALG_SHA,
+	CALG_MAC        = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MAC,
+	CALG_3DES       = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | 3,
+	CALG_CYLINK_MEK = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | 12,
+	CALG_SKIPJACK   = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | 10,
+	CALG_KEA_KEYX   = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_STREAM | ALG_TYPE_DSS | 4,
+	CALG_RSA_SIGN   = ALG_CLASS_SIGNATURE | ALG_TYPE_RSA | ALG_SID_RSA_ANY,
+	CALG_DSS_SIGN   = ALG_CLASS_SIGNATURE | ALG_TYPE_DSS | ALG_SID_DSS_ANY,
+	CALG_RSA_KEYX   = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_RSA | ALG_SID_RSA_ANY,
+	CALG_DES        = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_DES,
+	CALG_RC2        = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_RC2,
+	CALG_RC4        = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_STREAM | ALG_SID_RC4,
+	CALG_SEAL       = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_STREAM | ALG_SID_SEAL,
+	CALG_DH_EPHEM   = ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_STREAM | ALG_TYPE_DSS
+	                  | ALG_SID_DSS_DMS,
+	CALG_DESX       = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_DESX,
+// is undefined ALG_CLASS_DHASH in MinGW - presuming typo
+	CALG_TLS1PRF    = ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_TLS1PRF,
+	CALG_AES_128    = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_AES_128,
+	CALG_AES_192    = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_AES_192,
+	CALG_AES_256    = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_AES_256,
+	CALG_AES        = ALG_CLASS_DATA_ENCRYPT | ALG_TYPE_BLOCK | ALG_SID_AES,
+}
+
+/+
+#define CRYPT_VERIFYCONTEXT 0xF0000000
+#define CRYPT_NEWKEYSET 8
+#define CRYPT_DELETEKEYSET 16
+#define CRYPT_MACHINE_KEYSET 32
+#define CRYPT_SILENT 64
+#define CRYPT_EXPORTABLE 1
+#define CRYPT_USER_PROTECTED 2
+#define CRYPT_CREATE_SALT 4
+#define CRYPT_UPDATE_KEY 8
+#define SIMPLEBLOB 1
+#define PUBLICKEYBLOB 6
+#define PRIVATEKEYBLOB 7
+#define PLAINTEXTKEYBLOB 8
+#define OPAQUEKEYBLOB 9
+#define PUBLICKEYBLOBEX 10
+#define SYMMETRICWRAPKEYBLOB 11
+#define AT_KEYEXCHANGE 1
+#define AT_SIGNATURE 2
+#define CRYPT_USERDATA 1
+#define PKCS5_PADDING 1
+#define CRYPT_MODE_CBC 1
+#define CRYPT_MODE_ECB 2
+#define CRYPT_MODE_OFB 3
+#define CRYPT_MODE_CFB 4
+#define CRYPT_MODE_CTS 5
+#define CRYPT_MODE_CBCI 6
+#define CRYPT_MODE_CFBP 7
+#define CRYPT_MODE_OFBP 8
+#define CRYPT_MODE_CBCOFM 9
+#define CRYPT_MODE_CBCOFMI 10
+#define CRYPT_ENCRYPT 1
+#define CRYPT_DECRYPT 2
+#define CRYPT_EXPORT 4
+#define CRYPT_READ 8
+#define CRYPT_WRITE 16
+#define CRYPT_MAC 32
+#define HP_ALGID 1
+#define HP_HASHVAL 2
+#define HP_HASHSIZE 4
+#define HP_HMAC_INFO 5
+#define CRYPT_FAILED FALSE
+#define CRYPT_SUCCEED TRUE
+#define RCRYPT_SUCCEEDED(r) ((r)==CRYPT_SUCCEED)
+#define RCRYPT_FAILED(r) ((r)==CRYPT_FAILED)
+#define PP_ENUMALGS 1
+#define PP_ENUMCONTAINERS 2
+#define PP_IMPTYPE 3
+#define PP_NAME 4
+#define PP_VERSION 5
+#define PP_CONTAINER 6
+#define PP_CHANGE_PASSWORD	7
+#define PP_KEYSET_SEC_DESCR	8
+#define PP_CERTCHAIN	9
+#define PP_KEY_TYPE_SUBTYPE	10
+#define PP_PROVTYPE	16
+#define PP_KEYSTORAGE	17
+#define PP_APPLI_CERT	18
+#define PP_SYM_KEYSIZE	19
+#define PP_SESSION_KEYSIZE	20
+#define PP_UI_PROMPT	21
+#define PP_ENUMALGS_EX	22
+#define PP_ENUMMANDROOTS 25
+#define PP_ENUMELECTROOTS 26
+#define PP_KEYSET_TYPE 27
+#define PP_ADMIN_PIN 31
+#define PP_KEYEXCHANGE_PIN 32
+#define PP_SIGNATURE_PIN 33
+#define PP_SIG_KEYSIZE_INC 34
+#define PP_KEYX_KEYSIZE_INC 35
+#define PP_UNIQUE_CONTAINER 36
+#define PP_SGC_INFO 37
+#define PP_USE_HARDWARE_RNG 38
+#define PP_KEYSPEC 39
+#define PP_ENUMEX_SIGNING_PROT 40
+#define CRYPT_FIRST 1
+#define CRYPT_NEXT 2
+#define CRYPT_IMPL_HARDWARE 1
+#define CRYPT_IMPL_SOFTWARE 2
+#define CRYPT_IMPL_MIXED 3
+#define CRYPT_IMPL_UNKNOWN 4
+#define PROV_RSA_FULL 1
+#define PROV_RSA_SIG 2
+#define PROV_DSS 3
+#define PROV_FORTEZZA 4
+#define PROV_MS_MAIL 5
+#define PROV_SSL 6
+#define PROV_STT_MER 7
+#define PROV_STT_ACQ 8
+#define PROV_STT_BRND 9
+#define PROV_STT_ROOT 10
+#define PROV_STT_ISS 11
+#define PROV_RSA_SCHANNEL 12
+#define PROV_DSS_DH 13
+#define PROV_EC_ECDSA_SIG 14
+#define PROV_EC_ECNRA_SIG 15
+#define PROV_EC_ECDSA_FULL 16
+#define PROV_EC_ECNRA_FULL 17
+#define PROV_DH_SCHANNEL 18
+#define PROV_SPYRUS_LYNKS 20
+#define PROV_RNG 21
+#define PROV_INTEL_SEC 22
+#define PROV_RSA_AES 24
+#define MAXUIDLEN 64
+#define CUR_BLOB_VERSION 2
+#define X509_ASN_ENCODING 1
+#define PKCS_7_ASN_ENCODING  65536
+#define CERT_V1 0
+#define CERT_V2 1
+#define CERT_V3 2
+#define CERT_E_CHAINING (-2146762486)
+#define CERT_E_CN_NO_MATCH (-2146762481)
+#define CERT_E_EXPIRED (-2146762495)
+#define CERT_E_PURPOSE (-2146762490)
+#define CERT_E_REVOCATION_FAILURE (-2146762482)
+#define CERT_E_REVOKED (-2146762484)
+#define CERT_E_ROLE (-2146762493)
+#define CERT_E_UNTRUSTEDROOT (-2146762487)
+#define CERT_E_UNTRUSTEDTESTROOT (-2146762483)
+#define CERT_E_VALIDITYPERIODNESTING (-2146762494)
+#define CERT_E_WRONG_USAGE (-2146762480)
+#define CERT_E_PATHLENCONST (-2146762492)
+#define CERT_E_CRITICAL (-2146762491)
+#define CERT_E_ISSUERCHAINING (-2146762489)
+#define CERT_E_MALFORMED (-2146762488)
+#define CRYPT_E_REVOCATION_OFFLINE (-2146885613)
+#define CRYPT_E_REVOKED (-2146885616)
+#define TRUST_E_BASIC_CONSTRAINTS (-2146869223)
+#define TRUST_E_CERT_SIGNATURE (-2146869244)
+#define TRUST_E_FAIL (-2146762485)
+#define CERT_TRUST_NO_ERROR 0
+#define CERT_TRUST_IS_NOT_TIME_VALID 1
+#define CERT_TRUST_IS_NOT_TIME_NESTED 2
+#define CERT_TRUST_IS_REVOKED 4
+#define CERT_TRUST_IS_NOT_SIGNATURE_VALID 8
+#define CERT_TRUST_IS_NOT_VALID_FOR_USAGE 16
+#define CERT_TRUST_IS_UNTRUSTED_ROOT 32
+#define CERT_TRUST_REVOCATION_STATUS_UNKNOWN 64
+#define CERT_TRUST_IS_CYCLIC 128
+#define CERT_TRUST_IS_PARTIAL_CHAIN 65536
+#define CERT_TRUST_CTL_IS_NOT_TIME_VALID 131072
+#define CERT_TRUST_CTL_IS_NOT_SIGNATURE_VALID 262144
+#define CERT_TRUST_CTL_IS_NOT_VALID_FOR_USAGE 524288
+#define CERT_TRUST_HAS_EXACT_MATCH_ISSUER 1
+#define CERT_TRUST_HAS_KEY_MATCH_ISSUER 2
+#define CERT_TRUST_HAS_NAME_MATCH_ISSUER 4
+#define CERT_TRUST_IS_SELF_SIGNED 8
+#define CERT_TRUST_IS_COMPLEX_CHAIN 65536
+#define CERT_CHAIN_POLICY_BASE ((LPCSTR) 1)
+#define CERT_CHAIN_POLICY_AUTHENTICODE  ((LPCSTR) 2)
+#define CERT_CHAIN_POLICY_AUTHENTICODE_TS  ((LPCSTR) 3)
+#define CERT_CHAIN_POLICY_SSL  ((LPCSTR) 4)
+#define CERT_CHAIN_POLICY_BASIC_CONSTRAINTS ((LPCSTR) 5)
+#define CERT_CHAIN_POLICY_NT_AUTH ((LPCSTR) 6)
+#define USAGE_MATCH_TYPE_AND 0
+#define USAGE_MATCH_TYPE_OR 1
+#define CERT_SIMPLE_NAME_STR 1
+#define CERT_OID_NAME_STR 2
+#define CERT_X500_NAME_STR 3
+#define CERT_NAME_STR_SEMICOLON_FLAG 1073741824
+#define CERT_NAME_STR_CRLF_FLAG 134217728
+#define CERT_NAME_STR_NO_PLUS_FLAG 536870912
+#define CERT_NAME_STR_NO_QUOTING_FLAG 268435456
+#define CERT_NAME_STR_REVERSE_FLAG 33554432
+#define CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG 131072
+#define CERT_FIND_ANY 0
+#define CERT_FIND_CERT_ID 1048576
+#define CERT_FIND_CTL_USAGE 655360
+#define CERT_FIND_ENHKEY_USAGE 655360
+#define CERT_FIND_EXISTING 851968
+#define CERT_FIND_HASH 65536
+#define CERT_FIND_ISSUER_ATTR 196612
+#define CERT_FIND_ISSUER_NAME 131076
+#define CERT_FIND_ISSUER_OF 786432
+#define CERT_FIND_KEY_IDENTIFIER 983040
+#define CERT_FIND_KEY_SPEC 589824
+#define CERT_FIND_MD5_HASH 262144
+#define CERT_FIND_PROPERTY 327680
+#define CERT_FIND_PUBLIC_KEY 393216
+#define CERT_FIND_SHA1_HASH 65536
+#define CERT_FIND_SIGNATURE_HASH 917504
+#define CERT_FIND_SUBJECT_ATTR 196615
+#define CERT_FIND_SUBJECT_CERT 720896
+#define CERT_FIND_SUBJECT_NAME 131079
+#define CERT_FIND_SUBJECT_STR_A 458759
+#define CERT_FIND_SUBJECT_STR_W 524295
+#define CERT_FIND_ISSUER_STR_A 458756
+#define CERT_FIND_ISSUER_STR_W 524292
+#define CERT_FIND_OR_ENHKEY_USAGE_FLAG 16
+#define CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAG  1
+#define CERT_FIND_NO_ENHKEY_USAGE_FLAG  8
+#define CERT_FIND_VALID_ENHKEY_USAGE_FLAG  32
+#define CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG  2
+#define CERT_CASE_INSENSITIVE_IS_RDN_ATTRS_FLAG  2
+#define CERT_UNICODE_IS_RDN_ATTRS_FLAG 1
+#define CERT_CHAIN_FIND_BY_ISSUER 1
+#define CERT_CHAIN_FIND_BY_ISSUER_COMPARE_KEY_FLAG 1
+#define CERT_CHAIN_FIND_BY_ISSUER_COMPLEX_CHAIN_FLAG 2
+#define CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_FLAG 32768
+#define CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_URL_FLAG 4
+#define CERT_CHAIN_FIND_BY_ISSUER_LOCAL_MACHINE_FLAG 8
+#define CERT_CHAIN_FIND_BY_ISSUER_NO_KEY_FLAG 16384
+#define CERT_STORE_PROV_SYSTEM 10
+#define CERT_SYSTEM_STORE_LOCAL_MACHINE 131072
+#define szOID_PKIX_KP_SERVER_AUTH "4235600"
+#define szOID_SERVER_GATED_CRYPTO "4235658"
+#define szOID_SGC_NETSCAPE "2.16.840.1.113730.4.1"
+#define szOID_PKIX_KP_CLIENT_AUTH "1.3.6.1.5.5.7.3.2"
+#define CRYPT_NOHASHOID 0x00000001
+#define CRYPT_NO_SALT 0x10
+#define CRYPT_PREGEN 0x40
+#define CRYPT_RECIPIENT 0x10
+#define CRYPT_INITIATOR 0x40
+#define CRYPT_ONLINE 0x80
+#define CRYPT_SF 0x100
+#define CRYPT_CREATE_IV 0x200
+#define CRYPT_KEK 0x400
+#define CRYPT_DATA_KEY 0x800
+#define CRYPT_VOLATILE 0x1000
+#define CRYPT_SGCKEY 0x2000
+#define KP_IV               0x00000001
+#define KP_SALT             0x00000002
+#define KP_PADDING          0x00000003
+#define KP_MODE             0x00000004
+#define KP_MODE_BITS        0x00000005
+#define KP_PERMISSIONS      0x00000006
+#define KP_ALGID            0x00000007
+#define KP_BLOCKLEN         0x00000008
+#define KP_KEYLEN           0x00000009
+#define KP_SALT_EX          0x0000000a
+#define KP_P                0x0000000b
+#define KP_G                0x0000000c
+#define KP_Q                0x0000000d
+#define KP_X                0x0000000e
+#define KP_Y                0x0000000f
+#define KP_RA               0x00000010
+#define KP_RB               0x00000011
+#define KP_INFO             0x00000012
+#define KP_EFFECTIVE_KEYLEN 0x00000013
+#define KP_SCHANNEL_ALG     0x00000014
+#define KP_PUB_PARAMS       0x00000027
+#define CRYPT_FLAG_PCT1    0x0001
+#define CRYPT_FLAG_SSL2    0x0002
+#define CRYPT_FLAG_SSL3    0x0004
+#define CRYPT_FLAG_TLS1    0x0008
+#define CRYPT_FLAG_IPSEC   0x0010
+#define CRYPT_FLAG_SIGNING 0x0020
+#define SCHANNEL_MAC_KEY    0x00000000
+#define SCHANNEL_ENC_KEY    0x00000001
+#define INTERNATIONAL_USAGE 0x00000001
++/
+
+alias UINT ALG_ID;
+alias ULONG HCRYPTPROV, HCRYPTKEY, HCRYPTHASH;
+alias PVOID HCERTSTORE, HCRYPTMSG, HCERTCHAINENGINE;
+
+struct VTableProvStruc {
+	FARPROC FuncVerifyImage;
+}
+alias VTableProvStruc* PVTableProvStruc;
+
+struct _CRYPTOAPI_BLOB {
+	DWORD cbData;
+	BYTE* pbData;
+}
+alias _CRYPTOAPI_BLOB CRYPT_INTEGER_BLOB, CRYPT_UINT_BLOB,
+  CRYPT_OBJID_BLOB, CERT_NAME_BLOB, CERT_RDN_VALUE_BLOB, CERT_BLOB,
+  CRL_BLOB, DATA_BLOB, CRYPT_DATA_BLOB, CRYPT_HASH_BLOB,
+  CRYPT_DIGEST_BLOB, CRYPT_DER_BLOB, CRYPT_ATTR_BLOB;
+alias _CRYPTOAPI_BLOB* PCRYPT_INTEGER_BLOB, PCRYPT_UINT_BLOB,
+  PCRYPT_OBJID_BLOB, PCERT_NAME_BLOB, PCERT_RDN_VALUE_BLOB, PCERT_BLOB,
+  PCRL_BLOB, PDATA_BLOB, PCRYPT_DATA_BLOB, PCRYPT_HASH_BLOB,
+  PCRYPT_DIGEST_BLOB, PCRYPT_DER_BLOB, PCRYPT_ATTR_BLOB;
+
+// not described in SDK; has the same layout as HTTPSPolicyCallbackData
+struct SSL_EXTRA_CERT_CHAIN_POLICY_PARA {
+	DWORD  cbStruct;
+	DWORD  dwAuthType;
+	DWORD  fdwChecks;
+	LPWSTR pwszServerName;
+}
+alias SSL_EXTRA_CERT_CHAIN_POLICY_PARA HTTPSPolicyCallbackData;
+alias SSL_EXTRA_CERT_CHAIN_POLICY_PARA* PSSL_EXTRA_CERT_CHAIN_POLICY_PARA,
+  PHTTPSPolicyCallbackData;
+
+/* #if (_WIN32_WINNT>=0x500) */
+struct CERT_CHAIN_POLICY_PARA {
+	DWORD cbSize = CERT_CHAIN_POLICY_PARA.sizeof;
+	DWORD dwFlags;
+	void* pvExtraPolicyPara;
+}
+alias CERT_CHAIN_POLICY_PARA* PCERT_CHAIN_POLICY_PARA;
+
+struct CERT_CHAIN_POLICY_STATUS {
+	DWORD cbSize = CERT_CHAIN_POLICY_STATUS.sizeof;
+	DWORD dwError;
+	LONG  lChainIndex;
+	LONG  lElementIndex;
+	void* pvExtraPolicyStatus;
+}
+alias CERT_CHAIN_POLICY_STATUS* PCERT_CHAIN_POLICY_STATUS;
+/* #endif */
+
+struct CRYPT_ALGORITHM_IDENTIFIER {
+	LPSTR pszObjId;
+	CRYPT_OBJID_BLOB Parameters;
+}
+alias CRYPT_ALGORITHM_IDENTIFIER* PCRYPT_ALGORITHM_IDENTIFIER;
+
+struct CRYPT_BIT_BLOB {
+	DWORD cbData;
+	BYTE* pbData;
+	DWORD cUnusedBits;
+}
+alias CRYPT_BIT_BLOB* PCRYPT_BIT_BLOB;
+
+struct CERT_PUBLIC_KEY_INFO {
+	CRYPT_ALGORITHM_IDENTIFIER Algorithm;
+	CRYPT_BIT_BLOB             PublicKey;
+}
+alias CERT_PUBLIC_KEY_INFO* PCERT_PUBLIC_KEY_INFO;
+
+struct CERT_EXTENSION {
+	LPSTR            pszObjId;
+	BOOL             fCritical;
+	CRYPT_OBJID_BLOB Value;
+}
+alias CERT_EXTENSION* PCERT_EXTENSION;
+
+struct CERT_INFO {
+	DWORD dwVersion;
+	CRYPT_INTEGER_BLOB SerialNumber;
+	CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm;
+	CERT_NAME_BLOB Issuer;
+	FILETIME NotBefore;
+	FILETIME NotAfter;
+	CERT_NAME_BLOB Subject;
+	CERT_PUBLIC_KEY_INFO SubjectPublicKeyInfo;
+	CRYPT_BIT_BLOB IssuerUniqueId;
+	CRYPT_BIT_BLOB SubjectUniqueId;
+	DWORD cExtension;
+	PCERT_EXTENSION rgExtension;
+}
+alias CERT_INFO* PCERT_INFO;
+
+struct CERT_CONTEXT {
+	DWORD      dwCertEncodingType;
+	BYTE*      pbCertEncoded;
+	DWORD      cbCertEncoded;
+	PCERT_INFO pCertInfo;
+	HCERTSTORE hCertStore;
+}
+alias CERT_CONTEXT* PCERT_CONTEXT, PCCERT_CONTEXT;
+
+struct CTL_USAGE {
+	DWORD  cUsageIdentifier;
+	LPSTR* rgpszUsageIdentifier;
+}
+alias CTL_USAGE CERT_ENHKEY_USAGE;
+alias CTL_USAGE* PCTRL_USAGE, PCERT_ENHKEY_USAGE;
+
+struct CERT_USAGE_MATCH {
+	DWORD             dwType;
+	CERT_ENHKEY_USAGE Usage;
+}
+alias CERT_USAGE_MATCH* PCERT_USAGE_MATCH;
+/* #if (_WIN32_WINNT>=0x500) */
+
+struct CERT_CHAIN_PARA {
+	DWORD            cbSize = CERT_CHAIN_PARA.sizeof;
+	CERT_USAGE_MATCH RequestedUsage;
+//#if CERT_CHAIN_PARA_HAS_EXTRA_FIELDS
+	CERT_USAGE_MATCH RequestedIssuancePolicy;
+	DWORD            dwUrlRetrievalTimeout;
+	BOOL             fCheckRevocationFreshnessTime;
+	DWORD            dwRevocationFreshnessTime;
+//#endif
+}
+alias CERT_CHAIN_PARA* PCERT_CHAIN_PARA;
+
+extern (Windows) alias BOOL function(PCCERT_CONTEXT, void*)
+  PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK;
+
+struct CERT_CHAIN_FIND_BY_ISSUER_PARA {
+	DWORD  cbSize = CERT_CHAIN_FIND_BY_ISSUER_PARA.sizeof;
+	LPCSTR pszUsageIdentifier;
+	DWORD  dwKeySpec;
+	DWORD  dwAcquirePrivateKeyFlags;
+	DWORD  cIssuer;
+	CERT_NAME_BLOB* rgIssuer;
+	PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK pfnFIndCallback;
+	void*  pvFindArg;
+	DWORD* pdwIssuerChainIndex;
+	DWORD* pdwIssuerElementIndex;
+}
+alias CERT_CHAIN_FIND_BY_ISSUER_PARA* PCERT_CHAIN_FIND_BY_ISSUER_PARA;
+/* #endif */
+
+struct CERT_TRUST_STATUS {
+	DWORD dwErrorStatus;
+	DWORD dwInfoStatus;
+}
+alias CERT_TRUST_STATUS* PCERT_TRUST_STATUS;
+
+struct CRL_ENTRY {
+	CRYPT_INTEGER_BLOB SerialNumber;
+	FILETIME           RevocationDate;
+	DWORD              cExtension;
+	PCERT_EXTENSION    rgExtension;
+}
+alias CRL_ENTRY* PCRL_ENTRY;
+
+struct CRL_INFO {
+	DWORD           dwVersion;
+	CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm;
+	CERT_NAME_BLOB  Issuer;
+	FILETIME        ThisUpdate;
+	FILETIME        NextUpdate;
+	DWORD           cCRLEntry;
+	PCRL_ENTRY      rgCRLEntry;
+	DWORD           cExtension;
+	PCERT_EXTENSION rgExtension;
+}
+alias CRL_INFO* PCRL_INFO;
+
+struct CRL_CONTEXT {
+	DWORD      dwCertEncodingType;
+	BYTE*      pbCrlEncoded;
+	DWORD      cbCrlEncoded;
+	PCRL_INFO  pCrlInfo;
+	HCERTSTORE hCertStore;
+}
+alias CRL_CONTEXT* PCRL_CONTEXT, PCCRL_CONTEXT;
+
+struct CERT_REVOCATION_CRL_INFO {
+	DWORD         cbSize = CERT_REVOCATION_CRL_INFO.sizeof;
+	PCCRL_CONTEXT pBaseCRLContext;
+	PCCRL_CONTEXT pDeltaCRLContext;
+	PCRL_ENTRY    pCrlEntry;
+	BOOL          fDeltaCrlEntry;
+}
+alias CERT_REVOCATION_CRL_INFO* PCERT_REVOCATION_CRL_INFO;
+
+struct CERT_REVOCATION_INFO {
+	DWORD  cbSize = CERT_REVOCATION_INFO.sizeof;
+	DWORD  dwRevocationResult;
+	LPCSTR pszRevocationOid;
+	LPVOID pvOidSpecificInfo;
+	BOOL   fHasFreshnessTime;
+	DWORD  dwFreshnessTime;
+	PCERT_REVOCATION_CRL_INFO pCrlInfo;
+}
+alias CERT_REVOCATION_INFO* PCERT_REVOCATION_INFO;
+
+/* #if (_WIN32_WINNT>=0x500) */
+struct CERT_CHAIN_ELEMENT {
+	DWORD                 cbSize = CERT_CHAIN_ELEMENT.sizeof;
+	PCCERT_CONTEXT        pCertContext;
+	CERT_TRUST_STATUS     TrustStatus;
+	PCERT_REVOCATION_INFO pRevocationInfo;
+	PCERT_ENHKEY_USAGE    pIssuanceUsage;
+	PCERT_ENHKEY_USAGE    pApplicationUsage;
+}
+alias CERT_CHAIN_ELEMENT* PCERT_CHAIN_ELEMENT;
+/* #endif */
+
+struct CRYPT_ATTRIBUTE {
+	LPSTR            pszObjId;
+	DWORD            cValue;
+	PCRYPT_ATTR_BLOB rgValue;
+}
+alias CRYPT_ATTRIBUTE* PCRYPT_ATTRIBUTE;
+
+struct CTL_ENTRY {
+	CRYPT_DATA_BLOB  SubjectIdentifier;
+	DWORD            cAttribute;
+	PCRYPT_ATTRIBUTE rgAttribute;
+}
+alias CTL_ENTRY* PCTL_ENTRY;
+
+struct CTL_INFO {
+	DWORD              dwVersion;
+	CTL_USAGE          SubjectUsage;
+	CRYPT_DATA_BLOB    ListIdentifier;
+	CRYPT_INTEGER_BLOB SequenceNumber;
+	FILETIME           ThisUpdate;
+	FILETIME           NextUpdate;
+	CRYPT_ALGORITHM_IDENTIFIER SubjectAlgorithm;
+	DWORD              cCTLEntry;
+	PCTL_ENTRY         rgCTLEntry;
+	DWORD              cExtension;
+	PCERT_EXTENSION    rgExtension;
+}
+alias CTL_INFO* PCTL_INFO;
+
+struct CTL_CONTEXT {
+	DWORD      dwMsgAndCertEncodingType;
+	BYTE*      pbCtlEncoded;
+	DWORD      cbCtlEncoded;
+	PCTL_INFO  pCtlInfo;
+	HCERTSTORE hCertStore;
+	HCRYPTMSG  hCryptMsg;
+	BYTE*      pbCtlContent;
+	DWORD      cbCtlContent;
+}
+alias CTL_CONTEXT* PCTL_CONTEXT, PCCTL_CONTEXT;
+
+struct CERT_TRUST_LIST_INFO {
+	DWORD         cbSize = CERT_TRUST_LIST_INFO.sizeof;
+	PCTL_ENTRY    pCtlEntry;
+	PCCTL_CONTEXT pCtlContext;
+}
+alias CERT_TRUST_LIST_INFO* PCERT_TRUST_LIST_INFO;
+
+struct CERT_SIMPLE_CHAIN {
+	DWORD                 cbSize = CERT_SIMPLE_CHAIN.sizeof;
+	CERT_TRUST_STATUS     TrustStatus;
+	DWORD                 cElement;
+	PCERT_CHAIN_ELEMENT*  rgpElement;
+	PCERT_TRUST_LIST_INFO pTrustListInfo;
+	BOOL                  fHasRevocationFreshnessTime;
+	DWORD                 dwRevocationFreshnessTime;
+}
+alias CERT_SIMPLE_CHAIN* PCERT_SIMPLE_CHAIN, PCCERT_CHAIN_CONTEXT;
+
+/* #if (_WIN32_WINNT>=0x500) */
+struct CERT_CHAIN_CONTEXT {
+	DWORD                 cbSize = CERT_CHAIN_CONTEXT.sizeof;
+	CERT_TRUST_STATUS     TrustStatus;
+	DWORD                 cChain;
+	PCERT_SIMPLE_CHAIN*   rgpChain;
+	DWORD                 cLowerQualityChainContext;
+	PCCERT_CHAIN_CONTEXT* rgpLowerQualityChainContext;
+	BOOL                  fHasRevocationFreshnessTime;
+	DWORD                 dwRevocationFreshnessTime;
+}
+alias CERT_CHAIN_CONTEXT* PCERT_CHAIN_CONTEXT;
+/* #endif */
+
+struct PROV_ENUMALGS {
+	ALG_ID   aiAlgid;
+	DWORD    dwBitLen;
+	DWORD    dwNameLen;
+	CHAR[20] szName;
+}
+
+struct PUBLICKEYSTRUC {
+	BYTE   bType;
+	BYTE   bVersion;
+	WORD   reserved;
+	ALG_ID aiKeyAlg;
+}
+alias PUBLICKEYSTRUC BLOBHEADER;
+
+struct RSAPUBKEY {
+	DWORD magic;
+	DWORD bitlen;
+	DWORD pubexp;
+}
+
+struct HMAC_INFO {
+	ALG_ID HashAlgid;
+	BYTE*  pbInnerString;
+	DWORD  cbInnerString;
+	BYTE*  pbOuterString;
+	DWORD  cbOuterString;
+}
+alias HMAC_INFO* PHMAC_INFO;
+
+extern (Windows) {
+	BOOL CertCloseStore(HCERTSTORE, DWORD);
+	BOOL CertGetCertificateChain(HCERTCHAINENGINE, PCCERT_CONTEXT, LPFILETIME,
+	  HCERTSTORE, PCERT_CHAIN_PARA, DWORD, LPVOID, PCCERT_CHAIN_CONTEXT*);
+	BOOL CertVerifyCertificateChainPolicy(LPCSTR, PCCERT_CHAIN_CONTEXT,
+	  PCERT_CHAIN_POLICY_PARA, PCERT_CHAIN_POLICY_STATUS);
+	void CertFreeCertificateChain(PCCERT_CHAIN_CONTEXT);
+	DWORD CertNameToStrA(DWORD, PCERT_NAME_BLOB, DWORD, LPSTR, DWORD);
+	DWORD CertNameToStrW(DWORD, PCERT_NAME_BLOB, DWORD, LPWSTR, DWORD);
+	HCERTSTORE CertOpenSystemStoreA(HCRYPTPROV, LPCSTR);
+	HCERTSTORE CertOpenSystemStoreW(HCRYPTPROV, LPCWSTR);
+	HCERTSTORE CertOpenStore(LPCSTR, DWORD, HCRYPTPROV, DWORD, void*);
+	PCCERT_CONTEXT CertFindCertificateInStore(HCERTSTORE, DWORD, DWORD, DWORD,
+	  void*, PCCERT_CONTEXT);
+	BOOL CertFreeCertificateContext(PCCERT_CONTEXT);
+	PCCERT_CONTEXT CertGetIssuerCertificateFromStore(HCERTSTORE,
+	  PCCERT_CONTEXT, PCCERT_CONTEXT, DWORD*);
+	PCCERT_CHAIN_CONTEXT CertFindChainInStore(HCERTSTORE, DWORD, DWORD, DWORD,
+	  void*, PCCERT_CHAIN_CONTEXT);
+
+	BOOL CryptAcquireContextA(HCRYPTPROV*, LPCSTR, LPCSTR, DWORD, DWORD);
+	BOOL CryptAcquireContextW(HCRYPTPROV*, LPCWSTR, LPCWSTR, DWORD, DWORD);
+	 BOOL CryptContextAddRef(HCRYPTPROV, DWORD*, DWORD);
+	BOOL CryptReleaseContext(HCRYPTPROV, DWORD);
+	BOOL CryptGenKey(HCRYPTPROV, ALG_ID, DWORD, HCRYPTKEY*);
+	BOOL CryptDeriveKey(HCRYPTPROV, ALG_ID, HCRYPTHASH, DWORD, HCRYPTKEY*);
+	BOOL CryptDestroyKey(HCRYPTKEY);
+	static if (WINVER >= 0x0500) {
+		BOOL CryptDuplicateHash(HCRYPTHASH, DWORD*, DWORD, HCRYPTHASH*);
+		BOOL CryptDuplicateKey(HCRYPTKEY, DWORD*, DWORD, HCRYPTKEY*);
+	}
+	BOOL CryptSetKeyParam(HCRYPTKEY, DWORD, PBYTE, DWORD);
+	BOOL CryptGetKeyParam(HCRYPTKEY, DWORD, PBYTE, PDWORD, DWORD);
+	BOOL CryptSetHashParam(HCRYPTHASH, DWORD, PBYTE, DWORD);
+	BOOL CryptGetHashParam(HCRYPTHASH, DWORD, PBYTE, PDWORD, DWORD);
+	BOOL CryptSetProvParam(HCRYPTPROV, DWORD, PBYTE, DWORD);
+	BOOL CryptGetProvParam(HCRYPTPROV, DWORD, PBYTE, PDWORD, DWORD);
+	BOOL CryptGenRandom(HCRYPTPROV, DWORD, PBYTE);
+	BOOL CryptGetUserKey(HCRYPTPROV, DWORD, HCRYPTKEY*);
+	BOOL CryptExportKey(HCRYPTKEY, HCRYPTKEY, DWORD, DWORD, PBYTE, PDWORD);
+	BOOL CryptImportKey(HCRYPTPROV, PBYTE, DWORD, HCRYPTKEY, DWORD,
+	  HCRYPTKEY*);
+	BOOL CryptEncrypt(HCRYPTKEY, HCRYPTHASH, BOOL, DWORD, PBYTE, PDWORD,
+	  DWORD);
+	BOOL CryptDecrypt(HCRYPTKEY, HCRYPTHASH, BOOL, DWORD, PBYTE, PDWORD);
+	BOOL CryptCreateHash(HCRYPTPROV, ALG_ID, HCRYPTKEY, DWORD, HCRYPTHASH*);
+	BOOL CryptHashData(HCRYPTHASH, PBYTE, DWORD, DWORD);
+	BOOL CryptHashSessionKey(HCRYPTHASH, HCRYPTKEY, DWORD);
+	BOOL CryptGetHashValue(HCRYPTHASH, DWORD, PBYTE, PDWORD);
+	BOOL CryptDestroyHash(HCRYPTHASH);
+	BOOL CryptSignHashA(HCRYPTHASH, DWORD, LPCSTR, DWORD, PBYTE, PDWORD);
+	BOOL CryptSignHashW(HCRYPTHASH, DWORD, LPCWSTR, DWORD, PBYTE, PDWORD);
+	BOOL CryptVerifySignatureA(HCRYPTHASH, PBYTE, DWORD, HCRYPTKEY, LPCSTR,
+	  DWORD);
+	BOOL CryptVerifySignatureW(HCRYPTHASH, PBYTE, DWORD, HCRYPTKEY, LPCWSTR,
+	  DWORD);
+	BOOL CryptSetProviderA(LPCSTR, DWORD);
+	BOOL CryptSetProviderW(LPCWSTR, DWORD);
+}
+
+version (Unicode) {
+	alias CertNameToStrW CertNameToStr;
+	alias CryptAcquireContextW CryptAcquireContext;
+	alias CryptSignHashW CryptSignHash;
+	alias CryptVerifySignatureW CryptVerifySignature;
+	alias CryptSetProviderW CryptSetProvider;
+	alias CertOpenSystemStoreW CertOpenSystemStore;
+	/+alias CERT_FIND_SUBJECT_STR_W CERT_FIND_SUBJECT_STR;
+	alias CERT_FIND_ISSUER_STR_W CERT_FIND_ISSUER_STR;+/
+} else {
+	alias CertNameToStrA CertNameToStr;
+	alias CryptAcquireContextA CryptAcquireContext;
+	alias CryptSignHashA CryptSignHash;
+	alias CryptVerifySignatureA CryptVerifySignature;
+	alias CryptSetProviderA CryptSetProvider;
+	alias CertOpenSystemStoreA CertOpenSystemStore;
+	/+alias CERT_FIND_SUBJECT_STR_A CERT_FIND_SUBJECT_STR;
+	alias CERT_FIND_ISSUER_STR_A CERT_FIND_ISSUER_STR;+/
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/windef.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,114 @@
+/***********************************************************************\
+*                                windef.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.windef;
+
+public import win32.winnt;
+private import win32.w32api;
+
+const size_t MAX_PATH = 260;
+
+ushort MAKEWORD(ubyte a, ubyte b) {
+	return cast(ushort) ((b << 8) | a);
+}
+
+uint MAKELONG(ushort a, ushort b) {
+	return cast(uint) ((b << 16) | a);
+}
+
+ushort LOWORD(uint l) {
+	return cast(ushort) l;
+}
+
+ushort HIWORD(uint l) {
+	return cast(ushort) (l >>> 16);
+}
+
+ubyte LOBYTE(ushort w) {
+	return cast(ubyte) w;
+}
+
+ubyte HIBYTE(ushort w) {
+	return cast(ubyte) (w >>> 8);
+}
+
+template max(T) {
+	T max(T a, T b) {
+		return a > b ? a : b;
+	}
+}
+
+template min(T) {
+	T min(T a, T b) {
+		return a < b ? a : b;
+	}
+}
+
+const void* NULL = null;
+alias ubyte   BYTE;
+alias ubyte*  PBYTE, LPBYTE;
+alias ushort  USHORT, WORD, ATOM;
+alias ushort* PUSHORT, PWORD, LPWORD;
+alias uint    ULONG, DWORD, UINT, COLORREF;
+alias uint*   PULONG, PDWORD, LPDWORD, PUINT, LPUINT;
+alias int     WINBOOL, BOOL, INT, LONG, HFILE, HRESULT;
+alias int*    PWINBOOL, LPWINBOOL, PBOOL, LPBOOL, PINT, LPINT, LPLONG;
+alias float   FLOAT;
+alias float*  PFLOAT;
+alias void*   PCVOID, LPCVOID;
+
+alias UINT_PTR WPARAM;
+alias LONG_PTR LPARAM, LRESULT;
+
+alias HANDLE HGLOBAL, HLOCAL, GLOBALHANDLE, LOCALHANDLE, HGDIOBJ, HACCEL,
+  HBITMAP, HBRUSH, HCOLORSPACE, HDC, HGLRC, HDESK, HENHMETAFILE, HFONT,
+  HICON, HINSTANCE, HKEY, HMENU, HMETAFILE, HMODULE, HMONITOR, HPALETTE, HPEN,
+  HRGN, HRSRC, HSTR, HTASK, HWND, HWINSTA, HKL, HCURSOR;
+alias HANDLE* PHKEY;
+
+static if (WINVER >= 0x500) {
+	alias HANDLE HTERMINAL, HWINEVENTHOOK;
+}
+
+alias extern (Windows) int function() FARPROC, NEARPROC, PROC;
+
+struct RECT {
+	LONG left;
+	LONG top;
+	LONG right;
+	LONG bottom;
+}
+alias RECT RECTL;
+alias RECT* PRECT, LPRECT, LPCRECT, PRECTL, LPRECTL, LPCRECTL;
+
+struct POINT {
+	LONG x;
+	LONG y;
+}
+alias POINT POINTL;
+alias POINT* PPOINT, LPPOINT, PPOINTL, LPPOINTL;
+
+struct SIZE {
+	LONG cx;
+	LONG cy;
+}
+alias SIZE SIZEL;
+alias SIZE* PSIZE, LPSIZE, PSIZEL, LPSIZEL;
+
+struct POINTS {
+	SHORT x;
+	SHORT y;
+}
+alias POINTS* PPOINTS, LPPOINTS;
+
+enum : BOOL {
+	FALSE = 0,
+	TRUE  = 1
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/windows.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,77 @@
+/***********************************************************************\
+*                               windows.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*             Translated from MinGW API for MS-Windows 3.10             *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.windows;
+
+/*
+	windows.h - main header file for the Win32 API
+
+	Written by Anders Norlander <anorland@hem2.passagen.se>
+
+	This file is part of a free library for the Win32 API.
+
+	This library is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+*/
+
+public import win32.w32api;
+public import win32.core;
+
+// We can't use static if for imports, build gets confused.
+version (WindowsVista) {
+	public import win32.winsvc;
+} else version (Windows2003) {
+	public import win32.winsvc;
+} else version (WindowsXP) {
+	public import win32.winsvc;
+} else version (WindowsNTonly) {
+	public import win32.winsvc;
+}
+
+public import win32.cderr;
+public import win32.dde;
+public import win32.ddeml;
+public import win32.dlgs;
+public import win32.imm;
+public import win32.lzexpand;
+public import win32.mmsystem;
+public import win32.nb30;
+
+
+
+public import win32.rpc;
+public import win32.shellapi;
+public import win32.winperf;
+public import win32.commdlg;
+public import win32.winspool;
+public import win32.ole2;
+
+// Select correct version of winsock.  Importing the incorrect
+// module will cause a static assert to prevent problems later on.
+version (Win32_Winsock1) {
+	public import win32.winsock;
+} else {
+	public import win32.winsock2;
+	public import win32.ws2tcpip;
+}
+
+/+
+#if (_WIN32_WINNT >= 0x0400)
+#include <winsock2.h>
+/*
+ * MS likes to include mswsock.h here as well,
+ * but that can cause undefined symbols if
+ * winsock2.h is included before windows.h
+ */
+#else
+#include <winsock.h>
+#endif /*  (_WIN32_WINNT >= 0x0400) */
++/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/winerror.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,2310 @@
+/***********************************************************************\
+*                              winerror.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.winerror;
+
+/* Comments from the Mingw header:
+ * WAIT_TIMEOUT is also defined in winbase.h
+ */
+
+private import win32.windef;
+
+alias int SCODE; // was in win32.wtypes.
+
+enum : uint {
+	ERROR_SUCCESS                                         =     0,
+	NO_ERROR                                              =     0,
+	ERROR_INVALID_FUNCTION,
+	ERROR_FILE_NOT_FOUND,
+	ERROR_PATH_NOT_FOUND,
+	ERROR_TOO_MANY_OPEN_FILES,
+	ERROR_ACCESS_DENIED,
+	ERROR_INVALID_HANDLE,
+	ERROR_ARENA_TRASHED,
+	ERROR_NOT_ENOUGH_MEMORY,
+	ERROR_INVALID_BLOCK,
+	ERROR_BAD_ENVIRONMENT,
+	ERROR_BAD_FORMAT,
+	ERROR_INVALID_ACCESS,
+	ERROR_INVALID_DATA,
+	ERROR_OUTOFMEMORY,
+	ERROR_INVALID_DRIVE,
+	ERROR_CURRENT_DIRECTORY,
+	ERROR_NOT_SAME_DEVICE,
+	ERROR_NO_MORE_FILES,
+	ERROR_WRITE_PROTECT,
+	ERROR_BAD_UNIT,
+	ERROR_NOT_READY,
+	ERROR_BAD_COMMAND,
+	ERROR_CRC,
+	ERROR_BAD_LENGTH,
+	ERROR_SEEK,
+	ERROR_NOT_DOS_DISK,
+	ERROR_SECTOR_NOT_FOUND,
+	ERROR_OUT_OF_PAPER,
+	ERROR_WRITE_FAULT,
+	ERROR_READ_FAULT,
+	ERROR_GEN_FAILURE,
+	ERROR_SHARING_VIOLATION,
+	ERROR_LOCK_VIOLATION,
+	ERROR_WRONG_DISK,                                  // =    34
+	ERROR_SHARING_BUFFER_EXCEEDED                         =    36,
+	ERROR_HANDLE_EOF                                      =    38,
+	ERROR_HANDLE_DISK_FULL,                            // =    39
+	ERROR_NOT_SUPPORTED                                   =    50,
+	ERROR_REM_NOT_LIST,
+	ERROR_DUP_NAME,
+	ERROR_BAD_NETPATH,
+	ERROR_NETWORK_BUSY,
+	ERROR_DEV_NOT_EXIST,
+	ERROR_TOO_MANY_CMDS,
+	ERROR_ADAP_HDW_ERR,
+	ERROR_BAD_NET_RESP,
+	ERROR_UNEXP_NET_ERR,
+	ERROR_BAD_REM_ADAP,
+	ERROR_PRINTQ_FULL,
+	ERROR_NO_SPOOL_SPACE,
+	ERROR_PRINT_CANCELLED,
+	ERROR_NETNAME_DELETED,
+	ERROR_NETWORK_ACCESS_DENIED,
+	ERROR_BAD_DEV_TYPE,
+	ERROR_BAD_NET_NAME,
+	ERROR_TOO_MANY_NAMES,
+	ERROR_TOO_MANY_SESS,
+	ERROR_SHARING_PAUSED,
+	ERROR_REQ_NOT_ACCEP,
+	ERROR_REDIR_PAUSED,                                // =    72
+	ERROR_FILE_EXISTS                                     =    80,
+	ERROR_CANNOT_MAKE                                     =    82,
+	ERROR_FAIL_I24,
+	ERROR_OUT_OF_STRUCTURES,
+	ERROR_ALREADY_ASSIGNED,
+	ERROR_INVALID_PASSWORD,
+	ERROR_INVALID_PARAMETER,
+	ERROR_NET_WRITE_FAULT,
+	ERROR_NO_PROC_SLOTS,                               // =    89
+	ERROR_TOO_MANY_SEMAPHORES                             =   100,
+	ERROR_EXCL_SEM_ALREADY_OWNED,
+	ERROR_SEM_IS_SET,
+	ERROR_TOO_MANY_SEM_REQUESTS,
+	ERROR_INVALID_AT_INTERRUPT_TIME,
+	ERROR_SEM_OWNER_DIED,
+	ERROR_SEM_USER_LIMIT,
+	ERROR_DISK_CHANGE,
+	ERROR_DRIVE_LOCKED,
+	ERROR_BROKEN_PIPE,
+	ERROR_OPEN_FAILED,
+	ERROR_BUFFER_OVERFLOW,
+	ERROR_DISK_FULL,
+	ERROR_NO_MORE_SEARCH_HANDLES,
+	ERROR_INVALID_TARGET_HANDLE,                       // =   114
+	ERROR_INVALID_CATEGORY                                =   117,
+	ERROR_INVALID_VERIFY_SWITCH,
+	ERROR_BAD_DRIVER_LEVEL,
+	ERROR_CALL_NOT_IMPLEMENTED,
+	ERROR_SEM_TIMEOUT,
+	ERROR_INSUFFICIENT_BUFFER,
+	ERROR_INVALID_NAME,
+	ERROR_INVALID_LEVEL,
+	ERROR_NO_VOLUME_LABEL,
+	ERROR_MOD_NOT_FOUND,
+	ERROR_PROC_NOT_FOUND,
+	ERROR_WAIT_NO_CHILDREN,
+	ERROR_CHILD_NOT_COMPLETE,
+	ERROR_DIRECT_ACCESS_HANDLE,
+	ERROR_NEGATIVE_SEEK,
+	ERROR_SEEK_ON_DEVICE,
+	ERROR_IS_JOIN_TARGET,
+	ERROR_IS_JOINED,
+	ERROR_IS_SUBSTED,
+	ERROR_NOT_JOINED,
+	ERROR_NOT_SUBSTED,
+	ERROR_JOIN_TO_JOIN,
+	ERROR_SUBST_TO_SUBST,
+	ERROR_JOIN_TO_SUBST,
+	ERROR_SUBST_TO_JOIN,
+	ERROR_BUSY_DRIVE,
+	ERROR_SAME_DRIVE,
+	ERROR_DIR_NOT_ROOT,
+	ERROR_DIR_NOT_EMPTY,
+	ERROR_IS_SUBST_PATH,
+	ERROR_IS_JOIN_PATH,
+	ERROR_PATH_BUSY,
+	ERROR_IS_SUBST_TARGET,
+	ERROR_SYSTEM_TRACE,
+	ERROR_INVALID_EVENT_COUNT,
+	ERROR_TOO_MANY_MUXWAITERS,
+	ERROR_INVALID_LIST_FORMAT,
+	ERROR_LABEL_TOO_LONG,
+	ERROR_TOO_MANY_TCBS,
+	ERROR_SIGNAL_REFUSED,
+	ERROR_DISCARDED,
+	ERROR_NOT_LOCKED,
+	ERROR_BAD_THREADID_ADDR,
+	ERROR_BAD_ARGUMENTS,
+	ERROR_BAD_PATHNAME,
+	ERROR_SIGNAL_PENDING,                              // =   162
+	ERROR_MAX_THRDS_REACHED                               =   164,
+	ERROR_LOCK_FAILED                                     =   167,
+	ERROR_BUSY                                            =   170,
+	ERROR_CANCEL_VIOLATION                                =   173,
+	ERROR_ATOMIC_LOCKS_NOT_SUPPORTED,                  // =   174
+	ERROR_INVALID_SEGMENT_NUMBER                          =   180,
+	ERROR_INVALID_ORDINAL                                 =   182,
+	ERROR_ALREADY_EXISTS,                              // =   183
+	ERROR_INVALID_FLAG_NUMBER                             =   186,
+	ERROR_SEM_NOT_FOUND,
+	ERROR_INVALID_STARTING_CODESEG,
+	ERROR_INVALID_STACKSEG,
+	ERROR_INVALID_MODULETYPE,
+	ERROR_INVALID_EXE_SIGNATURE,
+	ERROR_EXE_MARKED_INVALID,
+	ERROR_BAD_EXE_FORMAT,
+	ERROR_ITERATED_DATA_EXCEEDS_64k,
+	ERROR_INVALID_MINALLOCSIZE,
+	ERROR_DYNLINK_FROM_INVALID_RING,
+	ERROR_IOPL_NOT_ENABLED,
+	ERROR_INVALID_SEGDPL,
+	ERROR_AUTODATASEG_EXCEEDS_64k,
+	ERROR_RING2SEG_MUST_BE_MOVABLE,
+	ERROR_RELOC_CHAIN_XEEDS_SEGLIM,
+	ERROR_INFLOOP_IN_RELOC_CHAIN,
+	ERROR_ENVVAR_NOT_FOUND,                            // =   203
+	ERROR_NO_SIGNAL_SENT                                  =   205,
+	ERROR_FILENAME_EXCED_RANGE,
+	ERROR_RING2_STACK_IN_USE,
+	ERROR_META_EXPANSION_TOO_LONG,
+	ERROR_INVALID_SIGNAL_NUMBER,
+	ERROR_THREAD_1_INACTIVE,                           // =   210
+	ERROR_LOCKED                                          =   212,
+	ERROR_TOO_MANY_MODULES                                =   214,
+	ERROR_NESTING_NOT_ALLOWED,
+	ERROR_EXE_MACHINE_TYPE_MISMATCH,
+	ERROR_EXE_CANNOT_MODIFY_SIGNED_BINARY,
+	ERROR_EXE_CANNOT_MODIFY_STRONG_SIGNED_BINARY,      // =   218
+	ERROR_BAD_PIPE                                        =   230,
+	ERROR_PIPE_BUSY,
+	ERROR_NO_DATA,
+	ERROR_PIPE_NOT_CONNECTED,
+	ERROR_MORE_DATA,                                   // =   234
+	ERROR_VC_DISCONNECTED                                 =   240,
+	ERROR_INVALID_EA_NAME                                 =   254,
+	ERROR_EA_LIST_INCONSISTENT,                        // =   255
+	WAIT_TIMEOUT                                          =   258,
+	ERROR_NO_MORE_ITEMS,                               // =   259
+	ERROR_CANNOT_COPY                                     =   266,
+	ERROR_DIRECTORY,                                   // =   267
+	ERROR_EAS_DIDNT_FIT                                   =   275,
+	ERROR_EA_FILE_CORRUPT,
+	ERROR_EA_TABLE_FULL,
+	ERROR_INVALID_EA_HANDLE,                           // =   278
+	ERROR_EAS_NOT_SUPPORTED                               =   282,
+	ERROR_NOT_OWNER                                       =   288,
+	ERROR_TOO_MANY_POSTS                                  =   298,
+	ERROR_PARTIAL_COPY,
+	ERROR_OPLOCK_NOT_GRANTED,
+	ERROR_INVALID_OPLOCK_PROTOCOL,
+	ERROR_DISK_TOO_FRAGMENTED,
+	ERROR_DELETE_PENDING,                              // =   303
+	ERROR_MR_MID_NOT_FOUND                                =   317,
+	ERROR_SCOPE_NOT_FOUND,                             // =   318
+	ERROR_INVALID_ADDRESS                                 =   487,
+	ERROR_ARITHMETIC_OVERFLOW                             =   534,
+	ERROR_PIPE_CONNECTED,
+	ERROR_PIPE_LISTENING,                              // =   536
+	ERROR_EA_ACCESS_DENIED                                =   994,
+	ERROR_OPERATION_ABORTED,
+	ERROR_IO_INCOMPLETE,
+	ERROR_IO_PENDING,
+	ERROR_NOACCESS,
+	ERROR_SWAPERROR,                                   // =   999
+	ERROR_STACK_OVERFLOW                                  =  1001,
+	ERROR_INVALID_MESSAGE,
+	ERROR_CAN_NOT_COMPLETE,
+	ERROR_INVALID_FLAGS,
+	ERROR_UNRECOGNIZED_VOLUME,
+	ERROR_FILE_INVALID,
+	ERROR_FULLSCREEN_MODE,
+	ERROR_NO_TOKEN,
+	ERROR_BADDB,
+	ERROR_BADKEY,
+	ERROR_CANTOPEN,
+	ERROR_CANTREAD,
+	ERROR_CANTWRITE,
+	ERROR_REGISTRY_RECOVERED,
+	ERROR_REGISTRY_CORRUPT,
+	ERROR_REGISTRY_IO_FAILED,
+	ERROR_NOT_REGISTRY_FILE,
+	ERROR_KEY_DELETED,
+	ERROR_NO_LOG_SPACE,
+	ERROR_KEY_HAS_CHILDREN,
+	ERROR_CHILD_MUST_BE_VOLATILE,
+	ERROR_NOTIFY_ENUM_DIR,                             // =  1022
+	ERROR_DEPENDENT_SERVICES_RUNNING                      =  1051,
+	ERROR_INVALID_SERVICE_CONTROL,
+	ERROR_SERVICE_REQUEST_TIMEOUT,
+	ERROR_SERVICE_NO_THREAD,
+	ERROR_SERVICE_DATABASE_LOCKED,
+	ERROR_SERVICE_ALREADY_RUNNING,
+	ERROR_INVALID_SERVICE_ACCOUNT,
+	ERROR_SERVICE_DISABLED,
+	ERROR_CIRCULAR_DEPENDENCY,
+	ERROR_SERVICE_DOES_NOT_EXIST,
+	ERROR_SERVICE_CANNOT_ACCEPT_CTRL,
+	ERROR_SERVICE_NOT_ACTIVE,
+	ERROR_FAILED_SERVICE_CONTROLLER_CONNECT,
+	ERROR_EXCEPTION_IN_SERVICE,
+	ERROR_DATABASE_DOES_NOT_EXIST,
+	ERROR_SERVICE_SPECIFIC_ERROR,
+	ERROR_PROCESS_ABORTED,
+	ERROR_SERVICE_DEPENDENCY_FAIL,
+	ERROR_SERVICE_LOGON_FAILED,
+	ERROR_SERVICE_START_HANG,
+	ERROR_INVALID_SERVICE_LOCK,
+	ERROR_SERVICE_MARKED_FOR_DELETE,
+	ERROR_SERVICE_EXISTS,
+	ERROR_ALREADY_RUNNING_LKG,
+	ERROR_SERVICE_DEPENDENCY_DELETED,
+	ERROR_BOOT_ALREADY_ACCEPTED,
+	ERROR_SERVICE_NEVER_STARTED,
+	ERROR_DUPLICATE_SERVICE_NAME,
+	ERROR_DIFFERENT_SERVICE_ACCOUNT,
+	ERROR_CANNOT_DETECT_DRIVER_FAILURE,
+	ERROR_CANNOT_DETECT_PROCESS_ABORT,
+	ERROR_NO_RECOVERY_PROGRAM,
+	ERROR_SERVICE_NOT_IN_EXE,
+	ERROR_NOT_SAFEBOOT_SERVICE,                        // =  1084
+	ERROR_END_OF_MEDIA                                    =  1100,
+	ERROR_FILEMARK_DETECTED,
+	ERROR_BEGINNING_OF_MEDIA,
+	ERROR_SETMARK_DETECTED,
+	ERROR_NO_DATA_DETECTED,
+	ERROR_PARTITION_FAILURE,
+	ERROR_INVALID_BLOCK_LENGTH,
+	ERROR_DEVICE_NOT_PARTITIONED,
+	ERROR_UNABLE_TO_LOCK_MEDIA,
+	ERROR_UNABLE_TO_UNLOAD_MEDIA,
+	ERROR_MEDIA_CHANGED,
+	ERROR_BUS_RESET,
+	ERROR_NO_MEDIA_IN_DRIVE,
+	ERROR_NO_UNICODE_TRANSLATION,
+	ERROR_DLL_INIT_FAILED,
+	ERROR_SHUTDOWN_IN_PROGRESS,
+	ERROR_NO_SHUTDOWN_IN_PROGRESS,
+	ERROR_IO_DEVICE,
+	ERROR_SERIAL_NO_DEVICE,
+	ERROR_IRQ_BUSY,
+	ERROR_MORE_WRITES,
+	ERROR_COUNTER_TIMEOUT,
+	ERROR_FLOPPY_ID_MARK_NOT_FOUND,
+	ERROR_FLOPPY_WRONG_CYLINDER,
+	ERROR_FLOPPY_UNKNOWN_ERROR,
+	ERROR_FLOPPY_BAD_REGISTERS,
+	ERROR_DISK_RECALIBRATE_FAILED,
+	ERROR_DISK_OPERATION_FAILED,
+	ERROR_DISK_RESET_FAILED,
+	ERROR_EOM_OVERFLOW,
+	ERROR_NOT_ENOUGH_SERVER_MEMORY,
+	ERROR_POSSIBLE_DEADLOCK,
+	ERROR_MAPPED_ALIGNMENT,                            // =  1132
+	ERROR_SET_POWER_STATE_VETOED                          =  1140,
+	ERROR_SET_POWER_STATE_FAILED,
+	ERROR_TOO_MANY_LINKS,                              // =  1142
+	ERROR_OLD_WIN_VERSION                                 =  1150,
+	ERROR_APP_WRONG_OS,
+	ERROR_SINGLE_INSTANCE_APP,
+	ERROR_RMODE_APP,
+	ERROR_INVALID_DLL,
+	ERROR_NO_ASSOCIATION,
+	ERROR_DDE_FAIL,
+	ERROR_DLL_NOT_FOUND,
+	ERROR_NO_MORE_USER_HANDLES,
+	ERROR_MESSAGE_SYNC_ONLY,
+	ERROR_SOURCE_ELEMENT_EMPTY,
+	ERROR_DESTINATION_ELEMENT_FULL,
+	ERROR_ILLEGAL_ELEMENT_ADDRESS,
+	ERROR_MAGAZINE_NOT_PRESENT,
+	ERROR_DEVICE_REINITIALIZATION_NEEDED,
+	ERROR_DEVICE_REQUIRES_CLEANING,
+	ERROR_DEVICE_DOOR_OPEN,
+	ERROR_DEVICE_NOT_CONNECTED,
+	ERROR_NOT_FOUND,
+	ERROR_NO_MATCH,
+	ERROR_SET_NOT_FOUND,
+	ERROR_POINT_NOT_FOUND,
+	ERROR_NO_TRACKING_SERVICE,
+	ERROR_NO_VOLUME_ID,                                // =  1173
+	ERROR_UNABLE_TO_REMOVE_REPLACED                       =  1175,
+	ERROR_UNABLE_TO_MOVE_REPLACEMENT,
+	ERROR_UNABLE_TO_MOVE_REPLACEMENT_2,
+	ERROR_JOURNAL_DELETE_IN_PROGRESS,
+	ERROR_JOURNAL_NOT_ACTIVE,
+	ERROR_POTENTIAL_FILE_FOUND,
+	ERROR_JOURNAL_ENTRY_DELETED,                       // =  1181
+	ERROR_BAD_DEVICE                                      =  1200,
+	ERROR_CONNECTION_UNAVAIL,
+	ERROR_DEVICE_ALREADY_REMEMBERED,
+	ERROR_NO_NET_OR_BAD_PATH,
+	ERROR_BAD_PROVIDER,
+	ERROR_CANNOT_OPEN_PROFILE,
+	ERROR_BAD_PROFILE,
+	ERROR_NOT_CONTAINER,
+	ERROR_EXTENDED_ERROR,
+	ERROR_INVALID_GROUPNAME,
+	ERROR_INVALID_COMPUTERNAME,
+	ERROR_INVALID_EVENTNAME,
+	ERROR_INVALID_DOMAINNAME,
+	ERROR_INVALID_SERVICENAME,
+	ERROR_INVALID_NETNAME,
+	ERROR_INVALID_SHARENAME,
+	ERROR_INVALID_PASSWORDNAME,
+	ERROR_INVALID_MESSAGENAME,
+	ERROR_INVALID_MESSAGEDEST,
+	ERROR_SESSION_CREDENTIAL_CONFLICT,
+	ERROR_REMOTE_SESSION_LIMIT_EXCEEDED,
+	ERROR_DUP_DOMAINNAME,
+	ERROR_NO_NETWORK,
+	ERROR_CANCELLED,
+	ERROR_USER_MAPPED_FILE,
+	ERROR_CONNECTION_REFUSED,
+	ERROR_GRACEFUL_DISCONNECT,
+	ERROR_ADDRESS_ALREADY_ASSOCIATED,
+	ERROR_ADDRESS_NOT_ASSOCIATED,
+	ERROR_CONNECTION_INVALID,
+	ERROR_CONNECTION_ACTIVE,
+	ERROR_NETWORK_UNREACHABLE,
+	ERROR_HOST_UNREACHABLE,
+	ERROR_PROTOCOL_UNREACHABLE,
+	ERROR_PORT_UNREACHABLE,
+	ERROR_REQUEST_ABORTED,
+	ERROR_CONNECTION_ABORTED,
+	ERROR_RETRY,
+	ERROR_CONNECTION_COUNT_LIMIT,
+	ERROR_LOGIN_TIME_RESTRICTION,
+	ERROR_LOGIN_WKSTA_RESTRICTION,
+	ERROR_INCORRECT_ADDRESS,
+	ERROR_ALREADY_REGISTERED,
+	ERROR_SERVICE_NOT_FOUND,
+	ERROR_NOT_AUTHENTICATED,
+	ERROR_NOT_LOGGED_ON,
+	ERROR_CONTINUE,
+	ERROR_ALREADY_INITIALIZED,
+	ERROR_NO_MORE_DEVICES,
+	ERROR_NO_SUCH_SITE,
+	ERROR_DOMAIN_CONTROLLER_EXISTS,
+	ERROR_ONLY_IF_CONNECTED,
+	ERROR_OVERRIDE_NOCHANGES,
+	ERROR_BAD_USER_PROFILE,
+	ERROR_NOT_SUPPORTED_ON_SBS,
+	ERROR_SERVER_SHUTDOWN_IN_PROGRESS,
+	ERROR_HOST_DOWN,
+	ERROR_NON_ACCOUNT_SID,
+	ERROR_NON_DOMAIN_SID,
+	ERROR_APPHELP_BLOCK,
+	ERROR_ACCESS_DISABLED_BY_POLICY,
+	ERROR_REG_NAT_CONSUMPTION,
+	ERROR_CSCSHARE_OFFLINE,
+	ERROR_PKINIT_FAILURE,
+	ERROR_SMARTCARD_SUBSYSTEM_FAILURE,
+	ERROR_DOWNGRADE_DETECTED,
+	SEC_E_SMARTCARD_CERT_REVOKED,
+	SEC_E_ISSUING_CA_UNTRUSTED,
+	SEC_E_REVOCATION_OFFLINE_C,
+	SEC_E_PKINIT_CLIENT_FAILUR,
+	SEC_E_SMARTCARD_CERT_EXPIRED,
+	ERROR_MACHINE_LOCKED,                              // =  1271
+	ERROR_CALLBACK_SUPPLIED_INVALID_DATA                  =  1273,
+	ERROR_SYNC_FOREGROUND_REFRESH_REQUIRED,
+	ERROR_DRIVER_BLOCKED,
+	ERROR_INVALID_IMPORT_OF_NON_DLL,
+	ERROR_ACCESS_DISABLED_WEBBLADE,
+	ERROR_ACCESS_DISABLED_WEBBLADE_TAMPER,
+	ERROR_RECOVERY_FAILURE,
+	ERROR_ALREADY_FIBER,
+	ERROR_ALREADY_THREAD,
+	ERROR_STACK_BUFFER_OVERRUN,
+	ERROR_PARAMETER_QUOTA_EXCEEDED,
+	ERROR_DEBUGGER_INACTIVE,                           // =  1284
+	ERROR_NOT_ALL_ASSIGNED                                =  1300,
+	ERROR_SOME_NOT_MAPPED,
+	ERROR_NO_QUOTAS_FOR_ACCOUNT,
+	ERROR_LOCAL_USER_SESSION_KEY,
+	ERROR_NULL_LM_PASSWORD,
+	ERROR_UNKNOWN_REVISION,
+	ERROR_REVISION_MISMATCH,
+	ERROR_INVALID_OWNER,
+	ERROR_INVALID_PRIMARY_GROUP,
+	ERROR_NO_IMPERSONATION_TOKEN,
+	ERROR_CANT_DISABLE_MANDATORY,
+	ERROR_NO_LOGON_SERVERS,
+	ERROR_NO_SUCH_LOGON_SESSION,
+	ERROR_NO_SUCH_PRIVILEGE,
+	ERROR_PRIVILEGE_NOT_HELD,
+	ERROR_INVALID_ACCOUNT_NAME,
+	ERROR_USER_EXISTS,
+	ERROR_NO_SUCH_USER,
+	ERROR_GROUP_EXISTS,
+	ERROR_NO_SUCH_GROUP,
+	ERROR_MEMBER_IN_GROUP,
+	ERROR_MEMBER_NOT_IN_GROUP,
+	ERROR_LAST_ADMIN,
+	ERROR_WRONG_PASSWORD,
+	ERROR_ILL_FORMED_PASSWORD,
+	ERROR_PASSWORD_RESTRICTION,
+	ERROR_LOGON_FAILURE,
+	ERROR_ACCOUNT_RESTRICTION,
+	ERROR_INVALID_LOGON_HOURS,
+	ERROR_INVALID_WORKSTATION,
+	ERROR_PASSWORD_EXPIRED,
+	ERROR_ACCOUNT_DISABLED,
+	ERROR_NONE_MAPPED,
+	ERROR_TOO_MANY_LUIDS_REQUESTED,
+	ERROR_LUIDS_EXHAUSTED,
+	ERROR_INVALID_SUB_AUTHORITY,
+	ERROR_INVALID_ACL,
+	ERROR_INVALID_SID,
+	ERROR_INVALID_SECURITY_DESCR,                      // =  1338
+	ERROR_BAD_INHERITANCE_ACL                             =  1340,
+	ERROR_SERVER_DISABLED,
+	ERROR_SERVER_NOT_DISABLED,
+	ERROR_INVALID_ID_AUTHORITY,
+	ERROR_ALLOTTED_SPACE_EXCEEDED,
+	ERROR_INVALID_GROUP_ATTRIBUTES,
+	ERROR_BAD_IMPERSONATION_LEVEL,
+	ERROR_CANT_OPEN_ANONYMOUS,
+	ERROR_BAD_VALIDATION_CLASS,
+	ERROR_BAD_TOKEN_TYPE,
+	ERROR_NO_SECURITY_ON_OBJECT,
+	ERROR_CANT_ACCESS_DOMAIN_INFO,
+	ERROR_INVALID_SERVER_STATE,
+	ERROR_INVALID_DOMAIN_STATE,
+	ERROR_INVALID_DOMAIN_ROLE,
+	ERROR_NO_SUCH_DOMAIN,
+	ERROR_DOMAIN_EXISTS,
+	ERROR_DOMAIN_LIMIT_EXCEEDED,
+	ERROR_INTERNAL_DB_CORRUPTION,
+	ERROR_INTERNAL_ERROR,
+	ERROR_GENERIC_NOT_MAPPED,
+	ERROR_BAD_DESCRIPTOR_FORMAT,
+	ERROR_NOT_LOGON_PROCESS,
+	ERROR_LOGON_SESSION_EXISTS,
+	ERROR_NO_SUCH_PACKAGE,
+	ERROR_BAD_LOGON_SESSION_STATE,
+	ERROR_LOGON_SESSION_COLLISION,
+	ERROR_INVALID_LOGON_TYPE,
+	ERROR_CANNOT_IMPERSONATE,
+	ERROR_RXACT_INVALID_STATE,
+	ERROR_RXACT_COMMIT_FAILURE,
+	ERROR_SPECIAL_ACCOUNT,
+	ERROR_SPECIAL_GROUP,
+	ERROR_SPECIAL_USER,
+	ERROR_MEMBERS_PRIMARY_GROUP,
+	ERROR_TOKEN_ALREADY_IN_USE,
+	ERROR_NO_SUCH_ALIAS,
+	ERROR_MEMBER_NOT_IN_ALIAS,
+	ERROR_MEMBER_IN_ALIAS,
+	ERROR_ALIAS_EXISTS,
+	ERROR_LOGON_NOT_GRANTED,
+	ERROR_TOO_MANY_SECRETS,
+	ERROR_SECRET_TOO_LONG,
+	ERROR_INTERNAL_DB_ERROR,
+	ERROR_TOO_MANY_CONTEXT_IDS,
+	ERROR_LOGON_TYPE_NOT_GRANTED,
+	ERROR_NT_CROSS_ENCRYPTION_REQUIRED,
+	ERROR_NO_SUCH_MEMBER,
+	ERROR_INVALID_MEMBER,
+	ERROR_TOO_MANY_SIDS,
+	ERROR_LM_CROSS_ENCRYPTION_REQUIRED,
+	ERROR_NO_INHERITANCE,
+	ERROR_FILE_CORRUPT,
+	ERROR_DISK_CORRUPT,
+	ERROR_NO_USER_SESSION_KEY,
+	ERROR_LICENSE_QUOTA_EXCEEDED,
+	ERROR_WRONG_TARGET_NAME,
+	ERROR_MUTUAL_AUTH_FAILED,
+	ERROR_TIME_SKEW,
+	ERROR_CURRENT_DOMAIN_NOT_ALLOWED,
+	ERROR_INVALID_WINDOW_HANDLE,
+	ERROR_INVALID_MENU_HANDLE,
+	ERROR_INVALID_CURSOR_HANDLE,
+	ERROR_INVALID_ACCEL_HANDLE,
+	ERROR_INVALID_HOOK_HANDLE,
+	ERROR_INVALID_DWP_HANDLE,
+	ERROR_TLW_WITH_WSCHILD,
+	ERROR_CANNOT_FIND_WND_CLASS,
+	ERROR_WINDOW_OF_OTHER_THREAD,
+	ERROR_HOTKEY_ALREADY_REGISTERED,
+	ERROR_CLASS_ALREADY_EXISTS,
+	ERROR_CLASS_DOES_NOT_EXIST,
+	ERROR_CLASS_HAS_WINDOWS,
+	ERROR_INVALID_INDEX,
+	ERROR_INVALID_ICON_HANDLE,
+	ERROR_PRIVATE_DIALOG_INDEX,
+	ERROR_LISTBOX_ID_NOT_FOUND,
+	ERROR_NO_WILDCARD_CHARACTERS,
+	ERROR_CLIPBOARD_NOT_OPEN,
+	ERROR_HOTKEY_NOT_REGISTERED,
+	ERROR_WINDOW_NOT_DIALOG,
+	ERROR_CONTROL_ID_NOT_FOUND,
+	ERROR_INVALID_COMBOBOX_MESSAGE,
+	ERROR_WINDOW_NOT_COMBOBOX,
+	ERROR_INVALID_EDIT_HEIGHT,
+	ERROR_DC_NOT_FOUND,
+	ERROR_INVALID_HOOK_FILTER,
+	ERROR_INVALID_FILTER_PROC,
+	ERROR_HOOK_NEEDS_HMOD,
+	ERROR_GLOBAL_ONLY_HOOK,
+	ERROR_JOURNAL_HOOK_SET,
+	ERROR_HOOK_NOT_INSTALLED,
+	ERROR_INVALID_LB_MESSAGE,
+	ERROR_SETCOUNT_ON_BAD_LB,
+	ERROR_LB_WITHOUT_TABSTOPS,
+	ERROR_DESTROY_OBJECT_OF_OTHER_THREAD,
+	ERROR_CHILD_WINDOW_MENU,
+	ERROR_NO_SYSTEM_MENU,
+	ERROR_INVALID_MSGBOX_STYLE,
+	ERROR_INVALID_SPI_VALUE,
+	ERROR_SCREEN_ALREADY_LOCKED,
+	ERROR_HWNDS_HAVE_DIFF_PARENT,
+	ERROR_NOT_CHILD_WINDOW,
+	ERROR_INVALID_GW_COMMAND,
+	ERROR_INVALID_THREAD_ID,
+	ERROR_NON_MDICHILD_WINDOW,
+	ERROR_POPUP_ALREADY_ACTIVE,
+	ERROR_NO_SCROLLBARS,
+	ERROR_INVALID_SCROLLBAR_RANGE,
+	ERROR_INVALID_SHOWWIN_COMMAND,
+	ERROR_NO_SYSTEM_RESOURCES,
+	ERROR_NONPAGED_SYSTEM_RESOURCES,
+	ERROR_PAGED_SYSTEM_RESOURCES,
+	ERROR_WORKING_SET_QUOTA,
+	ERROR_PAGEFILE_QUOTA,
+	ERROR_COMMITMENT_LIMIT,
+	ERROR_MENU_ITEM_NOT_FOUND,
+	ERROR_INVALID_KEYBOARD_HANDLE,
+	ERROR_HOOK_TYPE_NOT_ALLOWED,
+	ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION,
+	ERROR_TIMEOUT,
+	ERROR_INVALID_MONITOR_HANDLE,                      // =  1461
+	ERROR_EVENTLOG_FILE_CORRUPT                           =  1500,
+	ERROR_EVENTLOG_CANT_START,
+	ERROR_LOG_FILE_FULL,
+	ERROR_EVENTLOG_FILE_CHANGED,                       // =  1503
+	ERROR_INSTALL_SERVICE_FAILURE                         =  1601,
+	ERROR_INSTALL_USEREXIT,
+	ERROR_INSTALL_FAILURE,
+	ERROR_INSTALL_SUSPEND,
+	ERROR_UNKNOWN_PRODUCT,
+	ERROR_UNKNOWN_FEATURE,
+	ERROR_UNKNOWN_COMPONENT,
+	ERROR_UNKNOWN_PROPERTY,
+	ERROR_INVALID_HANDLE_STATE,
+	ERROR_BAD_CONFIGURATION,
+	ERROR_INDEX_ABSENT,
+	ERROR_INSTALL_SOURCE_ABSENT,
+	ERROR_INSTALL_PACKAGE_VERSION,
+	ERROR_PRODUCT_UNINSTALLED,
+	ERROR_BAD_QUERY_SYNTAX,
+	ERROR_INVALID_FIELD,
+	ERROR_DEVICE_REMOVED,
+	ERROR_INSTALL_ALREADY_RUNNING,
+	ERROR_INSTALL_PACKAGE_OPEN_FAILED,
+	ERROR_INSTALL_PACKAGE_INVALID,
+	ERROR_INSTALL_UI_FAILURE,
+	ERROR_INSTALL_LOG_FAILURE,
+	ERROR_INSTALL_LANGUAGE_UNSUPPORTED,
+	ERROR_INSTALL_TRANSFORM_FAILURE,
+	ERROR_INSTALL_PACKAGE_REJECTED,
+	ERROR_FUNCTION_NOT_CALLED,
+	ERROR_FUNCTION_FAILED,
+	ERROR_INVALID_TABLE,
+	ERROR_DATATYPE_MISMATCH,
+	ERROR_UNSUPPORTED_TYPE,
+	ERROR_CREATE_FAILED,
+	ERROR_INSTALL_TEMP_UNWRITABLE,
+	ERROR_INSTALL_PLATFORM_UNSUPPORTED,
+	ERROR_INSTALL_NOTUSED,
+	ERROR_PATCH_PACKAGE_OPEN_FAILED,
+	ERROR_PATCH_PACKAGE_INVALID,
+	ERROR_PATCH_PACKAGE_UNSUPPORTED,
+	ERROR_PRODUCT_VERSION,
+	ERROR_INVALID_COMMAND_LINE,
+	ERROR_INSTALL_REMOTE_DISALLOWED,
+	ERROR_SUCCESS_REBOOT_INITIATED,
+	ERROR_PATCH_TARGET_NOT_FOUND,
+	ERROR_PATCH_PACKAGE_REJECTED,
+	ERROR_INSTALL_TRANSFORM_REJECTED,
+	ERROR_INSTALL_REMOTE_PROHIBITED,                   // =  1645
+	RPC_S_INVALID_STRING_BINDING                          =  1700,
+	RPC_S_WRONG_KIND_OF_BINDING,
+	RPC_S_INVALID_BINDING,
+	RPC_S_PROTSEQ_NOT_SUPPORTED,
+	RPC_S_INVALID_RPC_PROTSEQ,
+	RPC_S_INVALID_STRING_UUID,
+	RPC_S_INVALID_ENDPOINT_FORMAT,
+	RPC_S_INVALID_NET_ADDR,
+	RPC_S_NO_ENDPOINT_FOUND,
+	RPC_S_INVALID_TIMEOUT,
+	RPC_S_OBJECT_NOT_FOUND,
+	RPC_S_ALREADY_REGISTERED,
+	RPC_S_TYPE_ALREADY_REGISTERED,
+	RPC_S_ALREADY_LISTENING,
+	RPC_S_NO_PROTSEQS_REGISTERED,
+	RPC_S_NOT_LISTENING,
+	RPC_S_UNKNOWN_MGR_TYPE,
+	RPC_S_UNKNOWN_IF,
+	RPC_S_NO_BINDINGS,
+	RPC_S_NO_PROTSEQS,
+	RPC_S_CANT_CREATE_ENDPOINT,
+	RPC_S_OUT_OF_RESOURCES,
+	RPC_S_SERVER_UNAVAILABLE,
+	RPC_S_SERVER_TOO_BUSY,
+	RPC_S_INVALID_NETWORK_OPTIONS,
+	RPC_S_NO_CALL_ACTIVE,
+	RPC_S_CALL_FAILED,
+	RPC_S_CALL_FAILED_DNE,
+	RPC_S_PROTOCOL_ERROR,                              // =  1728
+	RPC_S_UNSUPPORTED_TRANS_SYN                           =  1730,
+	RPC_S_UNSUPPORTED_TYPE                                =  1732,
+	RPC_S_INVALID_TAG,
+	RPC_S_INVALID_BOUND,
+	RPC_S_NO_ENTRY_NAME,
+	RPC_S_INVALID_NAME_SYNTAX,
+	RPC_S_UNSUPPORTED_NAME_SYNTAX,                     // =  1737
+	RPC_S_UUID_NO_ADDRESS                                 =  1739,
+	RPC_S_DUPLICATE_ENDPOINT,
+	RPC_S_UNKNOWN_AUTHN_TYPE,
+	RPC_S_MAX_CALLS_TOO_SMALL,
+	RPC_S_STRING_TOO_LONG,
+	RPC_S_PROTSEQ_NOT_FOUND,
+	RPC_S_PROCNUM_OUT_OF_RANGE,
+	RPC_S_BINDING_HAS_NO_AUTH,
+	RPC_S_UNKNOWN_AUTHN_SERVICE,
+	RPC_S_UNKNOWN_AUTHN_LEVEL,
+	RPC_S_INVALID_AUTH_IDENTITY,
+	RPC_S_UNKNOWN_AUTHZ_SERVICE,
+	EPT_S_INVALID_ENTRY,
+	EPT_S_CANT_PERFORM_OP,
+	EPT_S_NOT_REGISTERED,
+	RPC_S_NOTHING_TO_EXPORT,
+	RPC_S_INCOMPLETE_NAME,
+	RPC_S_INVALID_VERS_OPTION,
+	RPC_S_NO_MORE_MEMBERS,
+	RPC_S_NOT_ALL_OBJS_UNEXPORTED,
+	RPC_S_INTERFACE_NOT_FOUND,
+	RPC_S_ENTRY_ALREADY_EXISTS,
+	RPC_S_ENTRY_NOT_FOUND,
+	RPC_S_NAME_SERVICE_UNAVAILABLE,
+	RPC_S_INVALID_NAF_ID,
+	RPC_S_CANNOT_SUPPORT,
+	RPC_S_NO_CONTEXT_AVAILABLE,
+	RPC_S_INTERNAL_ERROR,
+	RPC_S_ZERO_DIVIDE,
+	RPC_S_ADDRESS_ERROR,
+	RPC_S_FP_DIV_ZERO,
+	RPC_S_FP_UNDERFLOW,
+	RPC_S_FP_OVERFLOW,
+	RPC_X_NO_MORE_ENTRIES,
+	RPC_X_SS_CHAR_TRANS_OPEN_FAIL,
+	RPC_X_SS_CHAR_TRANS_SHORT_FILE,
+	RPC_X_SS_IN_NULL_CONTEXT,                          // =  1775
+	RPC_X_SS_CONTEXT_DAMAGED                              =  1777,
+	RPC_X_SS_HANDLES_MISMATCH,
+	RPC_X_SS_CANNOT_GET_CALL_HANDLE,
+	RPC_X_NULL_REF_POINTER,
+	RPC_X_ENUM_VALUE_OUT_OF_RANGE,
+	RPC_X_BYTE_COUNT_TOO_SMALL,
+	RPC_X_BAD_STUB_DATA,
+	ERROR_INVALID_USER_BUFFER,
+	ERROR_UNRECOGNIZED_MEDIA,
+	ERROR_NO_TRUST_LSA_SECRET,
+	ERROR_NO_TRUST_SAM_ACCOUNT,
+	ERROR_TRUSTED_DOMAIN_FAILURE,
+	ERROR_TRUSTED_RELATIONSHIP_FAILURE,
+	ERROR_TRUST_FAILURE,
+	RPC_S_CALL_IN_PROGRESS,
+	ERROR_NETLOGON_NOT_STARTED,
+	ERROR_ACCOUNT_EXPIRED,
+	ERROR_REDIRECTOR_HAS_OPEN_HANDLES,
+	ERROR_PRINTER_DRIVER_ALREADY_INSTALLED,
+	ERROR_UNKNOWN_PORT,
+	ERROR_UNKNOWN_PRINTER_DRIVER,
+	ERROR_UNKNOWN_PRINTPROCESSOR,
+	ERROR_INVALID_SEPARATOR_FILE,
+	ERROR_INVALID_PRIORITY,
+	ERROR_INVALID_PRINTER_NAME,
+	ERROR_PRINTER_ALREADY_EXISTS,
+	ERROR_INVALID_PRINTER_COMMAND,
+	ERROR_INVALID_DATATYPE,
+	ERROR_INVALID_ENVIRONMENT,
+	RPC_S_NO_MORE_BINDINGS,
+	ERROR_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT,
+	ERROR_NOLOGON_WORKSTATION_TRUST_ACCOUNT,
+	ERROR_NOLOGON_SERVER_TRUST_ACCOUNT,
+	ERROR_DOMAIN_TRUST_INCONSISTENT,
+	ERROR_SERVER_HAS_OPEN_HANDLES,
+	ERROR_RESOURCE_DATA_NOT_FOUND,
+	ERROR_RESOURCE_TYPE_NOT_FOUND,
+	ERROR_RESOURCE_NAME_NOT_FOUND,
+	ERROR_RESOURCE_LANG_NOT_FOUND,
+	ERROR_NOT_ENOUGH_QUOTA,
+	RPC_S_NO_INTERFACES,
+	RPC_S_CALL_CANCELLED,
+	RPC_S_BINDING_INCOMPLETE,
+	RPC_S_COMM_FAILURE,
+	RPC_S_UNSUPPORTED_AUTHN_LEVEL,
+	RPC_S_NO_PRINC_NAME,
+	RPC_S_NOT_RPC_ERROR,
+	RPC_S_UUID_LOCAL_ONLY,
+	RPC_S_SEC_PKG_ERROR,
+	RPC_S_NOT_CANCELLED,
+	RPC_X_INVALID_ES_ACTION,
+	RPC_X_WRONG_ES_VERSION,
+	RPC_X_WRONG_STUB_VERSION,
+	RPC_X_INVALID_PIPE_OBJECT,
+	RPC_X_WRONG_PIPE_ORDER,
+	RPC_X_WRONG_PIPE_VERSION,                          // =  1832
+	RPC_S_GROUP_MEMBER_NOT_FOUND                          =  1898,
+	EPT_S_CANT_CREATE,
+	RPC_S_INVALID_OBJECT,
+	ERROR_INVALID_TIME,
+	ERROR_INVALID_FORM_NAME,
+	ERROR_INVALID_FORM_SIZE,
+	ERROR_ALREADY_WAITING,
+	ERROR_PRINTER_DELETED,
+	ERROR_INVALID_PRINTER_STATE,
+	ERROR_PASSWORD_MUST_CHANGE,
+	ERROR_DOMAIN_CONTROLLER_NOT_FOUND,
+	ERROR_ACCOUNT_LOCKED_OUT,
+	OR_INVALID_OXID,
+	OR_INVALID_OID,
+	OR_INVALID_SET,
+	RPC_S_SEND_INCOMPLETE,
+	RPC_S_INVALID_ASYNC_HANDLE,
+	RPC_S_INVALID_ASYNC_CALL,
+	RPC_X_PIPE_CLOSED,
+	RPC_X_PIPE_DISCIPLINE_ERROR,
+	RPC_X_PIPE_EMPTY,
+	ERROR_NO_SITENAME,
+	ERROR_CANT_ACCESS_FILE,
+	ERROR_CANT_RESOLVE_FILENAME,
+	RPC_S_ENTRY_TYPE_MISMATCH,
+	RPC_S_NOT_ALL_OBJS_EXPORTED,
+	RPC_S_INTERFACE_NOT_EXPORTED,
+	RPC_S_PROFILE_NOT_ADDED,
+	RPC_S_PRF_ELT_NOT_ADDED,
+	RPC_S_PRF_ELT_NOT_REMOVED,
+	RPC_S_GRP_ELT_NOT_ADDED,
+	RPC_S_GRP_ELT_NOT_REMOVED,
+	ERROR_KM_DRIVER_BLOCKED,
+	ERROR_CONTEXT_EXPIRED,
+	ERROR_PER_USER_TRUST_QUOTA_EXCEEDED,
+	ERROR_ALL_USER_TRUST_QUOTA_EXCEEDED,
+	ERROR_USER_DELETE_TRUST_QUOTA_EXCEEDED,            // =  1934
+	ERROR_INVALID_PIXEL_FORMAT                            =  2000,
+	ERROR_BAD_DRIVER,
+	ERROR_INVALID_WINDOW_STYLE,
+	ERROR_METAFILE_NOT_SUPPORTED,
+	ERROR_TRANSFORM_NOT_SUPPORTED,
+	ERROR_CLIPPING_NOT_SUPPORTED,                      // =  2005
+	ERROR_INVALID_CMM                                     =  2010,
+	ERROR_INVALID_PROFILE,
+	ERROR_TAG_NOT_FOUND,
+	ERROR_TAG_NOT_PRESENT,
+	ERROR_DUPLICATE_TAG,
+	ERROR_PROFILE_NOT_ASSOCIATED_WITH_DEVICE,
+	ERROR_PROFILE_NOT_FOUND,
+	ERROR_INVALID_COLORSPACE,
+	ERROR_ICM_NOT_ENABLED,
+	ERROR_DELETING_ICM_XFORM,
+	ERROR_INVALID_TRANSFORM,
+	ERROR_COLORSPACE_MISMATCH,
+	ERROR_INVALID_COLORINDEX,                          // =  2022
+	ERROR_CONNECTED_OTHER_PASSWORD                        =  2108,
+	ERROR_CONNECTED_OTHER_PASSWORD_DEFAULT,            // =  2109
+	ERROR_BAD_USERNAME                                    =  2202,
+	ERROR_NOT_CONNECTED                                   =  2250,
+	ERROR_OPEN_FILES                                      =  2401,
+	ERROR_ACTIVE_CONNECTIONS,                          // =  2402
+	ERROR_DEVICE_IN_USE                                   =  2404,
+	ERROR_UNKNOWN_PRINT_MONITOR                           =  3000,
+	ERROR_PRINTER_DRIVER_IN_USE,
+	ERROR_SPOOL_FILE_NOT_FOUND,
+	ERROR_SPL_NO_STARTDOC,
+	ERROR_SPL_NO_ADDJOB,
+	ERROR_PRINT_PROCESSOR_ALREADY_INSTALLED,
+	ERROR_PRINT_MONITOR_ALREADY_INSTALLED,
+	ERROR_INVALID_PRINT_MONITOR,
+	ERROR_PRINT_MONITOR_IN_USE,
+	ERROR_PRINTER_HAS_JOBS_QUEUED,
+	ERROR_SUCCESS_REBOOT_REQUIRED,
+	ERROR_SUCCESS_RESTART_REQUIRED,
+	ERROR_PRINTER_NOT_FOUND,
+	ERROR_PRINTER_DRIVER_WARNED,
+	ERROR_PRINTER_DRIVER_BLOCKED,                      // =  3014
+	ERROR_WINS_INTERNAL                                   =  4000,
+	ERROR_CAN_NOT_DEL_LOCAL_WINS,
+	ERROR_STATIC_INIT,
+	ERROR_INC_BACKUP,
+	ERROR_FULL_BACKUP,
+	ERROR_REC_NON_EXISTENT,
+	ERROR_RPL_NOT_ALLOWED,                             // =  4006
+	ERROR_DHCP_ADDRESS_CONFLICT                           =  4100,
+	ERROR_WMI_GUID_NOT_FOUND                              =  4200,
+	ERROR_WMI_INSTANCE_NOT_FOUND,
+	ERROR_WMI_ITEMID_NOT_FOUND,
+	ERROR_WMI_TRY_AGAIN,
+	ERROR_WMI_DP_NOT_FOUND,
+	ERROR_WMI_UNRESOLVED_INSTANCE_REF,
+	ERROR_WMI_ALREADY_ENABLED,
+	ERROR_WMI_GUID_DISCONNECTED,
+	ERROR_WMI_SERVER_UNAVAILABLE,
+	ERROR_WMI_DP_FAILED,
+	ERROR_WMI_INVALID_MOF,
+	ERROR_WMI_INVALID_REGINFO,
+	ERROR_WMI_ALREADY_DISABLED,
+	ERROR_WMI_READ_ONLY,
+	ERROR_WMI_SET_FAILURE,                             // =  4214
+	ERROR_INVALID_MEDIA                                   =  4300,
+	ERROR_INVALID_LIBRARY,
+	ERROR_INVALID_MEDIA_POOL,
+	ERROR_DRIVE_MEDIA_MISMATCH,
+	ERROR_MEDIA_OFFLINE,
+	ERROR_LIBRARY_OFFLINE,
+	ERROR_EMPTY,
+	ERROR_NOT_EMPTY,
+	ERROR_MEDIA_UNAVAILABLE,
+	ERROR_RESOURCE_DISABLED,
+	ERROR_INVALID_CLEANER,
+	ERROR_UNABLE_TO_CLEAN,
+	ERROR_OBJECT_NOT_FOUND,
+	ERROR_DATABASE_FAILURE,
+	ERROR_DATABASE_FULL,
+	ERROR_MEDIA_INCOMPATIBLE,
+	ERROR_RESOURCE_NOT_PRESENT,
+	ERROR_INVALID_OPERATION,
+	ERROR_MEDIA_NOT_AVAILABLE,
+	ERROR_DEVICE_NOT_AVAILABLE,
+	ERROR_REQUEST_REFUSED,
+	ERROR_INVALID_DRIVE_OBJECT,
+	ERROR_LIBRARY_FULL,
+	ERROR_MEDIUM_NOT_ACCESSIBLE,
+	ERROR_UNABLE_TO_LOAD_MEDIUM,
+	ERROR_UNABLE_TO_INVENTORY_DRIVE,
+	ERROR_UNABLE_TO_INVENTORY_SLOT,
+	ERROR_UNABLE_TO_INVENTORY_TRANSPORT,
+	ERROR_TRANSPORT_FULL,
+	ERROR_CONTROLLING_IEPORT,
+	ERROR_UNABLE_TO_EJECT_MOUNTED_MEDIA,
+	ERROR_CLEANER_SLOT_SET,
+	ERROR_CLEANER_SLOT_NOT_SET,
+	ERROR_CLEANER_CARTRIDGE_SPENT,
+	ERROR_UNEXPECTED_OMID,
+	ERROR_CANT_DELETE_LAST_ITEM,
+	ERROR_MESSAGE_EXCEEDS_MAX_SIZE,
+	ERROR_VOLUME_CONTAINS_SYS_FILES,
+	ERROR_INDIGENOUS_TYPE,
+	ERROR_NO_SUPPORTING_DRIVES,
+	ERROR_CLEANER_CARTRIDGE_INSTALLED,                 // =  4340
+	ERROR_FILE_OFFLINE                                    =  4350,
+	ERROR_REMOTE_STORAGE_NOT_ACTIVE,
+	ERROR_REMOTE_STORAGE_MEDIA_ERROR,                  // =  4352
+	ERROR_NOT_A_REPARSE_POINT                             =  4390,
+	ERROR_REPARSE_ATTRIBUTE_CONFLICT,
+	ERROR_INVALID_REPARSE_DATA,
+	ERROR_REPARSE_TAG_INVALID,
+	ERROR_REPARSE_TAG_MISMATCH,                        // =  4394
+	ERROR_VOLUME_NOT_SIS_ENABLED                          =  4500,
+	ERROR_DEPENDENT_RESOURCE_EXISTS                       =  5001,
+	ERROR_DEPENDENCY_NOT_FOUND,
+	ERROR_DEPENDENCY_ALREADY_EXISTS,
+	ERROR_RESOURCE_NOT_ONLINE,
+	ERROR_HOST_NODE_NOT_AVAILABLE,
+	ERROR_RESOURCE_NOT_AVAILABLE,
+	ERROR_RESOURCE_NOT_FOUND,
+	ERROR_SHUTDOWN_CLUSTER,
+	ERROR_CANT_EVICT_ACTIVE_NODE,
+	ERROR_OBJECT_ALREADY_EXISTS,
+	ERROR_OBJECT_IN_LIST,
+	ERROR_GROUP_NOT_AVAILABLE,
+	ERROR_GROUP_NOT_FOUND,
+	ERROR_GROUP_NOT_ONLINE,
+	ERROR_HOST_NODE_NOT_RESOURCE_OWNER,
+	ERROR_HOST_NODE_NOT_GROUP_OWNER,
+	ERROR_RESMON_CREATE_FAILED,
+	ERROR_RESMON_ONLINE_FAILED,
+	ERROR_RESOURCE_ONLINE,
+	ERROR_QUORUM_RESOURCE,
+	ERROR_NOT_QUORUM_CAPABLE,
+	ERROR_CLUSTER_SHUTTING_DOWN,
+	ERROR_INVALID_STATE,
+	ERROR_RESOURCE_PROPERTIES_STORED,
+	ERROR_NOT_QUORUM_CLASS,
+	ERROR_CORE_RESOURCE,
+	ERROR_QUORUM_RESOURCE_ONLINE_FAILED,
+	ERROR_QUORUMLOG_OPEN_FAILED,
+	ERROR_CLUSTERLOG_CORRUPT,
+	ERROR_CLUSTERLOG_RECORD_EXCEEDS_MAXSIZE,
+	ERROR_CLUSTERLOG_EXCEEDS_MAXSIZE,
+	ERROR_CLUSTERLOG_CHKPOINT_NOT_FOUND,
+	ERROR_CLUSTERLOG_NOT_ENOUGH_SPACE,
+	ERROR_QUORUM_OWNER_ALIVE,
+	ERROR_NETWORK_NOT_AVAILABLE,
+	ERROR_NODE_NOT_AVAILABLE,
+	ERROR_ALL_NODES_NOT_AVAILABLE,
+	ERROR_RESOURCE_FAILED,
+	ERROR_CLUSTER_INVALID_NODE,
+	ERROR_CLUSTER_NODE_EXISTS,
+	ERROR_CLUSTER_JOIN_IN_PROGRESS,
+	ERROR_CLUSTER_NODE_NOT_FOUND,
+	ERROR_CLUSTER_LOCAL_NODE_NOT_FOUND,
+	ERROR_CLUSTER_NETWORK_EXISTS,
+	ERROR_CLUSTER_NETWORK_NOT_FOUND,
+	ERROR_CLUSTER_NETINTERFACE_EXISTS,
+	ERROR_CLUSTER_NETINTERFACE_NOT_FOUND,
+	ERROR_CLUSTER_INVALID_REQUEST,
+	ERROR_CLUSTER_INVALID_NETWORK_PROVIDER,
+	ERROR_CLUSTER_NODE_DOWN,
+	ERROR_CLUSTER_NODE_UNREACHABLE,
+	ERROR_CLUSTER_NODE_NOT_MEMBER,
+	ERROR_CLUSTER_JOIN_NOT_IN_PROGRESS,
+	ERROR_CLUSTER_INVALID_NETWORK,                     // =  5054
+	ERROR_CLUSTER_NODE_UP                                 =  5056,
+	ERROR_CLUSTER_IPADDR_IN_USE,
+	ERROR_CLUSTER_NODE_NOT_PAUSED,
+	ERROR_CLUSTER_NO_SECURITY_CONTEXT,
+	ERROR_CLUSTER_NETWORK_NOT_INTERNAL,
+	ERROR_CLUSTER_NODE_ALREADY_UP,
+	ERROR_CLUSTER_NODE_ALREADY_DOWN,
+	ERROR_CLUSTER_NETWORK_ALREADY_ONLINE,
+	ERROR_CLUSTER_NETWORK_ALREADY_OFFLINE,
+	ERROR_CLUSTER_NODE_ALREADY_MEMBER,
+	ERROR_CLUSTER_LAST_INTERNAL_NETWORK,
+	ERROR_CLUSTER_NETWORK_HAS_DEPENDENTS,
+	ERROR_INVALID_OPERATION_ON_QUORUM,
+	ERROR_DEPENDENCY_NOT_ALLOWED,
+	ERROR_CLUSTER_NODE_PAUSED,
+	ERROR_NODE_CANT_HOST_RESOURCE,
+	ERROR_CLUSTER_NODE_NOT_READY,
+	ERROR_CLUSTER_NODE_SHUTTING_DOWN,
+	ERROR_CLUSTER_JOIN_ABORTED,
+	ERROR_CLUSTER_INCOMPATIBLE_VERSIONS,
+	ERROR_CLUSTER_MAXNUM_OF_RESOURCES_EXCEEDED,
+	ERROR_CLUSTER_SYSTEM_CONFIG_CHANGED,
+	ERROR_CLUSTER_RESOURCE_TYPE_NOT_FOUND,
+	ERROR_CLUSTER_RESTYPE_NOT_SUPPORTED,
+	ERROR_CLUSTER_RESNAME_NOT_FOUND,
+	ERROR_CLUSTER_NO_RPC_PACKAGES_REGISTERED,
+	ERROR_CLUSTER_OWNER_NOT_IN_PREFLIST,
+	ERROR_CLUSTER_DATABASE_SEQMISMATCH,
+	ERROR_RESMON_INVALID_STATE,
+	ERROR_CLUSTER_GUM_NOT_LOCKER,
+	ERROR_QUORUM_DISK_NOT_FOUND,
+	ERROR_DATABASE_BACKUP_CORRUPT,
+	ERROR_CLUSTER_NODE_ALREADY_HAS_DFS_ROOT,
+	ERROR_RESOURCE_PROPERTY_UNCHANGEABLE,              // =  5089
+	ERROR_CLUSTER_MEMBERSHIP_INVALID_STATE                =  5890,
+	ERROR_CLUSTER_QUORUMLOG_NOT_FOUND,
+	ERROR_CLUSTER_MEMBERSHIP_HALT,
+	ERROR_CLUSTER_INSTANCE_ID_MISMATCH,
+	ERROR_CLUSTER_NETWORK_NOT_FOUND_FOR_IP,
+	ERROR_CLUSTER_PROPERTY_DATA_TYPE_MISMATCH,
+	ERROR_CLUSTER_EVICT_WITHOUT_CLEANUP,
+	ERROR_CLUSTER_PARAMETER_MISMATCH,
+	ERROR_NODE_CANNOT_BE_CLUSTERED,
+	ERROR_CLUSTER_WRONG_OS_VERSION,
+	ERROR_CLUSTER_CANT_CREATE_DUP_CLUSTER_NAME,
+	ERROR_CLUSCFG_ALREADY_COMMITTED,
+	ERROR_CLUSCFG_ROLLBACK_FAILED,
+	ERROR_CLUSCFG_SYSTEM_DISK_DRIVE_LETTER_CONFLICT,
+	ERROR_CLUSTER_OLD_VERSION,
+	ERROR_CLUSTER_MISMATCHED_COMPUTER_ACCT_NAME,       // =  5905
+	ERROR_ENCRYPTION_FAILED                               =  6000,
+	ERROR_DECRYPTION_FAILED,
+	ERROR_FILE_ENCRYPTED,
+	ERROR_NO_RECOVERY_POLICY,
+	ERROR_NO_EFS,
+	ERROR_WRONG_EFS,
+	ERROR_NO_USER_KEYS,
+	ERROR_FILE_NOT_ENCRYPTED,
+	ERROR_NOT_EXPORT_FORMAT,
+	ERROR_FILE_READ_ONLY,
+	ERROR_DIR_EFS_DISALLOWED,
+	ERROR_EFS_SERVER_NOT_TRUSTED,
+	ERROR_BAD_RECOVERY_POLICY,
+	ERROR_EFS_ALG_BLOB_TOO_BIG,
+	ERROR_VOLUME_NOT_SUPPORT_EFS,
+	ERROR_EFS_DISABLED,
+	ERROR_EFS_VERSION_NOT_SUPPORT,                     // =  6016
+	ERROR_NO_BROWSER_SERVERS_FOUND                        =  6118,
+	SCHED_E_SERVICE_NOT_LOCALSYSTEM                       =  6200,
+
+	ERROR_CTX_WINSTATION_NAME_INVALID                     =  7001,
+	ERROR_CTX_INVALID_PD,
+	ERROR_CTX_PD_NOT_FOUND,
+	ERROR_CTX_WD_NOT_FOUND,
+	ERROR_CTX_CANNOT_MAKE_EVENTLOG_ENTRY,
+	ERROR_CTX_SERVICE_NAME_COLLISION,
+	ERROR_CTX_CLOSE_PENDING,
+	ERROR_CTX_NO_OUTBUF,
+	ERROR_CTX_MODEM_INF_NOT_FOUND,
+	ERROR_CTX_INVALID_MODEMNAME,
+	ERROR_CTX_MODEM_RESPONSE_ERROR,
+	ERROR_CTX_MODEM_RESPONSE_TIMEOUT,
+	ERROR_CTX_MODEM_RESPONSE_NO_CARRIER,
+	ERROR_CTX_MODEM_RESPONSE_NO_DIALTONE,
+	ERROR_CTX_MODEM_RESPONSE_BUSY,
+	ERROR_CTX_MODEM_RESPONSE_VOICE,
+	ERROR_CTX_TD_ERROR,                                // =  7017
+	ERROR_CTX_WINSTATION_NOT_FOUND                        =  7022,
+	ERROR_CTX_WINSTATION_ALREADY_EXISTS,
+	ERROR_CTX_WINSTATION_BUSY,
+	ERROR_CTX_BAD_VIDEO_MODE,                          // =  7025
+	ERROR_CTX_GRAPHICS_INVALID                            =  7035,
+	ERROR_CTX_LOGON_DISABLED                              =  7037,
+	ERROR_CTX_NOT_CONSOLE,                             // =  7038
+	ERROR_CTX_CLIENT_QUERY_TIMEOUT                        =  7040,
+	ERROR_CTX_CONSOLE_DISCONNECT,
+	ERROR_CTX_CONSOLE_CONNECT,                         // =  7042
+	ERROR_CTX_SHADOW_DENIED                               =  7044,
+	ERROR_CTX_WINSTATION_ACCESS_DENIED,                // =  7045
+	ERROR_CTX_INVALID_WD                                  =  7049,
+	ERROR_CTX_SHADOW_INVALID,
+	ERROR_CTX_SHADOW_DISABLED,
+	ERROR_CTX_CLIENT_LICENSE_IN_USE,
+	ERROR_CTX_CLIENT_LICENSE_NOT_SET,
+	ERROR_CTX_LICENSE_NOT_AVAILABLE,
+	ERROR_CTX_LICENSE_CLIENT_INVALID,
+	ERROR_CTX_LICENSE_EXPIRED,
+	ERROR_CTX_SHADOW_NOT_RUNNING,
+	ERROR_CTX_SHADOW_ENDED_BY_MODE_CHANGE,
+	ERROR_ACTIVATION_COUNT_EXCEEDED,                   // =  7059
+
+	FRS_ERR_INVALID_API_SEQUENCE                          =  8001,
+	FRS_ERR_STARTING_SERVICE,
+	FRS_ERR_STOPPING_SERVICE,
+	FRS_ERR_INTERNAL_API,
+	FRS_ERR_INTERNAL,
+	FRS_ERR_SERVICE_COMM,
+	FRS_ERR_INSUFFICIENT_PRIV,
+	FRS_ERR_AUTHENTICATION,
+	FRS_ERR_PARENT_INSUFFICIENT_PRIV,
+	FRS_ERR_PARENT_AUTHENTICATION,
+	FRS_ERR_CHILD_TO_PARENT_COMM,
+	FRS_ERR_PARENT_TO_CHILD_COMM,
+	FRS_ERR_SYSVOL_POPULATE,
+	FRS_ERR_SYSVOL_POPULATE_TIMEOUT,
+	FRS_ERR_SYSVOL_IS_BUSY,
+	FRS_ERR_SYSVOL_DEMOTE,
+	FRS_ERR_INVALID_SERVICE_PARAMETER,                 // =  8017
+	ERROR_DS_NOT_INSTALLED                                =  8200,
+	ERROR_DS_MEMBERSHIP_EVALUATED_LOCALLY,
+	ERROR_DS_NO_ATTRIBUTE_OR_VALUE,
+	ERROR_DS_INVALID_ATTRIBUTE_SYNTAX,
+	ERROR_DS_ATTRIBUTE_TYPE_UNDEFINED,
+	ERROR_DS_ATTRIBUTE_OR_VALUE_EXISTS,
+	ERROR_DS_BUSY,
+	ERROR_DS_UNAVAILABLE,
+	ERROR_DS_NO_RIDS_ALLOCATED,
+	ERROR_DS_NO_MORE_RIDS,
+	ERROR_DS_INCORRECT_ROLE_OWNER,
+	ERROR_DS_RIDMGR_INIT_ERROR,
+	ERROR_DS_OBJ_CLASS_VIOLATION,
+	ERROR_DS_CANT_ON_NON_LEAF,
+	ERROR_DS_CANT_ON_RDN,
+	ERROR_DS_CANT_MOD_OBJ_CLASS,
+	ERROR_DS_CROSS_DOM_MOVE_ERROR,
+	ERROR_DS_GC_NOT_AVAILABLE,
+	ERROR_SHARED_POLICY,
+	ERROR_POLICY_OBJECT_NOT_FOUND,
+	ERROR_POLICY_ONLY_IN_DS,
+	ERROR_PROMOTION_ACTIVE,
+	ERROR_NO_PROMOTION_ACTIVE,                         // =  8222
+	ERROR_DS_OPERATIONS_ERROR                             =  8224,
+	ERROR_DS_PROTOCOL_ERROR,
+	ERROR_DS_TIMELIMIT_EXCEEDED,
+	ERROR_DS_SIZELIMIT_EXCEEDED,
+	ERROR_DS_ADMIN_LIMIT_EXCEEDED,
+	ERROR_DS_COMPARE_FALSE,
+	ERROR_DS_COMPARE_TRUE,
+	ERROR_DS_AUTH_METHOD_NOT_SUPPORTED,
+	ERROR_DS_STRONG_AUTH_REQUIRED,
+	ERROR_DS_INAPPROPRIATE_AUTH,
+	ERROR_DS_AUTH_UNKNOWN,
+	ERROR_DS_REFERRAL,
+	ERROR_DS_UNAVAILABLE_CRIT_EXTENSION,
+	ERROR_DS_CONFIDENTIALITY_REQUIRED,
+	ERROR_DS_INAPPROPRIATE_MATCHING,
+	ERROR_DS_CONSTRAINT_VIOLATION,
+	ERROR_DS_NO_SUCH_OBJECT,
+	ERROR_DS_ALIAS_PROBLEM,
+	ERROR_DS_INVALID_DN_SYNTAX,
+	ERROR_DS_IS_LEAF,
+	ERROR_DS_ALIAS_DEREF_PROBLEM,
+	ERROR_DS_UNWILLING_TO_PERFORM,
+	ERROR_DS_LOOP_DETECT,
+	ERROR_DS_NAMING_VIOLATION,
+	ERROR_DS_OBJECT_RESULTS_TOO_LARGE,
+	ERROR_DS_AFFECTS_MULTIPLE_DSAS,
+	ERROR_DS_SERVER_DOWN,
+	ERROR_DS_LOCAL_ERROR,
+	ERROR_DS_ENCODING_ERROR,
+	ERROR_DS_DECODING_ERROR,
+	ERROR_DS_FILTER_UNKNOWN,
+	ERROR_DS_PARAM_ERROR,
+	ERROR_DS_NOT_SUPPORTED,
+	ERROR_DS_NO_RESULTS_RETURNED,
+	ERROR_DS_CONTROL_NOT_FOUND,
+	ERROR_DS_CLIENT_LOOP,
+	ERROR_DS_REFERRAL_LIMIT_EXCEEDED,
+	ERROR_DS_SORT_CONTROL_MISSING,
+	ERROR_DS_OFFSET_RANGE_ERROR,                       // =  8262
+	ERROR_DS_ROOT_MUST_BE_NC                              =  8301,
+	ERROR_DS_ADD_REPLICA_INHIBITED,
+	ERROR_DS_ATT_NOT_DEF_IN_SCHEMA,
+	ERROR_DS_MAX_OBJ_SIZE_EXCEEDED,
+	ERROR_DS_OBJ_STRING_NAME_EXISTS,
+	ERROR_DS_NO_RDN_DEFINED_IN_SCHEMA,
+	ERROR_DS_RDN_DOESNT_MATCH_SCHEMA,
+	ERROR_DS_NO_REQUESTED_ATTS_FOUND,
+	ERROR_DS_USER_BUFFER_TO_SMALL,
+	ERROR_DS_ATT_IS_NOT_ON_OBJ,
+	ERROR_DS_ILLEGAL_MOD_OPERATION,
+	ERROR_DS_OBJ_TOO_LARGE,
+	ERROR_DS_BAD_INSTANCE_TYPE,
+	ERROR_DS_MASTERDSA_REQUIRED,
+	ERROR_DS_OBJECT_CLASS_REQUIRED,
+	ERROR_DS_MISSING_REQUIRED_ATT,
+	ERROR_DS_ATT_NOT_DEF_FOR_CLASS,
+	ERROR_DS_ATT_ALREADY_EXISTS,                       // =  8318
+	ERROR_DS_CANT_ADD_ATT_VALUES                          =  8320,
+	ERROR_DS_SINGLE_VALUE_CONSTRAINT,
+	ERROR_DS_RANGE_CONSTRAINT,
+	ERROR_DS_ATT_VAL_ALREADY_EXISTS,
+	ERROR_DS_CANT_REM_MISSING_ATT,
+	ERROR_DS_CANT_REM_MISSING_ATT_VAL,
+	ERROR_DS_ROOT_CANT_BE_SUBREF,
+	ERROR_DS_NO_CHAINING,
+	ERROR_DS_NO_CHAINED_EVAL,
+	ERROR_DS_NO_PARENT_OBJECT,
+	ERROR_DS_PARENT_IS_AN_ALIAS,
+	ERROR_DS_CANT_MIX_MASTER_AND_REPS,
+	ERROR_DS_CHILDREN_EXIST,
+	ERROR_DS_OBJ_NOT_FOUND,
+	ERROR_DS_ALIASED_OBJ_MISSING,
+	ERROR_DS_BAD_NAME_SYNTAX,
+	ERROR_DS_ALIAS_POINTS_TO_ALIAS,
+	ERROR_DS_CANT_DEREF_ALIAS,
+	ERROR_DS_OUT_OF_SCOPE,
+	ERROR_DS_OBJECT_BEING_REMOVED,
+	ERROR_DS_CANT_DELETE_DSA_OBJ,
+	ERROR_DS_GENERIC_ERROR,
+	ERROR_DS_DSA_MUST_BE_INT_MASTER,
+	ERROR_DS_CLASS_NOT_DSA,
+	ERROR_DS_INSUFF_ACCESS_RIGHTS,
+	ERROR_DS_ILLEGAL_SUPERIOR,
+	ERROR_DS_ATTRIBUTE_OWNED_BY_SAM,
+	ERROR_DS_NAME_TOO_MANY_PARTS,
+	ERROR_DS_NAME_TOO_LONG,
+	ERROR_DS_NAME_VALUE_TOO_LONG,
+	ERROR_DS_NAME_UNPARSEABLE,
+	ERROR_DS_NAME_TYPE_UNKNOWN,
+	ERROR_DS_NOT_AN_OBJECT,
+	ERROR_DS_SEC_DESC_TOO_SHORT,
+	ERROR_DS_SEC_DESC_INVALID,
+	ERROR_DS_NO_DELETED_NAME,
+	ERROR_DS_SUBREF_MUST_HAVE_PARENT,
+	ERROR_DS_NCNAME_MUST_BE_NC,
+	ERROR_DS_CANT_ADD_SYSTEM_ONLY,
+	ERROR_DS_CLASS_MUST_BE_CONCRETE,
+	ERROR_DS_INVALID_DMD,
+	ERROR_DS_OBJ_GUID_EXISTS,
+	ERROR_DS_NOT_ON_BACKLINK,
+	ERROR_DS_NO_CROSSREF_FOR_NC,
+	ERROR_DS_SHUTTING_DOWN,
+	ERROR_DS_UNKNOWN_OPERATION,
+	ERROR_DS_INVALID_ROLE_OWNER,
+	ERROR_DS_COULDNT_CONTACT_FSMO,
+	ERROR_DS_CROSS_NC_DN_RENAME,
+	ERROR_DS_CANT_MOD_SYSTEM_ONLY,
+	ERROR_DS_REPLICATOR_ONLY,
+	ERROR_DS_OBJ_CLASS_NOT_DEFINED,
+	ERROR_DS_OBJ_CLASS_NOT_SUBCLASS,
+	ERROR_DS_NAME_REFERENCE_INVALID,
+	ERROR_DS_CROSS_REF_EXISTS,
+	ERROR_DS_CANT_DEL_MASTER_CROSSREF,
+	ERROR_DS_SUBTREE_NOTIFY_NOT_NC_HEAD,
+	ERROR_DS_NOTIFY_FILTER_TOO_COMPLEX,
+	ERROR_DS_DUP_RDN,
+	ERROR_DS_DUP_OID,
+	ERROR_DS_DUP_MAPI_ID,
+	ERROR_DS_DUP_SCHEMA_ID_GUID,
+	ERROR_DS_DUP_LDAP_DISPLAY_NAME,
+	ERROR_DS_SEMANTIC_ATT_TEST,
+	ERROR_DS_SYNTAX_MISMATCH,
+	ERROR_DS_EXISTS_IN_MUST_HAVE,
+	ERROR_DS_EXISTS_IN_MAY_HAVE,
+	ERROR_DS_NONEXISTENT_MAY_HAVE,
+	ERROR_DS_NONEXISTENT_MUST_HAVE,
+	ERROR_DS_AUX_CLS_TEST_FAIL,
+	ERROR_DS_NONEXISTENT_POSS_SUP,
+	ERROR_DS_SUB_CLS_TEST_FAIL,
+	ERROR_DS_BAD_RDN_ATT_ID_SYNTAX,
+	ERROR_DS_EXISTS_IN_AUX_CLS,
+	ERROR_DS_EXISTS_IN_SUB_CLS,
+	ERROR_DS_EXISTS_IN_POSS_SUP,
+	ERROR_DS_RECALCSCHEMA_FAILED,
+	ERROR_DS_TREE_DELETE_NOT_FINISHED,
+	ERROR_DS_CANT_DELETE,
+	ERROR_DS_ATT_SCHEMA_REQ_ID,
+	ERROR_DS_BAD_ATT_SCHEMA_SYNTAX,
+	ERROR_DS_CANT_CACHE_ATT,
+	ERROR_DS_CANT_CACHE_CLASS,
+	ERROR_DS_CANT_REMOVE_ATT_CACHE,
+	ERROR_DS_CANT_REMOVE_CLASS_CACHE,
+	ERROR_DS_CANT_RETRIEVE_DN,
+	ERROR_DS_MISSING_SUPREF,
+	ERROR_DS_CANT_RETRIEVE_INSTANCE,
+	ERROR_DS_CODE_INCONSISTENCY,
+	ERROR_DS_DATABASE_ERROR,
+	ERROR_DS_GOVERNSID_MISSING,
+	ERROR_DS_MISSING_EXPECTED_ATT,
+	ERROR_DS_NCNAME_MISSING_CR_REF,
+	ERROR_DS_SECURITY_CHECKING_ERROR,
+	ERROR_DS_SCHEMA_NOT_LOADED,
+	ERROR_DS_SCHEMA_ALLOC_FAILED,
+	ERROR_DS_ATT_SCHEMA_REQ_SYNTAX,
+	ERROR_DS_GCVERIFY_ERROR,
+	ERROR_DS_DRA_SCHEMA_MISMATCH,
+	ERROR_DS_CANT_FIND_DSA_OBJ,
+	ERROR_DS_CANT_FIND_EXPECTED_NC,
+	ERROR_DS_CANT_FIND_NC_IN_CACHE,
+	ERROR_DS_CANT_RETRIEVE_CHILD,
+	ERROR_DS_SECURITY_ILLEGAL_MODIFY,
+	ERROR_DS_CANT_REPLACE_HIDDEN_REC,
+	ERROR_DS_BAD_HIERARCHY_FILE,
+	ERROR_DS_BUILD_HIERARCHY_TABLE_FAILED,
+	ERROR_DS_CONFIG_PARAM_MISSING,
+	ERROR_DS_COUNTING_AB_INDICES_FAILED,
+	ERROR_DS_HIERARCHY_TABLE_MALLOC_FAILED,
+	ERROR_DS_INTERNAL_FAILURE,
+	ERROR_DS_UNKNOWN_ERROR,
+	ERROR_DS_ROOT_REQUIRES_CLASS_TOP,
+	ERROR_DS_REFUSING_FSMO_ROLES,
+	ERROR_DS_MISSING_FSMO_SETTINGS,
+	ERROR_DS_UNABLE_TO_SURRENDER_ROLES,
+	ERROR_DS_DRA_GENERIC,
+	ERROR_DS_DRA_INVALID_PARAMETER,
+	ERROR_DS_DRA_BUSY,
+	ERROR_DS_DRA_BAD_DN,
+	ERROR_DS_DRA_BAD_NC,
+	ERROR_DS_DRA_DN_EXISTS,
+	ERROR_DS_DRA_INTERNAL_ERROR,
+	ERROR_DS_DRA_INCONSISTENT_DIT,
+	ERROR_DS_DRA_CONNECTION_FAILED,
+	ERROR_DS_DRA_BAD_INSTANCE_TYPE,
+	ERROR_DS_DRA_OUT_OF_MEM,
+	ERROR_DS_DRA_MAIL_PROBLEM,
+	ERROR_DS_DRA_REF_ALREADY_EXISTS,
+	ERROR_DS_DRA_REF_NOT_FOUND,
+	ERROR_DS_DRA_OBJ_IS_REP_SOURCE,
+	ERROR_DS_DRA_DB_ERROR,
+	ERROR_DS_DRA_NO_REPLICA,
+	ERROR_DS_DRA_ACCESS_DENIED,
+	ERROR_DS_DRA_NOT_SUPPORTED,
+	ERROR_DS_DRA_RPC_CANCELLED,
+	ERROR_DS_DRA_SOURCE_DISABLED,
+	ERROR_DS_DRA_SINK_DISABLED,
+	ERROR_DS_DRA_NAME_COLLISION,
+	ERROR_DS_DRA_SOURCE_REINSTALLED,
+	ERROR_DS_DRA_MISSING_PARENT,
+	ERROR_DS_DRA_PREEMPTED,
+	ERROR_DS_DRA_ABANDON_SYNC,
+	ERROR_DS_DRA_SHUTDOWN,
+	ERROR_DS_DRA_INCOMPATIBLE_PARTIAL_SET,
+	ERROR_DS_DRA_SOURCE_IS_PARTIAL_REPLICA,
+	ERROR_DS_DRA_EXTN_CONNECTION_FAILED,
+	ERROR_DS_INSTALL_SCHEMA_MISMATCH,
+	ERROR_DS_DUP_LINK_ID,
+	ERROR_DS_NAME_ERROR_RESOLVING,
+	ERROR_DS_NAME_ERROR_NOT_FOUND,
+	ERROR_DS_NAME_ERROR_NOT_UNIQUE,
+	ERROR_DS_NAME_ERROR_NO_MAPPING,
+	ERROR_DS_NAME_ERROR_DOMAIN_ONLY,
+	ERROR_DS_NAME_ERROR_NO_SYNTACTICAL_MAPPING,
+	ERROR_DS_CONSTRUCTED_ATT_MOD,
+	ERROR_DS_WRONG_OM_OBJ_CLASS,
+	ERROR_DS_DRA_REPL_PENDING,
+	ERROR_DS_DS_REQUIRED,
+	ERROR_DS_INVALID_LDAP_DISPLAY_NAME,
+	ERROR_DS_NON_BASE_SEARCH,
+	ERROR_DS_CANT_RETRIEVE_ATTS,
+	ERROR_DS_BACKLINK_WITHOUT_LINK,
+	ERROR_DS_EPOCH_MISMATCH,
+	ERROR_DS_SRC_NAME_MISMATCH,
+	ERROR_DS_SRC_AND_DST_NC_IDENTICAL,
+	ERROR_DS_DST_NC_MISMATCH,
+	ERROR_DS_NOT_AUTHORITIVE_FOR_DST_NC,
+	ERROR_DS_SRC_GUID_MISMATCH,
+	ERROR_DS_CANT_MOVE_DELETED_OBJECT,
+	ERROR_DS_PDC_OPERATION_IN_PROGRESS,
+	ERROR_DS_CROSS_DOMAIN_CLEANUP_REQD,
+	ERROR_DS_ILLEGAL_XDOM_MOVE_OPERATION,
+	ERROR_DS_CANT_WITH_ACCT_GROUP_MEMBERSHPS,
+	ERROR_DS_NC_MUST_HAVE_NC_PARENT,
+	ERROR_DS_CR_IMPOSSIBLE_TO_VALIDATE,
+	ERROR_DS_DST_DOMAIN_NOT_NATIVE,
+	ERROR_DS_MISSING_INFRASTRUCTURE_CONTAINER,
+	ERROR_DS_CANT_MOVE_ACCOUNT_GROUP,
+	ERROR_DS_CANT_MOVE_RESOURCE_GROUP,
+	ERROR_DS_INVALID_SEARCH_FLAG,
+	ERROR_DS_NO_TREE_DELETE_ABOVE_NC,
+	ERROR_DS_COULDNT_LOCK_TREE_FOR_DELETE,
+	ERROR_DS_COULDNT_IDENTIFY_OBJECTS_FOR_TREE_DELETE,
+	ERROR_DS_SAM_INIT_FAILURE,
+	ERROR_DS_SENSITIVE_GROUP_VIOLATION,
+	ERROR_DS_CANT_MOD_PRIMARYGROUPID,
+	ERROR_DS_ILLEGAL_BASE_SCHEMA_MOD,
+	ERROR_DS_NONSAFE_SCHEMA_CHANGE,
+	ERROR_DS_SCHEMA_UPDATE_DISALLOWED,
+	ERROR_DS_CANT_CREATE_UNDER_SCHEMA,
+	ERROR_DS_INSTALL_NO_SRC_SCH_VERSION,
+	ERROR_DS_INSTALL_NO_SCH_VERSION_IN_INIFILE,
+	ERROR_DS_INVALID_GROUP_TYPE,
+	ERROR_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN,
+	ERROR_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN,
+	ERROR_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER,
+	ERROR_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER,
+	ERROR_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER,
+	ERROR_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER,
+	ERROR_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER,
+	ERROR_DS_HAVE_PRIMARY_MEMBERS,
+	ERROR_DS_STRING_SD_CONVERSION_FAILED,
+	ERROR_DS_NAMING_MASTER_GC,
+	ERROR_DS_LOOKUP_FAILURE,
+	ERROR_DS_COULDNT_UPDATE_SPNS,
+	ERROR_DS_CANT_RETRIEVE_SD,
+	ERROR_DS_KEY_NOT_UNIQUE,
+	ERROR_DS_WRONG_LINKED_ATT_SYNTAX,
+	ERROR_DS_SAM_NEED_BOOTKEY_PASSWORD,
+	ERROR_DS_SAM_NEED_BOOTKEY_FLOPPY,
+	ERROR_DS_CANT_START,
+	ERROR_DS_INIT_FAILURE,
+	ERROR_DS_NO_PKT_PRIVACY_ON_CONNECTION,
+	ERROR_DS_SOURCE_DOMAIN_IN_FOREST,
+	ERROR_DS_DESTINATION_DOMAIN_NOT_IN_FOREST,
+	ERROR_DS_DESTINATION_AUDITING_NOT_ENABLED,
+	ERROR_DS_CANT_FIND_DC_FOR_SRC_DOMAIN,
+	ERROR_DS_SRC_OBJ_NOT_GROUP_OR_USER,
+	ERROR_DS_SRC_SID_EXISTS_IN_FOREST,
+	ERROR_DS_SRC_AND_DST_OBJECT_CLASS_MISMATCH,
+	ERROR_SAM_INIT_FAILURE,
+	ERROR_DS_DRA_SCHEMA_INFO_SHIP,
+	ERROR_DS_DRA_SCHEMA_CONFLICT,
+	ERROR_DS_DRA_EARLIER_SCHEMA_CONLICT,
+	ERROR_DS_DRA_OBJ_NC_MISMATCH,
+	ERROR_DS_NC_STILL_HAS_DSAS,
+	ERROR_DS_GC_REQUIRED,
+	ERROR_DS_LOCAL_MEMBER_OF_LOCAL_ONLY,
+	ERROR_DS_NO_FPO_IN_UNIVERSAL_GROUPS,
+	ERROR_DS_CANT_ADD_TO_GC,
+	ERROR_DS_NO_CHECKPOINT_WITH_PDC,
+	ERROR_DS_SOURCE_AUDITING_NOT_ENABLED,
+	ERROR_DS_CANT_CREATE_IN_NONDOMAIN_NC,
+	ERROR_DS_INVALID_NAME_FOR_SPN,
+	ERROR_DS_FILTER_USES_CONTRUCTED_ATTRS,
+	ERROR_DS_UNICODEPWD_NOT_IN_QUOTES,
+	ERROR_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED,
+	ERROR_DS_MUST_BE_RUN_ON_DST_DC,
+	ERROR_DS_SRC_DC_MUST_BE_SP4_OR_GREATER,
+	ERROR_DS_CANT_TREE_DELETE_CRITICAL_OBJ,
+	ERROR_DS_INIT_FAILURE_CONSOLE,
+	ERROR_DS_SAM_INIT_FAILURE_CONSOLE,
+	ERROR_DS_FOREST_VERSION_TOO_HIGH,
+	ERROR_DS_DOMAIN_VERSION_TOO_HIGH,
+	ERROR_DS_FOREST_VERSION_TOO_LOW,
+	ERROR_DS_DOMAIN_VERSION_TOO_LOW,
+	ERROR_DS_INCOMPATIBLE_VERSION,
+	ERROR_DS_LOW_DSA_VERSION,
+	ERROR_DS_NO_BEHAVIOR_VERSION_IN_MIXEDDOMAIN,
+	ERROR_DS_NOT_SUPPORTED_SORT_ORDER,
+	ERROR_DS_NAME_NOT_UNIQUE,
+	ERROR_DS_MACHINE_ACCOUNT_CREATED_PRENT4,
+	ERROR_DS_OUT_OF_VERSION_STORE,
+	ERROR_DS_INCOMPATIBLE_CONTROLS_USED,
+	ERROR_DS_NO_REF_DOMAIN,
+	ERROR_DS_RESERVED_LINK_ID,
+	ERROR_DS_LINK_ID_NOT_AVAILABLE,
+	ERROR_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER,
+	ERROR_DS_MODIFYDN_DISALLOWED_BY_INSTANCE_TYPE,
+	ERROR_DS_NO_OBJECT_MOVE_IN_SCHEMA_NC,
+	ERROR_DS_MODIFYDN_DISALLOWED_BY_FLAG,
+	ERROR_DS_MODIFYDN_WRONG_GRANDPARENT,
+	ERROR_DS_NAME_ERROR_TRUST_REFERRAL,
+	ERROR_NOT_SUPPORTED_ON_STANDARD_SERVER,
+	ERROR_DS_CANT_ACCESS_REMOTE_PART_OF_AD,
+	ERROR_DS_CR_IMPOSSIBLE_TO_VALIDATE_V2,
+	ERROR_DS_THREAD_LIMIT_EXCEEDED,
+	ERROR_DS_NOT_CLOSEST,
+	ERROR_DS_CANT_DERIVE_SPN_WITHOUT_SERVER_REF,
+	ERROR_DS_SINGLE_USER_MODE_FAILED,
+	ERROR_DS_NTDSCRIPT_SYNTAX_ERROR,
+	ERROR_DS_NTDSCRIPT_PROCESS_ERROR,
+	ERROR_DS_DIFFERENT_REPL_EPOCHS,
+	ERROR_DS_DRS_EXTENSIONS_CHANGED,
+	ERROR_DS_REPLICA_SET_CHANGE_NOT_ALLOWED_ON_DISABLED_CR,
+	ERROR_DS_NO_MSDS_INTID,
+	ERROR_DS_DUP_MSDS_INTID,
+	ERROR_DS_EXISTS_IN_RDNATTID,
+	ERROR_DS_AUTHORIZATION_FAILED,
+	ERROR_DS_INVALID_SCRIPT,
+	ERROR_DS_REMOTE_CROSSREF_OP_FAILED,
+	ERROR_DS_CROSS_REF_BUSY,
+	ERROR_DS_CANT_DERIVE_SPN_FOR_DELETED_DOMAIN,
+	ERROR_DS_CANT_DEMOTE_WITH_WRITEABLE_NC,
+	ERROR_DS_DUPLICATE_ID_FOUND,
+	ERROR_DS_INSUFFICIENT_ATTR_TO_CREATE_OBJECT,
+	ERROR_DS_GROUP_CONVERSION_ERROR,
+	ERROR_DS_CANT_MOVE_APP_BASIC_GROUP,
+	ERROR_DS_CANT_MOVE_APP_QUERY_GROUP,
+	ERROR_DS_ROLE_NOT_VERIFIED,
+	ERROR_DS_WKO_CONTAINER_CANNOT_BE_SPECIAL,
+	ERROR_DS_DOMAIN_RENAME_IN_PROGRESS,
+	ERROR_DS_EXISTING_AD_CHILD_NC,                     // =  8613
+	DNS_ERROR_RCODE_FORMAT_ERROR                          =  9001,
+	DNS_ERROR_RCODE_SERVER_FAILURE,
+	DNS_ERROR_RCODE_NAME_ERROR,
+	DNS_ERROR_RCODE_NOT_IMPLEMENTED,
+	DNS_ERROR_RCODE_REFUSED,
+	DNS_ERROR_RCODE_YXDOMAIN,
+	DNS_ERROR_RCODE_YXRRSET,
+	DNS_ERROR_RCODE_NXRRSET,
+	DNS_ERROR_RCODE_NOTAUTH,
+	DNS_ERROR_RCODE_NOTZONE,                           // =  9010
+	DNS_ERROR_RCODE_BADSIG                                =  9016,
+	DNS_ERROR_RCODE_BADKEY,
+	DNS_ERROR_RCODE_BADTIME,                           // =  9018
+	DNS_INFO_NO_RECORDS                                   =  9501,
+	DNS_ERROR_BAD_PACKET,
+	DNS_ERROR_NO_PACKET,
+	DNS_ERROR_RCODE,
+	DNS_ERROR_UNSECURE_PACKET,                         // =  9505
+	DNS_ERROR_INVALID_TYPE                                =  9551,
+	DNS_ERROR_INVALID_IP_ADDRESS,
+	DNS_ERROR_INVALID_PROPERTY,
+	DNS_ERROR_TRY_AGAIN_LATER,
+	DNS_ERROR_NOT_UNIQUE,
+	DNS_ERROR_NON_RFC_NAME,
+	DNS_STATUS_FQDN,
+	DNS_STATUS_DOTTED_NAME,
+	DNS_STATUS_SINGLE_PART_NAME,
+	DNS_ERROR_INVALID_NAME_CHAR,
+	DNS_ERROR_NUMERIC_NAME,
+	DNS_ERROR_NOT_ALLOWED_ON_ROOT_SERVER,
+	DNS_ERROR_NOT_ALLOWED_UNDER_DELEGATION,
+	DNS_ERROR_CANNOT_FIND_ROOT_HINTS,
+	DNS_ERROR_INCONSISTENT_ROOT_HINTS,                 // =  9565
+	DNS_ERROR_ZONE_DOES_NOT_EXIST                         =  9601,
+	DNS_ERROR_NO_ZONE_INFO,
+	DNS_ERROR_INVALID_ZONE_OPERATION,
+	DNS_ERROR_ZONE_CONFIGURATION_ERROR,
+	DNS_ERROR_ZONE_HAS_NO_SOA_RECORD,
+	DNS_ERROR_ZONE_HAS_NO_NS_RECORDS,
+	DNS_ERROR_ZONE_LOCKED,
+	DNS_ERROR_ZONE_CREATION_FAILED,
+	DNS_ERROR_ZONE_ALREADY_EXISTS,
+	DNS_ERROR_AUTOZONE_ALREADY_EXISTS,
+	DNS_ERROR_INVALID_ZONE_TYPE,
+	DNS_ERROR_SECONDARY_REQUIRES_MASTER_IP,
+	DNS_ERROR_ZONE_NOT_SECONDARY,
+	DNS_ERROR_NEED_SECONDARY_ADDRESSES,
+	DNS_ERROR_WINS_INIT_FAILED,
+	DNS_ERROR_NEED_WINS_SERVERS,
+	DNS_ERROR_NBSTAT_INIT_FAILED,
+	DNS_ERROR_SOA_DELETE_INVALID,
+	DNS_ERROR_FORWARDER_ALREADY_EXISTS,
+	DNS_ERROR_ZONE_REQUIRES_MASTER_IP,
+	DNS_ERROR_ZONE_IS_SHUTDOWN,                        // =  9621
+	DNS_ERROR_PRIMARY_REQUIRES_DATAFILE                   =  9651,
+	DNS_ERROR_INVALID_DATAFILE_NAME,
+	DNS_ERROR_DATAFILE_OPEN_FAILURE,
+	DNS_ERROR_FILE_WRITEBACK_FAILED,
+	DNS_ERROR_DATAFILE_PARSING,                        // =  9655
+	DNS_ERROR_RECORD_DOES_NOT_EXIST                       =  9701,
+	DNS_ERROR_RECORD_FORMAT,
+	DNS_ERROR_NODE_CREATION_FAILED,
+	DNS_ERROR_UNKNOWN_RECORD_TYPE,
+	DNS_ERROR_RECORD_TIMED_OUT,
+	DNS_ERROR_NAME_NOT_IN_ZONE,
+	DNS_ERROR_CNAME_LOOP,
+	DNS_ERROR_NODE_IS_CNAME,
+	DNS_ERROR_CNAME_COLLISION,
+	DNS_ERROR_RECORD_ONLY_AT_ZONE_ROOT,
+	DNS_ERROR_RECORD_ALREADY_EXISTS,
+	DNS_ERROR_SECONDARY_DATA,
+	DNS_ERROR_NO_CREATE_CACHE_DATA,
+	DNS_ERROR_NAME_DOES_NOT_EXIST,
+	DNS_WARNING_PTR_CREATE_FAILED,
+	DNS_WARNING_DOMAIN_UNDELETED,
+	DNS_ERROR_DS_UNAVAILABLE,
+	DNS_ERROR_DS_ZONE_ALREADY_EXISTS,
+	DNS_ERROR_NO_BOOTFILE_IF_DS_ZONE,                  // =  9719
+	DNS_INFO_AXFR_COMPLETE                                =  9751,
+	DNS_ERROR_AXFR,
+	DNS_INFO_ADDED_LOCAL_WINS,                         // =  9753
+	DNS_STATUS_CONTINUE_NEEDED                            =  9801,
+	DNS_ERROR_NO_TCPIP                                    =  9851,
+	DNS_ERROR_NO_DNS_SERVERS,                          // =  9852
+	DNS_ERROR_DP_DOES_NOT_EXIST                           =  9901,
+	DNS_ERROR_DP_ALREADY_EXISTS,
+	DNS_ERROR_DP_NOT_ENLISTED,
+	DNS_ERROR_DP_ALREADY_ENLISTED,
+	DNS_ERROR_DP_NOT_AVAILABLE,                        // =  9905
+
+/+	already in winsock2.d defined!
+
+	WSABASEERR                                            = 10000,
+	WSAEINTR                                              = 10004,
+	WSAEBADF                                              = 10009,
+	WSAEACCES                                             = 10013,
+	WSAEFAULT,                                         // = 10014
+	WSAEINVAL                                             = 10022,
+	WSAEMFILE                                             = 10024,
+	WSAEWOULDBLOCK                                        = 10035,
+	WSAEINPROGRESS,
+	WSAEALREADY,
+	WSAENOTSOCK,
+	WSAEDESTADDRREQ,
+	WSAEMSGSIZE,
+	WSAEPROTOTYPE,
+	WSAENOPROTOOPT,
+	WSAEPROTONOSUPPORT,
+	WSAESOCKTNOSUPPORT,
+	WSAEOPNOTSUPP,
+	WSAEPFNOSUPPORT,
+	WSAEAFNOSUPPORT,
+	WSAEADDRINUSE,
+	WSAEADDRNOTAVAIL,
+	WSAENETDOWN,
+	WSAENETUNREACH,
+	WSAENETRESET,
+	WSAECONNABORTED,
+	WSAECONNRESET,
+	WSAENOBUFS,
+	WSAEISCONN,
+	WSAENOTCONN,
+	WSAESHUTDOWN,
+	WSAETOOMANYREFS,
+	WSAETIMEDOUT,
+	WSAECONNREFUSED,
+	WSAELOOP,
+	WSAENAMETOOLONG,
+	WSAEHOSTDOWN,
+	WSAEHOSTUNREACH,
+	WSAENOTEMPTY,
+	WSAEPROCLIM,
+	WSAEUSERS,
+	WSAEDQUOT,
+	WSAESTALE,
+	WSAEREMOTE,                                        // = 10071
+	WSASYSNOTREADY                                        = 10091,
+	WSAVERNOTSUPPORTED,
+	WSANOTINITIALISED,                                 // = 10093
+	WSAEDISCON                                            = 10101,
+	WSAENOMORE,
+	WSAECANCELLED,
+	WSAEINVALIDPROCTABLE,
+	WSAEINVALIDPROVIDER,
+	WSAEPROVIDERFAILEDINIT,
+	WSASYSCALLFAILURE,
+	WSASERVICE_NOT_FOUND,
+	WSATYPE_NOT_FOUND,
+	WSA_E_NO_MORE,
+	WSA_E_CANCELLED,
+	WSAEREFUSED,                                       // = 10112
+	WSAHOST_NOT_FOUND                                     = 11001,
+	WSATRY_AGAIN,
+	WSANO_RECOVERY,
+	WSANO_DATA,
+	WSA_QOS_RECEIVERS,
+	WSA_QOS_SENDERS,
+	WSA_QOS_NO_SENDERS,
+	WSA_QOS_NO_RECEIVERS,
+	WSA_QOS_REQUEST_CONFIRMED,
+	WSA_QOS_ADMISSION_FAILURE,
+	WSA_QOS_POLICY_FAILURE,
+	WSA_QOS_BAD_STYLE,
+	WSA_QOS_BAD_OBJECT,
+	WSA_QOS_TRAFFIC_CTRL_ERROR,
+	WSA_QOS_GENERIC_ERROR,
+	WSA_QOS_ESERVICETYPE,
+	WSA_QOS_EFLOWSPEC,
+	WSA_QOS_EPROVSPECBUF,
+	WSA_QOS_EFILTERSTYLE,
+	WSA_QOS_EFILTERTYPE,
+	WSA_QOS_EFILTERCOUNT,
+	WSA_QOS_EOBJLENGTH,
+	WSA_QOS_EFLOWCOUNT,
+	WSA_QOS_EUNKNOWNPSOBJ,
+	WSA_QOS_EPOLICYOBJ,
+	WSA_QOS_EFLOWDESC,
+	WSA_QOS_EPSFLOWSPEC,
+	WSA_QOS_EPSFILTERSPEC,
+	WSA_QOS_ESDMODEOBJ,
+	WSA_QOS_ESHAPERATEOBJ,
+	WSA_QOS_RESERVED_PETYPE,                           // = 11031
+
++/
+
+	ERROR_IPSEC_QM_POLICY_EXISTS                          = 13000,
+	ERROR_IPSEC_QM_POLICY_NOT_FOUND,
+	ERROR_IPSEC_QM_POLICY_IN_USE,
+	ERROR_IPSEC_MM_POLICY_EXISTS,
+	ERROR_IPSEC_MM_POLICY_NOT_FOUND,
+	ERROR_IPSEC_MM_POLICY_IN_USE,
+	ERROR_IPSEC_MM_FILTER_EXISTS,
+	ERROR_IPSEC_MM_FILTER_NOT_FOUND,
+	ERROR_IPSEC_TRANSPORT_FILTER_EXISTS,
+	ERROR_IPSEC_TRANSPORT_FILTER_NOT_FOUND,
+	ERROR_IPSEC_MM_AUTH_EXISTS,
+	ERROR_IPSEC_MM_AUTH_NOT_FOUND,
+	ERROR_IPSEC_MM_AUTH_IN_USE,
+	ERROR_IPSEC_DEFAULT_MM_POLICY_NOT_FOUND,
+	ERROR_IPSEC_DEFAULT_MM_AUTH_NOT_FOUND,
+	ERROR_IPSEC_DEFAULT_QM_POLICY_NOT_FOUND,
+	ERROR_IPSEC_TUNNEL_FILTER_EXISTS,
+	ERROR_IPSEC_TUNNEL_FILTER_NOT_FOUND,
+	ERROR_IPSEC_MM_FILTER_PENDING_DELETION,
+	ERROR_IPSEC_TRANSPORT_FILTER_PENDING_DELETION,
+	ERROR_IPSEC_TUNNEL_FILTER_PENDING_DELETION,
+	ERROR_IPSEC_MM_POLICY_PENDING_DELETION,
+	ERROR_IPSEC_MM_AUTH_PENDING_DELETION,
+	ERROR_IPSEC_QM_POLICY_PENDING_DELETION,
+	WARNING_IPSEC_MM_POLICY_PRUNED,
+	WARNING_IPSEC_QM_POLICY_PRUNED,                    // = 13025
+	ERROR_IPSEC_IKE_AUTH_FAIL                             = 13801,
+	ERROR_IPSEC_IKE_ATTRIB_FAIL,
+	ERROR_IPSEC_IKE_NEGOTIATION_PENDING,
+	ERROR_IPSEC_IKE_GENERAL_PROCESSING_ERROR,
+	ERROR_IPSEC_IKE_TIMED_OUT,
+	ERROR_IPSEC_IKE_NO_CERT,
+	ERROR_IPSEC_IKE_SA_DELETED,
+	ERROR_IPSEC_IKE_SA_REAPED,
+	ERROR_IPSEC_IKE_MM_ACQUIRE_DROP,
+	ERROR_IPSEC_IKE_QM_ACQUIRE_DROP,
+	ERROR_IPSEC_IKE_QUEUE_DROP_MM,
+	ERROR_IPSEC_IKE_QUEUE_DROP_NO_MM,
+	ERROR_IPSEC_IKE_DROP_NO_RESPONSE,
+	ERROR_IPSEC_IKE_MM_DELAY_DROP,
+	ERROR_IPSEC_IKE_QM_DELAY_DROP,
+	ERROR_IPSEC_IKE_ERROR,
+	ERROR_IPSEC_IKE_CRL_FAILED,
+	ERROR_IPSEC_IKE_INVALID_KEY_USAGE,
+	ERROR_IPSEC_IKE_INVALID_CERT_TYPE,
+	ERROR_IPSEC_IKE_NO_PRIVATE_KEY,                    // = 13820
+	ERROR_IPSEC_IKE_DH_FAIL                               = 13822,
+	ERROR_IPSEC_IKE_INVALID_HEADER                        = 13824,
+	ERROR_IPSEC_IKE_NO_POLICY,
+	ERROR_IPSEC_IKE_INVALID_SIGNATURE,
+	ERROR_IPSEC_IKE_KERBEROS_ERROR,
+	ERROR_IPSEC_IKE_NO_PUBLIC_KEY,
+	ERROR_IPSEC_IKE_PROCESS_ERR,
+	ERROR_IPSEC_IKE_PROCESS_ERR_SA,
+	ERROR_IPSEC_IKE_PROCESS_ERR_PROP,
+	ERROR_IPSEC_IKE_PROCESS_ERR_TRANS,
+	ERROR_IPSEC_IKE_PROCESS_ERR_KE,
+	ERROR_IPSEC_IKE_PROCESS_ERR_ID,
+	ERROR_IPSEC_IKE_PROCESS_ERR_CERT,
+	ERROR_IPSEC_IKE_PROCESS_ERR_CERT_REQ,
+	ERROR_IPSEC_IKE_PROCESS_ERR_HASH,
+	ERROR_IPSEC_IKE_PROCESS_ERR_SIG,
+	ERROR_IPSEC_IKE_PROCESS_ERR_NONCE,
+	ERROR_IPSEC_IKE_PROCESS_ERR_NOTIFY,
+	ERROR_IPSEC_IKE_PROCESS_ERR_DELETE,
+	ERROR_IPSEC_IKE_PROCESS_ERR_VENDOR,
+	ERROR_IPSEC_IKE_INVALID_PAYLOAD,
+	ERROR_IPSEC_IKE_LOAD_SOFT_SA,
+	ERROR_IPSEC_IKE_SOFT_SA_TORN_DOWN,
+	ERROR_IPSEC_IKE_INVALID_COOKIE,
+	ERROR_IPSEC_IKE_NO_PEER_CERT,
+	ERROR_IPSEC_IKE_PEER_CRL_FAILED,
+	ERROR_IPSEC_IKE_POLICY_CHANGE,
+	ERROR_IPSEC_IKE_NO_MM_POLICY,
+	ERROR_IPSEC_IKE_NOTCBPRIV,
+	ERROR_IPSEC_IKE_SECLOADFAIL,
+	ERROR_IPSEC_IKE_FAILSSPINIT,
+	ERROR_IPSEC_IKE_FAILQUERYSSP,
+	ERROR_IPSEC_IKE_SRVACQFAIL,
+	ERROR_IPSEC_IKE_SRVQUERYCRED,
+	ERROR_IPSEC_IKE_GETSPIFAIL,
+	ERROR_IPSEC_IKE_INVALID_FILTER,
+	ERROR_IPSEC_IKE_OUT_OF_MEMORY,
+	ERROR_IPSEC_IKE_ADD_UPDATE_KEY_FAILED,
+	ERROR_IPSEC_IKE_INVALID_POLICY,
+	ERROR_IPSEC_IKE_UNKNOWN_DOI,
+	ERROR_IPSEC_IKE_INVALID_SITUATION,
+	ERROR_IPSEC_IKE_DH_FAILURE,
+	ERROR_IPSEC_IKE_INVALID_GROUP,
+	ERROR_IPSEC_IKE_ENCRYPT,
+	ERROR_IPSEC_IKE_DECRYPT,
+	ERROR_IPSEC_IKE_POLICY_MATCH,
+	ERROR_IPSEC_IKE_UNSUPPORTED_ID,
+	ERROR_IPSEC_IKE_INVALID_HASH,
+	ERROR_IPSEC_IKE_INVALID_HASH_ALG,
+	ERROR_IPSEC_IKE_INVALID_HASH_SIZE,
+	ERROR_IPSEC_IKE_INVALID_ENCRYPT_ALG,
+	ERROR_IPSEC_IKE_INVALID_AUTH_ALG,
+	ERROR_IPSEC_IKE_INVALID_SIG,
+	ERROR_IPSEC_IKE_LOAD_FAILED,
+	ERROR_IPSEC_IKE_RPC_DELETE,
+	ERROR_IPSEC_IKE_BENIGN_REINIT,
+	ERROR_IPSEC_IKE_INVALID_RESPONDER_LIFETIME_NOTIFY, // = 13879
+	ERROR_IPSEC_IKE_INVALID_CERT_KEYLEN                   = 13881,
+	ERROR_IPSEC_IKE_MM_LIMIT,
+	ERROR_IPSEC_IKE_NEGOTIATION_DISABLED,
+	ERROR_IPSEC_IKE_NEG_STATUS_END,
+	ERROR_SXS_SECTION_NOT_FOUND,
+	ERROR_SXS_CANT_GEN_ACTCTX,
+	ERROR_SXS_INVALID_ACTCTXDATA_FORMAT,
+	ERROR_SXS_ASSEMBLY_NOT_FOUND,
+	ERROR_SXS_MANIFEST_FORMAT_ERROR,
+	ERROR_SXS_MANIFEST_PARSE_ERROR,
+	ERROR_SXS_ACTIVATION_CONTEXT_DISABLED,
+	ERROR_SXS_KEY_NOT_FOUND,
+	ERROR_SXS_VERSION_CONFLICT,
+	ERROR_SXS_WRONG_SECTION_TYPE,
+	ERROR_SXS_THREAD_QUERIES_DISABLED,
+	ERROR_SXS_PROCESS_DEFAULT_ALREADY_SET,
+	ERROR_SXS_UNKNOWN_ENCODING_GROUP,
+	ERROR_SXS_UNKNOWN_ENCODING,
+	ERROR_SXS_INVALID_XML_NAMESPACE_URI,
+	ERROR_SXS_ROOT_MANIFEST_DEPENDENCY_NOT_INSTALLED,
+	ERROR_SXS_LEAF_MANIFEST_DEPENDENCY_NOT_INSTALLED,
+	ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE,
+	ERROR_SXS_MANIFEST_MISSING_REQUIRED_DEFAULT_NAMESPACE,
+	ERROR_SXS_MANIFEST_INVALID_REQUIRED_DEFAULT_NAMESPACE,
+	ERROR_SXS_PRIVATE_MANIFEST_CROSS_PATH_WITH_REPARSE_POINT,
+	ERROR_SXS_DUPLICATE_DLL_NAME,
+	ERROR_SXS_DUPLICATE_WINDOWCLASS_NAME,
+	ERROR_SXS_DUPLICATE_CLSID,
+	ERROR_SXS_DUPLICATE_IID,
+	ERROR_SXS_DUPLICATE_TLBID,
+	ERROR_SXS_DUPLICATE_PROGID,
+	ERROR_SXS_DUPLICATE_ASSEMBLY_NAME,
+	ERROR_SXS_FILE_HASH_MISMATCH,
+	ERROR_SXS_POLICY_PARSE_ERROR,
+	ERROR_SXS_XML_E_MISSINGQUOTE,
+	ERROR_SXS_XML_E_COMMENTSYNTAX,
+	ERROR_SXS_XML_E_BADSTARTNAMECHAR,
+	ERROR_SXS_XML_E_BADNAMECHAR,
+	ERROR_SXS_XML_E_BADCHARINSTRING,
+	ERROR_SXS_XML_E_XMLDECLSYNTAX,
+	ERROR_SXS_XML_E_BADCHARDATA,
+	ERROR_SXS_XML_E_MISSINGWHITESPACE,
+	ERROR_SXS_XML_E_EXPECTINGTAGEND,
+	ERROR_SXS_XML_E_MISSINGSEMICOLON,
+	ERROR_SXS_XML_E_UNBALANCEDPAREN,
+	ERROR_SXS_XML_E_INTERNALERROR,
+	ERROR_SXS_XML_E_UNEXPECTED_WHITESPACE,
+	ERROR_SXS_XML_E_INCOMPLETE_ENCODING,
+	ERROR_SXS_XML_E_MISSING_PAREN,
+	ERROR_SXS_XML_E_EXPECTINGCLOSEQUOTE,
+	ERROR_SXS_XML_E_MULTIPLE_COLONS,
+	ERROR_SXS_XML_E_INVALID_DECIMAL,
+	ERROR_SXS_XML_E_INVALID_HEXIDECIMAL,
+	ERROR_SXS_XML_E_INVALID_UNICODE,
+	ERROR_SXS_XML_E_WHITESPACEORQUESTIONMARK,
+	ERROR_SXS_XML_E_UNEXPECTEDENDTAG,
+	ERROR_SXS_XML_E_UNCLOSEDTAG,
+	ERROR_SXS_XML_E_DUPLICATEATTRIBUTE,
+	ERROR_SXS_XML_E_MULTIPLEROOTS,
+	ERROR_SXS_XML_E_INVALIDATROOTLEVEL,
+	ERROR_SXS_XML_E_BADXMLDECL,
+	ERROR_SXS_XML_E_MISSINGROOT,
+	ERROR_SXS_XML_E_UNEXPECTEDEOF,
+	ERROR_SXS_XML_E_BADPEREFINSUBSET,
+	ERROR_SXS_XML_E_UNCLOSEDSTARTTAG,
+	ERROR_SXS_XML_E_UNCLOSEDENDTAG,
+	ERROR_SXS_XML_E_UNCLOSEDSTRING,
+	ERROR_SXS_XML_E_UNCLOSEDCOMMENT,
+	ERROR_SXS_XML_E_UNCLOSEDDECL,
+	ERROR_SXS_XML_E_UNCLOSEDCDATA,
+	ERROR_SXS_XML_E_RESERVEDNAMESPACE,
+	ERROR_SXS_XML_E_INVALIDENCODING,
+	ERROR_SXS_XML_E_INVALIDSWITCH,
+	ERROR_SXS_XML_E_BADXMLCASE,
+	ERROR_SXS_XML_E_INVALID_STANDALONE,
+	ERROR_SXS_XML_E_UNEXPECTED_STANDALONE,
+	ERROR_SXS_XML_E_INVALID_VERSION,
+	ERROR_SXS_XML_E_MISSINGEQUALS,
+	ERROR_SXS_PROTECTION_RECOVERY_FAILED,
+	ERROR_SXS_PROTECTION_PUBLIC_KEY_TOO_SHORT,
+	ERROR_SXS_PROTECTION_CATALOG_NOT_VALID,
+	ERROR_SXS_UNTRANSLATABLE_HRESULT,
+	ERROR_SXS_PROTECTION_CATALOG_FILE_MISSING,
+	ERROR_SXS_MISSING_ASSEMBLY_IDENTITY_ATTRIBUTE,
+	ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE_NAME // = 14080
+}
+
+enum : HRESULT {
+	S_OK                                   = 0x00000000,
+	S_FALSE                                = 0x00000001,
+
+	NOERROR                                = 0x00000000,
+
+	E_PENDING                              = 0x8000000A,
+	E_NOTIMPL                              = 0x80004001,
+	E_NOINTERFACE                          = 0x80004002,
+	E_POINTER                              = 0x80004003,
+	E_ABORT                                = 0x80004004,
+	E_FAIL                                 = 0x80004005,
+	E_ACCESSDENIED                         = 0x80070005,
+	E_HANDLE                               = 0x80070006,
+	E_OUTOFMEMORY                          = 0x8007000E,
+	E_INVALIDARG                           = 0x80070057,
+	E_UNEXPECTED                           = 0x8000FFFF,
+
+	CO_E_INIT_TLS                          = 0x80004006,
+	CO_E_INIT_SHARED_ALLOCATOR             = 0x80004007,
+	CO_E_INIT_MEMORY_ALLOCATOR             = 0x80004008,
+	CO_E_INIT_CLASS_CACHE                  = 0x80004009,
+	CO_E_INIT_RPC_CHANNEL                  = 0x8000400A,
+	CO_E_INIT_TLS_SET_CHANNEL_CONTROL      = 0x8000400B,
+	CO_E_INIT_TLS_CHANNEL_CONTROL          = 0x8000400C,
+	CO_E_INIT_UNACCEPTED_USER_ALLOCATOR    = 0x8000400D,
+	CO_E_INIT_SCM_MUTEX_EXISTS             = 0x8000400E,
+	CO_E_INIT_SCM_FILE_MAPPING_EXISTS      = 0x8000400F,
+	CO_E_INIT_SCM_MAP_VIEW_OF_FILE         = 0x80004010,
+	CO_E_INIT_SCM_EXEC_FAILURE             = 0x80004011,
+	CO_E_INIT_ONLY_SINGLE_THREADED         = 0x80004012,
+
+	RPC_E_CALL_REJECTED                    = 0x80010001,
+	RPC_E_CALL_CANCELED                    = 0x80010002,
+	RPC_E_CANTPOST_INSENDCALL              = 0x80010003,
+	RPC_E_CANTCALLOUT_INASYNCCALL          = 0x80010004,
+	RPC_E_CANTCALLOUT_INEXTERNALCALL       = 0x80010005,
+	RPC_E_CONNECTION_TERMINATED            = 0x80010006,
+	RPC_E_SERVER_DIED                      = 0x80010007,
+	RPC_E_CLIENT_DIED                      = 0x80010008,
+	RPC_E_INVALID_DATAPACKET               = 0x80010009,
+	RPC_E_CANTTRANSMIT_CALL                = 0x8001000A,
+	RPC_E_CLIENT_CANTMARSHAL_DATA          = 0x8001000B,
+	RPC_E_CLIENT_CANTUNMARSHAL_DATA        = 0x8001000C,
+	RPC_E_SERVER_CANTMARSHAL_DATA          = 0x8001000D,
+	RPC_E_SERVER_CANTUNMARSHAL_DATA        = 0x8001000E,
+	RPC_E_INVALID_DATA                     = 0x8001000F,
+	RPC_E_INVALID_PARAMETER                = 0x80010010,
+	RPC_E_CANTCALLOUT_AGAIN                = 0x80010011,
+	RPC_E_SERVER_DIED_DNE                  = 0x80010012,
+	RPC_E_SYS_CALL_FAILED                  = 0x80010100,
+	RPC_E_OUT_OF_RESOURCES                 = 0x80010101,
+	RPC_E_ATTEMPTED_MULTITHREAD            = 0x80010102,
+	RPC_E_NOT_REGISTERED                   = 0x80010103,
+	RPC_E_FAULT                            = 0x80010104,
+	RPC_E_SERVERFAULT                      = 0x80010105,
+	RPC_E_CHANGED_MODE                     = 0x80010106,
+	RPC_E_INVALIDMETHOD                    = 0x80010107,
+	RPC_E_DISCONNECTED                     = 0x80010108,
+	RPC_E_RETRY                            = 0x80010109,
+	RPC_E_SERVERCALL_RETRYLATER            = 0x8001010A,
+	RPC_E_SERVERCALL_REJECTED              = 0x8001010B,
+	RPC_E_INVALID_CALLDATA                 = 0x8001010C,
+	RPC_E_CANTCALLOUT_ININPUTSYNCCALL      = 0x8001010D,
+	RPC_E_WRONG_THREAD                     = 0x8001010E,
+	RPC_E_THREAD_NOT_INIT                  = 0x8001010F,
+	RPC_E_UNEXPECTED                       = 0x8001FFFF,
+
+	DISP_E_UNKNOWNINTERFACE                = 0x80020001,
+	DISP_E_MEMBERNOTFOUND                  = 0x80020003,
+	DISP_E_PARAMNOTFOUND                   = 0x80020004,
+	DISP_E_TYPEMISMATCH                    = 0x80020005,
+	DISP_E_UNKNOWNNAME                     = 0x80020006,
+	DISP_E_NONAMEDARGS                     = 0x80020007,
+	DISP_E_BADVARTYPE                      = 0x80020008,
+	DISP_E_EXCEPTION                       = 0x80020009,
+	DISP_E_OVERFLOW                        = 0x8002000A,
+	DISP_E_BADINDEX                        = 0x8002000B,
+	DISP_E_UNKNOWNLCID                     = 0x8002000C,
+	DISP_E_ARRAYISLOCKED                   = 0x8002000D,
+	DISP_E_BADPARAMCOUNT                   = 0x8002000E,
+	DISP_E_PARAMNOTOPTIONAL                = 0x8002000F,
+	DISP_E_BADCALLEE                       = 0x80020010,
+	DISP_E_NOTACOLLECTION                  = 0x80020011,
+	DISP_E_DIVBYZERO                       = 0x80020012,
+
+	TYPE_E_BUFFERTOOSMALL                  = 0x80028016,
+	TYPE_E_INVDATAREAD                     = 0x80028018,
+	TYPE_E_UNSUPFORMAT                     = 0x80028019,
+	TYPE_E_REGISTRYACCESS                  = 0x8002801C,
+	TYPE_E_LIBNOTREGISTERED                = 0x8002801D,
+	TYPE_E_UNDEFINEDTYPE                   = 0x80028027,
+	TYPE_E_QUALIFIEDNAMEDISALLOWED         = 0x80028028,
+	TYPE_E_INVALIDSTATE                    = 0x80028029,
+	TYPE_E_WRONGTYPEKIND                   = 0x8002802A,
+	TYPE_E_ELEMENTNOTFOUND                 = 0x8002802B,
+	TYPE_E_AMBIGUOUSNAME                   = 0x8002802C,
+	TYPE_E_NAMECONFLICT                    = 0x8002802D,
+	TYPE_E_UNKNOWNLCID                     = 0x8002802E,
+	TYPE_E_DLLFUNCTIONNOTFOUND             = 0x8002802F,
+	TYPE_E_BADMODULEKIND                   = 0x800288BD,
+	TYPE_E_SIZETOOBIG                      = 0x800288C5,
+	TYPE_E_DUPLICATEID                     = 0x800288C6,
+	TYPE_E_INVALIDID                       = 0x800288CF,
+	TYPE_E_TYPEMISMATCH                    = 0x80028CA0,
+	TYPE_E_OUTOFBOUNDS                     = 0x80028CA1,
+	TYPE_E_IOERROR                         = 0x80028CA2,
+	TYPE_E_CANTCREATETMPFILE               = 0x80028CA3,
+	TYPE_E_CANTLOADLIBRARY                 = 0x80029C4A,
+	TYPE_E_INCONSISTENTPROPFUNCS           = 0x80029C83,
+	TYPE_E_CIRCULARTYPE                    = 0x80029C84,
+
+	STG_E_INVALIDFUNCTION                  = 0x80030001,
+	STG_E_FILENOTFOUND                     = 0x80030002,
+	STG_E_PATHNOTFOUND                     = 0x80030003,
+	STG_E_TOOMANYOPENFILES                 = 0x80030004,
+	STG_E_ACCESSDENIED                     = 0x80030005,
+	STG_E_INVALIDHANDLE                    = 0x80030006,
+	STG_E_INSUFFICIENTMEMORY               = 0x80030008,
+	STG_E_INVALIDPOINTER                   = 0x80030009,
+	STG_E_NOMOREFILES                      = 0x80030012,
+	STG_E_DISKISWRITEPROTECTED             = 0x80030013,
+	STG_E_SEEKERROR                        = 0x80030019,
+	STG_E_WRITEFAULT                       = 0x8003001D,
+	STG_E_READFAULT                        = 0x8003001E,
+	STG_E_SHAREVIOLATION                   = 0x80030020,
+	STG_E_LOCKVIOLATION                    = 0x80030021,
+	STG_E_FILEALREADYEXISTS                = 0x80030050,
+	STG_E_INVALIDPARAMETER                 = 0x80030057,
+	STG_E_MEDIUMFULL                       = 0x80030070,
+	STG_E_ABNORMALAPIEXIT                  = 0x800300FA,
+	STG_E_INVALIDHEADER                    = 0x800300FB,
+	STG_E_INVALIDNAME                      = 0x800300FC,
+	STG_E_UNKNOWN                          = 0x800300FD,
+	STG_E_UNIMPLEMENTEDFUNCTION            = 0x800300FE,
+	STG_E_INVALIDFLAG                      = 0x800300FF,
+	STG_E_INUSE                            = 0x80030100,
+	STG_E_NOTCURRENT                       = 0x80030101,
+	STG_E_REVERTED                         = 0x80030102,
+	STG_E_CANTSAVE                         = 0x80030103,
+	STG_E_OLDFORMAT                        = 0x80030104,
+	STG_E_OLDDLL                           = 0x80030105,
+	STG_E_SHAREREQUIRED                    = 0x80030106,
+	STG_E_NOTFILEBASEDSTORAGE              = 0x80030107,
+	STG_E_EXTANTMARSHALLINGS               = 0x80030108,
+	STG_S_CONVERTED                        = 0x00030200,
+
+	OLE_E_FIRST                            = 0x80040000,
+	OLE_S_FIRST                            = 0x00040000,
+	OLE_E_OLEVERB                          = 0x80040000,
+	OLE_S_USEREG                           = 0x00040000,
+	OLE_E_ADVF                             = 0x80040001,
+	OLE_S_STATIC                           = 0x00040001,
+	OLE_E_ENUM_NOMORE                      = 0x80040002,
+	OLE_S_MAC_CLIPFORMAT                   = 0x00040002,
+	OLE_E_ADVISENOTSUPPORTED               = 0x80040003,
+	OLE_E_NOCONNECTION                     = 0x80040004,
+	OLE_E_NOTRUNNING                       = 0x80040005,
+	OLE_E_NOCACHE                          = 0x80040006,
+	OLE_E_BLANK                            = 0x80040007,
+	OLE_E_CLASSDIFF                        = 0x80040008,
+	OLE_E_CANT_GETMONIKER                  = 0x80040009,
+	OLE_E_CANT_BINDTOSOURCE                = 0x8004000A,
+	OLE_E_STATIC                           = 0x8004000B,
+	OLE_E_PROMPTSAVECANCELLED              = 0x8004000C,
+	OLE_E_INVALIDRECT                      = 0x8004000D,
+	OLE_E_WRONGCOMPOBJ                     = 0x8004000E,
+	OLE_E_INVALIDHWND                      = 0x8004000F,
+	OLE_E_NOT_INPLACEACTIVE                = 0x80040010,
+	OLE_E_CANTCONVERT                      = 0x80040011,
+	OLE_E_NOSTORAGE                        = 0x80040012,
+
+	DV_E_FORMATETC                         = 0x80040064,
+	DV_E_DVTARGETDEVICE                    = 0x80040065,
+	DV_E_STGMEDIUM                         = 0x80040066,
+	DV_E_STATDATA                          = 0x80040067,
+	DV_E_LINDEX                            = 0x80040068,
+	DV_E_TYMED                             = 0x80040069,
+	DV_E_CLIPFORMAT                        = 0x8004006A,
+	DV_E_DVASPECT                          = 0x8004006B,
+	DV_E_DVTARGETDEVICE_SIZE               = 0x8004006C,
+	DV_E_NOIVIEWOBJECT                     = 0x8004006D,
+
+	OLE_E_LAST                             = 0x800400FF,
+	OLE_S_LAST                             = 0x000400FF,
+	DRAGDROP_E_FIRST                       = 0x80040100,
+	DRAGDROP_S_FIRST                       = 0x00040100,
+	DRAGDROP_E_NOTREGISTERED               = 0x80040100,
+	DRAGDROP_S_DROP                        = 0x00040100,
+	DRAGDROP_E_ALREADYREGISTERED           = 0x80040101,
+	DRAGDROP_S_CANCEL                      = 0x00040101,
+	DRAGDROP_E_INVALIDHWND                 = 0x80040102,
+	DRAGDROP_S_USEDEFAULTCURSORS           = 0x00040102,
+	DRAGDROP_E_LAST                        = 0x8004010F,
+	DRAGDROP_S_LAST                        = 0x0004010F,
+	CLASSFACTORY_E_FIRST                   = 0x80040110,
+	CLASSFACTORY_S_FIRST                   = 0x00040110,
+	CLASS_E_NOAGGREGATION                  = 0x80040110,
+	CLASS_E_CLASSNOTAVAILABLE              = 0x80040111,
+	CLASSFACTORY_E_LAST                    = 0x8004011F,
+	CLASSFACTORY_S_LAST                    = 0x0004011F,
+	MARSHAL_E_FIRST                        = 0x80040120,
+	MARSHAL_S_FIRST                        = 0x00040120,
+	MARSHAL_E_LAST                         = 0x8004012F,
+	MARSHAL_S_LAST                         = 0x0004012F,
+	DATA_E_FIRST                           = 0x80040130,
+	DATA_S_FIRST                           = 0x00040130,
+	DATA_S_SAMEFORMATETC                   = 0x00040130,
+	DATA_E_LAST                            = 0x8004013F,
+	DATA_S_LAST                            = 0x0004013F,
+	VIEW_E_FIRST                           = 0x80040140,
+	VIEW_S_FIRST                           = 0x00040140,
+	VIEW_E_DRAW                            = 0x80040140,
+	VIEW_S_ALREADY_FROZEN                  = 0x00040140,
+	VIEW_E_LAST                            = 0x8004014F,
+	VIEW_S_LAST                            = 0x0004014F,
+	REGDB_E_FIRST                          = 0x80040150,
+	REGDB_S_FIRST                          = 0x00040150,
+	REGDB_E_READREGDB                      = 0x80040150,
+	REGDB_E_WRITEREGDB                     = 0x80040151,
+	REGDB_E_KEYMISSING                     = 0x80040152,
+	REGDB_E_INVALIDVALUE                   = 0x80040153,
+	REGDB_E_CLASSNOTREG                    = 0x80040154,
+	REGDB_E_IIDNOTREG                      = 0x80040155,
+	REGDB_E_LAST                           = 0x8004015F,
+	REGDB_S_LAST                           = 0x0004015F,
+	CACHE_E_FIRST                          = 0x80040170,
+	CACHE_S_FIRST                          = 0x00040170,
+	CACHE_E_NOCACHE_UPDATED                = 0x80040170,
+	CACHE_S_FORMATETC_NOTSUPPORTED         = 0x00040170,
+	CACHE_S_SAMECACHE                      = 0x00040171,
+	CACHE_S_SOMECACHES_NOTUPDATED          = 0x00040172,
+	CACHE_E_LAST                           = 0x8004017F,
+	CACHE_S_LAST                           = 0x0004017F,
+	OLEOBJ_E_FIRST                         = 0x80040180,
+	OLEOBJ_S_FIRST                         = 0x00040180,
+	OLEOBJ_E_NOVERBS                       = 0x80040180,
+	OLEOBJ_S_INVALIDVERB                   = 0x00040180,
+	OLEOBJ_E_INVALIDVERB                   = 0x80040181,
+	OLEOBJ_S_CANNOT_DOVERB_NOW             = 0x00040181,
+	OLEOBJ_S_INVALIDHWND                   = 0x00040182,
+	OLEOBJ_E_LAST                          = 0x8004018F,
+	OLEOBJ_S_LAST                          = 0x0004018F,
+	CLIENTSITE_E_FIRST                     = 0x80040190,
+	CLIENTSITE_S_FIRST                     = 0x00040190,
+	CLIENTSITE_E_LAST                      = 0x8004019F,
+	CLIENTSITE_S_LAST                      = 0x0004019F,
+	INPLACE_E_NOTUNDOABLE                  = 0x800401A0,
+	INPLACE_E_FIRST                        = 0x800401A0,
+	INPLACE_S_FIRST                        = 0x000401A0,
+	INPLACE_S_TRUNCATED                    = 0x000401A0,
+	INPLACE_E_NOTOOLSPACE                  = 0x800401A1,
+	INPLACE_E_LAST                         = 0x800401AF,
+	INPLACE_S_LAST                         = 0x000401AF,
+	ENUM_E_FIRST                           = 0x800401B0,
+	ENUM_S_FIRST                           = 0x000401B0,
+	ENUM_E_LAST                            = 0x800401BF,
+	ENUM_S_LAST                            = 0x000401BF,
+	CONVERT10_E_FIRST                      = 0x800401C0,
+	CONVERT10_S_FIRST                      = 0x000401C0,
+	CONVERT10_E_OLESTREAM_GET              = 0x800401C0,
+	CONVERT10_S_NO_PRESENTATION            = 0x000401C0,
+	CONVERT10_E_OLESTREAM_PUT              = 0x800401C1,
+	CONVERT10_E_OLESTREAM_FMT              = 0x800401C2,
+	CONVERT10_E_OLESTREAM_BITMAP_TO_DIB    = 0x800401C3,
+	CONVERT10_E_STG_FMT                    = 0x800401C4,
+	CONVERT10_E_STG_NO_STD_STREAM          = 0x800401C5,
+	CONVERT10_E_STG_DIB_TO_BITMAP          = 0x800401C6,
+	CONVERT10_E_LAST                       = 0x800401CF,
+	CONVERT10_S_LAST                       = 0x000401CF,
+	CLIPBRD_E_FIRST                        = 0x800401D0,
+	CLIPBRD_S_FIRST                        = 0x000401D0,
+	CLIPBRD_E_CANT_OPEN                    = 0x800401D0,
+	CLIPBRD_E_CANT_EMPTY                   = 0x800401D1,
+	CLIPBRD_E_CANT_SET                     = 0x800401D2,
+	CLIPBRD_E_BAD_DATA                     = 0x800401D3,
+	CLIPBRD_E_CANT_CLOSE                   = 0x800401D4,
+	CLIPBRD_E_LAST                         = 0x800401DF,
+	CLIPBRD_S_LAST                         = 0x000401DF,
+	MK_E_FIRST                             = 0x800401E0,
+	MK_S_FIRST                             = 0x000401E0,
+	MK_E_CONNECTMANUALLY                   = 0x800401E0,
+	MK_E_EXCEEDEDDEADLINE                  = 0x800401E1,
+	MK_E_NEEDGENERIC                       = 0x800401E2,
+	MK_S_REDUCED_TO_SELF                   = 0x000401E2,
+	MK_E_UNAVAILABLE                       = 0x800401E3,
+	MK_E_SYNTAX                            = 0x800401E4,
+	MK_S_ME                                = 0x000401E4,
+	MK_E_NOOBJECT                          = 0x800401E5,
+	MK_S_HIM                               = 0x000401E5,
+	MK_E_INVALIDEXTENSION                  = 0x800401E6,
+	MK_S_US                                = 0x000401E6,
+	MK_E_INTERMEDIATEINTERFACENOTSUPPORTED = 0x800401E7,
+	MK_S_MONIKERALREADYREGISTERED          = 0x000401E7,
+	MK_E_NOTBINDABLE                       = 0x800401E8,
+	MK_E_NOTBOUND                          = 0x800401E9,
+	MK_E_CANTOPENFILE                      = 0x800401EA,
+	MK_E_MUSTBOTHERUSER                    = 0x800401EB,
+	MK_E_NOINVERSE                         = 0x800401EC,
+	MK_E_NOSTORAGE                         = 0x800401ED,
+	MK_E_NOPREFIX                          = 0x800401EE,
+	MK_E_LAST                              = 0x800401EF,
+	MK_S_LAST                              = 0x000401EF,
+	MK_E_ENUMERATION_FAILED                = 0x800401EF,
+	CO_E_FIRST                             = 0x800401F0,
+	CO_S_FIRST                             = 0x000401F0,
+	CO_E_NOTINITIALIZED                    = 0x800401F0,
+	CO_E_ALREADYINITIALIZED                = 0x800401F1,
+	CO_E_CANTDETERMINECLASS                = 0x800401F2,
+	CO_E_CLASSSTRING                       = 0x800401F3,
+	CO_E_IIDSTRING                         = 0x800401F4,
+	CO_E_APPNOTFOUND                       = 0x800401F5,
+	CO_E_APPSINGLEUSE                      = 0x800401F6,
+	CO_E_ERRORINAPP                        = 0x800401F7,
+	CO_E_DLLNOTFOUND                       = 0x800401F8,
+	CO_E_ERRORINDLL                        = 0x800401F9,
+	CO_E_WRONGOSFORAPP                     = 0x800401FA,
+	CO_E_OBJNOTREG                         = 0x800401FB,
+	CO_E_OBJISREG                          = 0x800401FC,
+	CO_E_OBJNOTCONNECTED                   = 0x800401FD,
+	CO_E_APPDIDNTREG                       = 0x800401FE,
+	CO_E_LAST                              = 0x800401FF,
+	CO_S_LAST                              = 0x000401FF,
+	CO_E_RELEASED                          = 0x800401FF,
+
+	CO_E_CLASS_CREATE_FAILED               = 0x80080001,
+	CO_E_SCM_ERROR                         = 0x80080002,
+	CO_E_SCM_RPC_FAILURE                   = 0x80080003,
+	CO_E_BAD_PATH                          = 0x80080004,
+	CO_E_SERVER_EXEC_FAILURE               = 0x80080005,
+	CO_E_OBJSRV_RPC_FAILURE                = 0x80080006,
+	MK_E_NO_NORMALIZED                     = 0x80080007,
+	CO_E_SERVER_STOPPING                   = 0x80080008,
+	MEM_E_INVALID_ROOT                     = 0x80080009,
+	MEM_E_INVALID_LINK                     = 0x80080010,
+	MEM_E_INVALID_SIZE                     = 0x80080011,
+	CO_S_NOTALLINTERFACES                  = 0x00080012,
+
+	NTE_BAD_UID                            = 0x80090001,
+	NTE_BAD_HASH                           = 0x80090002,
+	NTE_BAD_KEY                            = 0x80090003,
+	NTE_BAD_LEN                            = 0x80090004,
+	NTE_BAD_DATA                           = 0x80090005,
+	NTE_BAD_SIGNATURE                      = 0x80090006,
+	NTE_BAD_VER                            = 0x80090007,
+	NTE_BAD_ALGID                          = 0x80090008,
+	NTE_BAD_FLAGS                          = 0x80090009,
+	NTE_BAD_TYPE                           = 0x8009000A,
+	NTE_BAD_KEY_STATE                      = 0x8009000B,
+	NTE_BAD_HASH_STATE                     = 0x8009000C,
+	NTE_NO_KEY                             = 0x8009000D,
+	NTE_NO_MEMORY                          = 0x8009000E,
+	NTE_EXISTS                             = 0x8009000F,
+	NTE_PERM                               = 0x80090010,
+	NTE_NOT_FOUND                          = 0x80090011,
+	NTE_DOUBLE_ENCRYPT                     = 0x80090012,
+	NTE_BAD_PROVIDER                       = 0x80090013,
+	NTE_BAD_PROV_TYPE                      = 0x80090014,
+	NTE_BAD_PUBLIC_KEY                     = 0x80090015,
+	NTE_BAD_KEYSET                         = 0x80090016,
+	NTE_PROV_TYPE_NOT_DEF                  = 0x80090017,
+	NTE_PROV_TYPE_ENTRY_BAD                = 0x80090018,
+	NTE_KEYSET_NOT_DEF                     = 0x80090019,
+	NTE_KEYSET_ENTRY_BAD                   = 0x8009001A,
+	NTE_PROV_TYPE_NO_MATCH                 = 0x8009001B,
+	NTE_SIGNATURE_FILE_BAD                 = 0x8009001C,
+	NTE_PROVIDER_DLL_FAIL                  = 0x8009001D,
+	NTE_PROV_DLL_NOT_FOUND                 = 0x8009001E,
+	NTE_BAD_KEYSET_PARAM                   = 0x8009001F,
+	NTE_FAIL                               = 0x80090020,
+	NTE_SYS_ERR                            = 0x80090021
+}
+
+
+enum : bool {
+	SEVERITY_SUCCESS = 0,
+	SEVERITY_ERROR   = 1
+}
+
+enum : uint {
+	FACILITY_NULL     =   0,
+	FACILITY_RPC,
+	FACILITY_DISPATCH,
+	FACILITY_STORAGE,
+	FACILITY_ITF,  // =   4
+	FACILITY_WIN32    =   7,
+	FACILITY_WINDOWS  =   8,
+	FACILITY_CONTROL  =  10,
+	FACILITY_NT_BIT   = 0x10000000
+}
+
+// C Macros
+
+bool SUCCEEDED(HRESULT Status) {
+	return Status >= 0;
+}
+
+bool FAILED(HRESULT Status) {
+	return Status < 0;
+}
+
+bool IS_ERROR(HRESULT Status) {
+	return (Status >>> 31) == SEVERITY_ERROR;
+}
+
+ushort HRESULT_CODE(HRESULT r) {
+	return cast(ushort) (r & 0xFFFF);
+}
+
+ushort SCODE_CODE(SCODE r) {
+	return cast(ushort) (r & 0xFFFF);
+}
+
+ushort HRESULT_FACILITY(HRESULT r) {
+	return cast(ushort) ((r>>16) & 0x1fff);
+}
+
+ushort SCODE_FACILITY(SCODE r) {
+	return cast(ushort) ((r>>16) & 0x1fff);
+}
+
+ushort HRESULT_SEVERITY(HRESULT r) {
+	return cast(ushort) ((r>>31) & 0x1);
+}
+
+ushort SCODE_SEVERITY(SCODE r) {
+	return cast(ushort) ((r>>31) & 0x1);
+}
+
+HRESULT MAKE_HRESULT(bool s, uint f, uint c) {
+	return (s << 31) | (f << 16) | c;
+}
+
+SCODE MAKE_SCODE(bool s, uint f, uint c) {
+	return (s << 31) | (f << 16) | c;
+}
+
+SCODE GetScode(HRESULT hr) {
+	return hr;
+}
+
+HRESULT ResultFromScode(SCODE c) {
+	return c;
+}
+
+HRESULT HRESULT_FROM_NT(HRESULT x) {
+	return x | FACILITY_NT_BIT;
+}
+
+HRESULT HRESULT_FROM_WIN32(HRESULT x) {
+	return  x ? (x & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000 : 0;
+}
+
+HRESULT PropagateResult(HRESULT hrPrevious, SCODE scBase) {
+	return scBase;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/wingdi.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,4590 @@
+/***********************************************************************\
+*                                wingdi.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.wingdi;
+pragma(lib, "gdi32.lib");
+
+// FIXME: clean up Windows version support
+
+private import win32.w32api, win32.windef, win32.winver;
+
+// BITMAPINFOHEADER.biCompression
+enum : DWORD {
+	BI_RGB = 0,
+	BI_RLE8,
+	BI_RLE4,
+	BI_BITFIELDS,
+	BI_JPEG,
+	BI_PNG
+}
+
+// ---
+// COLORADJUSTMENT -- only for NT 3.1+, Win2000+
+const WORD
+	CA_NEGATIVE   = 1,
+	CA_LOG_FILTER = 2;
+
+// COLORADJUSTMENT
+enum : WORD  {
+	ILLUMINANT_DEVICE_DEFAULT = 0,
+	ILLUMINANT_A,
+	ILLUMINANT_B,
+	ILLUMINANT_C,
+	ILLUMINANT_D50,
+	ILLUMINANT_D55,
+	ILLUMINANT_D65,
+	ILLUMINANT_D75,
+	ILLUMINANT_F2,
+	ILLUMINANT_MAX_INDEX   = ILLUMINANT_F2,
+	ILLUMINANT_TUNGSTEN    = ILLUMINANT_A,
+	ILLUMINANT_DAYLIGHT    = ILLUMINANT_C,
+	ILLUMINANT_FLUORESCENT = ILLUMINANT_F2,
+	ILLUMINANT_NTSC        = ILLUMINANT_C
+}
+
+enum {
+	RGB_GAMMA_MIN       = 2500,
+	RGB_GAMMA_MAX       = 65000,
+	REFERENCE_WHITE_MIN = 6000,
+	REFERENCE_WHITE_MAX = 10000,
+	REFERENCE_BLACK_MIN = 0,
+	REFERENCE_BLACK_MAX = 4000,
+	COLOR_ADJ_MIN       = -100,
+	COLOR_ADJ_MAX       = 100,
+}
+//---
+
+/* FIXME: move to win32.winuser ? */
+// DrawIconEx()
+enum : UINT {
+	DI_MASK        = 1,
+	DI_IMAGE       = 2,
+	DI_NORMAL      = 3,
+	DI_COMPAT      = 4,
+	DI_DEFAULTSIZE = 8
+}
+
+// DOCINFO
+enum : DWORD {
+	DI_APPBANDING = 1,
+	DI_ROPS_READ_DESTINATION = 2,
+}
+
+// ENHMETAHEADER
+enum : DWORD {
+	EMR_HEADER = 1,
+	EMR_POLYBEZIER,
+	EMR_POLYGON,
+	EMR_POLYLINE,
+	EMR_POLYBEZIERTO,
+	EMR_POLYLINETO,
+	EMR_POLYPOLYLINE,
+	EMR_POLYPOLYGON,
+	EMR_SETWINDOWEXTEX,
+	EMR_SETWINDOWORGEX,
+	EMR_SETVIEWPORTEXTEX,
+	EMR_SETVIEWPORTORGEX,
+	EMR_SETBRUSHORGEX,
+	EMR_EOF,
+	EMR_SETPIXELV,
+	EMR_SETMAPPERFLAGS,
+	EMR_SETMAPMODE,
+	EMR_SETBKMODE,
+	EMR_SETPOLYFILLMODE,
+	EMR_SETROP2,
+	EMR_SETSTRETCHBLTMODE,
+	EMR_SETTEXTALIGN,
+	EMR_SETCOLORADJUSTMENT,
+	EMR_SETTEXTCOLOR,
+	EMR_SETBKCOLOR,
+	EMR_OFFSETCLIPRGN,
+	EMR_MOVETOEX,
+	EMR_SETMETARGN,
+	EMR_EXCLUDECLIPRECT,
+	EMR_INTERSECTCLIPRECT,
+	EMR_SCALEVIEWPORTEXTEX,
+	EMR_SCALEWINDOWEXTEX,
+	EMR_SAVEDC,
+	EMR_RESTOREDC,
+	EMR_SETWORLDTRANSFORM,
+	EMR_MODIFYWORLDTRANSFORM,
+	EMR_SELECTOBJECT,
+	EMR_CREATEPEN,
+	EMR_CREATEBRUSHINDIRECT,
+	EMR_DELETEOBJECT,
+	EMR_ANGLEARC,
+	EMR_ELLIPSE,
+	EMR_RECTANGLE,
+	EMR_ROUNDRECT,
+	EMR_ARC,
+	EMR_CHORD,
+	EMR_PIE,
+	EMR_SELECTPALETTE,
+	EMR_CREATEPALETTE,
+	EMR_SETPALETTEENTRIES,
+	EMR_RESIZEPALETTE,
+	EMR_REALIZEPALETTE,
+	EMR_EXTFLOODFILL,
+	EMR_LINETO,
+	EMR_ARCTO,
+	EMR_POLYDRAW,
+	EMR_SETARCDIRECTION,
+	EMR_SETMITERLIMIT,
+	EMR_BEGINPATH,
+	EMR_ENDPATH,
+	EMR_CLOSEFIGURE,
+	EMR_FILLPATH,
+	EMR_STROKEANDFILLPATH,
+	EMR_STROKEPATH,
+	EMR_FLATTENPATH,
+	EMR_WIDENPATH,
+	EMR_SELECTCLIPPATH,
+	EMR_ABORTPATH, // 68
+	// reserved 69
+	EMR_GDICOMMENT = 70,
+	EMR_FILLRGN,
+	EMR_FRAMERGN,
+	EMR_INVERTRGN,
+	EMR_PAINTRGN,
+	EMR_EXTSELECTCLIPRGN,
+	EMR_BITBLT,
+	EMR_STRETCHBLT,
+	EMR_MASKBLT,
+	EMR_PLGBLT,
+	EMR_SETDIBITSTODEVICE,
+	EMR_STRETCHDIBITS,
+	EMR_EXTCREATEFONTINDIRECTW,
+	EMR_EXTTEXTOUTA,
+	EMR_EXTTEXTOUTW,
+	EMR_POLYBEZIER16,
+	EMR_POLYGON16,
+	EMR_POLYLINE16,
+	EMR_POLYBEZIERTO16,
+	EMR_POLYLINETO16,
+	EMR_POLYPOLYLINE16,
+	EMR_POLYPOLYGON16,
+	EMR_POLYDRAW16,
+	EMR_CREATEMONOBRUSH,
+	EMR_CREATEDIBPATTERNBRUSHPT,
+	EMR_EXTCREATEPEN,
+	EMR_POLYTEXTOUTA,
+	EMR_POLYTEXTOUTW, // 97
+	EMR_SETICMMODE,
+	EMR_CREATECOLORSPACE,
+	EMR_SETCOLORSPACE,
+	EMR_DELETECOLORSPACE,
+	EMR_GLSRECORD,
+	EMR_GLSBOUNDEDRECORD,
+	EMR_PIXELFORMAT, // = 104
+	// reserved 105 - 110
+	EMR_COLORCORRECTPALETTE = 111,
+	EMR_SETICMPROFILEA,
+	EMR_SETICMPROFILEW,
+	EMR_ALPHABLEND,
+	EMR_SETLAYOUT,
+	EMR_TRANSPARENTBLT, // 116
+	// reserved 117
+	EMR_GRADIENTFILL = 118,
+	// reserved 119, 120
+	EMR_COLORMATCHTOTARGETW = 121,
+	EMR_CREATECOLORSPACEW // 122
+}
+
+const EMR_MIN = EMR_HEADER;
+
+static if (WINVER >= 0x0500)
+	const EMR_MAX = EMR_CREATECOLORSPACEW;
+else static if (WINVER >= 0x0400)
+	const EMR_MAX = EMR_PIXELFORMAT;
+else
+	const EMR_MAX = EMR_POLYTEXTOUTW;
+
+// ENHMETAHEADER.dSignature, ENHMETAHEADER3.dSignature,
+// EMRFORMAT.dSignature
+enum : DWORD {
+	ENHMETA_SIGNATURE = 1179469088,
+	EPS_SIGNATURE     = 0x46535045
+}
+
+static if (_WIN32_WINNT >= 0x0500) {
+	// AddFontResourceEx()
+	enum : DWORD {
+		FR_PRIVATE  = 0x10,
+		FR_NOT_ENUM = 0x20
+	}
+}
+
+enum {
+	META_SAVEDC                = 0x1E,
+	META_REALIZEPALETTE        = 0x35,
+	META_SETPALENTRIES         = 0x37,
+	META_CREATEPALETTE         = 0xf7,
+	META_SETBKMODE             = 0x102,
+	META_SETMAPMODE            = 0x103,
+	META_SETROP2               = 0x104,
+	META_SETRELABS             = 0x105,
+	META_SETPOLYFILLMODE       = 0x106,
+	META_SETSTRETCHBLTMODE     = 0x107,
+	META_SETTEXTCHAREXTRA      = 0x108,
+	META_RESTOREDC             = 0x127,
+	META_INVERTREGION          = 0x12A,
+	META_PAINTREGION           = 0x12B,
+	META_SELECTCLIPREGION      = 0x12C,
+	META_SELECTOBJECT          = 0x12D,
+	META_SETTEXTALIGN          = 0x12E,
+	META_RESIZEPALETTE         = 0x139,
+	META_DIBCREATEPATTERNBRUSH = 0x142,
+	META_SETLAYOUT             = 0x149,
+	META_DELETEOBJECT          = 0x1F0,
+	META_CREATEPATTERNBRUSH    = 0x1F9,
+	META_SETBKCOLOR            = 0x201,
+	META_SETTEXTCOLOR          = 0x209,
+	META_SETTEXTJUSTIFICATION  = 0x20A,
+	META_SETWINDOWORG          = 0x20B,
+	META_SETWINDOWEXT          = 0x20C,
+	META_SETVIEWPORTORG        = 0x20D,
+	META_SETVIEWPORTEXT        = 0x20E,
+	META_OFFSETWINDOWORG       = 0x20F,
+	META_OFFSETVIEWPORTORG     = 0x211,
+	META_LINETO                = 0x213,
+	META_MOVETO                = 0x214,
+	META_OFFSETCLIPRGN         = 0x220,
+	META_FILLREGION            = 0x228,
+	META_SETMAPPERFLAGS        = 0x231,
+	META_SELECTPALETTE         = 0x234,
+	META_CREATEPENINDIRECT     = 0x2FA,
+	META_CREATEFONTINDIRECT    = 0x2FB,
+	META_CREATEBRUSHINDIRECT   = 0x2FC,
+	META_POLYGON               = 0x324,
+	META_POLYLINE              = 0x325,
+	META_SCALEWINDOWEXT        = 0x410,
+	META_SCALEVIEWPORTEXT      = 0x412,
+	META_EXCLUDECLIPRECT       = 0x415,
+	META_INTERSECTCLIPRECT     = 0x416,
+	META_ELLIPSE               = 0x418,
+	META_FLOODFILL             = 0x419,
+	META_RECTANGLE             = 0x41B,
+	META_SETPIXEL              = 0x41F,
+	META_FRAMEREGION           = 0x429,
+	META_ANIMATEPALETTE        = 0x436,
+	META_TEXTOUT               = 0x521,
+	META_POLYPOLYGON           = 0x538,
+	META_EXTFLOODFILL          = 0x548,
+	META_ROUNDRECT             = 0x61C,
+	META_PATBLT                = 0x61D,
+	META_ESCAPE                = 0x626,
+	META_CREATEREGION          = 0x6FF,
+	META_ARC                   = 0x817,
+	META_PIE                   = 0x81A,
+	META_CHORD                 = 0x830,
+	META_BITBLT                = 0x922,
+	META_DIBBITBLT             = 0x940,
+	META_EXTTEXTOUT            = 0xA32,
+	META_STRETCHBLT            = 0xB23,
+	META_DIBSTRETCHBLT         = 0xB41,
+	META_SETDIBTODEV           = 0xD33,
+	META_STRETCHDIB            = 0xF43
+}
+
+// EMRPOLYDRAW
+enum : BYTE {
+	PT_CLOSEFIGURE = 1,
+	PT_LINETO      = 2,
+	PT_BEZIERTO    = 4,
+	PT_MOVETO      = 6
+}
+
+// ----
+// PIXELFORMATDESCRIPTOR.iPixelType
+enum : BYTE {
+	PFD_TYPE_RGBA       = 0,
+	PFD_TYPE_COLORINDEX = 1
+}
+
+deprecated {
+// PIXELFORMATDESCRIPTOR.
+const byte
+	PFD_MAIN_PLANE     = 0,
+	PFD_OVERLAY_PLANE  = 1,
+	PFD_UNDERLAY_PLANE = -1;
+}
+// PIXELFORMATDESCRIPTOR.dwFlags
+const DWORD
+	PFD_DOUBLEBUFFER          = 0x00000001,
+	PFD_STEREO                = 0x00000002,
+	PFD_DRAW_TO_WINDOW        = 0x00000004,
+	PFD_DRAW_TO_BITMAP        = 0x00000008,
+	PFD_SUPPORT_GDI           = 0x00000010,
+	PFD_SUPPORT_OPENGL        = 0x00000020,
+	PFD_GENERIC_FORMAT        = 0x00000040,
+	PFD_NEED_PALETTE          = 0x00000080,
+	PFD_NEED_SYSTEM_PALETTE   = 0x00000100,
+	PFD_SWAP_EXCHANGE         = 0x00000200,
+	PFD_SWAP_COPY             = 0x00000400,
+	PFD_SWAP_LAYER_BUFFERS    = 0x00000800,
+	PFD_GENERIC_ACCELERATED   = 0x00001000,
+	PFD_SUPPORT_DIRECTDRAW    = 0x00002000,
+	/* PIXELFORMATDESCRIPTOR flags for use in ChoosePixelFormat only */
+	PFD_DEPTH_DONTCARE        = 0x20000000,
+	PFD_DOUBLEBUFFER_DONTCARE = 0x40000000,
+	PFD_STEREO_DONTCARE       = 0x80000000;
+
+// ----
+
+const DWORD
+	BLACKNESS   = 0x000042,
+	NOTSRCERASE = 0x1100A6,
+	NOTSRCCOPY  = 0x330008,
+	SRCERASE    = 0x440328,
+	DSTINVERT   = 0x550009,
+	PATINVERT   = 0x5A0049,
+	SRCINVERT   = 0x660046,
+	SRCAND      = 0x8800C6,
+	MERGEPAINT  = 0xBB0226,
+	MERGECOPY   = 0xC000CA,
+	SRCCOPY     = 0xCC0020,
+	SRCPAINT    = 0xEE0086,
+	PATCOPY     = 0xF00021,
+	PATPAINT    = 0xFB0A09,
+	WHITENESS   = 0xFF0062;
+static if (WINVER >= 0x0500) {
+	const DWORD
+		NOMIRRORBITMAP = 0x80000000,
+		CAPTUREBLT     = 0x40000000;
+}
+
+// GetROP2(), SetROP2()
+enum : int {
+	R2_BLACK       = 1,
+	R2_NOTMERGEPEN = 2,
+	R2_MASKNOTPEN  = 3,
+	R2_NOTCOPYPEN  = 4,
+	R2_MASKPENNOT  = 5,
+	R2_NOT         = 6,
+	R2_XORPEN      = 7,
+	R2_NOTMASKPEN  = 8,
+	R2_MASKPEN     = 9,
+	R2_NOTXORPEN   = 10,
+	R2_NOP         = 11,
+	R2_MERGENOTPEN = 12,
+	R2_COPYPEN     = 13,
+	R2_MERGEPENNOT = 14,
+	R2_MERGEPEN    = 15,
+	R2_WHITE       = 16
+}
+
+const R2_LAST = R2_WHITE;
+
+// CheckColorsInGamut()
+const ubyte
+	CM_IN_GAMUT     = 0,
+	CM_OUT_OF_GAMUT = 255;
+
+/* UpdateICMRegKey Constants               */
+const int
+	ICM_ADDPROFILE = 1,
+	ICM_DELETEPROFILE = 2,
+	ICM_QUERYPROFILE = 3,
+	ICM_SETDEFAULTPROFILE = 4,
+	ICM_REGISTERICMATCHER = 5,
+	ICM_UNREGISTERICMATCHER = 6,
+	ICM_QUERYMATCH = 7;
+
+enum : int {
+	RGN_AND  = 1,
+	RGN_OR   = 2,
+	RGN_XOR  = 3,
+	RGN_DIFF = 4,
+	RGN_COPY = 5
+}
+
+const RGN_MIN = RGN_AND;
+const RGN_MAX = RGN_COPY;
+
+// Return values for CombineRgn()
+enum {
+	NULLREGION    = 1,
+	SIMPLEREGION  = 2,
+	COMPLEXREGION = 3
+}
+
+const ERROR = 0;
+alias ERROR RGN_ERROR;
+
+// CreateDIBitmap()
+const DWORD CBM_INIT = 4;
+
+// CreateDIBitmap()
+enum : UINT {
+	DIB_RGB_COLORS = 0,
+	DIB_PAL_COLORS = 1
+}
+
+// ---
+//  Values for LOGFONT and CreateFont()
+
+// FIXME: For D, replace with lfFaceName.length()
+const LF_FACESIZE     = 32;
+const LF_FULLFACESIZE = 64;
+
+// FIXME: Not needed for D, only EXTLOGFONT
+const ELF_VENDOR_SIZE = 4;
+
+// ???
+const ELF_VERSION = 0;
+const ELF_CULTURE_LATIN = 0;
+
+// LOGFONT.lfWeight
+const LONG
+	FW_DONTCARE   = 0,
+	FW_THIN       = 100,
+	FW_EXTRALIGHT = 200,
+	FW_ULTRALIGHT = FW_EXTRALIGHT,
+	FW_LIGHT      = 300,
+	FW_NORMAL     = 400,
+	FW_REGULAR    = FW_NORMAL,
+	FW_MEDIUM     = 500,
+	FW_SEMIBOLD   = 600,
+	FW_DEMIBOLD   = FW_SEMIBOLD,
+	FW_BOLD       = 700,
+	FW_EXTRABOLD  = 800,
+	FW_ULTRABOLD  = FW_EXTRABOLD,
+	FW_HEAVY      = 900,
+	FW_BLACK      = FW_HEAVY;
+
+// LOGFONT.lfCharSet
+enum : DWORD {
+	ANSI_CHARSET        = 0,
+	DEFAULT_CHARSET     = 1,
+	SYMBOL_CHARSET      = 2,
+	MAC_CHARSET         = 77,
+	SHIFTJIS_CHARSET    = 128,
+	HANGEUL_CHARSET     = 129,
+	HANGUL_CHARSET      = 129,
+	JOHAB_CHARSET       = 130,
+	GB2312_CHARSET      = 134,
+	CHINESEBIG5_CHARSET = 136,
+	GREEK_CHARSET       = 161,
+	TURKISH_CHARSET     = 162,
+	VIETNAMESE_CHARSET  = 163,
+	HEBREW_CHARSET      = 177,
+	ARABIC_CHARSET      = 178,
+	BALTIC_CHARSET      = 186,
+	RUSSIAN_CHARSET     = 204,
+	THAI_CHARSET        = 222,
+	EASTEUROPE_CHARSET  = 238,
+	OEM_CHARSET         = 255
+}
+
+// LOGFONT.lfOutPrecision
+enum : BYTE {
+	OUT_DEFAULT_PRECIS = 0,
+	OUT_STRING_PRECIS,
+	OUT_CHARACTER_PRECIS,
+	OUT_STROKE_PRECIS,
+	OUT_TT_PRECIS,
+	OUT_DEVICE_PRECIS,
+	OUT_RASTER_PRECIS,
+	OUT_TT_ONLY_PRECIS,
+	OUT_OUTLINE_PRECIS,
+	OUT_SCREEN_OUTLINE_PRECIS,
+	OUT_PS_ONLY_PRECIS, // 10
+}
+
+// LOGFONT.lfClipPrecision
+enum : BYTE  {
+	CLIP_DEFAULT_PRECIS   = 0,
+	CLIP_CHARACTER_PRECIS = 1,
+	CLIP_STROKE_PRECIS    = 2,
+	CLIP_MASK             = 15,
+	CLIP_LH_ANGLES        = 16,
+	CLIP_TT_ALWAYS        = 32,
+	CLIP_DFA_DISABLE      = 64,
+	CLIP_EMBEDDED         = 128
+}
+
+// LOGFONT.lfQuality
+enum : BYTE {
+	DEFAULT_QUALITY = 0,
+	DRAFT_QUALITY,
+	PROOF_QUALITY,
+	NONANTIALIASED_QUALITY,
+	ANTIALIASED_QUALITY
+}
+
+// LOGFONT.lfPitchAndFamily
+
+const BYTE
+	DEFAULT_PITCH  = 0,
+	FIXED_PITCH    = 1,
+	VARIABLE_PITCH = 2,
+	MONO_FONT      = 8,
+	FF_DONTCARE    = 0,
+	FF_ROMAN       = 16,
+	FF_SWISS       = 32,
+	FF_SCRIPT      = 64,
+	FF_MODERN      = 48,
+	FF_DECORATIVE  = 80;
+
+// ----
+// Enums for the PANOSE struct
+
+const PANOSE_COUNT=10;
+
+enum {
+	PAN_FAMILYTYPE_INDEX = 0,
+	PAN_SERIFSTYLE_INDEX,
+	PAN_WEIGHT_INDEX,
+	PAN_PROPORTION_INDEX,
+	PAN_CONTRAST_INDEX,
+	PAN_STROKEVARIATION_INDEX,
+	PAN_ARMSTYLE_INDEX,
+	PAN_LETTERFORM_INDEX,
+	PAN_MIDLINE_INDEX,
+	PAN_XHEIGHT_INDEX
+}
+
+const PAN_CULTURE_LATIN=0;
+
+// NOTE: the first two values (PAN_ANY and PAN_NO_FIT) apply to all these enums!
+enum : BYTE {
+	PAN_ANY    = 0,
+	PAN_NO_FIT = 1,
+}
+
+enum : BYTE {
+	PAN_FAMILY_TEXT_DISPLAY = 2,
+	PAN_FAMILY_SCRIPT,
+	PAN_FAMILY_DECORATIVE,
+	PAN_FAMILY_PICTORIAL
+}
+enum : BYTE {
+	PAN_SERIF_COVE = 2,
+	PAN_SERIF_OBTUSE_COVE,
+	PAN_SERIF_SQUARE_COVE,
+	PAN_SERIF_OBTUSE_SQUARE_COVE,
+	PAN_SERIF_SQUARE,
+	PAN_SERIF_THIN,
+	PAN_SERIF_BONE,
+	PAN_SERIF_EXAGGERATED,
+	PAN_SERIF_TRIANGLE,
+	PAN_SERIF_NORMAL_SANS,
+	PAN_SERIF_OBTUSE_SANS,
+	PAN_SERIF_PERP_SANS,
+	PAN_SERIF_FLARED,
+	PAN_SERIF_ROUNDED
+}
+
+enum : BYTE {
+	PAN_WEIGHT_VERY_LIGHT = 2,
+	PAN_WEIGHT_LIGHT,
+	PAN_WEIGHT_THIN,
+	PAN_WEIGHT_BOOK,
+	PAN_WEIGHT_MEDIUM,
+	PAN_WEIGHT_DEMI,
+	PAN_WEIGHT_BOLD,
+	PAN_WEIGHT_HEAVY,
+	PAN_WEIGHT_BLACK,
+	PAN_WEIGHT_NORD
+}
+
+enum : BYTE {
+	PAN_PROP_OLD_STYLE = 2,
+	PAN_PROP_MODERN,
+	PAN_PROP_EVEN_WIDTH,
+	PAN_PROP_EXPANDED,
+	PAN_PROP_CONDENSED,
+	PAN_PROP_VERY_EXPANDED,
+	PAN_PROP_VERY_CONDENSED,
+	PAN_PROP_MONOSPACED
+}
+
+enum : BYTE {
+	PAN_CONTRAST_NONE = 2,
+	PAN_CONTRAST_VERY_LOW,
+	PAN_CONTRAST_LOW,
+	PAN_CONTRAST_MEDIUM_LOW,
+	PAN_CONTRAST_MEDIUM,
+	PAN_CONTRAST_MEDIUM_HIGH,
+	PAN_CONTRAST_HIGH,
+	PAN_CONTRAST_VERY_HIGH
+}
+
+// PANOSE.bStrokeVariation
+enum : BYTE {
+	PAN_STROKE_GRADUAL_DIAG = 2,
+	PAN_STROKE_GRADUAL_TRAN,
+	PAN_STROKE_GRADUAL_VERT,
+	PAN_STROKE_GRADUAL_HORZ,
+	PAN_STROKE_RAPID_VERT,
+	PAN_STROKE_RAPID_HORZ,
+	PAN_STROKE_INSTANT_VERT
+}
+
+// PANOSE.bArmStyle
+enum : BYTE {
+	PAN_STRAIGHT_ARMS_HORZ = 2,
+	PAN_STRAIGHT_ARMS_WEDGE,
+	PAN_STRAIGHT_ARMS_VERT,
+	PAN_STRAIGHT_ARMS_SINGLE_SERIF,
+	PAN_STRAIGHT_ARMS_DOUBLE_SERIF,
+	PAN_BENT_ARMS_HORZ,
+	PAN_BENT_ARMS_WEDGE,
+	PAN_BENT_ARMS_VERT,
+	PAN_BENT_ARMS_SINGLE_SERIF,
+	PAN_BENT_ARMS_DOUBLE_SERIF
+}
+
+// PANOSE.bLetterForm
+enum : BYTE {
+	PAN_LETT_NORMAL_CONTACT = 2,
+	PAN_LETT_NORMAL_WEIGHTED,
+	PAN_LETT_NORMAL_BOXED,
+	PAN_LETT_NORMAL_FLATTENED,
+	PAN_LETT_NORMAL_ROUNDED,
+	PAN_LETT_NORMAL_OFF_CENTER,
+	PAN_LETT_NORMAL_SQUARE,
+	PAN_LETT_OBLIQUE_CONTACT,
+	PAN_LETT_OBLIQUE_WEIGHTED,
+	PAN_LETT_OBLIQUE_BOXED,
+	PAN_LETT_OBLIQUE_FLATTENED,
+	PAN_LETT_OBLIQUE_ROUNDED,
+	PAN_LETT_OBLIQUE_OFF_CENTER,
+	PAN_LETT_OBLIQUE_SQUARE
+}
+
+// PANOSE.bMidLine
+enum : BYTE {
+	PAN_MIDLINE_STANDARD_TRIMMED = 2,
+	PAN_MIDLINE_STANDARD_POINTED,
+	PAN_MIDLINE_STANDARD_SERIFED,
+	PAN_MIDLINE_HIGH_TRIMMED,
+	PAN_MIDLINE_HIGH_POINTED,
+	PAN_MIDLINE_HIGH_SERIFED,
+	PAN_MIDLINE_CONSTANT_TRIMMED,
+	PAN_MIDLINE_CONSTANT_POINTED,
+	PAN_MIDLINE_CONSTANT_SERIFED,
+	PAN_MIDLINE_LOW_TRIMMED,
+	PAN_MIDLINE_LOW_POINTED,
+	PAN_MIDLINE_LOW_SERIFED
+}
+
+// PANOSE.bXHeight
+enum : BYTE {
+	PAN_XHEIGHT_CONSTANT_SMALL = 2,
+	PAN_XHEIGHT_CONSTANT_STD,
+	PAN_XHEIGHT_CONSTANT_LARGE,
+	PAN_XHEIGHT_DUCKING_SMALL,
+	PAN_XHEIGHT_DUCKING_STD,
+	PAN_XHEIGHT_DUCKING_LARGE
+}
+
+// ----
+// ???
+const FS_LATIN1      = 0x00000001;
+const FS_LATIN2      = 0x00000002;
+const FS_CYRILLIC    = 0x00000004;
+const FS_GREEK       = 0x00000008;
+const FS_TURKISH     = 0x00000010;
+const FS_HEBREW      = 0x00000020;
+const FS_ARABIC      = 0x00000040;
+const FS_BALTIC      = 0x00000080;
+const FS_VIETNAMESE  = 0x00000100;
+const FS_THAI        = 0x00010000;
+const FS_JISJAPAN    = 0x00020000;
+const FS_CHINESESIMP = 0x00040000;
+const FS_WANSUNG     = 0x00080000;
+const FS_CHINESETRAD = 0x00100000;
+const FS_JOHAB       = 0x00200000;
+const FS_SYMBOL      = 0x80000000;
+
+// ----
+// Poly Fill Mode
+enum : int {
+	ALTERNATE = 1,
+	WINDING = 2
+}
+const int POLYFILL_LAST = WINDING;
+
+//---
+// LOGBRUSH
+enum : LONG {
+	HS_HORIZONTAL = 0,
+	HS_VERTICAL,
+	HS_FDIAGONAL,
+	HS_BDIAGONAL,
+	HS_CROSS,
+	HS_DIAGCROSS
+}
+
+//LOGBRUSH.lbStyle
+enum : UINT {
+	BS_SOLID = 0,
+	BS_NULL  = 1,
+	BS_HOLLOW = BS_NULL,
+	BS_HATCHED,
+	BS_PATTERN,
+	BS_INDEXED,
+	BS_DIBPATTERN,
+	BS_DIBPATTERNPT,
+	BS_PATTERN8X8,
+	BS_DIBPATTERN8X8,
+	BS_MONOPATTERN,
+}
+//-----
+// EXTLOGPEN, ExtCreatePen()
+
+// EXTLOGPEN.elpPenStyle
+enum : DWORD {
+	PS_SOLID       = 0,
+	PS_DASH        = 1,
+	PS_DOT         = 2,
+	PS_DASHDOT     = 3,
+	PS_DASHDOTDOT  = 4,
+	PS_NULL        = 5,
+	PS_INSIDEFRAME = 6,
+	PS_USERSTYLE   = 7,
+	PS_ALTERNATE   = 8,
+	PS_STYLE_MASK  = 15,
+}
+
+enum : DWORD {
+	PS_COSMETIC      = 0x00000000,
+	PS_GEOMETRIC     = 0x00010000,
+	PS_TYPE_MASK     = 0x000F0000,
+}
+enum : DWORD {
+	PS_ENDCAP_ROUND  = 0x00000000,
+	PS_ENDCAP_SQUARE = 0x00000100,
+	PS_ENDCAP_FLAT   = 0x00000200,
+	PS_ENDCAP_MASK   = 0x00000F00,
+}
+enum : DWORD {
+	PS_JOIN_ROUND    = 0x00000000,
+	PS_JOIN_BEVEL    = 0x00001000,
+	PS_JOIN_MITER    = 0x00002000,
+	PS_JOIN_MASK     = 0x0000F000,
+}
+
+// ---
+// DeviceCapabilities()
+
+enum : WORD {
+	DC_FIELDS = 1,
+	DC_PAPERS,
+	DC_PAPERSIZE,
+	DC_MINEXTENT,
+	DC_MAXEXTENT,
+	DC_BINS,
+	DC_DUPLEX,
+	DC_SIZE,
+	DC_EXTRA,
+	DC_VERSION,
+	DC_DRIVER,
+	DC_BINNAMES,
+	DC_ENUMRESOLUTIONS,
+	DC_FILEDEPENDENCIES,
+	DC_TRUETYPE,
+	DC_PAPERNAMES,
+	DC_ORIENTATION,
+	DC_COPIES,
+	DC_BINADJUST,
+	DC_EMF_COMPLIANT,
+	DC_DATATYPE_PRODUCED,
+	DC_COLLATE,
+	DC_MANUFACTURER,
+	DC_MODEL,
+}
+
+static if (WINVER >= 0x0500) {
+	enum {
+		DC_PERSONALITY = 25,
+		DC_PRINTRATE = 26,
+		DC_PRINTRATEUNIT = 27,
+		DC_PRINTERMEM = 28,
+		DC_MEDIAREADY = 29,
+		DC_STAPLE = 30,
+		DC_PRINTRATEPPM = 31,
+		DC_COLORDEVICE = 32,
+		DC_NUP = 33,
+		DC_MEDIATYPENAMES = 34,
+		DC_MEDIATYPES = 35,
+	}
+	enum {
+		PRINTRATEUNIT_PPM = 1,
+		PRINTRATEUNIT_CPS = 2,
+		PRINTRATEUNIT_LPM = 3,
+		PRINTRATEUNIT_IPM = 4,
+	}
+}
+
+
+// return from DC_TRUETYPE
+const DWORD
+	DCTT_BITMAP           = 1,
+	DCTT_DOWNLOAD         = 2,
+	DCTT_SUBDEV           = 4,
+	DCTT_DOWNLOAD_OUTLINE = 8;
+
+static if (WINVER >= 0x0400) {
+	// return from DC_BINADJUST
+	enum : DWORD {
+		DCBA_FACEUPNONE     = 0x0000,
+		DCBA_FACEUPCENTER   = 0x0001,
+		DCBA_FACEUPLEFT     = 0x0002,
+		DCBA_FACEUPRIGHT    = 0x0003,
+		DCBA_FACEDOWNNONE   = 0x0100,
+		DCBA_FACEDOWNCENTER = 0x0101,
+		DCBA_FACEDOWNLEFT   = 0x0102,
+		DCBA_FACEDOWNRIGHT  = 0x0103,
+	}
+}
+//---
+
+const FLOODFILLBORDER  = 0;
+const FLOODFILLSURFACE = 1;
+
+// ExtTextOut()
+const UINT
+	ETO_OPAQUE         = 0x0002,
+	ETO_CLIPPED        = 0x0004,
+	ETO_GLYPH_INDEX    = 0x0010,
+	ETO_RTLREADING     = 0x0080,
+	ETO_NUMERICSLOCAL  = 0x0400,
+	ETO_NUMERICSLATIN  = 0x0800,
+	ETO_IGNORELANGUAGE = 0x1000;
+static if (_WIN32_WINNT >= 0x0500) {
+	const UINT
+		ETO_PDY = 0x2000;
+}
+
+// GdiComment()
+enum {
+	GDICOMMENT_BEGINGROUP       = 0x00000002,
+	GDICOMMENT_ENDGROUP         = 0x00000003,
+	GDICOMMENT_UNICODE_STRING   = 0x00000040,
+	GDICOMMENT_UNICODE_END      = 0x00000080,
+	GDICOMMENT_MULTIFORMATS     = 0x40000004,
+	GDICOMMENT_IDENTIFIER       = 0x43494447,
+	GDICOMMENT_WINDOWS_METAFILE = 0x80000001,
+}
+
+// Get/SetArcDirection()
+enum : int {
+	AD_COUNTERCLOCKWISE = 1,
+	AD_CLOCKWISE        = 2
+}
+
+const RDH_RECTANGLES = 1;
+
+// GCPRESULTS.lpClass
+enum {
+	GCPCLASS_LATIN  = 1,
+	GCPCLASS_HEBREW = 2,
+	GCPCLASS_ARABIC = 2,
+	GCPCLASS_NEUTRAL,
+	GCPCLASS_LOCALNUMBER,
+	GCPCLASS_LATINNUMBER,
+	GCPCLASS_LATINNUMERICTERMINATOR,
+	GCPCLASS_LATINNUMERICSEPARATOR,
+	GCPCLASS_NUMERICSEPARATOR, // = 8,
+	GCPCLASS_POSTBOUNDRTL = 16,
+	GCPCLASS_POSTBOUNDLTR = 32,
+	GCPCLASS_PREBOUNDRTL  = 64,
+	GCPCLASS_PREBOUNDLTR  = 128,
+	GCPGLYPH_LINKAFTER    = 0x4000,
+	GCPGLYPH_LINKBEFORE   = 0x8000
+}
+
+// GetBoundsRect(), SetBoundsRect()
+const UINT
+	DCB_RESET      = 1,
+	DCB_ACCUMULATE = 2,
+	DCB_SET        = DCB_RESET | DCB_ACCUMULATE,
+	DCB_ENABLE     = 4,
+	DCB_DISABLE    = 8,
+	DCB_DIRTY      = DCB_ACCUMULATE;
+
+//---
+// GetObjectType()
+enum : DWORD {
+	OBJ_PEN = 1,
+	OBJ_BRUSH,
+	OBJ_DC,
+	OBJ_METADC,
+	OBJ_PAL,
+	OBJ_FONT,
+	OBJ_BITMAP,
+	OBJ_REGION,
+	OBJ_METAFILE,
+	OBJ_MEMDC,
+	OBJ_EXTPEN,
+	OBJ_ENHMETADC,
+	OBJ_ENHMETAFILE,
+	OBJ_COLORSPACE,
+}
+
+//---------------------
+// Capabilities for GetDeviceCaps(dc, xxx)
+
+enum : int {
+	DRIVERVERSION   = 0,
+	TECHNOLOGY      = 2,
+	HORZSIZE        = 4,
+	VERTSIZE        = 6,
+	HORZRES         = 8,
+	VERTRES         = 10,
+	BITSPIXEL       = 12,
+	PLANES          = 14,
+	NUMBRUSHES      = 16,
+	NUMPENS         = 18,
+	NUMMARKERS      = 20,
+	NUMFONTS        = 22,
+	NUMCOLORS       = 24,
+	PDEVICESIZE     = 26,
+	CURVECAPS       = 28,
+	LINECAPS        = 30,
+	POLYGONALCAPS   = 32,
+	TEXTCAPS        = 34,
+	CLIPCAPS        = 36,
+	RASTERCAPS      = 38,
+	ASPECTX         = 40,
+	ASPECTY         = 42,
+	ASPECTXY        = 44,
+	LOGPIXELSX      = 88,
+	LOGPIXELSY      = 90,
+	SIZEPALETTE     = 104,
+	NUMRESERVED     = 106,
+	COLORRES        = 108,
+	PHYSICALWIDTH   = 110,
+	PHYSICALHEIGHT  = 111,
+	PHYSICALOFFSETX = 112,
+	PHYSICALOFFSETY = 113,
+	SCALINGFACTORX  = 114,
+	SCALINGFACTORY  = 115,
+	VREFRESH        = 116,
+	DESKTOPVERTRES  = 117,
+	DESKTOPHORZRES  = 118,
+	BLTALIGNMENT    = 119
+}
+static if (WINVER >= 0x0500) {
+	int
+	SHADEBLENDCAPS  = 120,
+	COLORMGMTCAPS   = 121;
+}
+
+// Return values for GetDeviceCaps(dc, TECHNOLOGY)
+enum : int {
+	DT_PLOTTER = 0,
+	DT_RASDISPLAY,
+	DT_RASPRINTER,
+	DT_RASCAMERA,
+	DT_CHARSTREAM,
+	DT_METAFILE,
+	DT_DISPFILE // = 6
+}
+
+// Return values for GetDeviceCaps(dc, RASTERCAPS)
+const int
+	RC_NONE         = 0,
+	RC_BITBLT       = 1,
+	RC_BANDING      = 2,
+	RC_SCALING      = 4,
+	RC_BITMAP64     = 8,
+	RC_GDI20_OUTPUT = 16,
+	RC_GDI20_STATE  = 32,
+	RC_SAVEBITMAP   = 64,
+	RC_DI_BITMAP    = 128,
+	RC_PALETTE      = 256,
+	RC_DIBTODEV     = 512,
+	RC_BIGFONT      = 1024,
+	RC_STRETCHBLT   = 2048,
+	RC_FLOODFILL    = 4096,
+	RC_STRETCHDIB   = 8192,
+	RC_OP_DX_OUTPUT = 0x4000,
+	RC_DEVBITS      = 0x8000;
+
+static if (WINVER >= 0x0500) {
+	/* Shading and blending caps */
+	const SB_NONE = 0x00000000;
+	const SB_CONST_ALPHA = 0x00000001;
+	const SB_PIXEL_ALPHA = 0x00000002;
+	const SB_PREMULT_ALPHA = 0x00000004;
+	const SB_GRAD_RECT = 0x00000010;
+	const SB_GRAD_TRI = 0x00000020;
+	/* Color Management caps */
+	const CM_NONE = 0x00000000;
+	const CM_DEVICE_ICM = 0x00000001;
+	const CM_GAMMA_RAMP = 0x00000002;
+	const CM_CMYK_COLOR = 0x00000004;
+}
+
+// Return values for GetDeviceCaps(dc, CURVECAPS)
+const int
+	CC_NONE       = 0,
+	CC_CIRCLES    = 1,
+	CC_PIE        = 2,
+	CC_CHORD      = 4,
+	CC_ELLIPSES   = 8,
+	CC_WIDE       = 16,
+	CC_STYLED     = 32,
+	CC_WIDESTYLED = 64,
+	CC_INTERIORS  = 128,
+	CC_ROUNDRECT  = 256;
+
+// Return values for GetDeviceCaps(dc, LINECAPS)
+
+const int
+	LC_NONE       = 0,
+	LC_POLYLINE   = 2,
+	LC_MARKER     = 4,
+	LC_POLYMARKER = 8,
+	LC_WIDE       = 16,
+	LC_STYLED     = 32,
+	LC_WIDESTYLED = 64,
+	LC_INTERIORS  = 128;
+
+// Return values for GetDeviceCaps(dc, POLYGONALCAPS)
+
+const int
+	PC_NONE        = 0,
+	PC_POLYGON     = 1,
+	PC_RECTANGLE   = 2,
+	PC_WINDPOLYGON = 4,
+	PC_TRAPEZOID   = 4,
+	PC_SCANLINE    = 8,
+	PC_WIDE        = 16,
+	PC_STYLED      = 32,
+	PC_WIDESTYLED  = 64,
+	PC_INTERIORS   = 128,
+	PC_POLYPOLYGON = 256,
+	PC_PATHS       = 512;
+
+/* Clipping Capabilities */
+const int CP_NONE = 0,
+	CP_RECTANGLE = 1,
+	CP_REGION = 2;
+
+// Return values for GetDeviceCaps(dc, TEXTCAPS)
+
+const int
+	TC_OP_CHARACTER = 1,
+	TC_OP_STROKE    = 2,
+	TC_CP_STROKE    = 4,
+	TC_CR_90        = 8,
+	TC_CR_ANY       = 16,
+	TC_SF_X_YINDEP  = 32,
+	TC_SA_DOUBLE    = 64,
+	TC_SA_INTEGER   = 128,
+	TC_SA_CONTIN    = 256,
+	TC_EA_DOUBLE    = 512,
+	TC_IA_ABLE      = 1024,
+	TC_UA_ABLE      = 2048,
+	TC_SO_ABLE      = 4096,
+	TC_RA_ABLE      = 8192,
+	TC_VA_ABLE      = 16384,
+	TC_RESERVED     = 32768,
+	TC_SCROLLBLT    = 65536;
+
+// End GetDeviceCaps
+//---------------------
+// GetCharacterPlacement(), and GetFontLanguageInfo()
+const DWORD
+	GCP_DBCS            = 1,
+	GCP_REORDER         = 2,
+	GCP_USEKERNING      = 8,
+	GCP_GLYPHSHAPE      = 16,
+	GCP_LIGATE          = 32,
+	GCP_DIACRITIC       = 256,
+	GCP_KASHIDA         = 1024,
+	GCP_ERROR           = 0x8000,
+	GCP_JUSTIFY         = 0x10000,
+	GCP_CLASSIN         = 0x80000,
+	GCP_MAXEXTENT       = 0x100000,
+	GCP_JUSTIFYIN       = 0x200000,
+	GCP_DISPLAYZWG      = 0x400000,
+	GCP_SYMSWAPOFF      = 0x800000,
+	GCP_NUMERICOVERRIDE = 0x1000000,
+	GCP_NEUTRALOVERRIDE = 0x2000000,
+	GCP_NUMERICSLATIN   = 0x4000000,
+	GCP_NUMERICSLOCAL   = 0x8000000,
+	// Only for GetFontLanguageInfo()
+	FLI_GLYPHS          = 0x40000,
+	FLI_MASK            = 0x103b;
+
+// GetGlyphOutline()
+enum : UINT {
+	GGO_METRICS      = 0,
+	GGO_BITMAP       = 1,
+	GGO_NATIVE       = 2,
+	GGO_BEZIER       = 3,
+	GGO_GRAY2_BITMAP = 4,
+	GGO_GRAY4_BITMAP = 5,
+	GGO_GRAY8_BITMAP = 6,
+	GGO_GLYPH_INDEX  = 128,
+	GGO_UNHINTED     = 256
+}
+
+enum : int {
+	GM_COMPATIBLE = 1,
+	GM_ADVANCED
+}
+const GM_LAST = GM_ADVANCED;
+
+enum : int {
+	MM_TEXT = 1,
+	MM_LOMETRIC,
+	MM_HIMETRIC,
+	MM_LOENGLISH,
+	MM_HIENGLISH,
+	MM_TWIPS,
+	MM_ISOTROPIC,
+	MM_ANISOTROPIC,
+}
+
+const int
+	MM_MIN = MM_TEXT,
+	MM_MAX = MM_ANISOTROPIC,
+	MM_MAX_FIXEDSCALE = MM_TWIPS;
+
+const ABSOLUTE = 1;
+const RELATIVE = 2;
+
+enum : BYTE {
+	PC_RESERVED   = 1,
+	PC_EXPLICIT   = 2,
+	PC_NOCOLLAPSE = 4
+}
+
+/* FIXME: move to win32.commctrl ? */
+// ImageList
+const COLORREF
+	CLR_NONE    = 0xffffffff,
+	CLR_INVALID = CLR_NONE,
+	CLR_DEFAULT = 0xff000000;
+
+// RASTERIZER_STATUS.wFlags
+const short
+	TT_AVAILABLE = 1,
+	TT_ENABLED   = 2;
+
+// GetStockObject()
+enum : int {
+	WHITE_BRUSH = 0,
+	LTGRAY_BRUSH,
+	GRAY_BRUSH,
+	DKGRAY_BRUSH,
+	BLACK_BRUSH,
+	HOLLOW_BRUSH, // = 5
+	NULL_BRUSH = HOLLOW_BRUSH,
+	WHITE_PEN = 6,
+	BLACK_PEN,
+	NULL_PEN, // = 8
+	OEM_FIXED_FONT = 10,
+	ANSI_FIXED_FONT,
+	ANSI_VAR_FONT,
+	SYSTEM_FONT,
+	DEVICE_DEFAULT_FONT,
+	DEFAULT_PALETTE,
+	SYSTEM_FIXED_FONT,
+}
+static if (WINVER >= 0x0400) {
+	enum : int {
+		DEFAULT_GUI_FONT = SYSTEM_FIXED_FONT + 1,
+	}
+}
+static if (_WIN32_WINNT >= 0x0500) {
+	enum : int {
+		DC_BRUSH = DEFAULT_GUI_FONT + 1,
+		DC_PEN,
+	}
+}
+
+static if (_WIN32_WINNT >= 0x0500) {
+	const STOCK_LAST = DC_PEN;
+}
+else static if (WINVER >= 0x0400) {
+	const STOCK_LAST = DEFAULT_GUI_FONT;
+}
+else {
+	const STOCK_LAST = SYSTEM_FIXED_FONT;
+}
+
+// Get/SetSystemPaletteUse()
+enum : UINT {
+	SYSPAL_ERROR    = 0,
+	SYSPAL_STATIC   = 1,
+	SYSPAL_NOSTATIC = 2,
+	SYSPAL_NOSTATIC256 = 3,
+}
+
+// SetTextAlign()
+const UINT
+	TA_TOP        = 0,
+	TA_CENTER     = 6,
+	TA_BOTTOM     = 8,
+	TA_BASELINE   = 24,
+	TA_LEFT       = 0,
+	TA_RIGHT      = 2,
+	TA_RTLREADING = 256,
+	TA_NOUPDATECP = 0,
+	TA_UPDATECP   = 1,
+	TA_MASK       = TA_BASELINE+TA_CENTER+TA_UPDATECP+TA_RTLREADING,
+	VTA_BASELINE  = TA_BASELINE,
+	VTA_CENTER    = TA_CENTER,
+	VTA_LEFT      = TA_BOTTOM,
+	VTA_RIGHT     = TA_TOP,
+	VTA_BOTTOM    = TA_RIGHT,
+	VTA_TOP       = TA_LEFT;
+
+// EMRMODIFYWORLDTRANSFORM.iMode
+enum : DWORD {
+	MWT_IDENTITY = 1,
+	MWT_LEFTMULTIPLY,
+	MWT_RIGHTMULTIPLY
+}
+
+const DWORD
+	MWT_MIN = MWT_IDENTITY,
+	MWT_MAX = MWT_RIGHTMULTIPLY;
+
+enum {
+	TRANSPARENT = 1,
+	OPAQUE      = 2
+}
+
+// Get/SetStretchMode()
+enum : int {
+	BLACKONWHITE = 1,
+	WHITEONBLACK = 2,
+	COLORONCOLOR = 3,
+	HALFTONE     = 4,
+
+	STRETCH_ANDSCANS    = 1,
+	STRETCH_ORSCANS     = 2,
+	STRETCH_DELETESCANS = 3,
+	STRETCH_HALFTONE    = 4,
+
+	MAXSTRETCHBLTMODE   = 4
+}
+
+// TranslateCharsetInfo()
+enum : DWORD {
+	TCI_SRCCHARSET  = 1,
+	TCI_SRCCODEPAGE = 2,
+	TCI_SRCFONTSIG  = 3,
+	TCI_SRCLOCALE   = 0x1000,
+}
+
+// SetICMMode()
+enum : int {
+	ICM_OFF   = 1,
+	ICM_ON    = 2,
+	ICM_QUERY = 3,
+	ICM_DONE_OUTSIDEDC = 4,
+}
+
+// ----
+// Escape() Spooler Error Codes
+enum : int {
+	SP_NOTREPORTED = 0x4000,
+	SP_ERROR       = -1,
+	SP_APPABORT    = -2,
+	SP_USERABORT   = -3,
+	SP_OUTOFDISK   = -4,
+	SP_OUTOFMEMORY = -5
+}
+
+// Escape(), ExtEscape()
+// Most of the following are deprecated (Win16 only)
+enum : int {
+	NEWFRAME      = 1,
+	ABORTDOC      = 2,
+	NEXTBAND      = 3,
+	SETCOLORTABLE = 4,
+	GETCOLORTABLE = 5,
+	FLUSHOUTPUT   = 6,
+	DRAFTMODE     = 7,
+	QUERYESCSUPPORT = 8,
+	SETABORTPROC  = 9,
+	STARTDOC      = 10,
+	ENDDOC        = 11,
+	GETPHYSPAGESIZE   = 12,
+	GETPRINTINGOFFSET = 13,
+	GETSCALINGFACTOR  = 14,
+	MFCOMMENT         = 15,
+	GETPENWIDTH       = 16,
+	SETCOPYCOUNT      = 17,
+	SELECTPAPERSOURCE = 18,
+	DEVICEDATA        = 19,
+	PASSTHROUGH       = 19,
+	GETTECHNOLOGY     = 20,
+	SETLINECAP = 21,
+	SETLINEJOIN = 22,
+	SETMITERLIMIT = 23,
+	BANDINFO = 24,
+	DRAWPATTERNRECT = 25,
+	GETVECTORPENSIZE = 26,
+	GETVECTORBRUSHSIZE = 27,
+	ENABLEDUPLEX = 28,
+	GETSETPAPERBINS = 29,
+	GETSETPRINTORIENT = 30,
+	ENUMPAPERBINS = 31,
+	SETDIBSCALING = 32,
+	EPSPRINTING = 33,
+	ENUMPAPERMETRICS = 34,
+	GETSETPAPERMETRICS = 35,
+	POSTSCRIPT_DATA = 37,
+	POSTSCRIPT_IGNORE = 38,
+	MOUSETRAILS = 39,
+	GETDEVICEUNITS = 42,
+	GETEXTENDEDTEXTMETRICS = 256,
+	GETEXTENTTABLE = 257,
+	GETPAIRKERNTABLE = 258,
+	GETTRACKKERNTABLE = 259,
+	EXTTEXTOUT = 512,
+	GETFACENAME = 513,
+	DOWNLOADFACE = 514,
+	ENABLERELATIVEWIDTHS = 768,
+	ENABLEPAIRKERNING = 769,
+	SETKERNTRACK = 770,
+	SETALLJUSTVALUES = 771,
+	SETCHARSET = 772,
+	STRETCHBLT = 2048,
+	METAFILE_DRIVER = 2049,
+	GETSETSCREENPARAMS = 3072,
+	QUERYDIBSUPPORT = 3073,
+	BEGIN_PATH = 4096,
+	CLIP_TO_PATH = 4097,
+	END_PATH = 4098,
+	EXT_DEVICE_CAPS = 4099,
+	RESTORE_CTM = 4100,
+	SAVE_CTM = 4101,
+	SET_ARC_DIRECTION = 4102,
+	SET_BACKGROUND_COLOR = 4103,
+	SET_POLY_MODE = 4104,
+	SET_SCREEN_ANGLE = 4105,
+	SET_SPREAD = 4106,
+	TRANSFORM_CTM = 4107,
+	SET_CLIP_BOX = 4108,
+	SET_BOUNDS = 4109,
+	SET_MIRROR_MODE = 4110,
+	OPENCHANNEL = 4110,
+	DOWNLOADHEADER = 4111,
+	CLOSECHANNEL = 4112,
+	POSTSCRIPT_PASSTHROUGH  = 4115,
+	ENCAPSULATED_POSTSCRIPT = 4116,
+	POSTSCRIPT_IDENTIFY = 4117,
+	POSTSCRIPT_INJECTION = 4118,
+	CHECKJPEGFORMAT = 4119,
+	CHECKPNGFORMAT = 4120,
+	GET_PS_FEATURESETTING = 4121,
+	SPCLPASSTHROUGH2 = 4568,
+}
+
+enum : int {
+	PSIDENT_GDICENTRIC = 0,
+	PSIDENT_PSCENTRIC = 1,
+}
+
+/*
+ * Header structure for the input buffer to POSTSCRIPT_INJECTION escape
+ */
+struct PSINJECTDATA {
+	DWORD DataBytes;
+	WORD  InjectionPoint;
+	WORD  PageNumber;
+}
+alias PSINJECTDATA* PPSINJECTDATA;
+
+/* Constants for PSINJECTDATA.InjectionPoint field */
+enum {
+	PSINJECT_BEGINSTREAM = 1,
+	PSINJECT_PSADOBE = 2,
+	PSINJECT_PAGESATEND = 3,
+	PSINJECT_PAGES = 4,
+	PSINJECT_DOCNEEDEDRES = 5,
+	PSINJECT_DOCSUPPLIEDRES = 6,
+	PSINJECT_PAGEORDER = 7,
+	PSINJECT_ORIENTATION = 8,
+	PSINJECT_BOUNDINGBOX = 9,
+	PSINJECT_DOCUMENTPROCESSCOLORS = 10,
+	PSINJECT_COMMENTS = 11,
+	PSINJECT_BEGINDEFAULTS = 12,
+	PSINJECT_ENDDEFAULTS = 13,
+	PSINJECT_BEGINPROLOG = 14,
+	PSINJECT_ENDPROLOG = 15,
+	PSINJECT_BEGINSETUP = 16,
+	PSINJECT_ENDSETUP = 17,
+	PSINJECT_TRAILER = 18,
+	PSINJECT_EOF = 19,
+	PSINJECT_ENDSTREAM = 20,
+	PSINJECT_DOCUMENTPROCESSCOLORSATEND = 21,
+
+	PSINJECT_PAGENUMBER = 100,
+	PSINJECT_BEGINPAGESETUP = 101,
+	PSINJECT_ENDPAGESETUP = 102,
+	PSINJECT_PAGETRAILER = 103,
+	PSINJECT_PLATECOLOR = 104,
+	PSINJECT_SHOWPAGE = 105,
+	PSINJECT_PAGEBBOX = 106,
+	PSINJECT_ENDPAGECOMMENTS = 107,
+
+	PSINJECT_VMSAVE = 200,
+	PSINJECT_VMRESTORE = 201,
+}
+
+/* Parameter for GET_PS_FEATURESETTING escape */
+enum {
+	FEATURESETTING_NUP = 0,
+	FEATURESETTING_OUTPUT = 1,
+	FEATURESETTING_PSLEVEL = 2,
+	FEATURESETTING_CUSTPAPER = 3,
+	FEATURESETTING_MIRROR = 4,
+	FEATURESETTING_NEGATIVE = 5,
+	FEATURESETTING_PROTOCOL = 6,
+}
+
+enum {
+	FEATURESETTING_PRIVATE_BEGIN = 0x1000,
+	FEATURESETTING_PRIVATE_END = 0x1FFF,
+}
+
+/* Value returned for FEATURESETTING_PROTOCOL */
+const PSPROTOCOL_ASCII = 0;
+const PSPROTOCOL_BCP = 1;
+const PSPROTOCOL_TBCP = 2;
+const PSPROTOCOL_BINARY = 3;
+
+// ----
+
+const WPARAM PR_JOBSTATUS = 0;
+
+// ???
+const QDI_SETDIBITS   = 1;
+const QDI_GETDIBITS   = 2;
+const QDI_DIBTOSCREEN = 4;
+const QDI_STRETCHDIB  = 8;
+
+const ASPECT_FILTERING = 1;
+
+// LOGCOLORSPACE.lcsCSType
+enum : LCSCSTYPE {
+	LCS_CALIBRATED_RGB = 0,
+	LCS_DEVICE_RGB,
+	LCS_DEVICE_CMYK
+} /* What this for? */
+
+// LOGCOLORSPACE.lcsIntent
+enum : LCSGAMUTMATCH {
+	LCS_GM_BUSINESS         = 1,
+	LCS_GM_GRAPHICS         = 2,
+	LCS_GM_IMAGES           = 4,
+	LCS_GM_ABS_COLORIMETRIC = 8,
+}
+
+const DWORD
+	RASTER_FONTTYPE   = 1,
+	DEVICE_FONTTYPE   = 2,
+	TRUETYPE_FONTTYPE = 4;
+
+// ---
+// DEVMODE struct
+
+// FIXME: Not needed for D (use .length instead)
+const CCHDEVICENAME = 32;
+const CCHFORMNAME   = 32;
+
+// DEVMODE.dmSpecVersion
+// current version of specification
+static if (WINVER >= 0x0500 || _WIN32_WINNT >= 0x0400) {
+	const WORD DM_SPECVERSION = 0x0401;
+}
+else static if (WINVER >= 0x0400) {
+	const WORD DM_SPECVERSION = 0x0400;
+}
+else {
+	const WORD DM_SPECVERSION = 0x0320;
+}
+
+// DEVMODE.dmOrientation
+enum : short {
+	DMORIENT_PORTRAIT  = 1,
+	DMORIENT_LANDSCAPE = 2
+}
+
+// DEVMODE.dmPaperSize
+enum : short {
+	DMPAPER_LETTER = 1,
+	DMPAPER_LETTERSMALL,
+	DMPAPER_TABLOID,
+	DMPAPER_LEDGER,
+	DMPAPER_LEGAL,
+	DMPAPER_STATEMENT,
+	DMPAPER_EXECUTIVE,
+	DMPAPER_A3,
+	DMPAPER_A4,
+	DMPAPER_A4SMALL,
+	DMPAPER_A5,
+	DMPAPER_B4,
+	DMPAPER_B5,
+	DMPAPER_FOLIO,
+	DMPAPER_QUARTO,
+	DMPAPER_10X14,
+	DMPAPER_11X17,
+	DMPAPER_NOTE,
+	DMPAPER_ENV_9,
+	DMPAPER_ENV_10,
+	DMPAPER_ENV_11,
+	DMPAPER_ENV_12,
+	DMPAPER_ENV_14,
+	DMPAPER_CSHEET,
+	DMPAPER_DSHEET,
+	DMPAPER_ESHEET,
+	DMPAPER_ENV_DL,
+	DMPAPER_ENV_C5,
+	DMPAPER_ENV_C3,
+	DMPAPER_ENV_C4,
+	DMPAPER_ENV_C6,
+	DMPAPER_ENV_C65,
+	DMPAPER_ENV_B4,
+	DMPAPER_ENV_B5,
+	DMPAPER_ENV_B6,
+	DMPAPER_ENV_ITALY,
+	DMPAPER_ENV_MONARCH,
+	DMPAPER_ENV_PERSONAL,
+	DMPAPER_FANFOLD_US,
+	DMPAPER_FANFOLD_STD_GERMAN,
+	DMPAPER_FANFOLD_LGL_GERMAN,
+	DMPAPER_ISO_B4,
+	DMPAPER_JAPANESE_POSTCARD,
+	DMPAPER_9X11,
+	DMPAPER_10X11,
+	DMPAPER_15X11,
+	DMPAPER_ENV_INVITE,
+	DMPAPER_RESERVED_48,
+	DMPAPER_RESERVED_49,
+	DMPAPER_LETTER_EXTRA,
+	DMPAPER_LEGAL_EXTRA,
+	DMPAPER_TABLOID_EXTRA,
+	DMPAPER_A4_EXTRA,
+	DMPAPER_LETTER_TRANSVERSE,
+	DMPAPER_A4_TRANSVERSE,
+	DMPAPER_LETTER_EXTRA_TRANSVERSE,
+	DMPAPER_A_PLUS,
+	DMPAPER_B_PLUS,
+	DMPAPER_LETTER_PLUS,
+	DMPAPER_A4_PLUS,
+	DMPAPER_A5_TRANSVERSE,
+	DMPAPER_B5_TRANSVERSE,
+	DMPAPER_A3_EXTRA,
+	DMPAPER_A5_EXTRA,
+	DMPAPER_B5_EXTRA,
+	DMPAPER_A2,
+	DMPAPER_A3_TRANSVERSE,
+	DMPAPER_A3_EXTRA_TRANSVERSE // = 68
+}
+static if (WINVER >= 0x0500) {
+	enum : short {
+		DMPAPER_DBL_JAPANESE_POSTCARD = 69,
+		DMPAPER_A6,
+		DMPAPER_JENV_KAKU2,
+		DMPAPER_JENV_KAKU3,
+		DMPAPER_JENV_CHOU3,
+		DMPAPER_JENV_CHOU4,
+		DMPAPER_LETTER_ROTATED,
+		DMPAPER_A3_ROTATED,
+		DMPAPER_A4_ROTATED,
+		DMPAPER_A5_ROTATED,
+		DMPAPER_B4_JIS_ROTATED,
+		DMPAPER_B5_JIS_ROTATED,
+		DMPAPER_JAPANESE_POSTCARD_ROTATED,
+		DMPAPER_DBL_JAPANESE_POSTCARD_ROTATED,
+		DMPAPER_A6_ROTATED,
+		DMPAPER_JENV_KAKU2_ROTATED,
+		DMPAPER_JENV_KAKU3_ROTATED,
+		DMPAPER_JENV_CHOU3_ROTATED,
+		DMPAPER_JENV_CHOU4_ROTATED,
+		DMPAPER_B6_JIS,
+		DMPAPER_B6_JIS_ROTATED,
+		DMPAPER_12X11,
+		DMPAPER_JENV_YOU4,
+		DMPAPER_JENV_YOU4_ROTATED,
+		DMPAPER_P16K,
+		DMPAPER_P32K,
+		DMPAPER_P32KBIG,
+		DMPAPER_PENV_1,
+		DMPAPER_PENV_2,
+		DMPAPER_PENV_3,
+		DMPAPER_PENV_4,
+		DMPAPER_PENV_5,
+		DMPAPER_PENV_6,
+		DMPAPER_PENV_7,
+		DMPAPER_PENV_8,
+		DMPAPER_PENV_9,
+		DMPAPER_PENV_10,
+		DMPAPER_P16K_ROTATED,
+		DMPAPER_P32K_ROTATED,
+		DMPAPER_P32KBIG_ROTATED,
+		DMPAPER_PENV_1_ROTATED,
+		DMPAPER_PENV_2_ROTATED,
+		DMPAPER_PENV_3_ROTATED,
+		DMPAPER_PENV_4_ROTATED,
+		DMPAPER_PENV_5_ROTATED,
+		DMPAPER_PENV_6_ROTATED,
+		DMPAPER_PENV_7_ROTATED,
+		DMPAPER_PENV_8_ROTATED,
+		DMPAPER_PENV_9_ROTATED,
+		DMPAPER_PENV_10_ROTATED // 118
+	}
+}
+
+const short DMPAPER_FIRST = DMPAPER_LETTER;
+
+static if (WINVER >= 0x0500)
+	const short DMPAPER_LAST = DMPAPER_PENV_10_ROTATED;
+else
+	const short DMPAPER_LAST = DMPAPER_A3_EXTRA_TRANSVERSE;
+
+const short DMPAPER_USER = 256;
+
+
+// DEVMODE.dmDefaultSource
+enum : short {
+	DMBIN_ONLYONE = 1,
+	DMBIN_UPPER   = 1,
+	DMBIN_LOWER,
+	DMBIN_MIDDLE,
+	DMBIN_MANUAL,
+	DMBIN_ENVELOPE,
+	DMBIN_ENVMANUAL,
+	DMBIN_AUTO,
+	DMBIN_TRACTOR,
+	DMBIN_SMALLFMT,
+	DMBIN_LARGEFMT,
+	DMBIN_LARGECAPACITY, // = 11
+	DMBIN_CASSETTE   = 14,
+	DMBIN_FORMSOURCE,
+}
+short
+	DMBIN_FIRST = DMBIN_UPPER,
+	DMBIN_LAST = DMBIN_FORMSOURCE,
+	DMBIN_USER = 256;
+
+// DEVMODE.dmPrintQuality
+enum : short {
+	DMRES_DRAFT  = -1,
+	DMRES_LOW    = -2,
+	DMRES_MEDIUM = -3,
+	DMRES_HIGH   = -4
+}
+
+// DEVMODE.dmColor
+enum : short {
+	DMCOLOR_MONOCHROME = 1,
+	DMCOLOR_COLOR      = 2
+}
+
+// DEVMODE.dmDuplex
+enum : short {
+	DMDUP_SIMPLEX    = 1,
+	DMDUP_VERTICAL   = 2,
+	DMDUP_HORIZONTAL = 3
+}
+
+// DEVMODE.dmTTOption
+enum : short {
+	DMTT_BITMAP = 1,
+	DMTT_DOWNLOAD,
+	DMTT_SUBDEV,
+	DMTT_DOWNLOAD_OUTLINE
+}
+
+// DEVMODE.dmCollate
+enum : short {
+	DMCOLLATE_FALSE = 0,
+	DMCOLLATE_TRUE
+}
+
+static if (WINVER >= 0x0501) {
+	/* DEVMODE dmDisplayOrientation specifiations */
+	enum : short {
+		DMDO_DEFAULT = 0,
+		DMDO_90 = 1,
+		DMDO_180 = 2,
+		DMDO_270 = 3,
+	}
+
+	/* DEVMODE dmDisplayFixedOutput specifiations */
+	enum : short {
+		DMDFO_DEFAULT = 0,
+		DMDFO_STRETCH = 1,
+		DMDFO_CENTER = 2,
+	}
+}
+
+
+/* FIXME: this flags are deprecated ? */
+// DEVMODE.dmDisplayFlags
+const DWORD
+	DM_GRAYSCALE  = 1,
+	DM_INTERLACED = 2;
+
+const DWORD
+	DMDISPLAYFLAGS_TEXTMODE = 0x00000004;
+
+/* dmNup , multiple logical page per physical page options */
+const DWORD
+	DMNUP_SYSTEM = 1,
+	DMNUP_ONEUP = 2;
+
+// DEVMODE.dmFields
+const DWORD
+	DM_ORIENTATION        = 0x00000001,
+	DM_PAPERSIZE          = 0x00000002,
+	DM_PAPERLENGTH        = 0x00000004,
+	DM_PAPERWIDTH         = 0x00000008,
+	DM_SCALE              = 0x00000010;
+static if (WINVER >= 0x0500) {
+	const DWORD
+		DM_POSITION       = 0x00000020,
+		DM_NUP            = 0x00000040;
+}
+static if (WINVER >= 0x0501) {
+	const DWORD
+		DM_DISPLAYORIENTATION = 0x00000080;
+}
+const DWORD
+	DM_COPIES             = 0x00000100,
+	DM_DEFAULTSOURCE      = 0x00000200,
+	DM_PRINTQUALITY       = 0x00000400,
+	DM_COLOR              = 0x00000800,
+	DM_DUPLEX             = 0x00001000,
+	DM_YRESOLUTION        = 0x00002000,
+	DM_TTOPTION           = 0x00004000,
+	DM_COLLATE            = 0x00008000,
+	DM_FORMNAME           = 0x00010000,
+	DM_LOGPIXELS          = 0x00020000,
+	DM_BITSPERPEL         = 0x00040000,
+	DM_PELSWIDTH          = 0x00080000,
+	DM_PELSHEIGHT         = 0x00100000,
+	DM_DISPLAYFLAGS       = 0x00200000,
+	DM_DISPLAYFREQUENCY   = 0x00400000;
+static if (WINVER >= 0x0400) {
+	const DWORD
+		DM_ICMMETHOD      = 0x00800000,
+		DM_ICMINTENT      = 0x01000000,
+		DM_MEDIATYPE      = 0x02000000,
+		DM_DITHERTYPE     = 0x04000000,
+		DM_PANNINGWIDTH   = 0x08000000,
+		DM_PANNINGHEIGHT  = 0x10000000;
+}
+static if (WINVER >= 0x0501) {
+	const DWORD
+		DM_DISPLAYFIXEDOUTPUT = 0x20000000;
+}
+
+// DEVMODE.dmICMMethod
+enum : DWORD {
+	DMICMMETHOD_NONE   = 1,
+	DMICMMETHOD_SYSTEM = 2,
+	DMICMMETHOD_DRIVER = 3,
+	DMICMMETHOD_DEVICE = 4,
+	DMICMMETHOD_USER   = 256
+}
+
+// DEVMODE.dmICMIntent
+enum : DWORD {
+	DMICM_SATURATE    = 1,
+	DMICM_CONTRAST    = 2,
+	DMICM_COLORIMETRIC = 3,
+	DMICM_ABS_COLORIMETRIC = 4,
+	DMICM_USER        = 256
+}
+
+// DEVMODE.dmMediaType
+enum : DWORD {
+	DMMEDIA_STANDARD     = 1,
+	DMMEDIA_TRANSPARENCY = 2,
+	DMMEDIA_GLOSSY       = 3,
+	DMMEDIA_USER         = 256
+}
+
+// DEVMODE.dmDitherType
+enum : DWORD {
+	DMDITHER_NONE = 1,
+	DMDITHER_COARSE,
+	DMDITHER_FINE,
+	DMDITHER_LINEART,
+	DMDITHER_ERRORDIFFUSION,
+	DMDITHER_RESERVED6,
+	DMDITHER_RESERVED7,
+	DMDITHER_RESERVED8,
+	DMDITHER_RESERVED9,
+	DMDITHER_GRAYSCALE,
+	DMDITHER_USER = 256
+}
+
+// ----
+// DocumentProperties()
+const DWORD
+	DM_UPDATE      = 1,
+	DM_COPY        = 2,
+	DM_PROMPT      = 4,
+	DM_MODIFY      = 8,
+	DM_IN_BUFFER   = DM_MODIFY,
+	DM_IN_PROMPT   = DM_PROMPT,
+	DM_OUT_BUFFER  = DM_COPY,
+	DM_OUT_DEFAULT = DM_UPDATE;
+// ---
+
+const GDI_ERROR = 0xFFFFFFFF;
+const HGDI_ERROR= cast(HANDLE)GDI_ERROR;
+
+// TEXTMETRIC.tmPitchAndFamily
+const BYTE
+	TMPF_FIXED_PITCH = 1,
+	TMPF_VECTOR      = 2,
+	TMPF_TRUETYPE    = 4,
+	TMPF_DEVICE      = 8;
+
+// NEWTEXTMETRIC.ntmFlags
+const DWORD
+	NTM_ITALIC         = 0x00000001,
+	NTM_BOLD           = 0x00000020,
+	NTM_REGULAR        = 0x00000040,
+	NTM_NONNEGATIVE_AC = 0x00010000,
+	NTM_PS_OPENTYPE    = 0x00020000,
+	NTM_TT_OPENTYPE    = 0x00040000,
+	NTM_MULTIPLEMASTER = 0x00080000,
+	NTM_TYPE1          = 0x00100000,
+	NTM_DSIG           = 0x00200000;
+
+// ---
+const DWORD TT_POLYGON_TYPE = 24;
+
+// TTPOLYCURVE
+enum : WORD {
+	TT_PRIM_LINE    = 1,
+	TT_PRIM_QSPLINE = 2,
+	TT_PRIM_CSPLINE = 3,
+}
+// ---
+const FONTMAPPER_MAX = 10;
+const ENHMETA_STOCK_OBJECT = 0x80000000;
+const WGL_FONT_LINES = 0;
+const WGL_FONT_POLYGONS = 1;
+
+// ---
+// LAYERPLANEDESCRIPTOR.dwFlags
+const DWORD
+	LPD_DOUBLEBUFFER   = 1,
+	LPD_STEREO         = 2,
+	LPD_SUPPORT_GDI    = 16,
+	LPD_SUPPORT_OPENGL = 32,
+	LPD_SHARE_DEPTH    = 64,
+	LPD_SHARE_STENCIL  = 128,
+	LPD_SHARE_ACCUM    = 256,
+	LPD_SWAP_EXCHANGE  = 512,
+	LPD_SWAP_COPY      = 1024,
+	LPD_TRANSPARENT    = 4096;
+
+// LAYERPLANEDESCRIPTOR.iPixelType
+enum : BYTE {
+	LPD_TYPE_RGBA       = 0,
+	LPD_TYPE_COLORINDEX = 1
+}
+
+// ---
+
+// wglSwapLayerBuffers()
+const UINT
+	WGL_SWAP_MAIN_PLANE = 1,
+	WGL_SWAP_OVERLAY1   = 2,
+	WGL_SWAP_OVERLAY2   = 4,
+	WGL_SWAP_OVERLAY3   = 8,
+	WGL_SWAP_OVERLAY4   = 16,
+	WGL_SWAP_OVERLAY5   = 32,
+	WGL_SWAP_OVERLAY6   = 64,
+	WGL_SWAP_OVERLAY7   = 128,
+	WGL_SWAP_OVERLAY8   = 256,
+	WGL_SWAP_OVERLAY9   = 512,
+	WGL_SWAP_OVERLAY10  = 1024,
+	WGL_SWAP_OVERLAY11  = 2048,
+	WGL_SWAP_OVERLAY12  = 4096,
+	WGL_SWAP_OVERLAY13  = 8192,
+	WGL_SWAP_OVERLAY14  = 16384,
+	WGL_SWAP_OVERLAY15  = 32768,
+	WGL_SWAP_UNDERLAY1  = 65536,
+	WGL_SWAP_UNDERLAY2  = 0x20000,
+	WGL_SWAP_UNDERLAY3  = 0x40000,
+	WGL_SWAP_UNDERLAY4  = 0x80000,
+	WGL_SWAP_UNDERLAY5  = 0x100000,
+	WGL_SWAP_UNDERLAY6  = 0x200000,
+	WGL_SWAP_UNDERLAY7  = 0x400000,
+	WGL_SWAP_UNDERLAY8  = 0x800000,
+	WGL_SWAP_UNDERLAY9  = 0x1000000,
+	WGL_SWAP_UNDERLAY10 = 0x2000000,
+	WGL_SWAP_UNDERLAY11 = 0x4000000,
+	WGL_SWAP_UNDERLAY12 = 0x8000000,
+	WGL_SWAP_UNDERLAY13 = 0x10000000,
+	WGL_SWAP_UNDERLAY14 = 0x20000000,
+	WGL_SWAP_UNDERLAY15 = 0x40000000;
+
+const AC_SRC_OVER  = 0x00;
+const AC_SRC_ALPHA = 0x01;
+
+// ???
+const AC_SRC_NO_PREMULT_ALPHA = 0x01;
+const AC_SRC_NO_ALPHA         = 0x02;
+const AC_DST_NO_PREMULT_ALPHA = 0x10;
+const AC_DST_NO_ALPHA         = 0x20;
+
+const LAYOUT_RTL = 1;
+const LAYOUT_BTT = 2;
+const LAYOUT_VBH = 4;
+const LAYOUT_BITMAPORIENTATIONPRESERVED = 8;
+
+static if (WINVER > 0x0400) {
+	const CS_ENABLE = 0x00000001;
+	const CS_DISABLE = 0x00000002;
+	const CS_DELETE_TRANSFORM = 0x00000003;
+}
+static if (WINVER > 0x0500) {
+	const GRADIENT_FILL_RECT_H=0x00;
+	const GRADIENT_FILL_RECT_V=0x01;
+	const GRADIENT_FILL_TRIANGLE=0x02;
+	const GRADIENT_FILL_OP_FLAG=0xff;
+	const COLORMATCHTOTARGET_EMBEDED=0x00000001;
+	const CREATECOLORSPACE_EMBEDED=0x00000001;
+	const SETICMPROFILE_EMBEDED=0x00000001;
+}
+
+// DISPLAY_DEVICE.StateFlags
+const DWORD
+	DISPLAY_DEVICE_ATTACHED_TO_DESKTOP = 0x00000001,
+	DISPLAY_DEVICE_MULTI_DRIVER        = 0x00000002,
+	DISPLAY_DEVICE_PRIMARY_DEVICE      = 0x00000004,
+	DISPLAY_DEVICE_MIRRORING_DRIVER    = 0x00000008,
+	DISPLAY_DEVICE_VGA_COMPATIBLE      = 0x00000010,
+	DISPLAY_DEVICE_REMOVABLE           = 0x00000020,
+	DISPLAY_DEVICE_DISCONNECT          = 0x02000000,
+	DISPLAY_DEVICE_REMOTE              = 0x04000000,
+	DISPLAY_DEVICE_MODESPRUNED         = 0x08000000;
+
+/* Child device state */
+const DWORD
+	DISPLAY_DEVICE_ACTIVE = 0x00000001,
+	DISPLAY_DEVICE_ATTACHED = 0x00000002;
+
+static if (_WIN32_WINNT >= 0x0500) {
+	const GGI_MARK_NONEXISTING_GLYPHS = 1;
+}
+
+// ----------
+//   STRUCTS
+// ----------
+
+struct ABC {
+	int  abcA;
+	UINT abcB;
+	int  abcC;
+}
+alias ABC* PABC, NPABC, LPABC;
+
+struct ABCFLOAT {
+	FLOAT abcfA;
+	FLOAT abcfB;
+	FLOAT abcfC;
+}
+alias ABCFLOAT* PABCFLOAT, NPABCFLOAT, LPABCFLOAT;
+
+struct BITMAP {
+	LONG   bmType;
+	LONG   bmWidth;
+	LONG   bmHeight;
+	LONG   bmWidthBytes;
+	WORD   bmPlanes;
+	WORD   bmBitsPixel;
+	LPVOID bmBits;
+}
+alias BITMAP* PBITMAP, NPBITMAP, LPBITMAP;
+
+struct BITMAPCOREHEADER {
+	DWORD bcSize;
+	WORD  bcWidth;
+	WORD  bcHeight;
+	WORD  bcPlanes;
+	WORD  bcBitCount;
+}
+alias BITMAPCOREHEADER* PBITMAPCOREHEADER, LPBITMAPCOREHEADER;
+
+align(1):
+struct RGBTRIPLE {
+	BYTE rgbtBlue;
+	BYTE rgbtGreen;
+	BYTE rgbtRed;
+}
+alias RGBTRIPLE* LPRGBTRIPLE;
+
+align(2):
+struct BITMAPFILEHEADER {
+	WORD  bfType;
+	DWORD bfSize;
+	WORD  bfReserved1;
+	WORD  bfReserved2;
+	DWORD bfOffBits;
+}
+alias BITMAPFILEHEADER* LPBITMAPFILEHEADER, PBITMAPFILEHEADER;
+
+align:
+
+struct BITMAPCOREINFO {
+	BITMAPCOREHEADER bmciHeader;
+	RGBTRIPLE[1]     bmciColors;
+}
+alias BITMAPCOREINFO* LPBITMAPCOREINFO, PBITMAPCOREINFO;
+
+struct BITMAPINFOHEADER {
+	DWORD biSize;
+	LONG  biWidth;
+	LONG  biHeight;
+	WORD  biPlanes;
+	WORD  biBitCount;
+	DWORD biCompression;
+	DWORD biSizeImage;
+	LONG  biXPelsPerMeter;
+	LONG  biYPelsPerMeter;
+	DWORD biClrUsed;
+	DWORD biClrImportant;
+}
+
+alias BITMAPINFOHEADER* LPBITMAPINFOHEADER, PBITMAPINFOHEADER;
+
+struct RGBQUAD {
+	BYTE rgbBlue;
+	BYTE rgbGreen;
+	BYTE rgbRed;
+	BYTE rgbReserved;
+};
+alias RGBQUAD* LPRGBQUAD;
+
+struct BITMAPINFO {
+	BITMAPINFOHEADER bmiHeader;
+	RGBQUAD[1]       bmiColors;
+};
+alias BITMAPINFO* PBITMAPINFO, LPBITMAPINFO;
+
+alias int FXPT16DOT16;
+alias int* LPFXPT16DOT16;
+alias int FXPT2DOT30;
+alias int* LPFXPT2DOT30;
+
+struct CIEXYZ {
+	FXPT2DOT30 ciexyzX;
+	FXPT2DOT30 ciexyzY;
+	FXPT2DOT30 ciexyzZ;
+}
+alias CIEXYZ* LPCIEXYZ;
+
+struct CIEXYZTRIPLE {
+	CIEXYZ ciexyzRed;
+	CIEXYZ ciexyzGreen;
+	CIEXYZ ciexyzBlue;
+}
+alias CIEXYZTRIPLE* LPCIEXYZTRIPLE;
+
+struct BITMAPV4HEADER {
+	DWORD        bV4Size;
+	LONG         bV4Width;
+	LONG         bV4Height;
+	WORD         bV4Planes;
+	WORD         bV4BitCount;
+	DWORD        bV4V4Compression;
+	DWORD        bV4SizeImage;
+	LONG         bV4XPelsPerMeter;
+	LONG         bV4YPelsPerMeter;
+	DWORD        bV4ClrUsed;
+	DWORD        bV4ClrImportant;
+	DWORD        bV4RedMask;
+	DWORD        bV4GreenMask;
+	DWORD        bV4BlueMask;
+	DWORD        bV4AlphaMask;
+	DWORD        bV4CSType;
+	CIEXYZTRIPLE bV4Endpoints;
+	DWORD        bV4GammaRed;
+	DWORD        bV4GammaGreen;
+	DWORD        bV4GammaBlue;
+}
+alias BITMAPV4HEADER* LPBITMAPV4HEADER, PBITMAPV4HEADER;
+
+struct BITMAPV5HEADER {
+	DWORD bV5Size;
+	LONG bV5Width;
+	LONG bV5Height;
+	WORD bV5Planes;
+	WORD bV5BitCount;
+	DWORD bV5Compression;
+	DWORD bV5SizeImage;
+	LONG bV5XPelsPerMeter;
+	LONG bV5YPelsPerMeter;
+	DWORD bV5ClrUsed;
+	DWORD bV5ClrImportant;
+	DWORD bV5RedMask;
+	DWORD bV5GreenMask;
+	DWORD bV5BlueMask;
+	DWORD bV5AlphaMask;
+	DWORD bV5CSType;
+	CIEXYZTRIPLE bV5Endpoints;
+	DWORD bV5GammaRed;
+	DWORD bV5GammaGreen;
+	DWORD bV5GammaBlue;
+	DWORD bV5Intent;
+	DWORD bV5ProfileData;
+	DWORD bV5ProfileSize;
+	DWORD bV5Reserved;
+}
+alias BITMAPV5HEADER* LPBITMAPV5HEADER, PBITMAPV5HEADER;
+
+struct FONTSIGNATURE {
+	DWORD[4] fsUsb;
+	DWORD[2] fsCsb;
+}
+alias FONTSIGNATURE* PFONTSIGNATURE, LPFONTSIGNATURE;
+
+struct CHARSETINFO {
+	UINT ciCharset;
+	UINT ciACP;
+	FONTSIGNATURE fs;
+}
+alias CHARSETINFO* PCHARSETINFO, NPCHARSETINFO, LPCHARSETINFO;
+
+struct COLORADJUSTMENT {
+	WORD  caSize;
+	WORD  caFlags;
+	WORD  caIlluminantIndex;
+	WORD  caRedGamma;
+	WORD  caGreenGamma;
+	WORD  caBlueGamma;
+	WORD  caReferenceBlack;
+	WORD  caReferenceWhite;
+	SHORT caContrast;
+	SHORT caBrightness;
+	SHORT caColorfulness;
+	SHORT caRedGreenTint;
+}
+alias COLORADJUSTMENT* PCOLORADJUSTMENT, LPCOLORADJUSTMENT;
+
+struct DEVMODEA {
+	BYTE[CCHDEVICENAME] dmDeviceName;
+	WORD   dmSpecVersion;
+	WORD   dmDriverVersion;
+	WORD   dmSize;
+	WORD   dmDriverExtra;
+	DWORD  dmFields;
+	union {
+		struct {
+			short dmOrientation;
+			short dmPaperSize;
+			short dmPaperLength;
+			short dmPaperWidth;
+			short dmScale;
+			short dmCopies;
+			short dmDefaultSource;
+			short dmPrintQuality;
+		}
+		POINTL dmPosition;
+		DWORD  dmDisplayOrientation;
+		DWORD  dmDisplayFixedOutput;
+	}
+	short  dmColor;
+	short  dmDuplex;
+	short  dmYResolution;
+	short  dmTTOption;
+	short  dmCollate;
+	BYTE[CCHFORMNAME]   dmFormName;
+	WORD   dmLogPixels;
+	DWORD  dmBitsPerPel;
+	DWORD  dmPelsWidth;
+	DWORD  dmPelsHeight;
+	union {
+		DWORD  dmDisplayFlags;
+		DWORD  dmNup;
+	}
+	DWORD  dmDisplayFrequency;
+	static if (WINVER >= 0x0400) {
+		DWORD  dmICMMethod;
+		DWORD  dmICMIntent;
+		DWORD  dmMediaType;
+		DWORD  dmDitherType;
+		DWORD  dmReserved1;
+		DWORD  dmReserved2;
+		static if ((WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400)) {
+			DWORD  dmPanningWidth;
+			DWORD  dmPanningHeight;
+		}
+	}
+}
+alias DEVMODEA* PDEVMODEA, NPDEVMODEA, LPDEVMODEA;
+
+struct DEVMODEW {
+	WCHAR[CCHDEVICENAME]   dmDeviceName;
+	WORD   dmSpecVersion;
+	WORD   dmDriverVersion;
+	WORD   dmSize;
+	WORD   dmDriverExtra;
+	DWORD  dmFields;
+	union {
+		struct {
+			short dmOrientation;
+			short dmPaperSize;
+			short dmPaperLength;
+			short dmPaperWidth;
+			short dmScale;
+			short dmCopies;
+			short dmDefaultSource;
+			short dmPrintQuality;
+		}
+		POINTL dmPosition;
+		DWORD  dmDisplayOrientation;
+		DWORD  dmDisplayFixedOutput;
+	}
+
+	short  dmColor;
+	short  dmDuplex;
+	short  dmYResolution;
+	short  dmTTOption;
+	short  dmCollate;
+	WCHAR[CCHFORMNAME]  dmFormName;
+	WORD   dmLogPixels;
+	DWORD  dmBitsPerPel;
+	DWORD  dmPelsWidth;
+	DWORD  dmPelsHeight;
+	union {
+		DWORD  dmDisplayFlags;
+		DWORD  dmNup;
+	}
+	DWORD  dmDisplayFrequency;
+	static if (WINVER >= 0x0400) {
+		DWORD  dmICMMethod;
+		DWORD  dmICMIntent;
+		DWORD  dmMediaType;
+		DWORD  dmDitherType;
+		DWORD  dmReserved1;
+		DWORD  dmReserved2;
+		static if ((WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400)) {
+			DWORD  dmPanningWidth;
+			DWORD  dmPanningHeight;
+		}
+	}
+}
+alias DEVMODEW* PDEVMODEW, NPDEVMODEW, LPDEVMODEW;
+
+/*
+ * Information about output options
+ */
+struct PSFEATURE_OUTPUT {
+	BOOL bPageIndependent;
+	BOOL bSetPageDevice;
+}
+alias PSFEATURE_OUTPUT* PPSFEATURE_OUTPUT;
+
+/*
+ * Information about custom paper size
+ */
+struct PSFEATURE_CUSTPAPER {
+	LONG lOrientation;
+	LONG lWidth;
+	LONG lHeight;
+	LONG lWidthOffset;
+	LONG lHeightOffset;
+}
+alias PSFEATURE_CUSTPAPER* PPSFEATURE_CUSTPAPER;
+
+struct DIBSECTION {
+	BITMAP           dsBm;
+	BITMAPINFOHEADER dsBmih;
+	DWORD[3]         dsBitfields;
+	HANDLE           dshSection;
+	DWORD            dsOffset;
+}
+alias DIBSECTION* PDIBSECTION;
+
+struct DOCINFOA {
+	int    cbSize = DOCINFOA.sizeof;
+	LPCSTR lpszDocName;
+	LPCSTR lpszOutput;
+	LPCSTR lpszDatatype;
+	DWORD  fwType;
+}
+alias DOCINFOA* LPDOCINFOA;
+
+struct DOCINFOW {
+	int     cbSize = DOCINFOW.sizeof;
+	LPCWSTR lpszDocName;
+	LPCWSTR lpszOutput;
+	LPCWSTR lpszDatatype;
+	DWORD   fwType;
+}
+alias DOCINFOW* LPDOCINFOW;
+
+
+struct PANOSE {
+	BYTE bFamilyType;
+	BYTE bSerifStyle;
+	BYTE bWeight;
+	BYTE bProportion;
+	BYTE bContrast;
+	BYTE bStrokeVariation;
+	BYTE bArmStyle;
+	BYTE bLetterform;
+	BYTE bMidline;
+	BYTE bXHeight;
+}
+alias PANOSE* LPPANOSE;
+
+struct LOGFONTA {
+	LONG lfHeight;
+	LONG lfWidth;
+	LONG lfEscapement;
+	LONG lfOrientation;
+	LONG lfWeight;
+	BYTE lfItalic;
+	BYTE lfUnderline;
+	BYTE lfStrikeOut;
+	BYTE lfCharSet;
+	BYTE lfOutPrecision;
+	BYTE lfClipPrecision;
+	BYTE lfQuality;
+	BYTE lfPitchAndFamily;
+	CHAR[LF_FACESIZE] lfFaceName;
+}
+alias LOGFONTA* PLOGFONTA, NPLOGFONTA, LPLOGFONTA;
+
+struct LOGFONTW {
+	LONG lfHeight;
+	LONG lfWidth;
+	LONG lfEscapement;
+	LONG lfOrientation;
+	LONG lfWeight;
+	BYTE lfItalic;
+	BYTE lfUnderline;
+	BYTE lfStrikeOut;
+	BYTE lfCharSet;
+	BYTE lfOutPrecision;
+	BYTE lfClipPrecision;
+	BYTE lfQuality;
+	BYTE lfPitchAndFamily;
+	WCHAR[LF_FACESIZE] lfFaceName;
+}
+alias LOGFONTW* PLOGFONTW, NPLOGFONTW, LPLOGFONTW;
+
+struct EXTLOGFONTA {
+	LOGFONTA              elfLogFont;
+	BYTE[LF_FULLFACESIZE] elfFullName;
+	BYTE[LF_FACESIZE]     elfStyle;
+	DWORD                 elfVersion;
+	DWORD                 elfStyleSize;
+	DWORD                 elfMatch;
+	DWORD                 elfReserved;
+	BYTE[ELF_VENDOR_SIZE] elfVendorId;
+	DWORD                 elfCulture;
+	PANOSE                elfPanose;
+}
+alias EXTLOGFONTA* PEXTLOGFONTA, NPEXTLOGFONTA, LPEXTLOGFONTA;
+
+struct EXTLOGFONTW {
+	LOGFONTW               elfLogFont;
+	WCHAR[LF_FULLFACESIZE] elfFullName;
+	WCHAR[LF_FACESIZE]     elfStyle;
+	DWORD                  elfVersion;
+	DWORD                  elfStyleSize;
+	DWORD                  elfMatch;
+	DWORD                  elfReserved;
+	BYTE[ELF_VENDOR_SIZE]  elfVendorId;
+	DWORD                  elfCulture;
+	PANOSE                 elfPanose;
+}
+alias EXTLOGFONTW* PEXTLOGFONTW, NPEXTLOGFONTW, LPEXTLOGFONTW;
+
+struct LOGPEN {
+	UINT     lopnStyle;
+	POINT    lopnWidth;
+	COLORREF lopnColor;
+}
+alias LOGPEN* PLOGPEN, NPLOGPEN, LPLOGPEN;
+
+// ---------------------- EMR ------------
+
+struct EMR {
+	DWORD iType;
+	DWORD nSize;
+}
+alias EMR* PEMR;
+
+struct EMRANGLEARC {
+	EMR    emr;
+	POINTL ptlCenter;
+	DWORD  nRadius;
+	FLOAT  eStartAngle;
+	FLOAT  eSweepAngle;
+}
+alias EMRANGLEARC* PEMRANGLEARC;
+
+struct EMRARC {
+	EMR    emr;
+	RECTL  rclBox;
+	POINTL ptlStart;
+	POINTL ptlEnd;
+}
+alias EMRARC* PEMRARC;
+typedef EMRARC EMRARCTO;
+alias EMRARCTO* PEMRARCTO;
+typedef EMRARC EMRCHORD;
+alias EMRCHORD* PEMRCHORD;
+typedef EMRARC EMRPIE;
+alias EMRPIE* PEMRPIE;
+
+struct XFORM {
+	FLOAT eM11;
+	FLOAT eM12;
+	FLOAT eM21;
+	FLOAT eM22;
+	FLOAT eDx;
+	FLOAT eDy;
+}
+alias XFORM* PXFORM, LPXFORM;
+
+struct EMRBITBLT {
+	EMR      emr;
+	RECTL    rclBounds;
+	LONG     xDest;
+	LONG     yDest;
+	LONG     cxDest;
+	LONG     cyDest;
+	DWORD    dwRop;
+	LONG     xSrc;
+	LONG     ySrc;
+	XFORM    xformSrc;
+	COLORREF crBkColorSrc;
+	DWORD    iUsageSrc;
+	DWORD    offBmiSrc;
+	DWORD    cbBmiSrc;
+	DWORD    offBitsSrc;
+	DWORD    cbBitsSrc;
+}
+alias EMRBITBLT* PEMRBITBLT;
+
+struct LOGBRUSH {
+	UINT     lbStyle;
+	COLORREF lbColor;
+	LONG     lbHatch;
+}
+typedef LOGBRUSH PATTERN;
+alias LOGBRUSH* PLOGBRUSH, NPLOGBRUSH, LPLOGBRUSH;
+alias PATTERN* PPATTERN, NPPATTERN, LPPATTERN;
+
+struct LOGBRUSH32 {
+	UINT lbStyle;
+	COLORREF lbColor;
+	ULONG lbHatch;
+}
+alias LOGBRUSH32* PLOGBRUSH32, NPLOGBRUSH32, LPLOGBRUSH32;
+
+struct EMRCREATEBRUSHINDIRECT {
+	EMR      emr;
+	DWORD    ihBrush;
+	LOGBRUSH32 lb;
+}
+alias EMRCREATEBRUSHINDIRECT* PEMRCREATEBRUSHINDIRECT;
+
+alias LONG LCSCSTYPE, LCSGAMUTMATCH;
+
+struct LOGCOLORSPACEA {
+	DWORD lcsSignature;
+	DWORD lcsVersion;
+	DWORD lcsSize;
+	LCSCSTYPE lcsCSType;
+	LCSGAMUTMATCH lcsIntent;
+	CIEXYZTRIPLE lcsEndpoints;
+	DWORD lcsGammaRed;
+	DWORD lcsGammaGreen;
+	DWORD lcsGammaBlue;
+	CHAR[MAX_PATH] lcsFilename;
+}
+alias LOGCOLORSPACEA* LPLOGCOLORSPACEA;
+
+struct LOGCOLORSPACEW {
+	DWORD lcsSignature;
+	DWORD lcsVersion;
+	DWORD lcsSize;
+	LCSCSTYPE lcsCSType;
+	LCSGAMUTMATCH lcsIntent;
+	CIEXYZTRIPLE lcsEndpoints;
+	DWORD lcsGammaRed;
+	DWORD lcsGammaGreen;
+	DWORD lcsGammaBlue;
+	WCHAR[MAX_PATH] lcsFilename;
+}
+alias LOGCOLORSPACEW* LPLOGCOLORSPACEW;
+
+alias USHORT COLOR16;
+struct TRIVERTEX {
+	LONG x;
+	LONG y;
+	COLOR16 Red;
+	COLOR16 Green;
+	COLOR16 Blue;
+	COLOR16 Alpha;
+}
+alias TRIVERTEX* PTRIVERTEX, LPTRIVERTEX;
+
+static if (WINVER >= 0x0400) {
+
+	struct EMRGLSRECORD {
+		EMR emr;
+		DWORD cbData;
+		BYTE[1] Data;
+	}
+	alias EMRGLSRECORD* PEMRGLSRECORD;
+
+	struct EMRGLSBOUNDEDRECORD {
+		EMR emr;
+		RECTL rclBounds;
+		DWORD cbData;
+		BYTE[1] Data;
+	}
+	alias EMRGLSBOUNDEDRECORD* PEMRGLSBOUNDEDRECORD;
+
+	struct EMRPIXELFORMAT {
+		EMR emr;
+		PIXELFORMATDESCRIPTOR pfd;
+	}
+	alias EMRPIXELFORMAT* PEMRPIXELFORMAT;
+
+	struct EMRCREATECOLORSPACE {
+		EMR emr;
+		DWORD ihCS;
+		LOGCOLORSPACE lcs;
+	}
+	alias EMRCREATECOLORSPACE* PEMRCREATECOLORSPACE;
+
+	struct EMRSETCOLORSPACE {
+		EMR emr;
+		DWORD ihCS;
+	}
+	alias EMRSETCOLORSPACE* PEMRSETCOLORSPACE;
+	typedef EMRSETCOLORSPACE EMRSELECTCOLORSPACE;
+	alias EMRSELECTCOLORSPACE* PEMRSELECTCOLORSPACE;
+	typedef EMRSETCOLORSPACE EMRDELETECOLORSPACE;
+	alias EMRDELETECOLORSPACE* PEMRDELETECOLORSPACE;
+}
+
+static if (WINVER >= 0x0500) {
+
+	struct EMREXTESCAPE {
+		EMR emr;
+		INT iEscape;
+		INT cbEscData;
+		BYTE[1] EscData;
+	}
+	alias EMREXTESCAPE* PEMREXTESCAPE;
+	typedef EMREXTESCAPE EMRDRAWESCAPE;
+	alias EMRDRAWESCAPE* PEMRDRAWESCAPE;
+
+	struct EMRNAMEDESCAPE {
+		EMR emr;
+		INT iEscape;
+		INT cbDriver;
+		INT cbEscData;
+		BYTE[1] EscData;
+	}
+	alias EMRNAMEDESCAPE* PEMRNAMEDESCAPE;
+
+	struct EMRSETICMPROFILE {
+		EMR emr;
+		DWORD dwFlags;
+		DWORD cbName;
+		DWORD cbData;
+		BYTE[1] Data;
+	}
+	alias EMRSETICMPROFILE* PEMRSETICMPROFILE;
+	typedef EMRSETICMPROFILE EMRSETICMPROFILEA;
+	alias EMRSETICMPROFILEA* PEMRSETICMPROFILEA;
+	typedef EMRSETICMPROFILE EMRSETICMPROFILEW;
+	alias EMRSETICMPROFILEW* PEMRSETICMPROFILEW;
+
+	struct EMRCREATECOLORSPACEW {
+		EMR emr;
+		DWORD ihCS;
+		LOGCOLORSPACEW lcs;
+		DWORD dwFlags;
+		DWORD cbData;
+		BYTE[1] Data;
+	}
+	alias EMRCREATECOLORSPACEW* PEMRCREATECOLORSPACEW;
+
+	struct EMRCOLORMATCHTOTARGET {
+		EMR emr;
+		DWORD dwAction;
+		DWORD dwFlags;
+		DWORD cbName;
+		DWORD cbData;
+		BYTE[1] Data;
+	}
+	alias EMRCOLORMATCHTOTARGET* PEMRCOLORMATCHTOTARGET;
+
+	struct EMRCOLORCORRECTPALETTE {
+		EMR emr;
+		DWORD ihPalette;
+		DWORD nFirstEntry;
+		DWORD nPalEntries;
+		DWORD nReserved;
+	}
+	alias EMRCOLORCORRECTPALETTE* PEMRCOLORCORRECTPALETTE;
+
+	struct EMRALPHABLEND {
+		EMR emr;
+		RECTL rclBounds;
+		LONG xDest;
+		LONG yDest;
+		LONG cxDest;
+		LONG cyDest;
+		DWORD dwRop;
+		LONG xSrc;
+		LONG ySrc;
+		XFORM xformSrc;
+		COLORREF crBkColorSrc;
+		DWORD iUsageSrc;
+		DWORD offBmiSrc;
+		DWORD cbBmiSrc;
+		DWORD offBitsSrc;
+		DWORD cbBitsSrc;
+		LONG cxSrc;
+		LONG cySrc;
+	}
+	alias EMRALPHABLEND* PEMRALPHABLEND;
+
+	struct EMRGRADIENTFILL {
+		EMR emr;
+		RECTL rclBounds;
+		DWORD nVer;
+		DWORD nTri;
+		ULONG ulMode;
+		TRIVERTEX[1] Ver;
+	}
+	alias EMRGRADIENTFILL* PEMRGRADIENTFILL;
+
+	struct EMRTRANSPARENTBLT {
+		EMR emr;
+		RECTL rclBounds;
+		LONG xDest;
+		LONG yDest;
+		LONG cxDest;
+		LONG cyDest;
+		DWORD dwRop;
+		LONG xSrc;
+		LONG ySrc;
+		XFORM xformSrc;
+		COLORREF crBkColorSrc;
+		DWORD iUsageSrc;
+		DWORD offBmiSrc;
+		DWORD cbBmiSrc;
+		DWORD offBitsSrc;
+		DWORD cbBitsSrc;
+		LONG cxSrc;
+		LONG cySrc;
+	}
+	alias EMRTRANSPARENTBLT* PEMRTRANSPARENTBLT;
+}
+
+struct EMRCREATEDIBPATTERNBRUSHPT {
+	EMR emr;
+	DWORD ihBrush;
+	DWORD iUsage;
+	DWORD offBmi;
+	DWORD cbBmi;
+	DWORD offBits;
+	DWORD cbBits;
+}
+alias EMRCREATEDIBPATTERNBRUSHPT* PEMRCREATEDIBPATTERNBRUSHPT;
+
+struct EMRCREATEMONOBRUSH {
+	EMR emr;
+	DWORD ihBrush;
+	DWORD iUsage;
+	DWORD offBmi;
+	DWORD cbBmi;
+	DWORD offBits;
+	DWORD cbBits;
+}
+alias EMRCREATEMONOBRUSH* PEMRCREATEMONOBRUSH;
+
+struct PALETTEENTRY {
+	BYTE peRed;
+	BYTE peGreen;
+	BYTE peBlue;
+	BYTE peFlags;
+}
+alias PALETTEENTRY* PPALETTEENTRY, LPPALETTEENTRY;
+
+struct LOGPALETTE {
+	WORD palVersion;
+	WORD palNumEntries;
+	PALETTEENTRY[1] palPalEntry;
+}
+alias LOGPALETTE* PLOGPALETTE, NPLOGPALETTE, LPLOGPALETTE;
+
+struct EMRCREATEPALETTE {
+	EMR emr;
+	DWORD ihPal;
+	LOGPALETTE lgpl;
+}
+alias EMRCREATEPALETTE* PEMRCREATEPALETTE;
+
+struct EMRCREATEPEN {
+	EMR emr;
+	DWORD ihPen;
+	LOGPEN lopn;
+}
+alias EMRCREATEPEN* PEMRCREATEPEN;
+
+struct EMRELLIPSE {
+	EMR emr;
+	RECTL rclBox;
+}
+alias EMRELLIPSE* PEMRELLIPSE;
+
+typedef EMRELLIPSE EMRRECTANGLE;
+alias EMRRECTANGLE* PEMRRECTANGLE;
+
+struct EMREOF {
+	EMR emr;
+	DWORD nPalEntries;
+	DWORD offPalEntries;
+	DWORD nSizeLast;
+}
+alias EMREOF* PEMREOF;
+
+struct EMREXCLUDECLIPRECT {
+	EMR emr;
+	RECTL rclClip;
+}
+alias EMREXCLUDECLIPRECT* PEMREXCLUDECLIPRECT;
+typedef EMREXCLUDECLIPRECT EMRINTERSECTCLIPRECT;
+alias EMRINTERSECTCLIPRECT* PEMRINTERSECTCLIPRECT;
+
+struct EMREXTCREATEFONTINDIRECTW {
+	EMR emr;
+	DWORD ihFont;
+	EXTLOGFONTW elfw;
+}
+alias EMREXTCREATEFONTINDIRECTW* PEMREXTCREATEFONTINDIRECTW;
+
+struct EXTLOGPEN {
+	UINT elpPenStyle;
+	UINT elpWidth;
+	UINT elpBrushStyle;
+	COLORREF elpColor;
+	LONG elpHatch;
+	DWORD elpNumEntries;
+	DWORD[1] elpStyleEntry;
+}
+alias EXTLOGPEN* PEXTLOGPEN, NPEXTLOGPEN, LPEXTLOGPEN;
+
+struct EMREXTCREATEPEN {
+	EMR emr;
+	DWORD ihPen;
+	DWORD offBmi;
+	DWORD cbBmi;
+	DWORD offBits;
+	DWORD cbBits;
+	EXTLOGPEN elp;
+}
+alias EMREXTCREATEPEN* PEMREXTCREATEPEN;
+
+struct EMREXTFLOODFILL {
+	EMR emr;
+	POINTL ptlStart;
+	COLORREF crColor;
+	DWORD iMode;
+}
+alias EMREXTFLOODFILL* PEMREXTFLOODFILL;
+
+struct EMREXTSELECTCLIPRGN {
+	EMR emr;
+	DWORD cbRgnData;
+	DWORD iMode;
+	BYTE [1]RgnData;
+}
+alias EMREXTSELECTCLIPRGN* PEMREXTSELECTCLIPRGN;
+
+struct EMRTEXT {
+	POINTL ptlReference;
+	DWORD nChars;
+	DWORD offString;
+	DWORD fOptions;
+	RECTL rcl;
+	DWORD offDx;
+}
+alias EMRTEXT* PEMRTEXT;
+
+struct EMREXTTEXTOUTA {
+	EMR emr;
+	RECTL rclBounds;
+	DWORD iGraphicsMode;
+	FLOAT exScale;
+	FLOAT eyScale;
+	EMRTEXT emrtext;
+}
+alias EMREXTTEXTOUTA* PEMREXTTEXTOUTA;
+typedef EMREXTTEXTOUTA EMREXTTEXTOUTW;
+alias EMREXTTEXTOUTW* PEMREXTTEXTOUTW;
+
+struct EMRFILLPATH {
+	EMR emr;
+	RECTL rclBounds;
+}
+alias EMRFILLPATH* PEMRFILLPATH;
+
+typedef EMRFILLPATH EMRSTROKEANDFILLPATH;
+alias EMRSTROKEANDFILLPATH* PEMRSTROKEANDFILLPATH;
+
+typedef EMRFILLPATH EMRSTROKEPATH;
+alias EMRSTROKEPATH* PEMRSTROKEPATH;
+
+struct EMRFILLRGN {
+	EMR emr;
+	RECTL rclBounds;
+	DWORD cbRgnData;
+	DWORD ihBrush;
+	BYTE[1] RgnData;
+}
+alias EMRFILLRGN* PEMRFILLRGN;
+
+struct EMRFORMAT {
+	DWORD dSignature;
+	DWORD nVersion;
+	DWORD cbData;
+	DWORD offData;
+}
+alias EMRFORMAT* PEMRFORMAT;
+
+struct EMRFRAMERGN {
+	EMR emr;
+	RECTL rclBounds;
+	DWORD cbRgnData;
+	DWORD ihBrush;
+	SIZEL szlStroke;
+	BYTE[1] RgnData;
+}
+alias EMRFRAMERGN* PEMRFRAMERGN;
+
+struct EMRGDICOMMENT {
+	EMR emr;
+	DWORD cbData;
+	BYTE[1] Data;
+}
+alias EMRGDICOMMENT* PEMRGDICOMMENT;
+
+struct EMRINVERTRGN {
+	EMR emr;
+	RECTL rclBounds;
+	DWORD cbRgnData;
+	BYTE[1] RgnData;
+}
+alias EMRINVERTRGN* PEMRINVERTRGN;
+typedef EMRINVERTRGN EMRPAINTRGN;
+alias EMRPAINTRGN* PEMRPAINTRGN;
+
+struct EMRLINETO {
+	EMR emr;
+	POINTL ptl;
+}
+alias EMRLINETO* PEMRLINETO;
+typedef EMRLINETO EMRMOVETOEX;
+alias EMRMOVETOEX* PEMRMOVETOEX;
+
+struct EMRMASKBLT {
+	EMR emr;
+	RECTL rclBounds;
+	LONG xDest;
+	LONG yDest;
+	LONG cxDest;
+	LONG cyDest;
+	DWORD dwRop;
+	LONG xSrc;
+	LONG ySrc;
+	XFORM xformSrc;
+	COLORREF crBkColorSrc;
+	DWORD iUsageSrc;
+	DWORD offBmiSrc;
+	DWORD cbBmiSrc;
+	DWORD offBitsSrc;
+	DWORD cbBitsSrc;
+	LONG xMask;
+	LONG yMask;
+	DWORD iUsageMask;
+	DWORD offBmiMask;
+	DWORD cbBmiMask;
+	DWORD offBitsMask;
+	DWORD cbBitsMask;
+}
+alias EMRMASKBLT* PEMRMASKBLT;
+
+struct EMRMODIFYWORLDTRANSFORM {
+	EMR emr;
+	XFORM xform;
+	DWORD iMode;
+}
+alias EMRMODIFYWORLDTRANSFORM* PEMRMODIFYWORLDTRANSFORM;
+
+struct EMROFFSETCLIPRGN {
+	EMR emr;
+	POINTL ptlOffset;
+}
+alias EMROFFSETCLIPRGN* PEMROFFSETCLIPRGN;
+
+struct EMRPLGBLT {
+	EMR emr;
+	RECTL rclBounds;
+	POINTL[3] aptlDest;
+	LONG xSrc;
+	LONG ySrc;
+	LONG cxSrc;
+	LONG cySrc;
+	XFORM xformSrc;
+	COLORREF crBkColorSrc;
+	DWORD iUsageSrc;
+	DWORD offBmiSrc;
+	DWORD cbBmiSrc;
+	DWORD offBitsSrc;
+	DWORD cbBitsSrc;
+	LONG xMask;
+	LONG yMask;
+	DWORD iUsageMask;
+	DWORD offBmiMask;
+	DWORD cbBmiMask;
+	DWORD offBitsMask;
+	DWORD cbBitsMask;
+}
+alias EMRPLGBLT* PEMRPLGBLT;
+
+struct EMRPOLYDRAW {
+	EMR emr;
+	RECTL rclBounds;
+	DWORD cptl;
+	POINTL[1] aptl;
+	BYTE[1] abTypes;
+}
+alias EMRPOLYDRAW* PEMRPOLYDRAW;
+
+struct EMRPOLYDRAW16 {
+	EMR emr;
+	RECTL rclBounds;
+	DWORD cpts;
+	POINTS[1] apts;
+	BYTE[1] abTypes;
+}
+alias EMRPOLYDRAW16* PEMRPOLYDRAW16;
+
+struct EMRPOLYLINE {
+	EMR emr;
+	RECTL rclBounds;
+	DWORD cptl;
+	POINTL[1] aptl;
+}
+alias EMRPOLYLINE* PEMRPOLYLINE;
+typedef EMRPOLYLINE EMRPOLYBEZIER;
+alias EMRPOLYBEZIER* PEMRPOLYBEZIER;
+typedef EMRPOLYLINE EMRPOLYGON;
+alias EMRPOLYGON* PEMRPOLYGON;
+typedef EMRPOLYLINE EMRPOLYBEZIERTO;
+alias EMRPOLYBEZIERTO* PEMRPOLYBEZIERTO;
+typedef EMRPOLYLINE EMRPOLYLINETO;
+alias EMRPOLYLINETO* PEMRPOLYLINETO;
+
+struct EMRPOLYLINE16 {
+	EMR emr;
+	RECTL rclBounds;
+	DWORD cpts;
+	POINTS[1] apts;
+}
+alias EMRPOLYLINE16* PEMRPOLYLINE16;
+typedef EMRPOLYLINE16 EMRPOLYBEZIER16;
+alias EMRPOLYBEZIER16* PEMRPOLYBEZIER16;
+typedef EMRPOLYLINE16 EMRPOLYGON16;
+alias EMRPOLYGON16* PEMRPOLYGON16;
+typedef EMRPOLYLINE16 EMRPOLYBEZIERTO16;
+alias EMRPOLYBEZIERTO16* PEMRPOLYBEZIERTO16;
+typedef EMRPOLYLINE16 EMRPOLYLINETO16;
+alias EMRPOLYLINETO16* PEMRPOLYLINETO16;
+
+struct EMRPOLYPOLYLINE {
+	EMR emr;
+	RECTL rclBounds;
+	DWORD nPolys;
+	DWORD cptl;
+	DWORD[1] aPolyCounts;
+	POINTL[1] aptl;
+}
+alias EMRPOLYPOLYLINE* PEMRPOLYPOLYLINE;
+typedef EMRPOLYPOLYLINE EMRPOLYPOLYGON;
+alias EMRPOLYPOLYGON* PEMRPOLYPOLYGON;
+
+struct EMRPOLYPOLYLINE16 {
+	EMR emr;
+	RECTL rclBounds;
+	DWORD nPolys;
+	DWORD cpts;
+	DWORD[1] aPolyCounts;
+	POINTS[1] apts;
+}
+alias EMRPOLYPOLYLINE16* PEMRPOLYPOLYLINE16;
+typedef EMRPOLYPOLYLINE16 EMRPOLYPOLYGON16;
+alias EMRPOLYPOLYGON16* PEMRPOLYPOLYGON16;
+
+struct EMRPOLYTEXTOUTA {
+	EMR emr;
+	RECTL rclBounds;
+	DWORD iGraphicsMode;
+	FLOAT exScale;
+	FLOAT eyScale;
+	LONG cStrings;
+	EMRTEXT[1] aemrtext;
+}
+alias EMRPOLYTEXTOUTA* PEMRPOLYTEXTOUTA;
+typedef EMRPOLYTEXTOUTA EMRPOLYTEXTOUTW;
+alias EMRPOLYTEXTOUTW* PEMRPOLYTEXTOUTW;
+
+struct EMRRESIZEPALETTE {
+	EMR emr;
+	DWORD ihPal;
+	DWORD cEntries;
+}
+alias EMRRESIZEPALETTE* PEMRRESIZEPALETTE;
+
+struct EMRRESTOREDC {
+	EMR emr;
+	LONG iRelative;
+}
+alias EMRRESTOREDC* PEMRRESTOREDC;
+
+struct EMRROUNDRECT {
+	EMR emr;
+	RECTL rclBox;
+	SIZEL szlCorner;
+}
+alias EMRROUNDRECT* PEMRROUNDRECT;
+
+struct EMRSCALEVIEWPORTEXTEX {
+	EMR emr;
+	LONG xNum;
+	LONG xDenom;
+	LONG yNum;
+	LONG yDenom;
+}
+alias EMRSCALEVIEWPORTEXTEX* PEMRSCALEVIEWPORTEXTEX;
+typedef EMRSCALEVIEWPORTEXTEX EMRSCALEWINDOWEXTEX;
+alias EMRSCALEWINDOWEXTEX* PEMRSCALEWINDOWEXTEX;
+
+struct EMRSELECTOBJECT {
+	EMR emr;
+	DWORD ihObject;
+}
+alias EMRSELECTOBJECT* PEMRSELECTOBJECT;
+typedef EMRSELECTOBJECT EMRDELETEOBJECT;
+alias EMRDELETEOBJECT* PEMRDELETEOBJECT;
+
+struct EMRSELECTPALETTE {
+	EMR emr;
+	DWORD ihPal;
+}
+alias EMRSELECTPALETTE* PEMRSELECTPALETTE;
+
+struct EMRSETARCDIRECTION {
+	EMR emr;
+	DWORD iArcDirection;
+}
+alias EMRSETARCDIRECTION* PEMRSETARCDIRECTION;
+
+struct EMRSETTEXTCOLOR {
+	EMR emr;
+	COLORREF crColor;
+}
+alias EMRSETTEXTCOLOR* PEMRSETTEXTCOLOR;
+typedef EMRSETTEXTCOLOR EMRSETBKCOLOR;
+alias EMRSETBKCOLOR* PEMRSETBKCOLOR;
+
+struct EMRSETCOLORADJUSTMENT {
+	EMR emr;
+	COLORADJUSTMENT ColorAdjustment;
+}
+alias EMRSETCOLORADJUSTMENT* PEMRSETCOLORADJUSTMENT;
+
+struct EMRSETDIBITSTODEVICE {
+	EMR emr;
+	RECTL rclBounds;
+	LONG xDest;
+	LONG yDest;
+	LONG xSrc;
+	LONG ySrc;
+	LONG cxSrc;
+	LONG cySrc;
+	DWORD offBmiSrc;
+	DWORD cbBmiSrc;
+	DWORD offBitsSrc;
+	DWORD cbBitsSrc;
+	DWORD iUsageSrc;
+	DWORD iStartScan;
+	DWORD cScans;
+}
+alias EMRSETDIBITSTODEVICE* PEMRSETDIBITSTODEVICE;
+
+struct EMRSETMAPPERFLAGS {
+	EMR emr;
+	DWORD dwFlags;
+}
+alias EMRSETMAPPERFLAGS* PEMRSETMAPPERFLAGS;
+
+struct EMRSETMITERLIMIT {
+	EMR emr;
+	FLOAT eMiterLimit;
+}
+alias EMRSETMITERLIMIT* PEMRSETMITERLIMIT;
+
+struct EMRSETPALETTEENTRIES {
+	EMR emr;
+	DWORD ihPal;
+	DWORD iStart;
+	DWORD cEntries;
+	PALETTEENTRY[1] aPalEntries;
+}
+alias EMRSETPALETTEENTRIES* PEMRSETPALETTEENTRIES;
+
+struct EMRSETPIXELV {
+	EMR emr;
+	POINTL ptlPixel;
+	COLORREF crColor;
+}
+alias EMRSETPIXELV* PEMRSETPIXELV;
+
+struct EMRSETVIEWPORTEXTEX {
+	EMR emr;
+	SIZEL szlExtent;
+}
+alias EMRSETVIEWPORTEXTEX* PEMRSETVIEWPORTEXTEX;
+typedef EMRSETVIEWPORTEXTEX EMRSETWINDOWEXTEX;
+alias EMRSETWINDOWEXTEX* PEMRSETWINDOWEXTEX;
+
+struct EMRSETVIEWPORTORGEX {
+	EMR emr;
+	POINTL ptlOrigin;
+}
+alias EMRSETVIEWPORTORGEX* PEMRSETVIEWPORTORGEX;
+typedef EMRSETVIEWPORTORGEX EMRSETWINDOWORGEX;
+alias EMRSETWINDOWORGEX* PEMRSETWINDOWORGEX;
+typedef EMRSETVIEWPORTORGEX EMRSETBRUSHORGEX;
+alias EMRSETBRUSHORGEX* PEMRSETBRUSHORGEX;
+
+struct EMRSETWORLDTRANSFORM {
+	EMR emr;
+	XFORM xform;
+}
+alias EMRSETWORLDTRANSFORM* PEMRSETWORLDTRANSFORM;
+
+struct EMRSTRETCHBLT {
+	EMR emr;
+	RECTL rclBounds;
+	LONG xDest;
+	LONG yDest;
+	LONG cxDest;
+	LONG cyDest;
+	DWORD dwRop;
+	LONG xSrc;
+	LONG ySrc;
+	XFORM xformSrc;
+	COLORREF crBkColorSrc;
+	DWORD iUsageSrc;
+	DWORD offBmiSrc;
+	DWORD cbBmiSrc;
+	DWORD offBitsSrc;
+	DWORD cbBitsSrc;
+	LONG cxSrc;
+	LONG cySrc;
+}
+alias EMRSTRETCHBLT* PEMRSTRETCHBLT;
+
+struct EMRSTRETCHDIBITS {
+	EMR emr;
+	RECTL rclBounds;
+	LONG xDest;
+	LONG yDest;
+	LONG xSrc;
+	LONG ySrc;
+	LONG cxSrc;
+	LONG cySrc;
+	DWORD offBmiSrc;
+	DWORD cbBmiSrc;
+	DWORD offBitsSrc;
+	DWORD cbBitsSrc;
+	DWORD iUsageSrc;
+	DWORD dwRop;
+	LONG cxDest;
+	LONG cyDest;
+}
+alias EMRSTRETCHDIBITS* PEMRSTRETCHDIBITS;
+
+struct EMRABORTPATH {
+	EMR emr;
+}
+alias EMRABORTPATH* PEMRABORTPATH;
+typedef EMRABORTPATH EMRBEGINPATH;
+alias EMRBEGINPATH* PEMRBEGINPATH;
+typedef EMRABORTPATH EMRENDPATH;
+alias EMRENDPATH* PEMRENDPATH;
+typedef EMRABORTPATH EMRCLOSEFIGURE;
+alias EMRCLOSEFIGURE* PEMRCLOSEFIGURE;
+typedef EMRABORTPATH EMRFLATTENPATH;
+alias EMRFLATTENPATH* PEMRFLATTENPATH;
+typedef EMRABORTPATH EMRWIDENPATH;
+alias EMRWIDENPATH* PEMRWIDENPATH;
+typedef EMRABORTPATH EMRSETMETARGN;
+alias EMRSETMETARGN* PEMRSETMETARGN;
+typedef EMRABORTPATH EMRSAVEDC;
+alias EMRSAVEDC* PEMRSAVEDC;
+typedef EMRABORTPATH EMRREALIZEPALETTE;
+alias EMRREALIZEPALETTE* PEMRREALIZEPALETTE;
+
+struct EMRSELECTCLIPPATH {
+	EMR emr;
+	DWORD iMode;
+}
+alias EMRSELECTCLIPPATH* PEMRSELECTCLIPPATH;
+typedef EMRSELECTCLIPPATH EMRSETBKMODE;
+alias EMRSETBKMODE* PEMRSETBKMODE;
+typedef EMRSELECTCLIPPATH EMRSETMAPMODE;
+alias EMRSETMAPMODE* PEMRSETMAPMODE;
+typedef EMRSELECTCLIPPATH EMRSETPOLYFILLMODE;
+alias EMRSETPOLYFILLMODE* PEMRSETPOLYFILLMODE;
+typedef EMRSELECTCLIPPATH EMRSETROP2;
+alias EMRSETROP2* PEMRSETROP2;
+typedef EMRSELECTCLIPPATH EMRSETSTRETCHBLTMODE;
+alias EMRSETSTRETCHBLTMODE* PEMRSETSTRETCHBLTMODE;
+typedef EMRSELECTCLIPPATH EMRSETICMMODE;
+alias EMRSETICMMODE* PEMRSETICMMODE;
+typedef EMRSELECTCLIPPATH EMRSETTEXTALIGN;
+alias EMRSETTEXTALIGN* PEMRSETTEXTALIGN;
+typedef EMRSELECTCLIPPATH EMRENABLEICM;
+alias EMRENABLEICM* PEMRENABLEICM;
+static if (WINVER >= 0x0500) {
+	typedef EMRSELECTCLIPPATH EMRSETLAYOUT;
+	alias EMRSETLAYOUT* PEMRSETLAYOUT;
+}
+
+align(2):
+struct METAHEADER {
+	WORD mtType;
+	WORD mtHeaderSize;
+	WORD mtVersion;
+	DWORD mtSize;
+	WORD mtNoObjects;
+	DWORD mtMaxRecord;
+	WORD mtNoParameters;
+}
+alias METAHEADER* PMETAHEADER;
+alias METAHEADER* LPMETAHEADER;
+
+align:
+
+struct ENHMETAHEADER {
+	DWORD iType;
+	DWORD nSize;
+	RECTL rclBounds;
+	RECTL rclFrame;
+	DWORD dSignature = ENHMETA_SIGNATURE;
+	DWORD nVersion;
+	DWORD nBytes;
+	DWORD nRecords;
+	WORD nHandles;
+	WORD sReserved;
+	DWORD nDescription;
+	DWORD offDescription;
+	DWORD nPalEntries;
+	SIZEL szlDevice;
+	SIZEL szlMillimeters;
+	static if (WINVER >= 0x0400) {
+		DWORD cbPixelFormat;
+		DWORD offPixelFormat;
+		DWORD bOpenGL;
+	}
+	static if (WINVER >= 0x0500) {
+		SIZEL szlMicrometers;
+	}
+}
+alias ENHMETAHEADER* PENHMETAHEADER, LPENHMETAHEADER;
+
+struct METARECORD {
+	DWORD rdSize;
+	WORD rdFunction;
+	WORD[1] rdParm;
+}
+alias METARECORD* PMETARECORD;
+alias METARECORD* LPMETARECORD;
+
+struct ENHMETARECORD {
+	DWORD iType;
+	DWORD nSize;
+	DWORD[1] dParm;
+}
+alias ENHMETARECORD* PENHMETARECORD, LPENHMETARECORD;
+
+// ---
+
+struct HANDLETABLE {
+	HGDIOBJ[1] objectHandle;
+}
+alias HANDLETABLE* PHANDLETABLE, LPHANDLETABLE;
+
+struct TEXTMETRICA {
+	LONG tmHeight;
+	LONG tmAscent;
+	LONG tmDescent;
+	LONG tmInternalLeading;
+	LONG tmExternalLeading;
+	LONG tmAveCharWidth;
+	LONG tmMaxCharWidth;
+	LONG tmWeight;
+	LONG tmOverhang;
+	LONG tmDigitizedAspectX;
+	LONG tmDigitizedAspectY;
+	BYTE tmFirstChar;
+	BYTE tmLastChar;
+	BYTE tmDefaultChar;
+	BYTE tmBreakChar;
+	BYTE tmItalic;
+	BYTE tmUnderlined;
+	BYTE tmStruckOut;
+	BYTE tmPitchAndFamily;
+	BYTE tmCharSet;
+}
+alias TEXTMETRICA* PTEXTMETRICA, NPTEXTMETRICA, LPTEXTMETRICA;
+
+struct TEXTMETRICW {
+	LONG tmHeight;
+	LONG tmAscent;
+	LONG tmDescent;
+	LONG tmInternalLeading;
+	LONG tmExternalLeading;
+	LONG tmAveCharWidth;
+	LONG tmMaxCharWidth;
+	LONG tmWeight;
+	LONG tmOverhang;
+	LONG tmDigitizedAspectX;
+	LONG tmDigitizedAspectY;
+	WCHAR tmFirstChar;
+	WCHAR tmLastChar;
+	WCHAR tmDefaultChar;
+	WCHAR tmBreakChar;
+	BYTE tmItalic;
+	BYTE tmUnderlined;
+	BYTE tmStruckOut;
+	BYTE tmPitchAndFamily;
+	BYTE tmCharSet;
+}
+alias TEXTMETRICW* PTEXTMETRICW, NPTEXTMETRICW, LPTEXTMETRICW;
+
+struct RGNDATAHEADER {
+	DWORD dwSize;
+	DWORD iType;
+	DWORD nCount;
+	DWORD nRgnSize;
+	RECT rcBound;
+}
+alias RGNDATAHEADER* PRGNDATAHEADER;
+
+struct RGNDATA {
+	RGNDATAHEADER rdh;
+	char[1] Buffer;
+}
+alias RGNDATA* PRGNDATA, NPRGNDATA, LPRGNDATA;
+
+/* for GetRandomRgn */
+const SYSRGN=4;
+struct GCP_RESULTSA {
+	DWORD lStructSize;
+	LPSTR lpOutString;
+	UINT* lpOrder;
+	INT* lpDx;
+	INT* lpCaretPos;
+	LPSTR lpClass;
+	LPWSTR lpGlyphs;
+	UINT nGlyphs;
+	UINT nMaxFit;
+}
+alias GCP_RESULTSA* LPGCP_RESULTSA;
+
+struct GCP_RESULTSW {
+	DWORD lStructSize;
+	LPWSTR lpOutString;
+	UINT* lpOrder;
+	INT* lpDx;
+	INT* lpCaretPos;
+	LPWSTR lpClass;
+	LPWSTR lpGlyphs;
+	UINT nGlyphs;
+	UINT nMaxFit;
+}
+alias GCP_RESULTSW* LPGCP_RESULTSW;
+
+struct GLYPHMETRICS {
+	UINT gmBlackBoxX;
+	UINT gmBlackBoxY;
+	POINT gmptGlyphOrigin;
+	short gmCellIncX;
+	short gmCellIncY;
+}
+alias GLYPHMETRICS* LPGLYPHMETRICS;
+
+static if (_WIN32_WINNT >= 0x0500) {
+	struct WCRANGE {
+		WCHAR  wcLow;
+		USHORT cGlyphs;
+	}
+	alias WCRANGE* PWCRANGE, LPWCRANGE;
+
+	struct GLYPHSET {
+		DWORD cbThis;
+		DWORD flAccel;
+		DWORD cGlyphsSupported;
+		DWORD cRanges;
+		WCRANGE[1] ranges;
+	}
+	alias GLYPHSET* PGLYPHSET, LPGLYPHSET;
+
+	const DWORD GS_8BIT_INDICES = 0x00000001;
+}
+
+struct KERNINGPAIR {
+	WORD wFirst;
+	WORD wSecond;
+	int iKernAmount;
+}
+alias KERNINGPAIR* LPKERNINGPAIR;
+
+struct FIXED {
+	WORD fract;
+	short value;
+}
+
+struct MAT2 {
+	FIXED eM11;
+	FIXED eM12;
+	FIXED eM21;
+	FIXED eM22;
+}
+alias MAT2* LPMAT2;
+
+struct OUTLINETEXTMETRICA {
+	UINT otmSize;
+	TEXTMETRICA otmTextMetrics;
+	BYTE otmFiller;
+	PANOSE otmPanoseNumber;
+	UINT otmfsSelection;
+	UINT otmfsType;
+	int otmsCharSlopeRise;
+	int otmsCharSlopeRun;
+	int otmItalicAngle;
+	UINT otmEMSquare;
+	int otmAscent;
+	int otmDescent;
+	UINT otmLineGap;
+	UINT otmsCapEmHeight;
+	UINT otmsXHeight;
+	RECT otmrcFontBox;
+	int otmMacAscent;
+	int otmMacDescent;
+	UINT otmMacLineGap;
+	UINT otmusMinimumPPEM;
+	POINT otmptSubscriptSize;
+	POINT otmptSubscriptOffset;
+	POINT otmptSuperscriptSize;
+	POINT otmptSuperscriptOffset;
+	UINT otmsStrikeoutSize;
+	int otmsStrikeoutPosition;
+	int otmsUnderscoreSize;
+	int otmsUnderscorePosition;
+	PSTR otmpFamilyName;
+	PSTR otmpFaceName;
+	PSTR otmpStyleName;
+	PSTR otmpFullName;
+}
+alias OUTLINETEXTMETRICA* POUTLINETEXTMETRICA, NPOUTLINETEXTMETRICA, LPOUTLINETEXTMETRICA;
+
+struct OUTLINETEXTMETRICW {
+	UINT otmSize;
+	TEXTMETRICW otmTextMetrics;
+	BYTE otmFiller;
+	PANOSE otmPanoseNumber;
+	UINT otmfsSelection;
+	UINT otmfsType;
+	int otmsCharSlopeRise;
+	int otmsCharSlopeRun;
+	int otmItalicAngle;
+	UINT otmEMSquare;
+	int otmAscent;
+	int otmDescent;
+	UINT otmLineGap;
+	UINT otmsCapEmHeight;
+	UINT otmsXHeight;
+	RECT otmrcFontBox;
+	int otmMacAscent;
+	int otmMacDescent;
+	UINT otmMacLineGap;
+	UINT otmusMinimumPPEM;
+	POINT otmptSubscriptSize;
+	POINT otmptSubscriptOffset;
+	POINT otmptSuperscriptSize;
+	POINT otmptSuperscriptOffset;
+	UINT otmsStrikeoutSize;
+	int otmsStrikeoutPosition;
+	int otmsUnderscoreSize;
+	int otmsUnderscorePosition;
+	PSTR otmpFamilyName;
+	PSTR otmpFaceName;
+	PSTR otmpStyleName;
+	PSTR otmpFullName;
+}
+alias OUTLINETEXTMETRICW* POUTLINETEXTMETRICW, NPOUTLINETEXTMETRICW, LPOUTLINETEXTMETRICW;
+
+struct RASTERIZER_STATUS {
+	short nSize;
+	short wFlags;
+	short nLanguageID;
+}
+alias RASTERIZER_STATUS* LPRASTERIZER_STATUS;
+
+struct POLYTEXTA {
+	int x;
+	int y;
+	UINT n;
+	LPCSTR lpstr;
+	UINT uiFlags;
+	RECT rcl;
+	int* pdx;
+}
+alias POLYTEXTA* PPOLYTEXTA, NPPOLYTEXTA, LPPOLYTEXTA;
+
+struct POLYTEXTW {
+	int x;
+	int y;
+	UINT n;
+	LPCWSTR lpstr;
+	UINT uiFlags;
+	RECT rcl;
+	int* pdx;
+}
+alias POLYTEXTW* PPOLYTEXTW, NPPOLYTEXTW, LPPOLYTEXTW;
+
+struct PIXELFORMATDESCRIPTOR {
+	WORD nSize;
+	WORD nVersion;
+	DWORD dwFlags;
+	BYTE iPixelType;
+	BYTE cColorBits;
+	BYTE cRedBits;
+	BYTE cRedShift;
+	BYTE cGreenBits;
+	BYTE cGreenShift;
+	BYTE cBlueBits;
+	BYTE cBlueShift;
+	BYTE cAlphaBits;
+	BYTE cAlphaShift;
+	BYTE cAccumBits;
+	BYTE cAccumRedBits;
+	BYTE cAccumGreenBits;
+	BYTE cAccumBlueBits;
+	BYTE cAccumAlphaBits;
+	BYTE cDepthBits;
+	BYTE cStencilBits;
+	BYTE cAuxBuffers;
+	BYTE iLayerType;
+	BYTE bReserved;
+	DWORD dwLayerMask;
+	DWORD dwVisibleMask;
+	DWORD dwDamageMask;
+}
+alias PIXELFORMATDESCRIPTOR* PPIXELFORMATDESCRIPTOR, LPPIXELFORMATDESCRIPTOR;
+
+struct METAFILEPICT {
+	LONG mm;
+	LONG xExt;
+	LONG yExt;
+	HMETAFILE hMF;
+}
+alias METAFILEPICT* LPMETAFILEPICT;
+
+struct LOCALESIGNATURE {
+	DWORD[4] lsUsb;
+	DWORD[2] lsCsbDefault;
+	DWORD[2] lsCsbSupported;
+}
+alias LOCALESIGNATURE* PLOCALESIGNATURE, LPLOCALESIGNATURE;
+
+alias LONG LCSTYPE; /* What this for? */
+
+align(4):
+struct NEWTEXTMETRICA {
+	LONG tmHeight;
+	LONG tmAscent;
+	LONG tmDescent;
+	LONG tmInternalLeading;
+	LONG tmExternalLeading;
+	LONG tmAveCharWidth;
+	LONG tmMaxCharWidth;
+	LONG tmWeight;
+	LONG tmOverhang;
+	LONG tmDigitizedAspectX;
+	LONG tmDigitizedAspectY;
+	BYTE tmFirstChar;
+	BYTE tmLastChar;
+	BYTE tmDefaultChar;
+	BYTE tmBreakChar;
+	BYTE tmItalic;
+	BYTE tmUnderlined;
+	BYTE tmStruckOut;
+	BYTE tmPitchAndFamily;
+	BYTE tmCharSet;
+	DWORD ntmFlags;
+	UINT ntmSizeEM;
+	UINT ntmCellHeight;
+	UINT ntmAvgWidth;
+}
+alias NEWTEXTMETRICA* PNEWTEXTMETRICA, NPNEWTEXTMETRICA, LPNEWTEXTMETRICA;
+
+struct NEWTEXTMETRICW {
+	LONG tmHeight;
+	LONG tmAscent;
+	LONG tmDescent;
+	LONG tmInternalLeading;
+	LONG tmExternalLeading;
+	LONG tmAveCharWidth;
+	LONG tmMaxCharWidth;
+	LONG tmWeight;
+	LONG tmOverhang;
+	LONG tmDigitizedAspectX;
+	LONG tmDigitizedAspectY;
+	WCHAR tmFirstChar;
+	WCHAR tmLastChar;
+	WCHAR tmDefaultChar;
+	WCHAR tmBreakChar;
+	BYTE tmItalic;
+	BYTE tmUnderlined;
+	BYTE tmStruckOut;
+	BYTE tmPitchAndFamily;
+	BYTE tmCharSet;
+	DWORD ntmFlags;
+	UINT ntmSizeEM;
+	UINT ntmCellHeight;
+	UINT ntmAvgWidth;
+}
+alias NEWTEXTMETRICW* PNEWTEXTMETRICW, NPNEWTEXTMETRICW, LPNEWTEXTMETRICW;
+
+align:
+struct NEWTEXTMETRICEXA {
+	NEWTEXTMETRICA ntmTm;
+	FONTSIGNATURE ntmFontSig;
+}
+
+struct NEWTEXTMETRICEXW {
+	NEWTEXTMETRICW ntmTm;
+	FONTSIGNATURE ntmFontSig;
+}
+
+struct PELARRAY {
+	LONG paXCount;
+	LONG paYCount;
+	LONG paXExt;
+	LONG paYExt;
+	BYTE paRGBs;
+}
+alias PELARRAY* PPELARRAY, NPPELARRAY, LPPELARRAY;
+
+struct ENUMLOGFONTA {
+	LOGFONTA elfLogFont;
+	BYTE[LF_FULLFACESIZE] elfFullName;
+	BYTE[LF_FACESIZE] elfStyle;
+}
+alias ENUMLOGFONTA* LPENUMLOGFONTA;
+
+struct ENUMLOGFONTW {
+	LOGFONTW elfLogFont;
+	WCHAR[LF_FULLFACESIZE] elfFullName;
+	WCHAR[LF_FACESIZE] elfStyle;
+}
+alias ENUMLOGFONTW* LPENUMLOGFONTW;
+
+struct ENUMLOGFONTEXA {
+	LOGFONTA elfLogFont;
+	BYTE[LF_FULLFACESIZE] elfFullName;
+	BYTE[LF_FACESIZE] elfStyle;
+	BYTE[LF_FACESIZE] elfScript;
+}
+alias ENUMLOGFONTEXA* LPENUMLOGFONTEXA;
+
+struct ENUMLOGFONTEXW {
+	LOGFONTW elfLogFont;
+	WCHAR[LF_FULLFACESIZE] elfFullName;
+	WCHAR[LF_FACESIZE] elfStyle;
+	WCHAR[LF_FACESIZE] elfScript;
+}
+alias ENUMLOGFONTEXW* LPENUMLOGFONTEXW;
+
+struct POINTFX {
+	FIXED x;
+	FIXED y;
+}
+alias POINTFX* LPPOINTFX;
+
+struct TTPOLYCURVE {
+	WORD wType;
+	WORD cpfx;
+	POINTFX[1] apfx;
+}
+alias TTPOLYCURVE* LPTTPOLYCURVE;
+
+struct TTPOLYGONHEADER {
+	DWORD cb;
+	DWORD dwType;
+	POINTFX pfxStart;
+}
+alias TTPOLYGONHEADER* LPTTPOLYGONHEADER;
+
+struct POINTFLOAT {
+	FLOAT x;
+	FLOAT y;
+}
+alias POINTFLOAT* PPOINTFLOAT;
+
+struct GLYPHMETRICSFLOAT {
+	FLOAT gmfBlackBoxX;
+	FLOAT gmfBlackBoxY;
+	POINTFLOAT gmfptGlyphOrigin;
+	FLOAT gmfCellIncX;
+	FLOAT gmfCellIncY;
+}
+alias GLYPHMETRICSFLOAT* PGLYPHMETRICSFLOAT, LPGLYPHMETRICSFLOAT;
+
+struct LAYERPLANEDESCRIPTOR {
+	WORD nSize;
+	WORD nVersion;
+	DWORD dwFlags;
+	BYTE iPixelType;
+	BYTE cColorBits;
+	BYTE cRedBits;
+	BYTE cRedShift;
+	BYTE cGreenBits;
+	BYTE cGreenShift;
+	BYTE cBlueBits;
+	BYTE cBlueShift;
+	BYTE cAlphaBits;
+	BYTE cAlphaShift;
+	BYTE cAccumBits;
+	BYTE cAccumRedBits;
+	BYTE cAccumGreenBits;
+	BYTE cAccumBlueBits;
+	BYTE cAccumAlphaBits;
+	BYTE cDepthBits;
+	BYTE cStencilBits;
+	BYTE cAuxBuffers;
+	BYTE iLayerPlane;
+	BYTE bReserved;
+	COLORREF crTransparent;
+}
+alias LAYERPLANEDESCRIPTOR* PLAYERPLANEDESCRIPTOR, LPLAYERPLANEDESCRIPTOR;
+
+struct BLENDFUNCTION {
+	BYTE BlendOp;
+	BYTE BlendFlags;
+	BYTE SourceConstantAlpha;
+	BYTE AlphaFormat;
+}
+alias BLENDFUNCTION* PBLENDFUNCTION, LPBLENDFUNCTION;
+
+const MM_MAX_NUMAXES = 16;
+
+struct DESIGNVECTOR {
+	DWORD dvReserved;
+	DWORD dvNumAxes;
+	LONG[MM_MAX_NUMAXES] dvValues;
+}
+alias DESIGNVECTOR* PDESIGNVECTOR, LPDESIGNVECTOR;
+const STAMP_DESIGNVECTOR = 0x8000000 + 'd' + ('v' << 8);
+const STAMP_AXESLIST     = 0x8000000 + 'a' + ('l' << 8);
+
+static if (_WIN32_WINNT >= 0x0500) {
+
+	const MM_MAX_AXES_NAMELEN = 16;
+
+	struct AXISINFOA {
+		LONG axMinValue;
+		LONG axMaxValue;
+		BYTE[MM_MAX_AXES_NAMELEN] axAxisName;
+	}
+	alias AXISINFOA* PAXISINFOA, LPAXISINFOA;
+
+	struct AXISINFOW {
+		LONG axMinValue;
+		LONG axMaxValue;
+		WCHAR[MM_MAX_AXES_NAMELEN] axAxisName;
+	}
+	alias AXISINFOW* PAXISINFOW, LPAXISINFOW;
+
+	version (Unicode) {
+		alias AXISINFOW AXISINFO;
+		alias PAXISINFOW PAXISINFO;
+		alias LPAXISINFOW LPAXISINFO;
+	}
+	else {
+		alias AXISINFOA AXISINFO;
+		alias PAXISINFOA PAXISINFO;
+		alias LPAXISINFOA LPAXISINFO;
+	}
+
+	struct AXESLISTA {
+		DWORD axlReserved;
+		DWORD axlNumAxes;
+		AXISINFOA[MM_MAX_NUMAXES] axlAxisInfo;
+	}
+	alias AXESLISTA* PAXESLISTA, LPAXESLISTA;
+
+	struct AXESLISTW {
+		DWORD axlReserved;
+		DWORD axlNumAxes;
+		AXISINFOW[MM_MAX_NUMAXES] axlAxisInfo;
+	}
+	alias AXESLISTW* PAXESLISTW, LPAXESLISTW;
+
+	version (Unicode) {
+		alias AXESLISTW AXESLIST;
+		alias PAXESLISTW PAXESLIST;
+		alias LPAXESLISTW LPAXESLIST;
+	}
+	else {
+		alias AXESLISTA AXESLIST;
+		alias PAXESLISTA PAXESLIST;
+		alias LPAXESLISTA LPAXESLIST;
+	}
+
+	struct ENUMLOGFONTEXDVA {
+		ENUMLOGFONTEXA elfEnumLogfontEx;
+		DESIGNVECTOR   elfDesignVector;
+	}
+	alias ENUMLOGFONTEXDVA* PENUMLOGFONTEXDVA, LPENUMLOGFONTEXDVA;
+
+	struct ENUMLOGFONTEXDVW {
+		ENUMLOGFONTEXW elfEnumLogfontEx;
+		DESIGNVECTOR   elfDesignVector;
+	}
+	alias ENUMLOGFONTEXDVW* PENUMLOGFONTEXDVW, LPENUMLOGFONTEXDVW;
+
+	HFONT CreateFontIndirectExA(ENUMLOGFONTEXDVA*);
+	HFONT CreateFontIndirectExW(ENUMLOGFONTEXDVW*);
+	version (Unicode)
+		alias CreateFontIndirectExW CreateFontIndirectEx;
+	else
+		alias CreateFontIndirectExA CreateFontIndirectEx;
+
+	struct ENUMTEXTMETRICA {
+		NEWTEXTMETRICEXA etmNewTextMetricEx;
+		AXESLISTA etmAxesList;
+	}
+	alias ENUMTEXTMETRICA* PENUMTEXTMETRICA, LPENUMTEXTMETRICA;
+
+	struct ENUMTEXTMETRICW {
+		NEWTEXTMETRICEXW etmNewTextMetricEx;
+		AXESLISTW etmAxesList;
+	}
+	alias ENUMTEXTMETRICW* PENUMTEXTMETRICW, LPENUMTEXTMETRICW;
+
+	version (Unicode) {
+		alias ENUMTEXTMETRICW ENUMTEXTMETRIC;
+		alias PENUMTEXTMETRICW PENUMTEXTMETRIC;
+		alias LPENUMTEXTMETRICW LPENUMTEXTMETRIC;
+	}
+	else {
+		alias ENUMTEXTMETRICA ENUMTEXTMETRIC;
+		alias PENUMTEXTMETRICA PENUMTEXTMETRIC;
+		alias LPENUMTEXTMETRICA LPENUMTEXTMETRIC;
+	}
+} /* _WIN32_WINNT >= 0x0500 */
+
+struct GRADIENT_TRIANGLE {
+	ULONG Vertex1;
+	ULONG Vertex2;
+	ULONG Vertex3;
+}
+alias GRADIENT_TRIANGLE* PGRADIENT_TRIANGLE, LPGRADIENT_TRIANGLE;
+
+struct GRADIENT_RECT {
+	ULONG UpperLeft;
+	ULONG LowerRight;
+}
+alias GRADIENT_RECT* PGRADIENT_RECT, LPGRADIENT_RECT;
+
+struct DISPLAY_DEVICEA {
+	DWORD cb;
+	CHAR[32] DeviceName;
+	CHAR[128] DeviceString;
+	DWORD StateFlags;
+	CHAR[128] DeviceID;
+	CHAR[128] DeviceKey;
+}
+alias DISPLAY_DEVICEA* PDISPLAY_DEVICEA, LPDISPLAY_DEVICEA;
+
+struct DISPLAY_DEVICEW {
+	DWORD cb;
+	WCHAR[32] DeviceName;
+	WCHAR[128] DeviceString;
+	DWORD StateFlags;
+	WCHAR[128] DeviceID;
+	WCHAR[128] DeviceKey;
+}
+alias DISPLAY_DEVICEW* PDISPLAY_DEVICEW, LPDISPLAY_DEVICEW;
+
+static if (WINVER >= 0x0400) {
+	struct DRAWPATRECT {
+		POINT ptPosition;
+		POINT ptSize;
+		WORD wStyle;
+		WORD wPattern;
+	}
+	alias DRAWPATRECT* PDRAWPATRECT;
+}
+
+// ---------
+// Callbacks
+
+alias BOOL function (HDC, int) ABORTPROC;
+alias int function (HDC, HANDLETABLE*, METARECORD*, int, LPARAM) MFENUMPROC;
+alias int function (HDC, HANDLETABLE*, ENHMETARECORD*, int, LPARAM) ENHMFENUMPROC;
+alias int function (LOGFONTA*, TEXTMETRICA*, DWORD, LPARAM) FONTENUMPROCA, OLDFONTENUMPROCA;
+alias int function (LOGFONTW*, TEXTMETRICW*, DWORD, LPARAM) FONTENUMPROCW, OLDFONTENUMPROCW;
+alias int function (LPSTR, LPARAM) ICMENUMPROCA;
+alias int function (LPWSTR, LPARAM) ICMENUMPROCW;
+alias void function (LPVOID, LPARAM) GOBJENUMPROC;
+alias void function (int, int, LPARAM) LINEDDAPROC;
+alias UINT function (HWND, HMODULE, LPDEVMODEA, LPSTR, LPSTR, LPDEVMODEA, LPSTR, UINT) LPFNDEVMODE;
+alias DWORD function (LPSTR, LPSTR, UINT, LPSTR, LPDEVMODEA) LPFNDEVCAPS;
+
+
+// ---------
+// C Macros.
+// FIXME:
+//POINTS MAKEPOINTS(DWORD dwValue) #define MAKEPOINTS(l) (*((POINTS*)&(l)))
+
+DWORD MAKEROP4(DWORD fore, DWORD back) {
+	return ((back<<8) & 0xFF000000) | (fore);
+}
+
+COLORREF CMYK(BYTE c, BYTE m, BYTE y, BYTE k) {
+	return cast(COLORREF)(k | (y << 8) | (m << 16) | (c << 24));
+}
+
+BYTE GetCValue(COLORREF cmyk) {
+	return cast(BYTE)(cmyk >> 24);
+}
+
+BYTE GetMValue(COLORREF cmyk) {
+	return cast(BYTE)(cmyk >> 16);
+}
+
+BYTE GetYValue(COLORREF cmyk) {
+	return cast(BYTE)(cmyk >> 8);
+}
+
+BYTE GetKValue(COLORREF cmyk) {
+	return cast(BYTE)cmyk;
+}
+
+COLORREF RGB(BYTE r, BYTE g, BYTE b) {
+	return cast(COLORREF)(r | (g << 8) | (b << 16));
+}
+
+BYTE GetRValue(COLORREF c) {
+	return cast(BYTE)c;
+}
+
+BYTE GetGValue(COLORREF c) {
+	return cast(BYTE)(c >> 8);
+}
+
+BYTE GetBValue(COLORREF c) {
+	return cast(BYTE)(c >> 16);
+}
+
+COLORREF PALETTEINDEX(WORD i) {
+	return 0x01000000 | cast(COLORREF) i;
+}
+
+COLORREF PALETTERGB(BYTE r, BYTE g, BYTE b) {
+	return 0x02000000|RGB(r, g, b);
+}
+
+extern(Windows) {
+	int AbortDoc(HDC);
+	BOOL AbortPath(HDC);
+	int AddFontResourceA(LPCSTR);
+	int AddFontResourceW(LPCWSTR);
+	BOOL AngleArc(HDC, int, int, DWORD, FLOAT, FLOAT);
+	BOOL AnimatePalette(HPALETTE, UINT, UINT, PALETTEENTRY*);
+	BOOL Arc(HDC, int, int, int, int, int, int, int, int);
+	BOOL ArcTo(HDC, int, int, int, int, int, int, int, int);
+	BOOL BeginPath(HDC);
+	BOOL BitBlt(HDC, int, int, int, int, HDC, int, int, DWORD);
+	BOOL CancelDC(HDC);
+	BOOL CheckColorsInGamut(HDC, PVOID, PVOID, DWORD);
+	BOOL Chord(HDC, int, int, int, int, int, int, int, int);
+	int ChoosePixelFormat(HDC, PIXELFORMATDESCRIPTOR*);
+	HENHMETAFILE CloseEnhMetaFile(HDC);
+	BOOL CloseFigure(HDC);
+	HMETAFILE CloseMetaFile(HDC);
+	BOOL ColorMatchToTarget(HDC, HDC, DWORD);
+	BOOL ColorCorrectPalette(HDC, HPALETTE, DWORD, DWORD);
+	int CombineRgn(HRGN, HRGN, HRGN, int);
+	BOOL CombineTransform(LPXFORM, XFORM*, XFORM*);
+	HENHMETAFILE CopyEnhMetaFileA(HENHMETAFILE, LPCSTR);
+	HENHMETAFILE CopyEnhMetaFileW(HENHMETAFILE, LPCWSTR);
+	HMETAFILE CopyMetaFileA(HMETAFILE, LPCSTR);
+	HMETAFILE CopyMetaFileW(HMETAFILE, LPCWSTR);
+	HBITMAP CreateBitmap(int, int, UINT, UINT, PCVOID);
+	HBITMAP CreateBitmapIndirect(BITMAP*);
+	HBRUSH CreateBrushIndirect(LOGBRUSH*);
+	HCOLORSPACE CreateColorSpaceA(LPLOGCOLORSPACEA);
+	HCOLORSPACE CreateColorSpaceW(LPLOGCOLORSPACEW);
+	HBITMAP CreateCompatibleBitmap(HDC, int, int);
+	HDC CreateCompatibleDC(HDC);
+	HDC CreateDCA(LPCSTR, LPCSTR, LPCSTR, DEVMODEA*);
+	HDC CreateDCW(LPCWSTR, LPCWSTR, LPCWSTR, DEVMODEW*);
+	HBITMAP CreateDIBitmap(HDC, BITMAPINFOHEADER*, DWORD, PCVOID, BITMAPINFO*, UINT);
+	HBRUSH CreateDIBPatternBrush(HGLOBAL, UINT);
+	HBRUSH CreateDIBPatternBrushPt(PCVOID, UINT);
+	HBITMAP CreateDIBSection(HDC, BITMAPINFO*, UINT, void**, HANDLE, DWORD);
+	HBITMAP CreateDiscardableBitmap(HDC, int, int);
+	HRGN CreateEllipticRgn(int, int, int, int);
+	HRGN CreateEllipticRgnIndirect(LPCRECT);
+	HDC CreateEnhMetaFileA(HDC, LPCSTR, LPCRECT, LPCSTR);
+	HDC CreateEnhMetaFileW(HDC, LPCWSTR, LPCRECT, LPCWSTR);
+	HFONT CreateFontA(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCSTR);
+	HFONT CreateFontW(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCWSTR);
+	HFONT CreateFontIndirectA(LOGFONTA*);
+	HFONT CreateFontIndirectW(LOGFONTW*);
+	HPALETTE CreateHalftonePalette(HDC);
+	HBRUSH CreateHatchBrush(int, COLORREF);
+	HDC CreateICA(LPCSTR, LPCSTR, LPCSTR, DEVMODEA*);
+	HDC CreateICW(LPCWSTR, LPCWSTR, LPCWSTR, DEVMODEW*);
+	HDC CreateMetaFileA(LPCSTR);
+	HDC CreateMetaFileW(LPCWSTR);
+	HPALETTE CreatePalette(LOGPALETTE*);
+	HBRUSH CreatePatternBrush(HBITMAP);
+	HPEN CreatePen(int, int, COLORREF);
+	HPEN CreatePenIndirect(LOGPEN*);
+	HRGN CreatePolygonRgn(POINT*, int, int);
+	HRGN CreatePolyPolygonRgn(POINT*, INT*, int, int);
+	HRGN CreateRectRgn(int, int, int, int);
+	HRGN CreateRectRgnIndirect(LPCRECT);
+	HRGN CreateRoundRectRgn(int, int, int, int, int, int);
+	BOOL CreateScalableFontResourceA(DWORD, LPCSTR, LPCSTR, LPCSTR);
+	BOOL CreateScalableFontResourceW(DWORD, LPCWSTR, LPCWSTR, LPCWSTR);
+	HBRUSH CreateSolidBrush(COLORREF);
+	BOOL DeleteColorSpace(HCOLORSPACE);
+	BOOL DeleteDC(HDC);
+	BOOL DeleteEnhMetaFile(HENHMETAFILE);
+	BOOL DeleteMetaFile(HMETAFILE);
+	BOOL DeleteObject(HGDIOBJ);
+	int DescribePixelFormat(HDC, int, UINT, LPPIXELFORMATDESCRIPTOR);
+	DWORD DeviceCapabilitiesA(LPCSTR, LPCSTR, WORD, LPSTR, DEVMODEA*);
+	DWORD DeviceCapabilitiesW(LPCWSTR, LPCWSTR, WORD, LPWSTR, DEVMODEW*);
+	BOOL DPtoLP(HDC, LPPOINT, int);
+	int DrawEscape(HDC, int, int, LPCSTR);
+	BOOL Ellipse(HDC, int, int, int, int);
+	int EndDoc(HDC);
+	int EndPage(HDC);
+	BOOL EndPath(HDC);
+	BOOL EnumEnhMetaFile(HDC, HENHMETAFILE, ENHMFENUMPROC, PVOID, LPCRECT);
+	int EnumFontFamiliesA(HDC, LPCSTR, FONTENUMPROCA, LPARAM);
+	int EnumFontFamiliesW(HDC, LPCWSTR, FONTENUMPROCW, LPARAM);
+	int EnumFontFamiliesExA(HDC, PLOGFONTA, FONTENUMPROCA, LPARAM, DWORD);
+	int EnumFontFamiliesExW(HDC, PLOGFONTW, FONTENUMPROCW, LPARAM, DWORD);
+	int EnumFontsA(HDC, LPCSTR, FONTENUMPROCA, LPARAM);
+	int EnumFontsW(HDC, LPCWSTR, FONTENUMPROCW, LPARAM);
+	int EnumICMProfilesA(HDC, ICMENUMPROCA, LPARAM);
+	int EnumICMProfilesW(HDC, ICMENUMPROCW, LPARAM);
+	BOOL EnumMetaFile(HDC, HMETAFILE, MFENUMPROC, LPARAM);
+	int EnumObjects(HDC, int, GOBJENUMPROC, LPARAM);
+	BOOL EqualRgn(HRGN, HRGN);
+	int Escape(HDC, int, int, LPCSTR, PVOID);
+	int ExcludeClipRect(HDC, int, int, int, int);
+	int ExcludeUpdateRgn(HDC, HWND);
+	HPEN ExtCreatePen(DWORD, DWORD, LOGBRUSH*, DWORD, DWORD*);
+	HRGN ExtCreateRegion(XFORM*, DWORD, RGNDATA*);
+	int ExtEscape(HDC, int, int, LPCSTR, int, LPSTR);
+	BOOL ExtFloodFill(HDC, int, int, COLORREF, UINT);
+	int ExtSelectClipRgn(HDC, HRGN, int);
+	BOOL ExtTextOutA(HDC, int, int, UINT, LPCRECT, LPCSTR, UINT, INT*);
+	BOOL ExtTextOutW(HDC, int, int, UINT, LPCRECT, LPCWSTR, UINT, INT*);
+	BOOL FillPath(HDC);
+	int FillRect(HDC, LPCRECT, HBRUSH);
+	int FillRgn(HDC, HRGN, HBRUSH);
+	BOOL FixBrushOrgEx(HDC, int, int, LPPOINT);
+	BOOL FlattenPath(HDC);
+	BOOL FloodFill(HDC, int, int, COLORREF);
+	BOOL FrameRgn(HDC, HRGN, HBRUSH, int, int);
+	BOOL GdiComment(HDC, UINT, BYTE*);
+	BOOL GdiFlush();
+	DWORD GdiGetBatchLimit();
+	DWORD GdiSetBatchLimit(DWORD);
+	int GetArcDirection(HDC);
+	BOOL GetAspectRatioFilterEx(HDC, LPSIZE);
+	LONG GetBitmapBits(HBITMAP, LONG, PVOID);
+	BOOL GetBitmapDimensionEx(HBITMAP, LPSIZE);
+	COLORREF GetBkColor(HDC);
+	int GetBkMode(HDC);
+	UINT GetBoundsRect(HDC, LPRECT, UINT);
+	BOOL GetBrushOrgEx(HDC, LPPOINT);
+	BOOL GetCharABCWidthsA(HDC, UINT, UINT, LPABC);
+	BOOL GetCharABCWidthsW(HDC, UINT, UINT, LPABC);
+	BOOL GetCharABCWidthsFloatA(HDC, UINT, UINT, LPABCFLOAT);
+	BOOL GetCharABCWidthsFloatW(HDC, UINT, UINT, LPABCFLOAT);
+	DWORD GetCharacterPlacementA(HDC, LPCSTR, int, int, LPGCP_RESULTSA, DWORD);
+	DWORD GetCharacterPlacementW(HDC, LPCWSTR, int, int, LPGCP_RESULTSW, DWORD);
+	BOOL GetCharWidth32A(HDC, UINT, UINT, LPINT);
+	BOOL GetCharWidth32W(HDC, UINT, UINT, LPINT);
+	BOOL GetCharWidthA(HDC, UINT, UINT, LPINT);
+	BOOL GetCharWidthW(HDC, UINT, UINT, LPINT);
+	BOOL GetCharWidthFloatA(HDC, UINT, UINT, PFLOAT);
+	BOOL GetCharWidthFloatW(HDC, UINT, UINT, PFLOAT);
+	int GetClipBox(HDC, LPRECT);
+	int GetClipRgn(HDC, HRGN);
+	BOOL GetColorAdjustment(HDC, LPCOLORADJUSTMENT);
+	HANDLE GetColorSpace(HDC);
+	HGDIOBJ GetCurrentObject(HDC, UINT);
+	BOOL GetCurrentPositionEx(HDC, LPPOINT);
+	HCURSOR GetCursor();
+	BOOL GetDCOrgEx(HDC, LPPOINT);
+	int GetDeviceCaps(HDC, int);
+	BOOL GetDeviceGammaRamp(HDC, PVOID);
+	UINT GetDIBColorTable(HDC, UINT, UINT, RGBQUAD*);
+	int GetDIBits(HDC, HBITMAP, UINT, UINT, PVOID, LPBITMAPINFO, UINT);
+	HENHMETAFILE GetEnhMetaFileA(LPCSTR);
+	HENHMETAFILE GetEnhMetaFileW(LPCWSTR);
+	UINT GetEnhMetaFileBits(HENHMETAFILE, UINT, LPBYTE);
+	UINT GetEnhMetaFileDescriptionA(HENHMETAFILE, UINT, LPSTR);
+	UINT GetEnhMetaFileDescriptionW(HENHMETAFILE, UINT, LPWSTR);
+	UINT GetEnhMetaFileHeader(HENHMETAFILE, UINT, LPENHMETAHEADER);
+	UINT GetEnhMetaFilePaletteEntries(HENHMETAFILE, UINT, LPPALETTEENTRY);
+	UINT GetEnhMetaFilePixelFormat(HENHMETAFILE, DWORD, PIXELFORMATDESCRIPTOR*);
+	DWORD GetFontData(HDC, DWORD, DWORD, PVOID, DWORD);
+	DWORD GetFontLanguageInfo(HDC);
+	DWORD GetGlyphOutlineA(HDC, UINT, UINT, LPGLYPHMETRICS, DWORD, PVOID, MAT2*);
+	DWORD GetGlyphOutlineW(HDC, UINT, UINT, LPGLYPHMETRICS, DWORD, PVOID, MAT2*);
+	int GetGraphicsMode(HDC);
+	BOOL GetICMProfileA(HDC, DWORD, LPSTR);
+	BOOL GetICMProfileW(HDC, DWORD, LPWSTR);
+	DWORD GetKerningPairsA(HDC, DWORD, LPKERNINGPAIR);
+	DWORD GetKerningPairsW(HDC, DWORD, LPKERNINGPAIR);
+	BOOL GetLogColorSpaceA(HCOLORSPACE, LPLOGCOLORSPACEA, DWORD);
+	BOOL GetLogColorSpaceW(HCOLORSPACE, LPLOGCOLORSPACEW, DWORD);
+	int GetMapMode(HDC);
+	HMETAFILE GetMetaFileA(LPCSTR);
+	HMETAFILE GetMetaFileW(LPCWSTR);
+	UINT GetMetaFileBitsEx(HMETAFILE, UINT, PVOID);
+	int GetMetaRgn(HDC, HRGN);
+	BOOL GetMiterLimit(HDC, PFLOAT);
+	COLORREF GetNearestColor(HDC, COLORREF);
+	UINT GetNearestPaletteIndex(HPALETTE, COLORREF);
+	int GetObjectA(HGDIOBJ, int, PVOID);
+	int GetObjectW(HGDIOBJ, int, PVOID);
+	DWORD GetObjectType(HGDIOBJ);
+	UINT GetOutlineTextMetricsA(HDC, UINT, LPOUTLINETEXTMETRICA);
+	UINT GetOutlineTextMetricsW(HDC, UINT, LPOUTLINETEXTMETRICW);
+	UINT GetPaletteEntries(HPALETTE, UINT, UINT, LPPALETTEENTRY);
+	int GetPath(HDC, LPPOINT, PBYTE, int);
+	COLORREF GetPixel(HDC, int, int);
+	int GetPixelFormat(HDC);
+	int GetPolyFillMode(HDC);
+	BOOL GetRasterizerCaps(LPRASTERIZER_STATUS, UINT);
+	int GetRandomRgn (HDC, HRGN, INT);
+	DWORD GetRegionData(HRGN, DWORD, LPRGNDATA);
+	int GetRgnBox(HRGN, LPRECT);
+	int GetROP2(HDC);
+	HGDIOBJ GetStockObject(int);
+	int GetStretchBltMode(HDC);
+	UINT GetSystemPaletteEntries(HDC, UINT, UINT, LPPALETTEENTRY);
+	UINT GetSystemPaletteUse(HDC);
+	UINT GetTextAlign(HDC);
+	int GetTextCharacterExtra(HDC);
+	int GetTextCharset(HDC);
+	int GetTextCharsetInfo(HDC, LPFONTSIGNATURE, DWORD);
+	COLORREF GetTextColor(HDC);
+	BOOL GetTextExtentExPointA(HDC, LPCSTR, int, int, LPINT, LPINT, LPSIZE);
+	BOOL GetTextExtentExPointW(HDC, LPCWSTR, int, int, LPINT, LPINT, LPSIZE);
+	BOOL GetTextExtentPointA(HDC, LPCSTR, int, LPSIZE);
+	BOOL GetTextExtentPointW(HDC, LPCWSTR, int, LPSIZE);
+	BOOL GetTextExtentPoint32A(HDC, LPCSTR, int, LPSIZE);
+	BOOL GetTextExtentPoint32W(HDC, LPCWSTR, int, LPSIZE);
+	int GetTextFaceA(HDC, int, LPSTR);
+	int GetTextFaceW(HDC, int, LPWSTR);
+	BOOL GetTextMetricsA(HDC, LPTEXTMETRICA);
+	BOOL GetTextMetricsW(HDC, LPTEXTMETRICW);
+	BOOL GetViewportExtEx(HDC, LPSIZE);
+	BOOL GetViewportOrgEx(HDC, LPPOINT);
+	BOOL GetWindowExtEx(HDC, LPSIZE);
+	BOOL GetWindowOrgEx(HDC, LPPOINT);
+	UINT GetWinMetaFileBits(HENHMETAFILE, UINT, LPBYTE, INT, HDC);
+	BOOL GetWorldTransform(HDC, LPXFORM);
+	int IntersectClipRect(HDC, int, int, int, int);
+	BOOL InvertRgn(HDC, HRGN);
+	BOOL LineDDA(int, int, int, int, LINEDDAPROC, LPARAM);
+	BOOL LineTo(HDC, int, int);
+	BOOL LPtoDP(HDC, LPPOINT, int);
+	BOOL MaskBlt(HDC, int, int, int, int, HDC, int, int, HBITMAP, int, int, DWORD);
+	BOOL ModifyWorldTransform(HDC, XFORM*, DWORD);
+	BOOL MoveToEx(HDC, int, int, LPPOINT);
+	int OffsetClipRgn(HDC, int, int);
+	int OffsetRgn(HRGN, int, int);
+	BOOL OffsetViewportOrgEx(HDC, int, int, LPPOINT);
+	BOOL OffsetWindowOrgEx(HDC, int, int, LPPOINT);
+	BOOL PaintRgn(HDC, HRGN);
+	BOOL PatBlt(HDC, int, int, int, int, DWORD);
+	HRGN PathToRegion(HDC);
+	BOOL Pie(HDC, int, int, int, int, int, int, int, int);
+	BOOL PlayEnhMetaFile(HDC, HENHMETAFILE, LPCRECT);
+	BOOL PlayEnhMetaFileRecord(HDC, LPHANDLETABLE, ENHMETARECORD*, UINT);
+	BOOL PlayMetaFile(HDC, HMETAFILE);
+	BOOL PlayMetaFileRecord(HDC, LPHANDLETABLE, LPMETARECORD, UINT);
+	BOOL PlgBlt(HDC, POINT*, HDC, int, int, int, int, HBITMAP, int, int);
+	BOOL PolyBezier(HDC, POINT*, DWORD);
+	BOOL PolyBezierTo(HDC, POINT*, DWORD);
+	BOOL PolyDraw(HDC, POINT*, BYTE*, int);
+	BOOL Polygon(HDC, POINT*, int);
+	BOOL Polyline(HDC, POINT*, int);
+	BOOL PolylineTo(HDC, POINT*, DWORD);
+	BOOL PolyPolygon(HDC, POINT*, INT*, int);
+	BOOL PolyPolyline(HDC, POINT*, DWORD*, DWORD);
+	BOOL PolyTextOutA(HDC, POLYTEXTA*, int);
+	BOOL PolyTextOutW(HDC, POLYTEXTW*, int);
+	BOOL PtInRegion(HRGN, int, int);
+	BOOL PtVisible(HDC, int, int);
+	UINT RealizePalette(HDC);
+	BOOL Rectangle(HDC, int, int, int, int);
+	BOOL RectInRegion(HRGN, LPCRECT);
+	BOOL RectVisible(HDC, LPCRECT);
+	BOOL RemoveFontResourceA(LPCSTR);
+	BOOL RemoveFontResourceW(LPCWSTR);
+
+	HDC ResetDCA(HDC, DEVMODEA*);
+	HDC ResetDCW(HDC, DEVMODEW*);
+	BOOL ResizePalette(HPALETTE, UINT);
+	BOOL RestoreDC(HDC, int);
+	BOOL RoundRect(HDC, int, int, int, int, int, int);
+	int SaveDC(HDC);
+	BOOL ScaleViewportExtEx(HDC, int, int, int, int, LPSIZE);
+	BOOL ScaleWindowExtEx(HDC, int, int, int, int, LPSIZE);
+	BOOL SelectClipPath(HDC, int);
+	int SelectClipRgn(HDC, HRGN);
+	HGDIOBJ SelectObject(HDC, HGDIOBJ);
+	HPALETTE SelectPalette(HDC, HPALETTE, BOOL);
+	int SetAbortProc(HDC, ABORTPROC);
+	int SetArcDirection(HDC, int);
+	LONG SetBitmapBits(HBITMAP, DWORD, PCVOID);
+	BOOL SetBitmapDimensionEx(HBITMAP, int, int, LPSIZE);
+	COLORREF SetBkColor(HDC, COLORREF);
+	int SetBkMode(HDC, int);
+	UINT SetBoundsRect(HDC, LPCRECT, UINT);
+	BOOL SetBrushOrgEx(HDC, int, int, LPPOINT);
+	BOOL SetColorAdjustment(HDC, COLORADJUSTMENT*);
+	BOOL SetColorSpace(HDC, HCOLORSPACE);
+
+	BOOL SetDeviceGammaRamp(HDC, PVOID);
+	UINT SetDIBColorTable(HDC, UINT, UINT, RGBQUAD*);
+	int SetDIBits(HDC, HBITMAP, UINT, UINT, PCVOID, BITMAPINFO*, UINT);
+	int SetDIBitsToDevice(HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, PCVOID, BITMAPINFO*, UINT);
+	HENHMETAFILE SetEnhMetaFileBits(UINT, BYTE*);
+	int SetGraphicsMode(HDC, int);
+	int SetICMMode(HDC, int);
+	BOOL SetICMProfileA(HDC, LPSTR);
+	BOOL SetICMProfileW(HDC, LPWSTR);
+	int SetMapMode(HDC, int);
+
+	static if (WINVER >= 0x0500) {
+		DWORD SetLayout(HDC hdc, DWORD l);
+		DWORD GetLayout(HDC hdc);
+	}
+
+	DWORD SetMapperFlags(HDC, DWORD);
+	HMETAFILE SetMetaFileBitsEx(UINT, BYTE*);
+	int SetMetaRgn(HDC);
+	BOOL SetMiterLimit(HDC, FLOAT, PFLOAT);
+	UINT SetPaletteEntries(HPALETTE, UINT, UINT, PALETTEENTRY*);
+	COLORREF SetPixel(HDC, int, int, COLORREF);
+	BOOL SetPixelFormat(HDC, int, PIXELFORMATDESCRIPTOR*);
+	BOOL SetPixelV(HDC, int, int, COLORREF);
+	int SetPolyFillMode(HDC, int);
+	BOOL SetRectRgn(HRGN, int, int, int, int);
+	int SetROP2(HDC, int);
+	int SetStretchBltMode(HDC, int);
+	UINT SetSystemPaletteUse(HDC, UINT);
+	UINT SetTextAlign(HDC, UINT);
+	int SetTextCharacterExtra(HDC, int);
+	COLORREF SetTextColor(HDC, COLORREF);
+	BOOL SetTextJustification(HDC, int, int);
+	BOOL SetViewportExtEx(HDC, int, int, LPSIZE);
+	BOOL SetViewportOrgEx(HDC, int, int, LPPOINT);
+	BOOL SetWindowExtEx(HDC, int, int, LPSIZE);
+	BOOL SetWindowOrgEx(HDC, int, int, LPPOINT);
+	HENHMETAFILE SetWinMetaFileBits(UINT, BYTE*, HDC, METAFILEPICT*);
+	BOOL SetWorldTransform(HDC, XFORM*);
+	int StartDocA(HDC, DOCINFOA*);
+	int StartDocW(HDC, DOCINFOW*);
+	int StartPage(HDC);
+	BOOL StretchBlt(HDC, int, int, int, int, HDC, int, int, int, int, DWORD);
+	int StretchDIBits(HDC, int, int, int, int, int, int, int, int, VOID* , BITMAPINFO* , UINT, DWORD);
+	BOOL StrokeAndFillPath(HDC);
+	BOOL StrokePath(HDC);
+	BOOL SwapBuffers(HDC);
+	BOOL TextOutA(HDC, int, int, LPCSTR, int);
+	BOOL TextOutW(HDC, int, int, LPCWSTR, int);
+	BOOL TranslateCharsetInfo(PDWORD, LPCHARSETINFO, DWORD);
+	BOOL UnrealizeObject(HGDIOBJ);
+	BOOL UpdateColors(HDC);
+	BOOL UpdateICMRegKeyA(DWORD, DWORD, LPSTR, UINT);
+	BOOL UpdateICMRegKeyW(DWORD, DWORD, LPWSTR, UINT);
+	BOOL WidenPath(HDC);
+	BOOL wglCopyContext(HGLRC, HGLRC, UINT);
+	HGLRC wglCreateContext(HDC);
+	HGLRC wglCreateLayerContext(HDC, int);
+	BOOL wglDeleteContext(HGLRC);
+	BOOL wglDescribeLayerPlane(HDC, int, int, UINT, LPLAYERPLANEDESCRIPTOR);
+	HGLRC wglGetCurrentContext();
+	HDC wglGetCurrentDC();
+	int wglGetLayerPaletteEntries(HDC, int, int, int, COLORREF*);
+	PROC wglGetProcAddress(LPCSTR);
+	BOOL wglMakeCurrent(HDC, HGLRC);
+	BOOL wglRealizeLayerPalette(HDC, int, BOOL);
+	int wglSetLayerPaletteEntries(HDC, int, int, int, COLORREF*);
+	BOOL wglShareLists(HGLRC, HGLRC);
+	BOOL wglSwapLayerBuffers(HDC, UINT);
+	BOOL wglUseFontBitmapsA(HDC, DWORD, DWORD, DWORD);
+	BOOL wglUseFontBitmapsW(HDC, DWORD, DWORD, DWORD);
+	BOOL wglUseFontOutlinesA(HDC, DWORD, DWORD, DWORD, FLOAT, FLOAT, int, LPGLYPHMETRICSFLOAT);
+	BOOL wglUseFontOutlinesW(HDC, DWORD, DWORD, DWORD, FLOAT, FLOAT, int, LPGLYPHMETRICSFLOAT);
+
+	static if (WINVER >= 0x0500) {
+	alias WGLSWAP* PWGLSWAP;
+	struct WGLSWAP {
+		HDC hdc;
+		UINT uiFlags;
+	}
+	const WGL_SWAPMULTIPLE_MAX = 16;
+	DWORD  wglSwapMultipleBuffers(UINT, WGLSWAP*);
+}
+
+static if (WINVER >= 0x0500) {
+		BOOL AlphaBlend(HDC, int, int, int, int, HDC, int, int, int, int, BLENDFUNCTION);
+		BOOL GradientFill(HDC, PTRIVERTEX, ULONG, PVOID, ULONG, ULONG);
+		BOOL TransparentBlt(HDC, int, int, int, int, HDC, int, int, int, int, UINT);
+	}
+
+	static if (_WIN32_WINNT >= 0x0500) {
+		COLORREF SetDCBrushColor(HDC, COLORREF);
+		COLORREF SetDCPenColor(HDC, COLORREF);
+		HANDLE AddFontMemResourceEx(PVOID, DWORD, PVOID, DWORD*);
+		int AddFontResourceExA(LPCSTR, DWORD, PVOID);
+		int AddFontResourceExW(LPCWSTR, DWORD, PVOID);
+		BOOL RemoveFontMemResourceEx(HANDLE);
+		BOOL RemoveFontResourceExA(LPCSTR, DWORD, PVOID);
+		BOOL RemoveFontResourceExW(LPCWSTR, DWORD, PVOID);
+		DWORD GetFontUnicodeRanges(HDC, LPGLYPHSET);
+		DWORD GetGlyphIndicesA(HDC, LPCSTR, int, LPWORD, DWORD);
+		DWORD GetGlyphIndicesW(HDC, LPCWSTR, int, LPWORD, DWORD);
+		BOOL GetTextExtentPointI(HDC, LPWORD, int, LPSIZE);
+		BOOL GetTextExtentExPointI(HDC, LPWORD, int, int, LPINT, LPINT, LPSIZE);
+		BOOL GetCharWidthI(HDC, UINT, UINT, LPWORD, LPINT);
+		BOOL GetCharABCWidthsI(HDC, UINT, UINT, LPWORD, LPABC);
+	}
+} // extern (Windows)
+
+version(Unicode) {
+	alias WCHAR BCHAR;
+	alias DOCINFOW DOCINFO;
+	alias LOGFONTW LOGFONT;
+
+	alias TEXTMETRICW TEXTMETRIC;
+	alias NPTEXTMETRICW NPTEXTMETRIC;
+	alias ICMENUMPROCW ICMENUMPROC;
+	alias FONTENUMPROCW FONTENUMPROC;
+	alias DEVMODEW DEVMODE;
+
+	alias EXTLOGFONTW EXTLOGFONT;
+	alias GCP_RESULTSW GCP_RESULTS;
+	alias OUTLINETEXTMETRICW OUTLINETEXTMETRIC;
+	alias POLYTEXTW POLYTEXT;
+	alias LOGCOLORSPACEW LOGCOLORSPACE;
+	alias NEWTEXTMETRICW NEWTEXTMETRIC;
+	alias NEWTEXTMETRICEXW NEWTEXTMETRICEX;
+	alias ENUMLOGFONTW ENUMLOGFONT;
+	alias ENUMLOGFONTEXW ENUMLOGFONTEX;
+	alias DISPLAY_DEVICEW DISPLAY_DEVICE;
+	alias AddFontResourceW AddFontResource;
+
+	alias CopyEnhMetaFileW CopyEnhMetaFile;
+	alias CopyMetaFileW CopyMetaFile;
+	alias CreateColorSpaceW CreateColorSpace;
+	alias CreateDCW CreateDC;
+	alias CreateEnhMetaFileW CreateEnhMetaFile;
+	alias CreateFontW CreateFont;
+	alias CreateFontIndirectW CreateFontIndirect;
+	alias CreateICW CreateIC;
+	alias CreateMetaFileW CreateMetaFile;
+	alias CreateScalableFontResourceW CreateScalableFontResource;
+	alias DeviceCapabilitiesW DeviceCapabilities;
+	alias EnumFontFamiliesW EnumFontFamilies;
+	alias EnumFontFamiliesExW EnumFontFamiliesEx;
+	alias EnumFontsW EnumFonts;
+	alias EnumICMProfilesW EnumICMProfiles;
+	alias ExtTextOutW ExtTextOut;
+	alias GetCharABCWidthsFloatW GetCharABCWidthsFloat;
+	alias GetCharABCWidthsW GetCharABCWidths;
+	alias GetCharacterPlacementW GetCharacterPlacement;
+	alias GetCharWidth32W GetCharWidth32;
+	alias GetCharWidthFloatW GetCharWidthFloat;
+	alias GetCharWidthW GetCharWidth;
+	alias GetEnhMetaFileW GetEnhMetaFile;
+	alias GetEnhMetaFileDescriptionW GetEnhMetaFileDescription;
+	alias GetGlyphOutlineW GetGlyphOutline;
+	alias GetICMProfileW GetICMProfile;
+	alias GetKerningPairsW GetKerningPairs;
+	alias GetLogColorSpaceW GetLogColorSpace;
+	alias GetMetaFileW GetMetaFile;
+	alias GetObjectW GetObject;
+	alias GetOutlineTextMetricsW GetOutlineTextMetrics;
+	alias GetTextExtentPointW GetTextExtentPoint;
+	alias GetTextExtentExPointW GetTextExtentExPoint;
+	alias GetTextExtentPoint32W GetTextExtentPoint32;
+	alias GetTextFaceW GetTextFace;
+	alias GetTextMetricsW GetTextMetrics;
+	alias PolyTextOutW PolyTextOut;
+	alias RemoveFontResourceW RemoveFontResource;
+
+	alias ResetDCW ResetDC;
+	alias SetICMProfileW SetICMProfile;
+	alias StartDocW StartDoc;
+	alias TextOutW TextOut;
+	alias UpdateICMRegKeyW UpdateICMRegKey;
+	alias wglUseFontBitmapsW wglUseFontBitmaps;
+	alias wglUseFontOutlinesW wglUseFontOutlines;
+	static if (_WIN32_WINNT >= 0x0500) {
+		alias ENUMLOGFONTEXDVW ENUMLOGFONTEXDV;
+		alias PENUMLOGFONTEXDVW PENUMLOGFONTEXDV;
+		alias LPENUMLOGFONTEXDVW LPENUMLOGFONTEXDV;
+		alias AddFontResourceExW AddFontResourceEx;
+		alias RemoveFontResourceExW RemoveFontResourceEx;
+		alias GetGlyphIndicesW GetGlyphIndices;
+	}
+} else { /* non-unicode build */
+	alias BYTE BCHAR;
+	alias DOCINFOA DOCINFO;
+	alias LOGFONTA LOGFONT;
+	alias TEXTMETRICA TEXTMETRIC;
+	alias NPTEXTMETRICA NPTEXTMETRIC;
+	alias ICMENUMPROCA ICMENUMPROC;
+	alias FONTENUMPROCA FONTENUMPROC;
+	alias DEVMODEA DEVMODE;
+	alias EXTLOGFONTA EXTLOGFONT;
+	alias GCP_RESULTSA GCP_RESULTS;
+	alias OUTLINETEXTMETRICA OUTLINETEXTMETRIC;
+	alias POLYTEXTA POLYTEXT;
+	alias LOGCOLORSPACEA LOGCOLORSPACE;
+	alias NEWTEXTMETRICA NEWTEXTMETRIC;
+	alias NEWTEXTMETRICEXA NEWTEXTMETRICEX;
+	alias ENUMLOGFONTA ENUMLOGFONT;
+	alias ENUMLOGFONTEXA ENUMLOGFONTEX;
+	alias DISPLAY_DEVICEA DISPLAY_DEVICE;
+
+	alias AddFontResourceA AddFontResource;
+	alias CopyEnhMetaFileA CopyEnhMetaFile;
+	alias CopyMetaFileA CopyMetaFile;
+	alias CreateColorSpaceA CreateColorSpace;
+	alias CreateDCA CreateDC;
+	alias CreateEnhMetaFileA CreateEnhMetaFile;
+	alias CreateFontA CreateFont;
+	alias CreateFontIndirectA CreateFontIndirect;
+	alias CreateICA CreateIC;
+	alias CreateMetaFileA CreateMetaFile;
+	alias CreateScalableFontResourceA CreateScalableFontResource;
+	alias DeviceCapabilitiesA DeviceCapabilities;
+	alias EnumFontFamiliesA EnumFontFamilies;
+	alias EnumFontFamiliesExA EnumFontFamiliesEx;
+	alias EnumFontsA EnumFonts;
+	alias EnumICMProfilesA EnumICMProfiles;
+	alias ExtTextOutA ExtTextOut;
+	alias GetCharWidthFloatA GetCharWidthFloat;
+	alias GetCharWidthA GetCharWidth;
+	alias GetCharacterPlacementA GetCharacterPlacement;
+	alias GetCharABCWidthsA GetCharABCWidths;
+	alias GetCharABCWidthsFloatA GetCharABCWidthsFloat;
+	alias GetCharWidth32A GetCharWidth32;
+	alias GetEnhMetaFileA GetEnhMetaFile;
+	alias GetEnhMetaFileDescriptionA GetEnhMetaFileDescription;
+	alias GetGlyphOutlineA GetGlyphOutline;
+	alias GetICMProfileA GetICMProfile;
+	alias GetKerningPairsA GetKerningPairs;
+	alias GetLogColorSpaceA GetLogColorSpace;
+	alias GetMetaFileA GetMetaFile;
+	alias GetObjectA GetObject;
+	alias GetOutlineTextMetricsA GetOutlineTextMetrics;
+	alias GetTextExtentPointA GetTextExtentPoint;
+	alias GetTextExtentExPointA GetTextExtentExPoint;
+	alias GetTextExtentPoint32A GetTextExtentPoint32;
+	alias GetTextFaceA GetTextFace;
+	alias GetTextMetricsA GetTextMetrics;
+	alias PolyTextOutA PolyTextOut;
+	alias RemoveFontResourceA RemoveFontResource;
+	alias ResetDCA ResetDC;
+	alias SetICMProfileA SetICMProfile;
+	alias StartDocA StartDoc;
+	alias TextOutA TextOut;
+	alias UpdateICMRegKeyA UpdateICMRegKey;
+	alias wglUseFontBitmapsA wglUseFontBitmaps;
+	alias wglUseFontOutlinesA wglUseFontOutlines;
+	static if (_WIN32_WINNT >= 0x0500) {
+		alias ENUMLOGFONTEXDVA ENUMLOGFONTEXDV;
+		alias PENUMLOGFONTEXDVA PENUMLOGFONTEXDV;
+		alias LPENUMLOGFONTEXDVA LPENUMLOGFONTEXDV;
+		alias AddFontResourceExA AddFontResourceEx;
+		alias RemoveFontResourceExA RemoveFontResourceEx;
+		alias GetGlyphIndicesA GetGlyphIndices;
+	}
+}
+
+// Common to both ASCII & UNICODE
+alias DOCINFO* LPDOCINFO;
+alias LOGFONT* PLOGFONT, NPLOGFONT, LPLOGFONT;
+alias TEXTMETRIC* PTEXTMETRIC, LPTEXTMETRIC;
+alias DEVMODE* PDEVMODE, NPDEVMODE, LPDEVMODE;
+alias EXTLOGFONT* PEXTLOGFONT, NPEXTLOGFONT, LPEXTLOGFONT;
+alias GCP_RESULTS* LPGCP_RESULTS;
+alias OUTLINETEXTMETRIC* POUTLINETEXTMETRIC, NPOUTLINETEXTMETRIC, LPOUTLINETEXTMETRIC;
+alias POLYTEXT* PPOLYTEXT, NPPOLYTEXT, LPPOLYTEXT;
+alias LOGCOLORSPACE* LPLOGCOLORSPACE;
+alias NEWTEXTMETRIC* PNEWTEXTMETRIC, NPNEWTEXTMETRIC, LPNEWTEXTMETRIC;
+alias ENUMLOGFONT* LPENUMLOGFONT;
+alias ENUMLOGFONTEX* LPENUMLOGFONTEX;
+alias DISPLAY_DEVICE* PDISPLAY_DEVICE, LPDISPLAY_DEVICE;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/wininet.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,1241 @@
+/***********************************************************************\
+*                               wininet.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.wininet;
+
+// FIXME: check types and grouping of constants
+
+import win32.windows;
+
+enum {
+	INTERNET_INVALID_PORT_NUMBER =    0,
+	INTERNET_DEFAULT_FTP_PORT    =   21,
+	INTERNET_DEFAULT_GOPHER_PORT =   70,
+	INTERNET_DEFAULT_HTTP_PORT   =   80,
+	INTERNET_DEFAULT_HTTPS_PORT  =  443,
+	INTERNET_DEFAULT_SOCKS_PORT  = 1080
+}
+
+const size_t
+	MAX_CACHE_ENTRY_INFO_SIZE       =  4096,
+	INTERNET_MAX_HOST_NAME_LENGTH   =   256,
+	INTERNET_MAX_USER_NAME_LENGTH   =   128,
+	INTERNET_MAX_PASSWORD_LENGTH    =   128,
+	INTERNET_MAX_PORT_NUMBER_LENGTH =     5,
+	INTERNET_MAX_PORT_NUMBER_VALUE  = 65535,
+	INTERNET_MAX_PATH_LENGTH        =  2048,
+	INTERNET_MAX_SCHEME_LENGTH      =    32,
+	INTERNET_MAX_URL_LENGTH         = INTERNET_MAX_SCHEME_LENGTH
+	                                  + "://".length
+	                                  + INTERNET_MAX_PATH_LENGTH;
+
+enum : DWORD {
+	INTERNET_KEEP_ALIVE_UNKNOWN  = DWORD.max,
+	INTERNET_KEEP_ALIVE_DISABLED = 0,
+	INTERNET_KEEP_ALIVE_ENABLED
+}
+
+enum {
+	INTERNET_REQFLAG_FROM_CACHE = 1,
+	INTERNET_REQFLAG_ASYNC      = 2
+}
+
+const DWORD
+	INTERNET_FLAG_RELOAD                   = 0x80000000,
+	INTERNET_FLAG_RAW_DATA                 = 0x40000000,
+	INTERNET_FLAG_EXISTING_CONNECT         = 0x20000000,
+	INTERNET_FLAG_ASYNC                    = 0x10000000,
+	INTERNET_FLAG_PASSIVE                  = 0x08000000,
+	INTERNET_FLAG_NO_CACHE_WRITE           = 0x04000000,
+	INTERNET_FLAG_DONT_CACHE               = INTERNET_FLAG_NO_CACHE_WRITE,
+	INTERNET_FLAG_MAKE_PERSISTENT          = 0x02000000,
+	INTERNET_FLAG_OFFLINE                  = 0x01000000,
+	INTERNET_FLAG_SECURE                   = 0x00800000,
+	INTERNET_FLAG_KEEP_CONNECTION          = 0x00400000,
+	INTERNET_FLAG_NO_AUTO_REDIRECT         = 0x00200000,
+	INTERNET_FLAG_READ_PREFETCH            = 0x00100000,
+	INTERNET_FLAG_NO_COOKIES               = 0x00080000,
+	INTERNET_FLAG_NO_AUTH                  = 0x00040000,
+	INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP  = 0x00008000,
+	INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS = 0x00004000,
+	INTERNET_FLAG_IGNORE_CERT_DATE_INVALID = 0x00002000,
+	INTERNET_FLAG_IGNORE_CERT_CN_INVALID   = 0x00001000,
+	INTERNET_FLAG_RESYNCHRONIZE            = 0x00000800,
+	INTERNET_FLAG_HYPERLINK                = 0x00000400,
+	INTERNET_FLAG_NO_UI                    = 0x00000200,
+	INTERNET_FLAG_PRAGMA_NOCACHE           = 0x00000100,
+	INTERNET_FLAG_MUST_CACHE_REQUEST       = 0x00000010,
+	INTERNET_FLAG_TRANSFER_ASCII           = FTP_TRANSFER_TYPE_ASCII,
+	INTERNET_FLAG_TRANSFER_BINARY          = FTP_TRANSFER_TYPE_BINARY,
+
+	SECURITY_INTERNET_MASK                 = 0x0000F000,
+	SECURITY_SET_MASK                      = SECURITY_INTERNET_MASK,
+
+	INTERNET_FLAGS_MASK                    = 0xFFFCFE13,
+	INTERNET_OPTIONS_MASK                  = ~INTERNET_FLAGS_MASK;
+
+const INTERNET_NO_CALLBACK = 0;
+const INTERNET_RFC1123_FORMAT = 0;
+const size_t INTERNET_RFC1123_BUFSIZE = 30;
+
+const DWORD
+	ICU_ESCAPE             = 0x80000000,
+	ICU_USERNAME           = 0x40000000,
+	ICU_NO_ENCODE          = 0x20000000,
+	ICU_DECODE             = 0x10000000,
+	ICU_NO_META            = 0x08000000,
+	ICU_ENCODE_SPACES_ONLY = 0x04000000,
+	ICU_BROWSER_MODE       = 0x02000000;
+
+enum {
+	INTERNET_OPEN_TYPE_PRECONFIG = 0,
+	INTERNET_OPEN_TYPE_DIRECT    = 1,
+	INTERNET_OPEN_TYPE_PROXY     = 3,
+	PRE_CONFIG_INTERNET_ACCESS   = INTERNET_OPEN_TYPE_PRECONFIG,
+	LOCAL_INTERNET_ACCESS        = INTERNET_OPEN_TYPE_DIRECT,
+	GATEWAY_INTERNET_ACCESS      = 2,
+	CERN_PROXY_INTERNET_ACCESS   = INTERNET_OPEN_TYPE_PROXY,
+}
+
+const ISO_GLOBAL      = 1;
+const ISO_REGISTRY    = 2;
+const ISO_VALID_FLAGS = ISO_GLOBAL | ISO_REGISTRY;
+
+enum {
+	INTERNET_OPTION_CALLBACK                    =  1,
+	INTERNET_OPTION_CONNECT_TIMEOUT,
+	INTERNET_OPTION_CONNECT_RETRIES,
+	INTERNET_OPTION_CONNECT_BACKOFF,
+	INTERNET_OPTION_SEND_TIMEOUT,
+	INTERNET_OPTION_CONTROL_SEND_TIMEOUT        = INTERNET_OPTION_SEND_TIMEOUT,
+	INTERNET_OPTION_RECEIVE_TIMEOUT,
+	INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT  = INTERNET_OPTION_RECEIVE_TIMEOUT,
+	INTERNET_OPTION_DATA_SEND_TIMEOUT,
+	INTERNET_OPTION_DATA_RECEIVE_TIMEOUT,
+	INTERNET_OPTION_HANDLE_TYPE,
+	INTERNET_OPTION_CONTEXT_VALUE,
+	INTERNET_OPTION_LISTEN_TIMEOUT,
+	INTERNET_OPTION_READ_BUFFER_SIZE,
+	INTERNET_OPTION_WRITE_BUFFER_SIZE,       // = 13
+	INTERNET_OPTION_ASYNC_ID                    = 15,
+	INTERNET_OPTION_ASYNC_PRIORITY,          // = 16
+	INTERNET_OPTION_PARENT_HANDLE               = 21,
+	INTERNET_OPTION_KEEP_CONNECTION,
+	INTERNET_OPTION_REQUEST_FLAGS,
+	INTERNET_OPTION_EXTENDED_ERROR,          // = 24
+	INTERNET_OPTION_OFFLINE_MODE                = 26,
+	INTERNET_OPTION_CACHE_STREAM_HANDLE,
+	INTERNET_OPTION_USERNAME,
+	INTERNET_OPTION_PASSWORD,
+	INTERNET_OPTION_ASYNC,
+	INTERNET_OPTION_SECURITY_FLAGS,
+	INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT,
+	INTERNET_OPTION_DATAFILE_NAME,
+	INTERNET_OPTION_URL,
+	INTERNET_OPTION_SECURITY_CERTIFICATE,
+	INTERNET_OPTION_SECURITY_KEY_BITNESS,
+	INTERNET_OPTION_REFRESH,
+	INTERNET_OPTION_PROXY,
+	INTERNET_OPTION_SETTINGS_CHANGED,
+	INTERNET_OPTION_VERSION,
+	INTERNET_OPTION_USER_AGENT,
+	INTERNET_OPTION_END_BROWSER_SESSION,
+	INTERNET_OPTION_PROXY_USERNAME,
+	INTERNET_OPTION_PROXY_PASSWORD,          // = 44
+	INTERNET_FIRST_OPTION                       = INTERNET_OPTION_CALLBACK,
+	// why?
+	INTERNET_LAST_OPTION                        = INTERNET_OPTION_USER_AGENT
+}
+
+const INTERNET_PRIORITY_FOREGROUND = 1000;
+
+enum {
+	INTERNET_HANDLE_TYPE_INTERNET = 1,
+	INTERNET_HANDLE_TYPE_CONNECT_FTP,
+	INTERNET_HANDLE_TYPE_CONNECT_GOPHER,
+	INTERNET_HANDLE_TYPE_CONNECT_HTTP,
+	INTERNET_HANDLE_TYPE_FTP_FIND,
+	INTERNET_HANDLE_TYPE_FTP_FIND_HTML,
+	INTERNET_HANDLE_TYPE_FTP_FILE,
+	INTERNET_HANDLE_TYPE_FTP_FILE_HTML,
+	INTERNET_HANDLE_TYPE_GOPHER_FIND,
+	INTERNET_HANDLE_TYPE_GOPHER_FIND_HTML,
+	INTERNET_HANDLE_TYPE_GOPHER_FILE,
+	INTERNET_HANDLE_TYPE_GOPHER_FILE_HTML,
+	INTERNET_HANDLE_TYPE_HTTP_REQUEST
+}
+
+const DWORD
+	SECURITY_FLAG_SECURE                   = 0x00000001,
+	SECURITY_FLAG_SSL                      = 0x00000002,
+	SECURITY_FLAG_SSL3                     = 0x00000004,
+	SECURITY_FLAG_PCT                      = 0x00000008,
+	SECURITY_FLAG_PCT4                     = 0x00000010,
+	SECURITY_FLAG_IETFSSL4                 = 0x00000020,
+	SECURITY_FLAG_IGNORE_REVOCATION        = 0x00000080,
+	SECURITY_FLAG_IGNORE_UNKNOWN_CA        = 0x00000100,
+	SECURITY_FLAG_IGNORE_WRONG_USAGE       = 0x00000200,
+	SECURITY_FLAG_40BIT                    = 0x10000000,
+	SECURITY_FLAG_128BIT                   = 0x20000000,
+	SECURITY_FLAG_56BIT                    = 0x40000000,
+	SECURITY_FLAG_UNKNOWNBIT               = 0x80000000,
+	SECURITY_FLAG_NORMALBITNESS            = SECURITY_FLAG_40BIT,
+	SECURITY_FLAG_IGNORE_CERT_CN_INVALID   = INTERNET_FLAG_IGNORE_CERT_CN_INVALID,
+	SECURITY_FLAG_IGNORE_CERT_DATE_INVALID = INTERNET_FLAG_IGNORE_CERT_DATE_INVALID,
+	SECURITY_FLAG_IGNORE_REDIRECT_TO_HTTPS = INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS,
+	SECURITY_FLAG_IGNORE_REDIRECT_TO_HTTP  = INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP;
+
+enum {
+	INTERNET_SERVICE_FTP = 1,
+	INTERNET_SERVICE_GOPHER,
+	INTERNET_SERVICE_HTTP
+}
+
+enum {
+	INTERNET_STATUS_RESOLVING_NAME        =  10,
+	INTERNET_STATUS_NAME_RESOLVED         =  11,
+	INTERNET_STATUS_CONNECTING_TO_SERVER  =  20,
+	INTERNET_STATUS_CONNECTED_TO_SERVER   =  21,
+	INTERNET_STATUS_SENDING_REQUEST       =  30,
+	INTERNET_STATUS_REQUEST_SENT          =  31,
+	INTERNET_STATUS_RECEIVING_RESPONSE    =  40,
+	INTERNET_STATUS_RESPONSE_RECEIVED     =  41,
+	INTERNET_STATUS_CTL_RESPONSE_RECEIVED =  42,
+	INTERNET_STATUS_PREFETCH              =  43,
+	INTERNET_STATUS_CLOSING_CONNECTION    =  50,
+	INTERNET_STATUS_CONNECTION_CLOSED     =  51,
+	INTERNET_STATUS_HANDLE_CREATED        =  60,
+	INTERNET_STATUS_HANDLE_CLOSING        =  70,
+	INTERNET_STATUS_REQUEST_COMPLETE      = 100,
+	INTERNET_STATUS_REDIRECT              = 110
+}
+
+const INTERNET_INVALID_STATUS_CALLBACK
+  = cast(INTERNET_STATUS_CALLBACK) -1;
+
+enum {
+	FTP_TRANSFER_TYPE_UNKNOWN = 0,
+	FTP_TRANSFER_TYPE_ASCII   = 1,
+	FTP_TRANSFER_TYPE_BINARY  = 2,
+	FTP_TRANSFER_TYPE_MASK    = 3
+}
+
+const size_t
+	MAX_GOPHER_DISPLAY_TEXT   = 128,
+	MAX_GOPHER_SELECTOR_TEXT  = 256,
+	MAX_GOPHER_HOST_NAME      = INTERNET_MAX_HOST_NAME_LENGTH,
+	MAX_GOPHER_LOCATOR_LENGTH
+	  = 1 + MAX_GOPHER_DISPLAY_TEXT + 1 + MAX_GOPHER_SELECTOR_TEXT + 1
+	    + MAX_GOPHER_HOST_NAME + 1 + INTERNET_MAX_PORT_NUMBER_LENGTH + 4;
+
+const DWORD
+	GOPHER_TYPE_TEXT_FILE      = 0x00000001,
+	GOPHER_TYPE_DIRECTORY      = 0x00000002,
+	GOPHER_TYPE_CSO            = 0x00000004,
+	GOPHER_TYPE_ERROR          = 0x00000008,
+	GOPHER_TYPE_MAC_BINHEX     = 0x00000010,
+	GOPHER_TYPE_DOS_ARCHIVE    = 0x00000020,
+	GOPHER_TYPE_UNIX_UUENCODED = 0x00000040,
+	GOPHER_TYPE_INDEX_SERVER   = 0x00000080,
+	GOPHER_TYPE_TELNET         = 0x00000100,
+	GOPHER_TYPE_BINARY         = 0x00000200,
+	GOPHER_TYPE_REDUNDANT      = 0x00000400,
+	GOPHER_TYPE_TN3270         = 0x00000800,
+	GOPHER_TYPE_GIF            = 0x00001000,
+	GOPHER_TYPE_IMAGE          = 0x00002000,
+	GOPHER_TYPE_BITMAP         = 0x00004000,
+	GOPHER_TYPE_MOVIE          = 0x00008000,
+	GOPHER_TYPE_SOUND          = 0x00010000,
+	GOPHER_TYPE_HTML           = 0x00020000,
+	GOPHER_TYPE_PDF            = 0x00040000,
+	GOPHER_TYPE_CALENDAR       = 0x00080000,
+	GOPHER_TYPE_INLINE         = 0x00100000,
+	GOPHER_TYPE_UNKNOWN        = 0x20000000,
+	GOPHER_TYPE_ASK            = 0x40000000,
+	GOPHER_TYPE_GOPHER_PLUS    = 0x80000000,
+	GOPHER_TYPE_FILE_MASK      = 0x001FF271;
+
+BOOL IS_GOPHER_FILE(DWORD t) {
+	return !!(t & GOPHER_TYPE_FILE_MASK);
+}
+
+BOOL IS_GOPHER_DIRECTORY(DWORD t) {
+	return !!(t & GOPHER_TYPE_DIRECTORY);
+}
+
+BOOL IS_GOPHER_PHONE_SERVER(DWORD t) {
+	return !!(t & GOPHER_TYPE_CSO);
+}
+
+BOOL IS_GOPHER_ERROR(DWORD t) {
+	return !!(t & GOPHER_TYPE_ERROR);
+}
+
+BOOL IS_GOPHER_INDEX_SERVER(DWORD t) {
+	return !!(t & GOPHER_TYPE_INDEX_SERVER);
+}
+
+BOOL IS_GOPHER_TELNET_SESSION(DWORD t) {
+	return !!(t & GOPHER_TYPE_TELNET);
+}
+
+BOOL IS_GOPHER_BACKUP_SERVER(DWORD t) {
+	return !!(t & GOPHER_TYPE_REDUNDANT);
+}
+
+BOOL IS_GOPHER_TN3270_SESSION(DWORD t) {
+	return !!(t & GOPHER_TYPE_TN3270);
+}
+
+BOOL IS_GOPHER_ASK(DWORD t) {
+	return !!(t & GOPHER_TYPE_ASK);
+}
+
+BOOL IS_GOPHER_PLUS(DWORD t) {
+	return !!(t & GOPHER_TYPE_GOPHER_PLUS);
+}
+
+BOOL IS_GOPHER_TYPE_KNOWN(DWORD t) {
+	return !(t & GOPHER_TYPE_UNKNOWN);
+}
+
+const size_t
+	MAX_GOPHER_CATEGORY_NAME    = 128,
+	MAX_GOPHER_ATTRIBUTE_NAME   = 128,
+	MIN_GOPHER_ATTRIBUTE_LENGTH = 256;
+
+const TCHAR[]
+	GOPHER_INFO_CATEGORY      = "+INFO",
+	GOPHER_ADMIN_CATEGORY     = "+ADMIN",
+	GOPHER_VIEWS_CATEGORY     = "+VIEWS",
+	GOPHER_ABSTRACT_CATEGORY  = "+ABSTRACT",
+	GOPHER_VERONICA_CATEGORY  = "+VERONICA",
+	GOPHER_ADMIN_ATTRIBUTE    = "Admin",
+	GOPHER_MOD_DATE_ATTRIBUTE = "Mod-Date",
+	GOPHER_TTL_ATTRIBUTE      = "TTL",
+	GOPHER_SCORE_ATTRIBUTE    = "Score",
+	GOPHER_RANGE_ATTRIBUTE    = "Score-range",
+	GOPHER_SITE_ATTRIBUTE     = "Site",
+	GOPHER_ORG_ATTRIBUTE      = "Org",
+	GOPHER_LOCATION_ATTRIBUTE = "Loc",
+	GOPHER_GEOG_ATTRIBUTE     = "Geog",
+	GOPHER_TIMEZONE_ATTRIBUTE = "TZ",
+	GOPHER_PROVIDER_ATTRIBUTE = "Provider",
+	GOPHER_VERSION_ATTRIBUTE  = "Version",
+	GOPHER_ABSTRACT_ATTRIBUTE = "Abstract",
+	GOPHER_VIEW_ATTRIBUTE     = "View",
+	GOPHER_TREEWALK_ATTRIBUTE = "treewalk";
+
+enum : DWORD {
+	GOPHER_ATTRIBUTE_ID_BASE = 0xABCCCC00,
+	GOPHER_CATEGORY_ID_ALL,
+	GOPHER_CATEGORY_ID_INFO,
+	GOPHER_CATEGORY_ID_ADMIN,
+	GOPHER_CATEGORY_ID_VIEWS,
+	GOPHER_CATEGORY_ID_ABSTRACT,
+	GOPHER_CATEGORY_ID_VERONICA,
+	GOPHER_CATEGORY_ID_ASK,
+	GOPHER_CATEGORY_ID_UNKNOWN,
+	GOPHER_ATTRIBUTE_ID_ALL,
+	GOPHER_ATTRIBUTE_ID_ADMIN,
+	GOPHER_ATTRIBUTE_ID_MOD_DATE,
+	GOPHER_ATTRIBUTE_ID_TTL,
+	GOPHER_ATTRIBUTE_ID_SCORE,
+	GOPHER_ATTRIBUTE_ID_RANGE,
+	GOPHER_ATTRIBUTE_ID_SITE,
+	GOPHER_ATTRIBUTE_ID_ORG,
+	GOPHER_ATTRIBUTE_ID_LOCATION,
+	GOPHER_ATTRIBUTE_ID_GEOG,
+	GOPHER_ATTRIBUTE_ID_TIMEZONE,
+	GOPHER_ATTRIBUTE_ID_PROVIDER,
+	GOPHER_ATTRIBUTE_ID_VERSION,
+	GOPHER_ATTRIBUTE_ID_ABSTRACT,
+	GOPHER_ATTRIBUTE_ID_VIEW,
+	GOPHER_ATTRIBUTE_ID_TREEWALK,
+	GOPHER_ATTRIBUTE_ID_UNKNOWN
+}
+
+const HTTP_MAJOR_VERSION   = 1;
+const HTTP_MINOR_VERSION   = 0;
+const TCHAR[] HTTP_VERSION = "HTTP/1.0";
+
+enum : DWORD {
+	HTTP_QUERY_MIME_VERSION,
+	HTTP_QUERY_CONTENT_TYPE,
+	HTTP_QUERY_CONTENT_TRANSFER_ENCODING,
+	HTTP_QUERY_CONTENT_ID,
+	HTTP_QUERY_CONTENT_DESCRIPTION,
+	HTTP_QUERY_CONTENT_LENGTH,
+	HTTP_QUERY_CONTENT_LANGUAGE,
+	HTTP_QUERY_ALLOW,
+	HTTP_QUERY_PUBLIC,
+	HTTP_QUERY_DATE,
+	HTTP_QUERY_EXPIRES,
+	HTTP_QUERY_LAST_MODIFIED,
+	HTTP_QUERY_MESSAGE_ID,
+	HTTP_QUERY_URI,
+	HTTP_QUERY_DERIVED_FROM,
+	HTTP_QUERY_COST,
+	HTTP_QUERY_LINK,
+	HTTP_QUERY_PRAGMA,
+	HTTP_QUERY_VERSION,
+	HTTP_QUERY_STATUS_CODE,
+	HTTP_QUERY_STATUS_TEXT,
+	HTTP_QUERY_RAW_HEADERS,
+	HTTP_QUERY_RAW_HEADERS_CRLF,
+	HTTP_QUERY_CONNECTION,
+	HTTP_QUERY_ACCEPT,
+	HTTP_QUERY_ACCEPT_CHARSET,
+	HTTP_QUERY_ACCEPT_ENCODING,
+	HTTP_QUERY_ACCEPT_LANGUAGE,
+	HTTP_QUERY_AUTHORIZATION,
+	HTTP_QUERY_CONTENT_ENCODING,
+	HTTP_QUERY_FORWARDED,
+	HTTP_QUERY_FROM,
+	HTTP_QUERY_IF_MODIFIED_SINCE,
+	HTTP_QUERY_LOCATION,
+	HTTP_QUERY_ORIG_URI,
+	HTTP_QUERY_REFERER,
+	HTTP_QUERY_RETRY_AFTER,
+	HTTP_QUERY_SERVER,
+	HTTP_QUERY_TITLE,
+	HTTP_QUERY_USER_AGENT,
+	HTTP_QUERY_WWW_AUTHENTICATE,
+	HTTP_QUERY_PROXY_AUTHENTICATE,
+	HTTP_QUERY_ACCEPT_RANGES,
+	HTTP_QUERY_SET_COOKIE,
+	HTTP_QUERY_COOKIE,
+	HTTP_QUERY_REQUEST_METHOD,
+	HTTP_QUERY_MAX    = 45,
+	HTTP_QUERY_CUSTOM = 65535
+}
+
+const DWORD
+	HTTP_QUERY_FLAG_REQUEST_HEADERS = 0x80000000,
+	HTTP_QUERY_FLAG_SYSTEMTIME      = 0x40000000,
+	HTTP_QUERY_FLAG_NUMBER          = 0x20000000,
+	HTTP_QUERY_FLAG_COALESCE        = 0x10000000,
+	HTTP_QUERY_MODIFIER_FLAGS_MASK  = 0xF0000000,
+	HTTP_QUERY_HEADER_MASK          = ~HTTP_QUERY_MODIFIER_FLAGS_MASK;
+
+enum {
+	HTTP_STATUS_OK                 = 200,
+	HTTP_STATUS_CREATED,
+	HTTP_STATUS_ACCEPTED,
+	HTTP_STATUS_PARTIAL,
+	HTTP_STATUS_NO_CONTENT,     // = 204
+	HTTP_STATUS_AMBIGUOUS          = 300,
+	HTTP_STATUS_MOVED,
+	HTTP_STATUS_REDIRECT,
+	HTTP_STATUS_REDIRECT_METHOD,
+	HTTP_STATUS_NOT_MODIFIED,   // = 304
+	HTTP_STATUS_BAD_REQUEST        = 400,
+	HTTP_STATUS_DENIED,
+	HTTP_STATUS_PAYMENT_REQ,
+	HTTP_STATUS_FORBIDDEN,
+	HTTP_STATUS_NOT_FOUND,
+	HTTP_STATUS_BAD_METHOD,
+	HTTP_STATUS_NONE_ACCEPTABLE,
+	HTTP_STATUS_PROXY_AUTH_REQ,
+	HTTP_STATUS_REQUEST_TIMEOUT,
+	HTTP_STATUS_CONFLICT,
+	HTTP_STATUS_GONE,
+	HTTP_STATUS_AUTH_REFUSED,   // = 411
+	HTTP_STATUS_SERVER_ERROR       = 500,
+	HTTP_STATUS_NOT_SUPPORTED,
+	HTTP_STATUS_BAD_GATEWAY,
+	HTTP_STATUS_SERVICE_UNAVAIL,
+	HTTP_STATUS_GATEWAY_TIMEOUT // = 504
+}
+
+enum {
+	INTERNET_PREFETCH_PROGRESS,
+	INTERNET_PREFETCH_COMPLETE,
+	INTERNET_PREFETCH_ABORTED
+}
+
+const FLAGS_ERROR_UI_FILTER_FOR_ERRORS    = 0x01;
+const FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS = 0x02;
+const FLAGS_ERROR_UI_FLAGS_GENERATE_DATA  = 0x04;
+const FLAGS_ERROR_UI_FLAGS_NO_UI          = 0x08;
+
+const DWORD
+	HTTP_ADDREQ_INDEX_MASK                   = 0x0000FFFF,
+	HTTP_ADDREQ_FLAGS_MASK                   = 0xFFFF0000,
+	HTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON = 0x01000000,
+	HTTP_ADDREQ_FLAG_ADD_IF_NEW              = 0x10000000,
+	HTTP_ADDREQ_FLAG_ADD                     = 0x20000000,
+	HTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA     = 0x40000000,
+	HTTP_ADDREQ_FLAG_COALESCE          = HTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA,
+	HTTP_ADDREQ_FLAG_REPLACE                 = 0x80000000;
+
+enum {
+	INTERNET_ERROR_BASE                       = 12000,
+	ERROR_INTERNET_OUT_OF_HANDLES,
+	ERROR_INTERNET_TIMEOUT,
+	ERROR_INTERNET_EXTENDED_ERROR,
+	ERROR_INTERNET_INTERNAL_ERROR,
+	ERROR_INTERNET_INVALID_URL,
+	ERROR_INTERNET_UNRECOGNIZED_SCHEME,
+	ERROR_INTERNET_NAME_NOT_RESOLVED,
+	ERROR_INTERNET_PROTOCOL_NOT_FOUND,
+	ERROR_INTERNET_INVALID_OPTION,
+	ERROR_INTERNET_BAD_OPTION_LENGTH,
+	ERROR_INTERNET_OPTION_NOT_SETTABLE,
+	ERROR_INTERNET_SHUTDOWN,
+	ERROR_INTERNET_INCORRECT_USER_NAME,
+	ERROR_INTERNET_INCORRECT_PASSWORD,
+	ERROR_INTERNET_LOGIN_FAILURE,
+	ERROR_INTERNET_INVALID_OPERATION,
+	ERROR_INTERNET_OPERATION_CANCELLED,
+	ERROR_INTERNET_INCORRECT_HANDLE_TYPE,
+	ERROR_INTERNET_INCORRECT_HANDLE_STATE,
+	ERROR_INTERNET_NOT_PROXY_REQUEST,
+	ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND,
+	ERROR_INTERNET_BAD_REGISTRY_PARAMETER,
+	ERROR_INTERNET_NO_DIRECT_ACCESS,
+	ERROR_INTERNET_NO_CONTEXT,
+	ERROR_INTERNET_NO_CALLBACK,
+	ERROR_INTERNET_REQUEST_PENDING,
+	ERROR_INTERNET_INCORRECT_FORMAT,
+	ERROR_INTERNET_ITEM_NOT_FOUND,
+	ERROR_INTERNET_CANNOT_CONNECT,
+	ERROR_INTERNET_CONNECTION_ABORTED,
+	ERROR_INTERNET_CONNECTION_RESET,
+	ERROR_INTERNET_FORCE_RETRY,
+	ERROR_INTERNET_INVALID_PROXY_REQUEST,
+	ERROR_INTERNET_NEED_UI,                // = INTERNET_ERROR_BASE +  34
+	ERROR_INTERNET_HANDLE_EXISTS              = INTERNET_ERROR_BASE +  36,
+	ERROR_INTERNET_SEC_CERT_DATE_INVALID,
+	ERROR_INTERNET_SEC_CERT_CN_INVALID,
+	ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR,
+	ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR,
+	ERROR_INTERNET_MIXED_SECURITY,
+	ERROR_INTERNET_CHG_POST_IS_NON_SECURE,
+	ERROR_INTERNET_POST_IS_NON_SECURE,
+	ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED,
+	ERROR_INTERNET_INVALID_CA,
+	ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP,
+	ERROR_INTERNET_ASYNC_THREAD_FAILED,
+	ERROR_INTERNET_REDIRECT_SCHEME_CHANGE, // = INTERNET_ERROR_BASE +  48
+
+	ERROR_FTP_TRANSFER_IN_PROGRESS            = INTERNET_ERROR_BASE + 110,
+	ERROR_FTP_DROPPED,                     // = INTERNET_ERROR_BASE + 111
+	ERROR_GOPHER_PROTOCOL_ERROR               = INTERNET_ERROR_BASE + 130,
+	ERROR_GOPHER_NOT_FILE,
+	ERROR_GOPHER_DATA_ERROR,
+	ERROR_GOPHER_END_OF_DATA,
+	ERROR_GOPHER_INVALID_LOCATOR,
+	ERROR_GOPHER_INCORRECT_LOCATOR_TYPE,
+	ERROR_GOPHER_NOT_GOPHER_PLUS,
+	ERROR_GOPHER_ATTRIBUTE_NOT_FOUND,
+	ERROR_GOPHER_UNKNOWN_LOCATOR,          // = INTERNET_ERROR_BASE + 138,
+	ERROR_HTTP_HEADER_NOT_FOUND               = INTERNET_ERROR_BASE + 150,
+	ERROR_HTTP_DOWNLEVEL_SERVER,
+	ERROR_HTTP_INVALID_SERVER_RESPONSE,
+	ERROR_HTTP_INVALID_HEADER,
+	ERROR_HTTP_INVALID_QUERY_REQUEST,
+	ERROR_HTTP_HEADER_ALREADY_EXISTS,
+	ERROR_HTTP_REDIRECT_FAILED,
+	ERROR_INTERNET_SECURITY_CHANNEL_ERROR,
+	ERROR_INTERNET_UNABLE_TO_CACHE_FILE,
+	ERROR_INTERNET_TCPIP_NOT_INSTALLED,
+	ERROR_HTTP_NOT_REDIRECTED,             // = INTERNET_ERROR_BASE + 160
+	// why?
+	INTERNET_ERROR_LAST                  = ERROR_INTERNET_TCPIP_NOT_INSTALLED
+}
+
+
+const NORMAL_CACHE_ENTRY     = 0x000001;
+const STABLE_CACHE_ENTRY     = 0x000002;
+const STICKY_CACHE_ENTRY     = 0x000004;
+const SPARSE_CACHE_ENTRY     = 0x010000;
+const OCX_CACHE_ENTRY        = 0x020000;
+const COOKIE_CACHE_ENTRY     = 0x100000;
+const URLHISTORY_CACHE_ENTRY = 0x200000;
+
+const CACHE_ENTRY_ATTRIBUTE_FC  = 0x0004;
+const CACHE_ENTRY_HITRATE_FC    = 0x0010;
+const CACHE_ENTRY_MODTIME_FC    = 0x0040;
+const CACHE_ENTRY_EXPTIME_FC    = 0x0080;
+const CACHE_ENTRY_ACCTIME_FC    = 0x0100;
+const CACHE_ENTRY_SYNCTIME_FC   = 0x0200;
+const CACHE_ENTRY_HEADERINFO_FC = 0x0400;
+
+enum {
+	WININET_API_FLAG_ASYNC       = 1,
+	WININET_API_FLAG_SYNC        = 4,
+	WININET_API_FLAG_USE_CONTEXT = 8
+}
+
+// FIXME: how should these really be grouped?
+enum {
+	IRF_ASYNC       = WININET_API_FLAG_ASYNC,
+	IRF_SYNC        = WININET_API_FLAG_SYNC,
+	IRF_USE_CONTEXT = WININET_API_FLAG_USE_CONTEXT,
+}
+const IRF_NO_WAIT = 8;
+
+enum {
+	HSR_ASYNC = WININET_API_FLAG_ASYNC,
+	HSR_SYNC = WININET_API_FLAG_SYNC,
+	HSR_USE_CONTEXT = WININET_API_FLAG_USE_CONTEXT,
+}
+
+const HSR_INITIATE =  8;
+const HSR_DOWNLOAD = 16;
+const HSR_CHUNKED  = 32;
+
+const INTERNET_DIAL_UNATTENDED              = 0x8000;
+const INTERNET_DIALSTATE_DISCONNECTED       = 1;
+const INTERENT_GOONLINE_REFRESH             = 1;
+const INTERENT_GOONLINE_MASK                = 1;
+const INTERNET_AUTODIAL_FORCE_ONLINE        = 1;
+const INTERNET_AUTODIAL_FORCE_UNATTENDED    = 2;
+const INTERNET_AUTODIAL_FAILIFSECURITYCHECK = 4;
+const INTERNET_CONNECTION_MODEM             = 0x01;
+const INTERNET_CONNECTION_LAN               = 0x02;
+const INTERNET_CONNECTION_PROXY             = 0x04;
+const INTERNET_CONNECTION_MODEM_BUSY        = 0x08;
+const INTERNET_RAS_INSTALLED                = 0x10;
+const INTERNET_CONNECTION_OFFLINE           = 0x20;
+const INTERNET_CONNECTION_CONFIGURED        = 0x40;
+
+enum {
+	CACHEGROUP_SEARCH_ALL   = 0,
+	CACHEGROUP_SEARCH_BYURL = 1
+}
+
+enum {
+	INTERNET_CACHE_GROUP_ADD    = 0,
+	INTERNET_CACHE_GROUP_REMOVE = 1
+}
+
+alias HANDLE HINTERNET;
+alias HANDLE* LPHINTERNET;
+
+alias LONGLONG GROUPID;
+alias WORD INTERNET_PORT;
+alias WORD* LPINTERNET_PORT;
+
+enum INTERNET_SCHEME {
+	INTERNET_SCHEME_PARTIAL = -2,
+	INTERNET_SCHEME_UNKNOWN,
+	INTERNET_SCHEME_DEFAULT,
+	INTERNET_SCHEME_FTP,
+	INTERNET_SCHEME_GOPHER,
+	INTERNET_SCHEME_HTTP,
+	INTERNET_SCHEME_HTTPS,
+	INTERNET_SCHEME_FILE,
+	INTERNET_SCHEME_NEWS,
+	INTERNET_SCHEME_MAILTO,
+	INTERNET_SCHEME_SOCKS,
+	INTERNET_SCHEME_FIRST = INTERNET_SCHEME_FTP,
+	INTERNET_SCHEME_LAST = INTERNET_SCHEME_SOCKS
+}
+alias INTERNET_SCHEME* LPINTERNET_SCHEME;
+
+struct INTERNET_ASYNC_RESULT {
+	DWORD dwResult;
+	DWORD dwError;
+}
+alias INTERNET_ASYNC_RESULT* LPINTERNET_ASYNC_RESULT;
+
+struct INTERNET_PREFETCH_STATUS {
+	DWORD dwStatus;
+	DWORD dwSize;
+}
+alias INTERNET_PREFETCH_STATUS* LPINTERNET_PREFETCH_STATUS;
+
+struct INTERNET_PROXY_INFO {
+	DWORD dwAccessType;
+	LPCTSTR lpszProxy;
+	LPCTSTR lpszProxyBypass;
+}
+alias INTERNET_PROXY_INFO* LPINTERNET_PROXY_INFO;
+
+struct INTERNET_VERSION_INFO {
+	DWORD dwMajorVersion;
+	DWORD dwMinorVersion;
+}
+alias INTERNET_VERSION_INFO* LPINTERNET_VERSION_INFO;
+
+struct URL_COMPONENTSA {
+	DWORD           dwStructSize = URL_COMPONENTSA.sizeof;
+	LPSTR           lpszScheme;
+	DWORD           dwSchemeLength;
+	INTERNET_SCHEME nScheme;
+	LPSTR           lpszHostName;
+	DWORD           dwHostNameLength;
+	INTERNET_PORT   nPort;
+	LPSTR           lpszUserName;
+	DWORD           dwUserNameLength;
+	LPSTR           lpszPassword;
+	DWORD           dwPasswordLength;
+	LPSTR           lpszUrlPath;
+	DWORD           dwUrlPathLength;
+	LPSTR           lpszExtraInfo;
+	DWORD           dwExtraInfoLength;
+}
+alias URL_COMPONENTSA* LPURL_COMPONENTSA;
+
+struct URL_COMPONENTSW {
+	DWORD  dwStructSize = URL_COMPONENTSW.sizeof;
+	LPWSTR lpszScheme;
+	DWORD  dwSchemeLength;
+	INTERNET_SCHEME nScheme;
+	LPWSTR lpszHostName;
+	DWORD  dwHostNameLength;
+	INTERNET_PORT nPort;
+	LPWSTR lpszUserName;
+	DWORD  dwUserNameLength;
+	LPWSTR lpszPassword;
+	DWORD  dwPasswordLength;
+	LPWSTR lpszUrlPath;
+	DWORD  dwUrlPathLength;
+	LPWSTR lpszExtraInfo;
+	DWORD  dwExtraInfoLength;
+}
+alias URL_COMPONENTSW* LPURL_COMPONENTSW;
+
+struct INTERNET_CERTIFICATE_INFO {
+	FILETIME ftExpiry;
+	FILETIME ftStart;
+	LPTSTR   lpszSubjectInfo;
+	LPTSTR   lpszIssuerInfo;
+	LPTSTR   lpszProtocolName;
+	LPTSTR   lpszSignatureAlgName;
+	LPTSTR   lpszEncryptionAlgName;
+	DWORD    dwKeySize;
+}
+alias INTERNET_CERTIFICATE_INFO* LPINTERNET_CERTIFICATE_INFO;
+
+extern (Windows) alias void function(HINTERNET, DWORD, DWORD, PVOID, DWORD)
+  INTERNET_STATUS_CALLBACK;
+alias INTERNET_STATUS_CALLBACK* LPINTERNET_STATUS_CALLBACK;
+
+struct GOPHER_FIND_DATAA {
+	CHAR[MAX_GOPHER_DISPLAY_TEXT+1] DisplayString;
+	DWORD    GopherType;
+	DWORD    SizeLow;
+	DWORD    SizeHigh;
+	FILETIME LastModificationTime;
+	CHAR[MAX_GOPHER_LOCATOR_LENGTH+1] Locator;
+}
+alias GOPHER_FIND_DATAA* LPGOPHER_FIND_DATAA;
+
+struct GOPHER_FIND_DATAW {
+	WCHAR[MAX_GOPHER_DISPLAY_TEXT+1] DisplayString;
+	DWORD    GopherType;
+	DWORD    SizeLow;
+	DWORD    SizeHigh;
+	FILETIME LastModificationTime;
+	WCHAR[MAX_GOPHER_LOCATOR_LENGTH+1] Locator;
+}
+alias GOPHER_FIND_DATAW* LPGOPHER_FIND_DATAW;
+
+struct GOPHER_ADMIN_ATTRIBUTE_TYPE {
+	LPCTSTR Comment;
+	LPCTSTR EmailAddress;
+}
+alias GOPHER_ADMIN_ATTRIBUTE_TYPE* LPGOPHER_ADMIN_ATTRIBUTE_TYPE;
+
+struct GOPHER_MOD_DATE_ATTRIBUTE_TYPE {
+	FILETIME DateAndTime;
+}
+alias GOPHER_MOD_DATE_ATTRIBUTE_TYPE* LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE;
+
+struct GOPHER_TTL_ATTRIBUTE_TYPE {
+	DWORD Ttl;
+}
+alias GOPHER_TTL_ATTRIBUTE_TYPE* LPGOPHER_TTL_ATTRIBUTE_TYPE;
+
+struct GOPHER_SCORE_ATTRIBUTE_TYPE {
+	INT Score;
+}
+alias GOPHER_SCORE_ATTRIBUTE_TYPE* LPGOPHER_SCORE_ATTRIBUTE_TYPE;
+
+struct GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE {
+	INT LowerBound;
+	INT UpperBound;
+}
+alias GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE* LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE;
+
+struct GOPHER_SITE_ATTRIBUTE_TYPE {
+	LPCTSTR Site;
+}
+alias GOPHER_SITE_ATTRIBUTE_TYPE* LPGOPHER_SITE_ATTRIBUTE_TYPE;
+
+struct GOPHER_ORGANIZATION_ATTRIBUTE_TYPE {
+	LPCTSTR Organization;
+}
+alias GOPHER_ORGANIZATION_ATTRIBUTE_TYPE* LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPE;
+
+struct GOPHER_LOCATION_ATTRIBUTE_TYPE {
+	LPCTSTR Location;
+}
+alias GOPHER_LOCATION_ATTRIBUTE_TYPE* LPGOPHER_LOCATION_ATTRIBUTE_TYPE;
+
+struct GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE {
+	INT DegreesNorth;
+	INT MinutesNorth;
+	INT SecondsNorth;
+	INT DegreesEast;
+	INT MinutesEast;
+	INT SecondsEast;
+}
+alias GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE*
+  LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE;
+
+struct GOPHER_TIMEZONE_ATTRIBUTE_TYPE {
+	INT Zone;
+}
+alias GOPHER_TIMEZONE_ATTRIBUTE_TYPE* LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE;
+
+struct GOPHER_PROVIDER_ATTRIBUTE_TYPE {
+	LPCTSTR Provider;
+}
+alias GOPHER_PROVIDER_ATTRIBUTE_TYPE* LPGOPHER_PROVIDER_ATTRIBUTE_TYPE;
+
+struct GOPHER_VERSION_ATTRIBUTE_TYPE {
+	LPCTSTR Version;
+}
+alias GOPHER_VERSION_ATTRIBUTE_TYPE* LPGOPHER_VERSION_ATTRIBUTE_TYPE;
+
+struct GOPHER_ABSTRACT_ATTRIBUTE_TYPE {
+	LPCTSTR ShortAbstract;
+	LPCTSTR AbstractFile;
+}
+alias GOPHER_ABSTRACT_ATTRIBUTE_TYPE* LPGOPHER_ABSTRACT_ATTRIBUTE_TYPE;
+
+struct GOPHER_VIEW_ATTRIBUTE_TYPE {
+	LPCTSTR ContentType;
+	LPCTSTR Language;
+	DWORD   Size;
+}
+alias GOPHER_VIEW_ATTRIBUTE_TYPE* LPGOPHER_VIEW_ATTRIBUTE_TYPE;
+
+struct GOPHER_VERONICA_ATTRIBUTE_TYPE {
+	BOOL TreeWalk;
+}
+alias GOPHER_VERONICA_ATTRIBUTE_TYPE* LPGOPHER_VERONICA_ATTRIBUTE_TYPE;
+
+struct GOPHER_ASK_ATTRIBUTE_TYPE {
+	LPCTSTR QuestionType;
+	LPCTSTR QuestionText;
+}
+alias GOPHER_ASK_ATTRIBUTE_TYPE* LPGOPHER_ASK_ATTRIBUTE_TYPE;
+
+struct GOPHER_UNKNOWN_ATTRIBUTE_TYPE {
+	LPCTSTR Text;
+}
+alias GOPHER_UNKNOWN_ATTRIBUTE_TYPE* LPGOPHER_UNKNOWN_ATTRIBUTE_TYPE;
+
+struct GOPHER_ATTRIBUTE_TYPE {
+	DWORD CategoryId;
+	DWORD AttributeId;
+	union {
+		GOPHER_ADMIN_ATTRIBUTE_TYPE                 Admin;
+		GOPHER_MOD_DATE_ATTRIBUTE_TYPE              ModDate;
+		GOPHER_TTL_ATTRIBUTE_TYPE                   Ttl;
+		GOPHER_SCORE_ATTRIBUTE_TYPE                 Score;
+		GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE           ScoreRange;
+		GOPHER_SITE_ATTRIBUTE_TYPE                  Site;
+		GOPHER_ORGANIZATION_ATTRIBUTE_TYPE          Organization;
+		GOPHER_LOCATION_ATTRIBUTE_TYPE              Location;
+		GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE GeographicalLocation;
+		GOPHER_TIMEZONE_ATTRIBUTE_TYPE              TimeZone;
+		GOPHER_PROVIDER_ATTRIBUTE_TYPE              Provider;
+		GOPHER_VERSION_ATTRIBUTE_TYPE               Version;
+		GOPHER_ABSTRACT_ATTRIBUTE_TYPE              Abstract;
+		GOPHER_VIEW_ATTRIBUTE_TYPE                  View;
+		GOPHER_VERONICA_ATTRIBUTE_TYPE              Veronica;
+		GOPHER_ASK_ATTRIBUTE_TYPE                   Ask;
+		GOPHER_UNKNOWN_ATTRIBUTE_TYPE               Unknown;
+	} /+AttributeType;+/
+}
+alias GOPHER_ATTRIBUTE_TYPE* LPGOPHER_ATTRIBUTE_TYPE;
+
+alias BOOL function(LPGOPHER_ATTRIBUTE_TYPE, DWORD)
+  GOPHER_ATTRIBUTE_ENUMERATOR;
+
+struct INTERNET_CACHE_ENTRY_INFOA {
+	DWORD    dwStructSize = INTERNET_CACHE_ENTRY_INFOA.sizeof;
+	LPSTR    lpszSourceUrlName;
+	LPSTR    lpszLocalFileName;
+	DWORD    CacheEntryType;
+	DWORD    dwUseCount;
+	DWORD    dwHitRate;
+	DWORD    dwSizeLow;
+	DWORD    dwSizeHigh;
+	FILETIME LastModifiedTime;
+	FILETIME ExpireTime;
+	FILETIME LastAccessTime;
+	FILETIME LastSyncTime;
+	PBYTE    lpHeaderInfo;
+	DWORD    dwHeaderInfoSize;
+	LPSTR    lpszFileExtension;
+	DWORD    dwReserved;
+}
+alias INTERNET_CACHE_ENTRY_INFOA* LPINTERNET_CACHE_ENTRY_INFOA;
+
+struct INTERNET_CACHE_ENTRY_INFOW {
+	DWORD    dwStructSize = INTERNET_CACHE_ENTRY_INFOW.sizeof;
+	LPSTR    lpszSourceUrlName;
+	LPWSTR   lpszLocalFileName;
+	DWORD    CacheEntryType;
+	DWORD    dwUseCount;
+	DWORD    dwHitRate;
+	DWORD    dwSizeLow;
+	DWORD    dwSizeHigh;
+	FILETIME LastModifiedTime;
+	FILETIME ExpireTime;
+	FILETIME LastAccessTime;
+	FILETIME LastSyncTime;
+	PBYTE    lpHeaderInfo;
+	DWORD    dwHeaderInfoSize;
+	LPWSTR   lpszFileExtension;
+	DWORD    dwReserved;
+}
+alias INTERNET_CACHE_ENTRY_INFOW* LPINTERNET_CACHE_ENTRY_INFOW;
+
+struct INTERNET_BUFFERSA {
+	DWORD              dwStructSize = INTERNET_BUFFERSA.sizeof;
+	INTERNET_BUFFERSA* Next;
+	LPCSTR             lpcszHeader;
+	DWORD              dwHeadersLength;
+	DWORD              dwHeadersTotal;
+	LPVOID             lpvBuffer;
+	DWORD              dwBufferLength;
+	DWORD              dwBufferTotal;
+	DWORD              dwOffsetLow;
+	DWORD              dwOffsetHigh;
+}
+alias INTERNET_BUFFERSA* LPINTERNET_BUFFERSA;
+
+struct INTERNET_BUFFERSW {
+	DWORD              dwStructSize = INTERNET_BUFFERSW.sizeof;
+	INTERNET_BUFFERSW* Next;
+	LPCWSTR            lpcszHeader;
+	DWORD              dwHeadersLength;
+	DWORD              dwHeadersTotal;
+	LPVOID             lpvBuffer;
+	DWORD              dwBufferLength;
+	DWORD              dwBufferTotal;
+	DWORD              dwOffsetLow;
+	DWORD              dwOffsetHigh;
+}
+alias INTERNET_BUFFERSW* LPINTERNET_BUFFERSW;
+
+const size_t
+	GROUP_OWNER_STORAGE_SIZE =   4,
+	GROUPNAME_MAX_LENGTH     = 120;
+
+struct INTERNET_CACHE_GROUP_INFOA {
+	DWORD dwGroupSize;
+	DWORD dwGroupFlags;
+	DWORD dwGroupType;
+	DWORD dwDiskUsage;
+	DWORD dwDiskQuota;
+	DWORD[GROUP_OWNER_STORAGE_SIZE] dwOwnerStorage;
+	CHAR[GROUPNAME_MAX_LENGTH]      szGroupName;
+}
+alias INTERNET_CACHE_GROUP_INFOA* LPINTERNET_CACHE_GROUP_INFOA;
+
+struct INTERNET_CACHE_GROUP_INFOW {
+	DWORD dwGroupSize;
+	DWORD dwGroupFlags;
+	DWORD dwGroupType;
+	DWORD dwDiskUsage;
+	DWORD dwDiskQuota;
+	DWORD[GROUP_OWNER_STORAGE_SIZE] dwOwnerStorage;
+	WCHAR[GROUPNAME_MAX_LENGTH]     szGroupName;
+}
+alias INTERNET_CACHE_GROUP_INFOW* LPINTERNET_CACHE_GROUP_INFOW;
+
+extern (Windows) {
+	BOOL InternetTimeFromSystemTime(SYSTEMTIME*, DWORD, LPSTR, DWORD);
+	BOOL InternetTimeToSystemTime(LPCSTR, SYSTEMTIME*, DWORD);
+	BOOL InternetDebugGetLocalTime(SYSTEMTIME*, PDWORD);
+	BOOL InternetCrackUrlA(LPCSTR, DWORD, DWORD, LPURL_COMPONENTSA);
+	BOOL InternetCrackUrlW(LPCWSTR, DWORD, DWORD, LPURL_COMPONENTSW);
+	BOOL InternetCreateUrlA(LPURL_COMPONENTSA, DWORD, LPSTR, PDWORD);
+	BOOL InternetCreateUrlW(LPURL_COMPONENTSW, DWORD, LPWSTR, PDWORD);
+	BOOL InternetCanonicalizeUrlA(LPCSTR, LPSTR, PDWORD, DWORD);
+	BOOL InternetCanonicalizeUrlW(LPCWSTR, LPWSTR, PDWORD, DWORD);
+	BOOL InternetCheckConnectionA(LPCSTR, DWORD, DWORD);
+	BOOL InternetCheckConnectionW(LPCWSTR, DWORD, DWORD);
+	BOOL InternetCombineUrlA(LPCSTR, LPCSTR, LPSTR, PDWORD, DWORD);
+	BOOL InternetCombineUrlW(LPCWSTR, LPCWSTR, LPWSTR, PDWORD, DWORD);
+	HINTERNET InternetOpenA(LPCSTR, DWORD, LPCSTR, LPCSTR, DWORD);
+	HINTERNET InternetOpenW(LPCWSTR, DWORD, LPCWSTR, LPCWSTR, DWORD);
+	BOOL InternetCloseHandle(HINTERNET);
+	HINTERNET InternetConnectA(HINTERNET, LPCSTR, INTERNET_PORT, LPCSTR,
+	  LPCSTR, DWORD, DWORD, DWORD);
+	HINTERNET InternetConnectW(HINTERNET, LPCWSTR, INTERNET_PORT, LPCWSTR,
+	  LPCWSTR, DWORD, DWORD, DWORD);
+	HINTERNET InternetOpenUrlA(HINTERNET, LPCSTR, LPCSTR, DWORD, DWORD,
+	  DWORD);
+	HINTERNET InternetOpenUrlW(HINTERNET, LPCWSTR, LPCWSTR, DWORD, DWORD,
+	  DWORD);
+	BOOL InternetReadFile(HINTERNET, PVOID, DWORD, PDWORD);
+	DWORD InternetSetFilePointer(HINTERNET, LONG, PVOID, DWORD, DWORD);
+	BOOL InternetWriteFile(HINTERNET, LPCVOID, DWORD, PDWORD);
+	BOOL InternetQueryDataAvailable(HINTERNET, PDWORD, DWORD, DWORD);
+	BOOL InternetFindNextFileA(HINTERNET, PVOID);
+	BOOL InternetFindNextFileW(HINTERNET, PVOID);
+	BOOL InternetQueryOptionA(HINTERNET, DWORD, PVOID, PDWORD);
+	BOOL InternetQueryOptionW(HINTERNET, DWORD, PVOID, PDWORD);
+	BOOL InternetSetOptionA(HINTERNET, DWORD, PVOID, DWORD);
+	BOOL InternetSetOptionW(HINTERNET, DWORD, PVOID, DWORD);
+	BOOL InternetSetOptionExA(HINTERNET, DWORD, PVOID, DWORD, DWORD);
+	BOOL InternetSetOptionExW(HINTERNET, DWORD, PVOID, DWORD, DWORD);
+	BOOL InternetGetLastResponseInfoA(PDWORD, LPSTR, PDWORD);
+	BOOL InternetGetLastResponseInfoW(PDWORD, LPWSTR, PDWORD);
+	INTERNET_STATUS_CALLBACK InternetSetStatusCallback(HINTERNET,
+	  INTERNET_STATUS_CALLBACK);
+	DWORD FtpGetFileSize(HINTERNET, LPDWORD);
+	HINTERNET FtpFindFirstFileA(HINTERNET, LPCSTR, LPWIN32_FIND_DATA, DWORD,
+	  DWORD);
+	HINTERNET FtpFindFirstFileW(HINTERNET, LPCWSTR, LPWIN32_FIND_DATA, DWORD,
+	  DWORD);
+	BOOL FtpGetFileA(HINTERNET, LPCSTR, LPCSTR, BOOL, DWORD, DWORD, DWORD);
+	BOOL FtpGetFileW(HINTERNET, LPCWSTR, LPCWSTR, BOOL, DWORD, DWORD, DWORD);
+	BOOL FtpPutFileA(HINTERNET, LPCSTR, LPCSTR, DWORD, DWORD);
+	BOOL FtpPutFileW(HINTERNET, LPCWSTR, LPCWSTR, DWORD, DWORD);
+	BOOL FtpDeleteFileA(HINTERNET, LPCSTR);
+	BOOL FtpDeleteFileW(HINTERNET, LPCWSTR);
+	BOOL FtpRenameFileA(HINTERNET, LPCSTR, LPCSTR);
+	BOOL FtpRenameFileW(HINTERNET, LPCWSTR, LPCWSTR);
+	HINTERNET FtpOpenFileA(HINTERNET, LPCSTR, DWORD, DWORD, DWORD);
+	HINTERNET FtpOpenFileW(HINTERNET, LPCWSTR, DWORD, DWORD, DWORD);
+	BOOL FtpCreateDirectoryA(HINTERNET, LPCSTR);
+	BOOL FtpCreateDirectoryW(HINTERNET, LPCWSTR);
+	BOOL FtpRemoveDirectoryA(HINTERNET, LPCSTR);
+	BOOL FtpRemoveDirectoryW(HINTERNET, LPCWSTR);
+	BOOL FtpSetCurrentDirectoryA(HINTERNET, LPCSTR);
+	BOOL FtpSetCurrentDirectoryW(HINTERNET, LPCWSTR);
+	BOOL FtpGetCurrentDirectoryA(HINTERNET, LPSTR, PDWORD);
+	BOOL FtpGetCurrentDirectoryW(HINTERNET, LPWSTR, PDWORD);
+	BOOL FtpCommandA(HINTERNET, BOOL, DWORD, LPCSTR, DWORD_PTR, HINTERNET*);
+	BOOL FtpCommandW(HINTERNET, BOOL, DWORD, LPCWSTR, DWORD_PTR, HINTERNET*);
+	BOOL GopherCreateLocatorA(LPCSTR, INTERNET_PORT, LPCSTR, LPCSTR, DWORD,
+	  LPSTR, PDWORD);
+	BOOL GopherCreateLocatorW(LPCWSTR, INTERNET_PORT, LPCWSTR, LPCWSTR, DWORD,
+	  LPWSTR, PDWORD);
+	BOOL GopherGetLocatorTypeA(LPCSTR, PDWORD);
+	BOOL GopherGetLocatorTypeW(LPCWSTR, PDWORD);
+	HINTERNET GopherFindFirstFileA(HINTERNET, LPCSTR, LPCSTR,
+	  LPGOPHER_FIND_DATAA, DWORD, DWORD);
+	HINTERNET GopherFindFirstFileW(HINTERNET, LPCWSTR, LPCWSTR,
+	  LPGOPHER_FIND_DATAW, DWORD, DWORD);
+	HINTERNET GopherOpenFileA(HINTERNET, LPCSTR, LPCSTR, DWORD, DWORD);
+	HINTERNET GopherOpenFileW(HINTERNET, LPCWSTR, LPCWSTR, DWORD, DWORD);
+	BOOL GopherGetAttributeA(HINTERNET, LPCSTR, LPCSTR, LPBYTE, DWORD,
+	  PDWORD, GOPHER_ATTRIBUTE_ENUMERATOR, DWORD);
+	BOOL GopherGetAttributeW(HINTERNET, LPCWSTR, LPCWSTR, LPBYTE, DWORD,
+	  PDWORD, GOPHER_ATTRIBUTE_ENUMERATOR, DWORD);
+	HINTERNET HttpOpenRequestA(HINTERNET, LPCSTR, LPCSTR, LPCSTR, LPCSTR,
+	  LPCSTR*, DWORD, DWORD);
+	HINTERNET HttpOpenRequestW(HINTERNET, LPCWSTR, LPCWSTR, LPCWSTR, LPCWSTR,
+	  LPCWSTR*, DWORD, DWORD);
+	BOOL HttpAddRequestHeadersA(HINTERNET, LPCSTR, DWORD, DWORD);
+	BOOL HttpAddRequestHeadersW(HINTERNET, LPCWSTR, DWORD, DWORD);
+	BOOL HttpSendRequestA(HINTERNET, LPCSTR, DWORD, PVOID, DWORD);
+	BOOL HttpSendRequestW(HINTERNET, LPCWSTR, DWORD, PVOID, DWORD);
+	BOOL HttpQueryInfoA(HINTERNET, DWORD, PVOID, PDWORD, PDWORD);
+	BOOL HttpQueryInfoW(HINTERNET, DWORD, PVOID, PDWORD, PDWORD);
+	BOOL InternetSetCookieA(LPCSTR, LPCSTR, LPCSTR);
+	BOOL InternetSetCookieW(LPCSTR, LPCWSTR, LPCWSTR);
+	BOOL InternetGetCookieA(LPCSTR, LPCSTR, LPSTR, PDWORD);
+	BOOL InternetGetCookieW(LPCSTR, LPCWSTR, LPWSTR, PDWORD);
+	DWORD InternetAttemptConnect(DWORD);
+	DWORD InternetErrorDlg(HWND, HINTERNET, DWORD, DWORD, PVOID*);
+	DWORD InternetConfirmZoneCrossing(HWND, LPSTR, LPSTR, BOOL);
+	BOOL CreateUrlCacheEntryA(LPCSTR, DWORD, LPCSTR, LPSTR, DWORD);
+	BOOL CreateUrlCacheEntryW(LPCSTR, DWORD, LPCSTR, LPWSTR, DWORD);
+	BOOL CommitUrlCacheEntryA(LPCSTR, LPCSTR, FILETIME, FILETIME, DWORD,
+	  LPBYTE, DWORD, LPCSTR, DWORD);
+	BOOL CommitUrlCacheEntryW(LPCSTR, LPCWSTR, FILETIME, FILETIME, DWORD,
+	  LPBYTE, DWORD, LPCWSTR, DWORD);
+	BOOL RetrieveUrlCacheEntryFileA(LPCSTR, LPINTERNET_CACHE_ENTRY_INFOA,
+	  PDWORD, DWORD);
+	BOOL RetrieveUrlCacheEntryFileW(LPCSTR, LPINTERNET_CACHE_ENTRY_INFOW,
+	  PDWORD, DWORD);
+	BOOL UnlockUrlCacheEntryFile(LPCSTR, DWORD);
+	HANDLE RetrieveUrlCacheEntryStreamA(LPCSTR, LPINTERNET_CACHE_ENTRY_INFOA,
+	  PDWORD, BOOL, DWORD);
+	HANDLE RetrieveUrlCacheEntryStreamW(LPCSTR, LPINTERNET_CACHE_ENTRY_INFOW,
+	  PDWORD, BOOL, DWORD);
+	BOOL ReadUrlCacheEntryStream(HANDLE, DWORD, PVOID, PDWORD, DWORD);
+	BOOL UnlockUrlCacheEntryStream(HANDLE, DWORD);
+	BOOL GetUrlCacheEntryInfoA(LPCSTR, LPINTERNET_CACHE_ENTRY_INFOA, PDWORD);
+	BOOL GetUrlCacheEntryInfoW(LPCSTR, LPINTERNET_CACHE_ENTRY_INFOW, PDWORD);
+	BOOL SetUrlCacheEntryInfoA(LPCSTR, LPINTERNET_CACHE_ENTRY_INFOA, DWORD);
+	BOOL SetUrlCacheEntryInfoW(LPCSTR, LPINTERNET_CACHE_ENTRY_INFOW, DWORD);
+	HANDLE FindFirstUrlCacheEntryA(LPCSTR, LPINTERNET_CACHE_ENTRY_INFOA,
+	  PDWORD);
+	HANDLE FindFirstUrlCacheEntryW(LPCSTR, LPINTERNET_CACHE_ENTRY_INFOW,
+	  PDWORD);
+	BOOL FindNextUrlCacheEntryA(HANDLE, LPINTERNET_CACHE_ENTRY_INFOA, PDWORD);
+	BOOL FindNextUrlCacheEntryW(HANDLE, LPINTERNET_CACHE_ENTRY_INFOW, PDWORD);
+	BOOL FindCloseUrlCache(HANDLE);
+	BOOL DeleteUrlCacheEntry(LPCSTR);
+	DWORD AuthenticateUser(PVOID*, LPSTR, LPSTR, DWORD, LPSTR, DWORD, LPSTR,
+	  LPSTR);
+	BOOL HttpSendRequestExA(HINTERNET, LPINTERNET_BUFFERSA,
+	  LPINTERNET_BUFFERSA, DWORD, DWORD);
+	BOOL HttpSendRequestExW(HINTERNET, LPINTERNET_BUFFERSW,
+	  LPINTERNET_BUFFERSW, DWORD, DWORD);
+	BOOL HttpEndRequestA(HINTERNET, LPINTERNET_BUFFERSA, DWORD, DWORD);
+	BOOL HttpEndRequestW(HINTERNET, LPINTERNET_BUFFERSW, DWORD, DWORD);
+	DWORD InternetDial(HWND, LPTSTR, DWORD, LPDWORD, DWORD);
+	DWORD InternetHangUp(DWORD, DWORD);
+	BOOL InternetGoOnline(LPTSTR, HWND, DWORD);
+	BOOL InternetAutodial(DWORD, DWORD);
+	BOOL InternetAutodialHangup(DWORD);
+	BOOL InternetGetConnectedState(LPDWORD, DWORD);
+	BOOL InternetSetDialState(LPCTSTR, DWORD, DWORD);
+	BOOL InternetReadFileExA(HINTERNET, LPINTERNET_BUFFERSA, DWORD, DWORD_PTR);
+	BOOL InternetReadFileExW(HINTERNET, LPINTERNET_BUFFERSW, DWORD, DWORD_PTR);
+	GROUPID CreateUrlCacheGroup(DWORD, LPVOID);
+	BOOL DeleteUrlCacheGroup(GROUPID, DWORD, LPVOID);
+	HANDLE FindFirstUrlCacheGroup(DWORD, DWORD, LPVOID, DWORD, GROUPID*,
+	  LPVOID);
+	BOOL FindNextUrlCacheGroup(HANDLE, GROUPID*, LPVOID);
+	BOOL GetUrlCacheGroupAttributeA(GROUPID, DWORD, DWORD,
+	  LPINTERNET_CACHE_GROUP_INFOA, LPDWORD, LPVOID);
+	BOOL GetUrlCacheGroupAttributeW(GROUPID, DWORD, DWORD,
+	  LPINTERNET_CACHE_GROUP_INFOW, LPDWORD, LPVOID);
+	BOOL SetUrlCacheGroupAttributeA(GROUPID, DWORD, DWORD,
+	  LPINTERNET_CACHE_GROUP_INFOA, LPVOID);
+	BOOL SetUrlCacheGroupAttributeW(GROUPID, DWORD, DWORD,
+	  LPINTERNET_CACHE_GROUP_INFOW, LPVOID);
+}
+
+version (Unicode) {
+	alias URL_COMPONENTSW URL_COMPONENTS;
+	alias LPURL_COMPONENTSW LPURL_COMPONENTS;
+	alias GOPHER_FIND_DATAW GOPHER_FIND_DATA;
+	alias LPGOPHER_FIND_DATAW LPGOPHER_FIND_DATA;
+	alias INTERNET_CACHE_ENTRY_INFOW INTERNET_CACHE_ENTRY_INFO;
+	alias LPINTERNET_CACHE_ENTRY_INFOW LPINTERNET_CACHE_ENTRY_INFO;
+	alias INTERNET_BUFFERSW INTERNET_BUFFERS;
+	alias INTERNET_CACHE_GROUP_INFOW INTERNET_CACHE_GROUP_INFO;
+	alias LPINTERNET_CACHE_GROUP_INFOW LPINTERNET_CACHE_GROUP_INFO;
+	alias InternetCrackUrlW InternetCrackUrl;
+	alias InternetCreateUrlW InternetCreateUrl;
+	alias InternetCanonicalizeUrlW InternetCanonicalizeUrl;
+	alias InternetCheckConnectionW InternetCheckConnection;
+	alias InternetCombineUrlW InternetCombineUrl;
+	alias InternetOpenW InternetOpen;
+	alias InternetConnectW InternetConnect;
+	alias InternetOpenUrlW InternetOpenUrl;
+	alias InternetFindNextFileW InternetFindNextFile;
+	alias InternetQueryOptionW InternetQueryOption;
+	alias InternetSetOptionW InternetSetOption;
+	alias InternetSetOptionExW InternetSetOptionEx;
+	alias InternetGetLastResponseInfoW InternetGetLastResponseInfo;
+	alias InternetReadFileExW InternetReadFileEx;
+	alias FtpFindFirstFileW FtpFindFirstFile;
+	alias FtpGetFileW FtpGetFile;
+	alias FtpPutFileW FtpPutFile;
+	alias FtpDeleteFileW FtpDeleteFile;
+	alias FtpRenameFileW FtpRenameFile;
+	alias FtpOpenFileW FtpOpenFile;
+	alias FtpCreateDirectoryW FtpCreateDirectory;
+	alias FtpRemoveDirectoryW FtpRemoveDirectory;
+	alias FtpSetCurrentDirectoryW FtpSetCurrentDirectory;
+	alias FtpGetCurrentDirectoryW FtpGetCurrentDirectory;
+	alias FtpCommandW FtpCommand;
+	alias GopherGetLocatorTypeW GopherGetLocatorType;
+	alias GopherCreateLocatorW GopherCreateLocator;
+	alias GopherFindFirstFileW GopherFindFirstFile;
+	alias GopherOpenFileW GopherOpenFile;
+	alias GopherGetAttributeW GopherGetAttribute;
+	alias HttpSendRequestW HttpSendRequest;
+	alias HttpOpenRequestW HttpOpenRequest;
+	alias HttpAddRequestHeadersW HttpAddRequestHeaders;
+	alias HttpQueryInfoW HttpQueryInfo;
+	alias InternetSetCookieW InternetSetCookie;
+	alias InternetGetCookieW InternetGetCookie;
+	alias CreateUrlCacheEntryW CreateUrlCacheEntry;
+	alias RetrieveUrlCacheEntryStreamW RetrieveUrlCacheEntryStream;
+	alias FindNextUrlCacheEntryW FindNextUrlCacheEntry;
+	alias CommitUrlCacheEntryW CommitUrlCacheEntry;
+	alias GetUrlCacheEntryInfoW GetUrlCacheEntryInfo;
+	alias SetUrlCacheEntryInfoW SetUrlCacheEntryInfo;
+	alias FindFirstUrlCacheEntryW FindFirstUrlCacheEntry;
+	alias RetrieveUrlCacheEntryFileW RetrieveUrlCacheEntryFile;
+	alias HttpSendRequestExW HttpSendRequestEx;
+	alias HttpEndRequestW HttpEndRequest;
+	alias GetUrlCacheGroupAttributeW GetUrlCacheGroupAttribute;
+	alias SetUrlCacheGroupAttributeW SetUrlCacheGroupAttribute;
+} else {
+	alias URL_COMPONENTSA URL_COMPONENTS;
+	alias LPURL_COMPONENTSA LPURL_COMPONENTS;
+	alias GOPHER_FIND_DATAA GOPHER_FIND_DATA;
+	alias LPGOPHER_FIND_DATAA LPGOPHER_FIND_DATA;
+	alias INTERNET_CACHE_ENTRY_INFOA INTERNET_CACHE_ENTRY_INFO;
+	alias LPINTERNET_CACHE_ENTRY_INFOA LPINTERNET_CACHE_ENTRY_INFO;
+	alias INTERNET_BUFFERSA INTERNET_BUFFERS;
+	alias INTERNET_CACHE_GROUP_INFOA INTERNET_CACHE_GROUP_INFO;
+	alias LPINTERNET_CACHE_GROUP_INFOA LPINTERNET_CACHE_GROUP_INFO;
+	alias GopherGetAttributeA GopherGetAttribute;
+	alias InternetCrackUrlA InternetCrackUrl;
+	alias InternetCreateUrlA InternetCreateUrl;
+	alias InternetCanonicalizeUrlA InternetCanonicalizeUrl;
+	alias InternetCheckConnectionA InternetCheckConnection;
+	alias InternetCombineUrlA InternetCombineUrl;
+	alias InternetOpenA InternetOpen;
+	alias InternetConnectA InternetConnect;
+	alias InternetOpenUrlA InternetOpenUrl;
+	alias InternetFindNextFileA InternetFindNextFile;
+	alias InternetQueryOptionA InternetQueryOption;
+	alias InternetSetOptionA InternetSetOption;
+	alias InternetSetOptionExA InternetSetOptionEx;
+	alias InternetGetLastResponseInfoA InternetGetLastResponseInfo;
+	alias InternetReadFileExA InternetReadFileEx;
+	alias FtpFindFirstFileA FtpFindFirstFile;
+	alias FtpGetFileA FtpGetFile;
+	alias FtpPutFileA FtpPutFile;
+	alias FtpDeleteFileA FtpDeleteFile;
+	alias FtpRenameFileA FtpRenameFile;
+	alias FtpOpenFileA FtpOpenFile;
+	alias FtpCreateDirectoryA FtpCreateDirectory;
+	alias FtpRemoveDirectoryA FtpRemoveDirectory;
+	alias FtpSetCurrentDirectoryA FtpSetCurrentDirectory;
+	alias FtpGetCurrentDirectoryA FtpGetCurrentDirectory;
+	alias FtpCommandA FtpCommand;
+	alias GopherGetLocatorTypeA GopherGetLocatorType;
+	alias GopherCreateLocatorA GopherCreateLocator;
+	alias GopherFindFirstFileA GopherFindFirstFile;
+	alias GopherOpenFileA GopherOpenFile;
+	alias HttpSendRequestA HttpSendRequest;
+	alias HttpOpenRequestA HttpOpenRequest;
+	alias HttpAddRequestHeadersA HttpAddRequestHeaders;
+	alias HttpQueryInfoA HttpQueryInfo;
+	alias InternetSetCookieA InternetSetCookie;
+	alias InternetGetCookieA InternetGetCookie;
+	alias CreateUrlCacheEntryA CreateUrlCacheEntry;
+	alias RetrieveUrlCacheEntryStreamA RetrieveUrlCacheEntryStream;
+	alias FindNextUrlCacheEntryA FindNextUrlCacheEntry;
+	alias CommitUrlCacheEntryA CommitUrlCacheEntry;
+	alias GetUrlCacheEntryInfoA GetUrlCacheEntryInfo;
+	alias SetUrlCacheEntryInfoA SetUrlCacheEntryInfo;
+	alias FindFirstUrlCacheEntryA FindFirstUrlCacheEntry;
+	alias RetrieveUrlCacheEntryFileA RetrieveUrlCacheEntryFile;
+	alias HttpSendRequestExA HttpSendRequestEx;
+	alias HttpEndRequestA HttpEndRequest;
+	alias GetUrlCacheGroupAttributeA GetUrlCacheGroupAttribute;
+	alias SetUrlCacheGroupAttributeA SetUrlCacheGroupAttribute;
+}
+
+alias INTERNET_BUFFERS* LPINTERNET_BUFFERS;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/winioctl.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,712 @@
+/***********************************************************************\
+*                               winioctl.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.winioctl;
+
+// FIXME: check types of some constants
+
+private import win32.basetyps, win32.windef;
+
+const size_t
+	HIST_NO_OF_BUCKETS = 24,
+	HISTOGRAM_BUCKET_SIZE = HISTOGRAM_BUCKET.sizeof,
+	DISK_HISTOGRAM_SIZE = DISK_HISTOGRAM.sizeof;
+
+alias DWORD DEVICE_TYPE;
+
+enum : DEVICE_TYPE {
+	FILE_DEVICE_BEEP               = 1,
+	FILE_DEVICE_CD_ROM,
+	FILE_DEVICE_CD_ROM_FILE_SYSTEM,
+	FILE_DEVICE_CONTROLLER,
+	FILE_DEVICE_DATALINK,
+	FILE_DEVICE_DFS,
+	FILE_DEVICE_DISK,
+	FILE_DEVICE_DISK_FILE_SYSTEM,
+	FILE_DEVICE_FILE_SYSTEM,
+	FILE_DEVICE_INPORT_PORT,
+	FILE_DEVICE_KEYBOARD,
+	FILE_DEVICE_MAILSLOT,
+	FILE_DEVICE_MIDI_IN,
+	FILE_DEVICE_MIDI_OUT,
+	FILE_DEVICE_MOUSE,
+	FILE_DEVICE_MULTI_UNC_PROVIDER,
+	FILE_DEVICE_NAMED_PIPE,
+	FILE_DEVICE_NETWORK,
+	FILE_DEVICE_NETWORK_BROWSER,
+	FILE_DEVICE_NETWORK_FILE_SYSTEM,
+	FILE_DEVICE_NULL,
+	FILE_DEVICE_PARALLEL_PORT,
+	FILE_DEVICE_PHYSICAL_NETCARD,
+	FILE_DEVICE_PRINTER,
+	FILE_DEVICE_SCANNER,
+	FILE_DEVICE_SERIAL_MOUSE_PORT,
+	FILE_DEVICE_SERIAL_PORT,
+	FILE_DEVICE_SCREEN,
+	FILE_DEVICE_SOUND,
+	FILE_DEVICE_STREAMS,
+	FILE_DEVICE_TAPE,
+	FILE_DEVICE_TAPE_FILE_SYSTEM,
+	FILE_DEVICE_TRANSPORT,
+	FILE_DEVICE_UNKNOWN,
+	FILE_DEVICE_VIDEO,
+	FILE_DEVICE_VIRTUAL_DISK,
+	FILE_DEVICE_WAVE_IN,
+	FILE_DEVICE_WAVE_OUT,
+	FILE_DEVICE_8042_PORT,
+	FILE_DEVICE_NETWORK_REDIRECTOR,
+	FILE_DEVICE_BATTERY,
+	FILE_DEVICE_BUS_EXTENDER,
+	FILE_DEVICE_MODEM,
+	FILE_DEVICE_VDM,
+	FILE_DEVICE_MASS_STORAGE,
+	FILE_DEVICE_SMB,
+	FILE_DEVICE_KS,
+	FILE_DEVICE_CHANGER,
+	FILE_DEVICE_SMARTCARD,
+	FILE_DEVICE_ACPI,
+	FILE_DEVICE_DVD,
+	FILE_DEVICE_FULLSCREEN_VIDEO,
+	FILE_DEVICE_DFS_FILE_SYSTEM,
+	FILE_DEVICE_DFS_VOLUME,
+	FILE_DEVICE_SERENUM,
+	FILE_DEVICE_TERMSRV,
+	FILE_DEVICE_KSEC            // = 57
+}
+
+enum {
+	METHOD_BUFFERED,
+	METHOD_IN_DIRECT,
+	METHOD_OUT_DIRECT,
+	METHOD_NEITHER
+}
+
+enum {
+	FILE_ANY_ACCESS,
+	FILE_SPECIAL_ACCESS = 0,
+	FILE_READ_ACCESS,
+	FILE_WRITE_ACCESS
+}
+
+/*	Bit pattern:
+ *	tttttttt tttttttt aaffffff ffffffmm
+ */
+/+
+#define CTL_CODE(t, f, m, a) (((t)<<16)|((a)<<14)|((f)<<2)|(m))
++/
+
+template CTL_CODE_T(DEVICE_TYPE t, uint f, uint m, uint a) {
+	const DWORD CTL_CODE_T = (t << 16) | (a << 14) | (f << 2) | m;
+}
+
+DEVICE_TYPE DEVICE_TYPE_FROM_CTL_CODE(DWORD c) {
+	return (c & 0xFFFF0000) >> 16;
+}
+
+const DEVICE_TYPE
+	IOCTL_STORAGE_BASE = FILE_DEVICE_MASS_STORAGE,
+	IOCTL_DISK_BASE    = FILE_DEVICE_DISK,
+	IOCTL_VOLUME_BASE  = 'V';
+
+enum : DWORD {
+	IOCTL_STORAGE_CHECK_VERIFY           = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS),
+	IOCTL_STORAGE_CHECK_VERIFY2          = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_STORAGE_MEDIA_REMOVAL          = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS),
+	IOCTL_STORAGE_EJECT_MEDIA            = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS),
+	IOCTL_STORAGE_LOAD_MEDIA             = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS),
+	IOCTL_STORAGE_LOAD_MEDIA2            = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_STORAGE_RESERVE                = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS),
+	IOCTL_STORAGE_RELEASE                = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS),
+	IOCTL_STORAGE_FIND_NEW_DEVICES       = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS),
+	IOCTL_STORAGE_EJECTION_CONTROL       = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0250, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_STORAGE_MCN_CONTROL            = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0251, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_STORAGE_GET_MEDIA_TYPES        = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_STORAGE_GET_MEDIA_TYPES_EX     = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0301, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_STORAGE_RESET_BUS              = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS),
+	IOCTL_STORAGE_RESET_DEVICE           = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS),
+	IOCTL_STORAGE_GET_DEVICE_NUMBER      = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0420, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_STORAGE_PREDICT_FAILURE        = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0440, METHOD_BUFFERED, FILE_ANY_ACCESS),
+
+	IOCTL_DISK_GET_DRIVE_GEOMETRY        = CTL_CODE_T!(IOCTL_DISK_BASE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_DISK_GET_PARTITION_INFO        = CTL_CODE_T!(IOCTL_DISK_BASE, 1, METHOD_BUFFERED, FILE_READ_ACCESS),
+	IOCTL_DISK_SET_PARTITION_INFO        = CTL_CODE_T!(IOCTL_DISK_BASE, 2, METHOD_BUFFERED, FILE_READ_ACCESS|FILE_WRITE_ACCESS),
+	IOCTL_DISK_GET_DRIVE_LAYOUT          = CTL_CODE_T!(IOCTL_DISK_BASE, 3, METHOD_BUFFERED, FILE_READ_ACCESS),
+	IOCTL_DISK_SET_DRIVE_LAYOUT          = CTL_CODE_T!(IOCTL_DISK_BASE, 4, METHOD_BUFFERED, FILE_READ_ACCESS|FILE_WRITE_ACCESS),
+	IOCTL_DISK_VERIFY                    = CTL_CODE_T!(IOCTL_DISK_BASE, 5, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_DISK_FORMAT_TRACKS             = CTL_CODE_T!(IOCTL_DISK_BASE, 6, METHOD_BUFFERED, FILE_READ_ACCESS|FILE_WRITE_ACCESS),
+	IOCTL_DISK_REASSIGN_BLOCKS           = CTL_CODE_T!(IOCTL_DISK_BASE, 7, METHOD_BUFFERED, FILE_READ_ACCESS|FILE_WRITE_ACCESS),
+	IOCTL_DISK_PERFORMANCE               = CTL_CODE_T!(IOCTL_DISK_BASE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_DISK_IS_WRITABLE               = CTL_CODE_T!(IOCTL_DISK_BASE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_DISK_LOGGING                   = CTL_CODE_T!(IOCTL_DISK_BASE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_DISK_FORMAT_TRACKS_EX          = CTL_CODE_T!(IOCTL_DISK_BASE, 11, METHOD_BUFFERED, FILE_READ_ACCESS|FILE_WRITE_ACCESS),
+	IOCTL_DISK_HISTOGRAM_STRUCTURE       = CTL_CODE_T!(IOCTL_DISK_BASE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_DISK_HISTOGRAM_DATA            = CTL_CODE_T!(IOCTL_DISK_BASE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_DISK_HISTOGRAM_RESET           = CTL_CODE_T!(IOCTL_DISK_BASE, 14, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_DISK_REQUEST_STRUCTURE         = CTL_CODE_T!(IOCTL_DISK_BASE, 15, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_DISK_REQUEST_DATA              = CTL_CODE_T!(IOCTL_DISK_BASE, 16, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_DISK_GET_PARTITION_INFO_EX     = CTL_CODE_T!(IOCTL_DISK_BASE, 0x12, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_DISK_SET_PARTITION_INFO_EX     = CTL_CODE_T!(IOCTL_DISK_BASE, 0x13, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
+	IOCTL_DISK_GET_DRIVE_LAYOUT_EX       = CTL_CODE_T!(IOCTL_DISK_BASE, 0x14, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_DISK_SET_DRIVE_LAYOUT_EX       = CTL_CODE_T!(IOCTL_DISK_BASE, 0x15, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
+	IOCTL_DISK_CREATE_DISK               = CTL_CODE_T!(IOCTL_DISK_BASE, 0x16, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
+	IOCTL_DISK_GET_LENGTH_INFO           = CTL_CODE_T!(IOCTL_DISK_BASE, 0x17, METHOD_BUFFERED, FILE_READ_ACCESS),
+	IOCTL_DISK_PERFORMANCE_OFF           = CTL_CODE_T!(IOCTL_DISK_BASE, 0x18, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_DISK_GET_DRIVE_GEOMETRY_EX     = CTL_CODE_T!(IOCTL_DISK_BASE, 0x28, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_DISK_GROW_PARTITION            = CTL_CODE_T!(IOCTL_DISK_BASE, 0x34, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
+	IOCTL_DISK_GET_CACHE_INFORMATION     = CTL_CODE_T!(IOCTL_DISK_BASE, 0x35, METHOD_BUFFERED, FILE_READ_ACCESS),
+	IOCTL_DISK_SET_CACHE_INFORMATION     = CTL_CODE_T!(IOCTL_DISK_BASE, 0x36, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
+	IOCTL_DISK_DELETE_DRIVE_LAYOUT       = CTL_CODE_T!(IOCTL_DISK_BASE, 0x40, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
+	IOCTL_DISK_UPDATE_PROPERTIES         = CTL_CODE_T!(IOCTL_DISK_BASE, 0x50, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_DISK_CHECK_VERIFY              = CTL_CODE_T!(IOCTL_DISK_BASE, 0x200, METHOD_BUFFERED, FILE_READ_ACCESS),
+	IOCTL_DISK_MEDIA_REMOVAL             = CTL_CODE_T!(IOCTL_DISK_BASE, 0x201, METHOD_BUFFERED, FILE_READ_ACCESS),
+	IOCTL_DISK_EJECT_MEDIA               = CTL_CODE_T!(IOCTL_DISK_BASE, 0x202, METHOD_BUFFERED, FILE_READ_ACCESS),
+	IOCTL_DISK_LOAD_MEDIA                = CTL_CODE_T!(IOCTL_DISK_BASE, 0x203, METHOD_BUFFERED, FILE_READ_ACCESS),
+	IOCTL_DISK_RESERVE                   = CTL_CODE_T!(IOCTL_DISK_BASE, 0x204, METHOD_BUFFERED, FILE_READ_ACCESS),
+	IOCTL_DISK_RELEASE                   = CTL_CODE_T!(IOCTL_DISK_BASE, 0x205, METHOD_BUFFERED, FILE_READ_ACCESS),
+	IOCTL_DISK_FIND_NEW_DEVICES          = CTL_CODE_T!(IOCTL_DISK_BASE, 0x206, METHOD_BUFFERED, FILE_READ_ACCESS),
+	IOCTL_DISK_REMOVE_DEVICE             = CTL_CODE_T!(IOCTL_DISK_BASE, 0x207, METHOD_BUFFERED, FILE_READ_ACCESS),
+	IOCTL_DISK_GET_MEDIA_TYPES           = CTL_CODE_T!(IOCTL_DISK_BASE, 0x300, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_DISK_UPDATE_DRIVE_SIZE         = CTL_CODE_T!(IOCTL_DISK_BASE, 0x0032, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
+	IOCTL_SERIAL_LSRMST_INSERT           = CTL_CODE_T!(FILE_DEVICE_SERIAL_PORT, 31, METHOD_BUFFERED, FILE_ANY_ACCESS),
+
+	IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS = CTL_CODE_T!(IOCTL_VOLUME_BASE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	IOCTL_VOLUME_IS_CLUSTERED            = CTL_CODE_T!(IOCTL_VOLUME_BASE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS),
+
+	FSCTL_LOCK_VOLUME                    = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 6, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	FSCTL_UNLOCK_VOLUME                  = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 7, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	FSCTL_DISMOUNT_VOLUME                = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 8, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	FSCTL_MOUNT_DBLS_VOLUME              = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 13, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	FSCTL_GET_COMPRESSION                = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 15, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	FSCTL_SET_COMPRESSION                = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 16, METHOD_BUFFERED, FILE_READ_DATA|FILE_WRITE_DATA),
+	FSCTL_READ_COMPRESSION               = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 17, METHOD_NEITHER, FILE_READ_DATA),
+	FSCTL_WRITE_COMPRESSION              = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 18, METHOD_NEITHER, FILE_WRITE_DATA),
+	FSCTL_GET_NTFS_VOLUME_DATA           = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	FSCTL_GET_VOLUME_BITMAP              = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 27, METHOD_NEITHER, FILE_ANY_ACCESS),
+	FSCTL_GET_RETRIEVAL_POINTERS         = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 28, METHOD_NEITHER, FILE_ANY_ACCESS),
+	FSCTL_MOVE_FILE                      = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 29, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	FSCTL_GET_REPARSE_POINT              = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	FSCTL_SET_REPARSE_POINT              = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	FSCTL_DELETE_REPARSE_POINT           = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 43, METHOD_BUFFERED, FILE_ANY_ACCESS),
+	FSCTL_SET_SPARSE                     = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 49, METHOD_BUFFERED, FILE_SPECIAL_ACCESS),
+}
+
+enum : BYTE {
+	PARTITION_ENTRY_UNUSED,
+	PARTITION_FAT_12,
+	PARTITION_XENIX_1,
+	PARTITION_XENIX_2,
+	PARTITION_FAT_16,
+	PARTITION_EXTENDED,
+	PARTITION_HUGE,
+	PARTITION_IFS,         // = 0x07
+	PARTITION_FAT32           = 0x0B,
+	PARTITION_FAT32_XINT13    = 0x0C,
+	PARTITION_XINT13          = 0x0E,
+	PARTITION_XINT13_EXTENDED = 0x0F,
+	PARTITION_PREP            = 0x41,
+	PARTITION_LDM             = 0x42,
+	PARTITION_UNIX            = 0x63
+}
+
+const BYTE
+	PARTITION_NTFT = 0x80,
+	VALID_NTFT     = 0xC0;
+
+enum {
+	SERIAL_LSRMST_ESCAPE,
+	SERIAL_LSRMST_LSR_DATA,
+	SERIAL_LSRMST_LSR_NODATA,
+	SERIAL_LSRMST_MST
+}
+
+enum {
+	DISK_LOGGING_START,
+	DISK_LOGGING_STOP,
+	DISK_LOGGING_DUMP,
+	DISK_BINNING
+}
+
+alias WORD BAD_TRACK_NUMBER;
+alias WORD* PBAD_TRACK_NUMBER;
+
+enum BIN_TYPES {
+	RequestSize, RequestLocation
+}
+
+struct BIN_RANGE {
+	LARGE_INTEGER StartValue;
+	LARGE_INTEGER Length;
+}
+alias BIN_RANGE* PBIN_RANGE;
+
+struct BIN_COUNT {
+	BIN_RANGE BinRange;
+	DWORD     BinCount;
+}
+alias BIN_COUNT* PBIN_COUNT;
+
+struct BIN_RESULTS {
+	DWORD     NumberOfBins;
+	BIN_COUNT _BinCounts;
+
+	BIN_COUNT* BinCounts() { return &_BinCounts; }
+}
+alias BIN_RESULTS* PBIN_RESULTS;
+
+enum PARTITION_STYLE {
+	PARTITION_STYLE_MBR,
+	PARTITION_STYLE_GPT,
+	PARTITION_STYLE_RAW
+}
+
+struct CREATE_DISK_GPT {
+	GUID  DiskId;
+	DWORD MaxPartitionCount;
+}
+alias CREATE_DISK_GPT* PCREATE_DISK_GPT;
+
+struct CREATE_DISK_MBR {
+	DWORD Signature;
+}
+alias CREATE_DISK_MBR* PCREATE_DISK_MBR;
+
+struct CREATE_DISK {
+	PARTITION_STYLE PartitionStyle;
+	union {
+		CREATE_DISK_MBR Mbr;
+		CREATE_DISK_GPT Gpt;
+	}
+}
+alias CREATE_DISK* PCREATE_DISK;
+
+enum DISK_CACHE_RETENTION_PRIORITY {
+	EqualPriority,
+	KeepPrefetchedData,
+	KeepReadData
+}
+
+struct DISK_CACHE_INFORMATION {
+	BOOLEAN ParametersSavable;
+	BOOLEAN ReadCacheEnabled;
+	BOOLEAN WriteCacheEnabled;
+	DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority;
+	DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority;
+	WORD    DisablePrefetchTransferLength;
+	BOOLEAN PrefetchScalar;
+	union {
+		struct _ScalarPrefetch {
+			WORD Minimum;
+			WORD Maximum;
+			WORD MaximumBlocks;
+		}
+		_ScalarPrefetch ScalarPrefetch;
+		struct _BlockPrefetch {
+			WORD Minimum;
+			WORD Maximum;
+		}
+		_BlockPrefetch BlockPrefetch;
+	}
+}
+alias DISK_CACHE_INFORMATION* PDISK_CACHE_INFORMATION;
+
+enum DETECTION_TYPE {
+	DetectNone,
+	DetectInt13,
+	DetectExInt13
+}
+
+struct DISK_INT13_INFO {
+	WORD  DriveSelect;
+	DWORD MaxCylinders;
+	WORD  SectorsPerTrack;
+	WORD  MaxHeads;
+	WORD  NumberDrives;
+	}
+alias DISK_INT13_INFO* PDISK_INT13_INFO;
+
+struct DISK_EX_INT13_INFO {
+	WORD    ExBufferSize;
+	WORD    ExFlags;
+	DWORD   ExCylinders;
+	DWORD   ExHeads;
+	DWORD   ExSectorsPerTrack;
+	DWORD64 ExSectorsPerDrive;
+	WORD    ExSectorSize;
+	WORD    ExReserved;
+}
+alias DISK_EX_INT13_INFO* PDISK_EX_INT13_INFO;
+
+struct DISK_DETECTION_INFO {
+	DWORD              SizeOfDetectInfo;
+	DETECTION_TYPE     DetectionType;
+	DISK_INT13_INFO    Int13;
+	DISK_EX_INT13_INFO ExInt13;
+}
+alias DISK_DETECTION_INFO* PDISK_DETECTION_INFO;
+
+enum MEDIA_TYPE {
+	Unknown,
+	F5_1Pt2_512,
+	F3_1Pt44_512,
+	F3_2Pt88_512,
+	F3_20Pt8_512,
+	F3_720_512,
+	F5_360_512,
+	F5_320_512,
+	F5_320_1024,
+	F5_180_512,
+	F5_160_512,
+	RemovableMedia,
+	FixedMedia,
+	F3_120M_512,
+	F3_640_512,
+	F5_640_512,
+	F5_720_512,
+	F3_1Pt2_512,
+	F3_1Pt23_1024,
+	F5_1Pt23_1024,
+	F3_128Mb_512,
+	F3_230Mb_512,
+	F8_256_128,
+	F3_200Mb_512,
+	F3_240M_512,
+	F3_32M_512
+}
+alias MEDIA_TYPE* PMEDIA_TYPE;
+
+struct DISK_GEOMETRY {
+	LARGE_INTEGER Cylinders;
+	MEDIA_TYPE    MediaType;
+	DWORD         TracksPerCylinder;
+	DWORD         SectorsPerTrack;
+	DWORD         BytesPerSector;
+}
+alias DISK_GEOMETRY* PDISK_GEOMETRY;
+
+struct DISK_GEOMETRY_EX {
+	DISK_GEOMETRY Geometry;
+	LARGE_INTEGER DiskSize;
+	BYTE          _Data;
+
+	BYTE* Data() { return &_Data; }
+}
+alias DISK_GEOMETRY_EX* PDISK_GEOMETRY_EX;
+
+struct DISK_GROW_PARTITION {
+	DWORD         PartitionNumber;
+	LARGE_INTEGER BytesToGrow;
+}
+alias DISK_GROW_PARTITION* PDISK_GROW_PARTITION;
+
+struct DISK_PARTITION_INFO {
+	DWORD           SizeOfPartitionInfo;
+	PARTITION_STYLE PartitionStyle;
+	union {
+		//struct {
+			DWORD Signature;
+		//} Mbr;
+		//struct {
+			GUID DiskId;
+		//} Gpt;
+	}
+}
+alias DISK_PARTITION_INFO* PDISK_PARTITION_INFO;
+
+struct DISK_PERFORMANCE {
+	LARGE_INTEGER BytesRead;
+	LARGE_INTEGER BytesWritten;
+	LARGE_INTEGER ReadTime;
+	LARGE_INTEGER WriteTime;
+	DWORD         ReadCount;
+	DWORD         WriteCount;
+	DWORD         QueueDepth;
+}
+alias DISK_PERFORMANCE* PDISK_PERFORMANCE;
+
+struct DISK_RECORD {
+	LARGE_INTEGER ByteOffset;
+	LARGE_INTEGER StartTime;
+	LARGE_INTEGER EndTime;
+	PVOID         VirtualAddress;
+	DWORD         NumberOfBytes;
+	BYTE          DeviceNumber;
+	BOOLEAN       ReadRequest;
+}
+alias DISK_RECORD* PDISK_RECORD;
+
+struct DISK_LOGGING {
+	BYTE  Function;
+	PVOID BufferAddress;
+	DWORD BufferSize;
+}
+alias DISK_LOGGING* PDISK_LOGGING;
+
+struct DISKQUOTA_USER_INFORMATION {
+	LONGLONG QuotaUsed;
+	LONGLONG QuotaThreshold;
+	LONGLONG QuotaLimit;
+}
+alias DISKQUOTA_USER_INFORMATION* PDISKQUOTA_USER_INFORMATION;
+
+struct FORMAT_PARAMETERS {
+	MEDIA_TYPE MediaType;
+	DWORD      StartCylinderNumber;
+	DWORD      EndCylinderNumber;
+	DWORD      StartHeadNumber;
+	DWORD      EndHeadNumber;
+}
+alias FORMAT_PARAMETERS* PFORMAT_PARAMETERS;
+
+struct FORMAT_EX_PARAMETERS {
+	MEDIA_TYPE MediaType;
+	DWORD      StartCylinderNumber;
+	DWORD      EndCylinderNumber;
+	DWORD      StartHeadNumber;
+	DWORD      EndHeadNumber;
+	WORD       FormatGapLength;
+	WORD       SectorsPerTrack;
+	WORD       _SectorNumber;
+
+	WORD* SectorNumber() { return &_SectorNumber; }
+}
+alias FORMAT_EX_PARAMETERS* PFORMAT_EX_PARAMETERS;
+
+struct GET_LENGTH_INFORMATION {
+	LARGE_INTEGER Length;
+}
+
+struct HISTOGRAM_BUCKET {
+	DWORD Reads;
+	DWORD Writes;
+}
+alias HISTOGRAM_BUCKET* PHISTOGRAM_BUCKET;
+
+struct DISK_HISTOGRAM {
+	LARGE_INTEGER     DiskSize;
+	LARGE_INTEGER     Start;
+	LARGE_INTEGER     End;
+	LARGE_INTEGER     Average;
+	LARGE_INTEGER     AverageRead;
+	LARGE_INTEGER     AverageWrite;
+	DWORD             Granularity;
+	DWORD             Size;
+	DWORD             ReadCount;
+	DWORD             WriteCount;
+	PHISTOGRAM_BUCKET Histogram;
+}
+alias DISK_HISTOGRAM* PDISK_HISTOGRAM;
+
+struct DISK_EXTENT {
+	DWORD         DiskNumber;
+	LARGE_INTEGER StartingOffset;
+	LARGE_INTEGER ExtentLength;
+}
+alias DISK_EXTENT* PDISK_EXTENT;
+
+struct VOLUME_DISK_EXTENTS {
+	DWORD       NumberOfDiskExtents;
+	DISK_EXTENT _Extents;
+
+	DISK_EXTENT* Extents() { return &_Extents; }
+}
+alias VOLUME_DISK_EXTENTS* PVOLUME_DISK_EXTENTS;
+
+struct PARTITION_INFORMATION {
+	LARGE_INTEGER StartingOffset;
+	LARGE_INTEGER PartitionLength;
+	DWORD         HiddenSectors;
+	DWORD         PartitionNumber;
+	BYTE          PartitionType;
+	BOOLEAN       BootIndicator;
+	BOOLEAN       RecognizedPartition;
+	BOOLEAN       RewritePartition;
+}
+alias PARTITION_INFORMATION* PPARTITION_INFORMATION;
+
+struct DRIVE_LAYOUT_INFORMATION {
+	DWORD                 PartitionCount;
+	DWORD                 Signature;
+	PARTITION_INFORMATION _PartitionEntry;
+
+	PARTITION_INFORMATION* PartitionEntry() { return &_PartitionEntry; }
+}
+alias DRIVE_LAYOUT_INFORMATION* PDRIVE_LAYOUT_INFORMATION;
+
+struct DRIVE_LAYOUT_INFORMATION_GPT {
+	GUID          DiskId;
+	LARGE_INTEGER StartingUsableOffset;
+	LARGE_INTEGER UsableLength;
+	ULONG         MaxPartitionCount;
+}
+alias DRIVE_LAYOUT_INFORMATION_GPT* PDRIVE_LAYOUT_INFORMATION_GPT;
+
+struct DRIVE_LAYOUT_INFORMATION_MBR {
+	ULONG Signature;
+}
+alias DRIVE_LAYOUT_INFORMATION_MBR* PDRIVE_LAYOUT_INFORMATION_MBR;
+
+struct PARTITION_INFORMATION_MBR {
+	BYTE    PartitionType;
+	BOOLEAN BootIndicator;
+	BOOLEAN RecognizedPartition;
+	DWORD   HiddenSectors;
+}
+
+struct PARTITION_INFORMATION_GPT {
+	GUID      PartitionType;
+	GUID      PartitionId;
+	DWORD64   Attributes;
+	WCHAR[36] Name;
+}
+
+struct PARTITION_INFORMATION_EX {
+	PARTITION_STYLE PartitionStyle;
+	LARGE_INTEGER   StartingOffset;
+	LARGE_INTEGER   PartitionLength;
+	DWORD           PartitionNumber;
+	BOOLEAN         RewritePartition;
+	union {
+		PARTITION_INFORMATION_MBR Mbr;
+		PARTITION_INFORMATION_GPT Gpt;
+	}
+}
+
+struct DRIVE_LAYOUT_INFORMATION_EX {
+	DWORD PartitionStyle;
+	DWORD PartitionCount;
+	union {
+		DRIVE_LAYOUT_INFORMATION_MBR Mbr;
+		DRIVE_LAYOUT_INFORMATION_GPT Gpt;
+	}
+	PARTITION_INFORMATION_EX _PartitionEntry;
+
+	PARTITION_INFORMATION_EX* PartitionEntry() { return &_PartitionEntry; }
+}
+alias DRIVE_LAYOUT_INFORMATION_EX* PDRIVE_LAYOUT_INFORMATION_EX;
+
+struct MOVE_FILE_DATA {
+	HANDLE FileHandle;
+	LARGE_INTEGER StartingVcn;
+	LARGE_INTEGER StartingLcn;
+	DWORD ClusterCount;
+}
+alias MOVE_FILE_DATA* PMOVE_FILE_DATA;
+
+struct PERF_BIN {
+	DWORD     NumberOfBins;
+	DWORD     TypeOfBin;
+	BIN_RANGE _BinsRanges;
+
+	BIN_RANGE* BinsRanges() { return &_BinsRanges; }
+}
+alias PERF_BIN* PPERF_BIN;
+
+struct PREVENT_MEDIA_REMOVAL {
+	BOOLEAN PreventMediaRemoval;
+}
+alias PREVENT_MEDIA_REMOVAL* PPREVENT_MEDIA_REMOVAL;
+
+struct RETRIEVAL_POINTERS_BUFFER {
+	DWORD         ExtentCount;
+	LARGE_INTEGER StartingVcn;
+	// In MinGW, this is declared as struct { ... } Extents[1];
+	struct Extent {
+		LARGE_INTEGER NextVcn;
+		LARGE_INTEGER Lcn;
+	}
+	Extent _Extents;
+
+	Extent* Extents() { return &_Extents; }
+}
+alias RETRIEVAL_POINTERS_BUFFER* PRETRIEVAL_POINTERS_BUFFER;
+
+struct REASSIGN_BLOCKS {
+	WORD  Reserved;
+	WORD  Count;
+	DWORD _BlockNumber;
+
+	DWORD* BlockNumber() { return &_BlockNumber; }
+}
+alias REASSIGN_BLOCKS* PREASSIGN_BLOCKS;
+
+struct SET_PARTITION_INFORMATION {
+	BYTE PartitionType;
+}
+alias SET_PARTITION_INFORMATION* PSET_PARTITION_INFORMATION;
+
+struct STARTING_LCN_INPUT_BUFFER {
+	LARGE_INTEGER StartingLcn;
+}
+alias STARTING_LCN_INPUT_BUFFER* PSTARTING_LCN_INPUT_BUFFER;
+
+struct STARTING_VCN_INPUT_BUFFER {
+	LARGE_INTEGER StartingVcn;
+}
+alias STARTING_VCN_INPUT_BUFFER* PSTARTING_VCN_INPUT_BUFFER;
+
+struct VERIFY_INFORMATION {
+	LARGE_INTEGER StartingOffset;
+	DWORD         Length;
+}
+alias VERIFY_INFORMATION* PVERIFY_INFORMATION;
+
+struct VOLUME_BITMAP_BUFFER {
+	LARGE_INTEGER StartingLcn;
+	LARGE_INTEGER BitmapSize;
+	BYTE          _Buffer;
+
+	BYTE* Buffer() { return &_Buffer; }
+}
+alias VOLUME_BITMAP_BUFFER* PVOLUME_BITMAP_BUFFER;
+
+struct NTFS_VOLUME_DATA_BUFFER {
+	LARGE_INTEGER VolumeSerialNumber;
+	LARGE_INTEGER NumberSectors;
+	LARGE_INTEGER TotalClusters;
+	LARGE_INTEGER FreeClusters;
+	LARGE_INTEGER TotalReserved;
+	DWORD         BytesPerSector;
+	DWORD         BytesPerCluster;
+	DWORD         BytesPerFileRecordSegment;
+	DWORD         ClustersPerFileRecordSegment;
+	LARGE_INTEGER MftValidDataLength;
+	LARGE_INTEGER MftStartLcn;
+	LARGE_INTEGER Mft2StartLcn;
+	LARGE_INTEGER MftZoneStart;
+	LARGE_INTEGER MftZoneEnd;
+}
+alias NTFS_VOLUME_DATA_BUFFER* PNTFS_VOLUME_DATA_BUFFER;
+
+
+bool IsRecognizedPartition(BYTE t) {
+	return ((t & PARTITION_NTFT)
+	  && ((t & ~VALID_NTFT) == PARTITION_FAT_12
+	    || (t & ~VALID_NTFT) == PARTITION_FAT_16
+	    || (t & ~VALID_NTFT) == PARTITION_IFS
+	    || (t & ~VALID_NTFT) == PARTITION_HUGE
+	    || (t & ~VALID_NTFT) == PARTITION_FAT32
+	    || (t & ~VALID_NTFT) == PARTITION_FAT32_XINT13
+	    || (t & ~VALID_NTFT) == PARTITION_XINT13))
+	  || (t & ~PARTITION_NTFT) == PARTITION_FAT_12
+	  || (t & ~PARTITION_NTFT) == PARTITION_FAT_16
+	  || (t & ~PARTITION_NTFT) == PARTITION_IFS
+	  || (t & ~PARTITION_NTFT) == PARTITION_HUGE
+	  || (t & ~PARTITION_NTFT) == PARTITION_FAT32
+	  || (t & ~PARTITION_NTFT) == PARTITION_FAT32_XINT13
+	  || (t & ~PARTITION_NTFT) == PARTITION_XINT13;
+}
+
+bool IsContainerPartition(BYTE t) {
+	return ((t & PARTITION_NTFT)
+	  && ((t & ~VALID_NTFT) == PARTITION_EXTENDED
+	    || (t & ~VALID_NTFT) == PARTITION_XINT13_EXTENDED))
+	  || (t & ~PARTITION_NTFT) == PARTITION_EXTENDED
+	  || (t & ~PARTITION_NTFT) == PARTITION_XINT13_EXTENDED;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/winldap.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,853 @@
+/***********************************************************************\
+*                               winldap.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.winldap;
+
+/* Comment from MinGW
+  winldap.h - Header file for the Windows LDAP API
+
+  Written by Filip Navara <xnavara@volny.cz>
+
+  References:
+    The C LDAP Application Program Interface
+    http://www.watersprings.org/pub/id/draft-ietf-ldapext-ldap-c-api-05.txt
+
+    Lightweight Directory Access Protocol Reference
+    http://msdn.microsoft.com/library/en-us/netdir/ldap/ldap_reference.asp
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+*/
+
+import win32.schannel, win32.winber;
+private import win32.wincrypt, win32.windef;
+version(Tango){
+    private import tango.stdc.stdio;
+}
+
+align(4):
+
+enum {
+	LDAP_VERSION1    = 1,
+	LDAP_VERSION2    = 2,
+	LDAP_VERSION3    = 3,
+	LDAP_VERSION     = LDAP_VERSION2,
+	LDAP_VERSION_MIN = LDAP_VERSION2,
+	LDAP_VERSION_MAX = LDAP_VERSION3
+}
+
+/*	MinGW defines ANSI and Unicode versions as LDAP_VENDOR_NAME and
+ *	LDAP_VENDOR_NAME_W respectively; similarly with other string constants
+ *	defined in this module.
+ */
+const TCHAR[] LDAP_VENDOR_NAME = "Microsoft Corporation.";
+
+const LDAP_API_VERSION          = 2004;
+const LDAP_VENDOR_VERSION       =  510;
+const LDAP_API_INFO_VERSION     =    1;
+const LDAP_FEATURE_INFO_VERSION =    1;
+
+enum {
+	LDAP_SUCCESS                    = 0x00,
+	LDAP_OPT_SUCCESS                = LDAP_SUCCESS,
+	LDAP_OPERATIONS_ERROR,
+	LDAP_PROTOCOL_ERROR,
+	LDAP_TIMELIMIT_EXCEEDED,
+	LDAP_SIZELIMIT_EXCEEDED,
+	LDAP_COMPARE_FALSE,
+	LDAP_COMPARE_TRUE,
+	LDAP_STRONG_AUTH_NOT_SUPPORTED,
+	LDAP_AUTH_METHOD_NOT_SUPPORTED  = LDAP_STRONG_AUTH_NOT_SUPPORTED,
+	LDAP_STRONG_AUTH_REQUIRED,
+	LDAP_REFERRAL_V2,
+	LDAP_PARTIAL_RESULTS            = LDAP_REFERRAL_V2,
+	LDAP_REFERRAL,
+	LDAP_ADMIN_LIMIT_EXCEEDED,
+	LDAP_UNAVAILABLE_CRIT_EXTENSION,
+	LDAP_CONFIDENTIALITY_REQUIRED,
+	LDAP_SASL_BIND_IN_PROGRESS,  // = 0x0e
+	LDAP_NO_SUCH_ATTRIBUTE          = 0x10,
+	LDAP_UNDEFINED_TYPE,
+	LDAP_INAPPROPRIATE_MATCHING,
+	LDAP_CONSTRAINT_VIOLATION,
+	LDAP_TYPE_OR_VALUE_EXISTS,
+	LDAP_ATTRIBUTE_OR_VALUE_EXISTS  = LDAP_TYPE_OR_VALUE_EXISTS,
+	LDAP_INVALID_SYNTAX,         // = 0x15
+	LDAP_NO_SUCH_OBJECT             = 0x20,
+	LDAP_ALIAS_PROBLEM,
+	LDAP_INVALID_DN_SYNTAX,
+	LDAP_IS_LEAF,
+	LDAP_ALIAS_DEREF_PROBLEM,    // = 0x24
+	LDAP_INAPPROPRIATE_AUTH         = 0x30,
+	LDAP_INVALID_CREDENTIALS,
+	LDAP_INSUFFICIENT_ACCESS,
+	LDAP_INSUFFICIENT_RIGHTS        = LDAP_INSUFFICIENT_ACCESS,
+	LDAP_BUSY,
+	LDAP_UNAVAILABLE,
+	LDAP_UNWILLING_TO_PERFORM,
+	LDAP_LOOP_DETECT,            // = 0x36
+	LDAP_NAMING_VIOLATION           = 0x40,
+	LDAP_OBJECT_CLASS_VIOLATION,
+	LDAP_NOT_ALLOWED_ON_NONLEAF,
+	LDAP_NOT_ALLOWED_ON_RDN,
+	LDAP_ALREADY_EXISTS,
+	LDAP_NO_OBJECT_CLASS_MODS,
+	LDAP_RESULTS_TOO_LARGE,
+	LDAP_AFFECTS_MULTIPLE_DSAS,  // = 0x47
+	LDAP_OTHER                      = 0x50,
+	LDAP_SERVER_DOWN,
+	LDAP_LOCAL_ERROR,
+	LDAP_ENCODING_ERROR,
+	LDAP_DECODING_ERROR,
+	LDAP_TIMEOUT,
+	LDAP_AUTH_UNKNOWN,
+	LDAP_FILTER_ERROR,
+	LDAP_USER_CANCELLED,
+	LDAP_PARAM_ERROR,
+	LDAP_NO_MEMORY,
+	LDAP_CONNECT_ERROR,
+	LDAP_NOT_SUPPORTED,
+	LDAP_CONTROL_NOT_FOUND,
+	LDAP_NO_RESULTS_RETURNED,
+	LDAP_MORE_RESULTS_TO_RETURN,
+	LDAP_CLIENT_LOOP,
+	LDAP_REFERRAL_LIMIT_EXCEEDED // = 0x61
+}
+
+enum {
+	LDAP_PORT        =  389,
+	LDAP_SSL_PORT    =  636,
+	LDAP_GC_PORT     = 3268,
+	LDAP_SSL_GC_PORT = 3269
+}
+
+const void*
+	LDAP_OPT_OFF = null,
+	LDAP_OPT_ON = cast(void*) 1;
+
+enum {
+	LDAP_OPT_API_INFO               = 0x00,
+	LDAP_OPT_DESC,
+	LDAP_OPT_DEREF,
+	LDAP_OPT_SIZELIMIT,
+	LDAP_OPT_TIMELIMIT,
+	LDAP_OPT_THREAD_FN_PTRS,
+	LDAP_OPT_REBIND_FN,
+	LDAP_OPT_REBIND_ARG,
+	LDAP_OPT_REFERRALS,
+	LDAP_OPT_RESTART,
+	LDAP_OPT_SSL,
+	LDAP_OPT_TLS                    = LDAP_OPT_SSL,
+	LDAP_OPT_IO_FN_PTRS,         // = 0x0b
+	LDAP_OPT_CACHE_FN_PTRS          = 0x0d,
+	LDAP_OPT_CACHE_STRATEGY,
+	LDAP_OPT_CACHE_ENABLE,
+	LDAP_OPT_REFERRAL_HOP_LIMIT,
+	LDAP_OPT_PROTOCOL_VERSION,
+	LDAP_OPT_VERSION                = LDAP_OPT_PROTOCOL_VERSION,
+	LDAP_OPT_SERVER_CONTROLS,
+	LDAP_OPT_CLIENT_CONTROLS,    // = 0x13
+	LDAP_OPT_API_FEATURE_INFO       = 0x15,
+	LDAP_OPT_HOST_NAME              = 0x30,
+	LDAP_OPT_ERROR_NUMBER,
+	LDAP_OPT_ERROR_STRING,
+	LDAP_OPT_SERVER_ERROR,
+	LDAP_OPT_SERVER_EXT_ERROR,   // = 0x34
+	LDAP_OPT_PING_KEEP_ALIVE        = 0x36,
+	LDAP_OPT_PING_WAIT_TIME,
+	LDAP_OPT_PING_LIMIT,         // = 0x38
+	LDAP_OPT_DNSDOMAIN_NAME         = 0x3b,
+	LDAP_OPT_GETDSNAME_FLAGS        = 0x3d,
+	LDAP_OPT_HOST_REACHABLE,
+	LDAP_OPT_PROMPT_CREDENTIALS,
+	LDAP_OPT_TCP_KEEPALIVE,      // = 0x40
+	LDAP_OPT_REFERRAL_CALLBACK      = 0x70,
+	LDAP_OPT_CLIENT_CERTIFICATE     = 0x80,
+	LDAP_OPT_SERVER_CERTIFICATE, // = 0x81
+	LDAP_OPT_AUTO_RECONNECT         = 0x91,
+	LDAP_OPT_SSPI_FLAGS,
+	LDAP_OPT_SSL_INFO,
+	LDAP_OPT_TLS_INFO               = LDAP_OPT_SSL_INFO,
+	LDAP_OPT_REF_DEREF_CONN_PER_MSG,
+	LDAP_OPT_SIGN,
+	LDAP_OPT_ENCRYPT,
+	LDAP_OPT_SASL_METHOD,
+	LDAP_OPT_AREC_EXCLUSIVE,
+	LDAP_OPT_SECURITY_CONTEXT,
+	LDAP_OPT_ROOTDSE_CACHE       // = 0x9a
+}
+
+enum {
+	LDAP_DEREF_NEVER,
+	LDAP_DEREF_SEARCHING,
+	LDAP_DEREF_FINDING,
+	LDAP_DEREF_ALWAYS
+}
+
+const LDAP_NO_LIMIT = 0;
+
+const TCHAR[] LDAP_CONTROL_REFERRALS = "1.2.840.113556.1.4.616";
+
+// FIXME: check type (declared with U suffix in MinGW)
+enum : uint {
+	LDAP_CHASE_SUBORDINATE_REFERRALS = 0x20,
+	LDAP_CHASE_EXTERNAL_REFERRALS    = 0x40
+}
+
+enum {
+	LDAP_SCOPE_DEFAULT = -1,
+	LDAP_SCOPE_BASE,
+	LDAP_SCOPE_ONELEVEL,
+	LDAP_SCOPE_SUBTREE
+}
+
+enum {
+	LDAP_MOD_ADD,
+	LDAP_MOD_DELETE,
+	LDAP_MOD_REPLACE,
+	LDAP_MOD_BVALUES = 0x80
+}
+
+enum : int {
+	LDAP_RES_BIND             = 0x61,
+	LDAP_RES_SEARCH_ENTRY     = 0x64,
+	LDAP_RES_SEARCH_RESULT    = 0x65,
+	LDAP_RES_MODIFY           = 0x67,
+	LDAP_RES_ADD              = 0x69,
+	LDAP_RES_DELETE           = 0x6b,
+	LDAP_RES_MODRDN           = 0x6d,
+	LDAP_RES_COMPARE          = 0x6f,
+	LDAP_RES_SEARCH_REFERENCE = 0x73,
+	LDAP_RES_EXTENDED         = 0x78,
+	LDAP_RES_ANY              = -1
+}
+
+enum {
+	LDAP_MSG_ONE,
+	LDAP_MSG_ALL,
+	LDAP_MSG_RECEIVED
+}
+
+const TCHAR[]
+	LDAP_SERVER_SORT_OID         = "1.2.840.113556.1.4.473",
+	LDAP_SERVER_RESP_SORT_OID    = "1.2.840.113556.1.4.474",
+	LDAP_PAGED_RESULT_OID_STRING = "1.2.840.113556.1.4.319",
+	LDAP_CONTROL_VLVREQUEST      = "2.16.840.1.113730.3.4.9",
+	LDAP_CONTROL_VLVRESPONSE     = "2.16.840.1.113730.3.4.10",
+	LDAP_START_TLS_OID           = "1.3.6.1.4.1.1466.20037",
+	LDAP_TTL_EXTENDED_OP_OID     = "1.3.6.1.4.1.1466.101.119.1";
+
+enum {
+	LDAP_AUTH_NONE      = 0x00U,
+	LDAP_AUTH_SIMPLE    = 0x80U,
+	LDAP_AUTH_SASL      = 0x83U,
+	LDAP_AUTH_OTHERKIND = 0x86U,
+	LDAP_AUTH_EXTERNAL  = LDAP_AUTH_OTHERKIND | 0x0020U,
+	LDAP_AUTH_SICILY    = LDAP_AUTH_OTHERKIND | 0x0200U,
+	LDAP_AUTH_NEGOTIATE = LDAP_AUTH_OTHERKIND | 0x0400U,
+	LDAP_AUTH_MSN       = LDAP_AUTH_OTHERKIND | 0x0800U,
+	LDAP_AUTH_NTLM      = LDAP_AUTH_OTHERKIND | 0x1000U,
+	LDAP_AUTH_DIGEST    = LDAP_AUTH_OTHERKIND | 0x4000U,
+	LDAP_AUTH_DPA       = LDAP_AUTH_OTHERKIND | 0x2000U,
+	LDAP_AUTH_SSPI      = LDAP_AUTH_NEGOTIATE
+}
+
+enum {
+	LDAP_FILTER_AND        = 0xa0,
+	LDAP_FILTER_OR,
+	LDAP_FILTER_NOT,
+	LDAP_FILTER_EQUALITY,
+	LDAP_FILTER_SUBSTRINGS,
+	LDAP_FILTER_GE,
+	LDAP_FILTER_LE,     // = 0xa6
+	LDAP_FILTER_APPROX     = 0xa8,
+	LDAP_FILTER_EXTENSIBLE,
+	LDAP_FILTER_PRESENT    = 0x87
+}
+
+enum {
+	LDAP_SUBSTRING_INITIAL = 0x80,
+	LDAP_SUBSTRING_ANY,
+	LDAP_SUBSTRING_FINAL
+}
+
+struct LDAP {
+	char[76] Reserved;
+	PCHAR    ld_host;
+	ULONG    ld_version;
+	UCHAR    ld_lberoptions;
+	int      ld_deref;
+	int      ld_timelimit;
+	int      ld_sizelimit;
+	int      ld_errno;
+	PCHAR    ld_matched;
+	PCHAR    ld_error;
+}
+alias LDAP* PLDAP;
+
+struct LDAPMessage {
+	ULONG        lm_msgid;
+	ULONG        lm_msgtype;
+	BerElement*  lm_ber;
+	LDAPMessage* lm_chain;
+	LDAPMessage* lm_next;
+	ULONG        lm_time;
+}
+alias LDAPMessage* PLDAPMessage;
+
+struct LDAP_TIMEVAL {
+	LONG tv_sec;
+	LONG tv_usec;
+}
+alias LDAP_TIMEVAL* PLDAP_TIMEVAL;
+
+struct LDAPAPIInfoA {
+	int    ldapai_info_version;
+	int    ldapai_api_version;
+	int    ldapai_protocol_version;
+	char** ldapai_extensions;
+	char*  ldapai_vendor_name;
+	int    ldapai_vendor_version;
+}
+alias LDAPAPIInfoA* PLDAPAPIInfoA;
+
+struct LDAPAPIInfoW {
+	int     ldapai_info_version;
+	int     ldapai_api_version;
+	int     ldapai_protocol_version;
+	PWCHAR* ldapai_extensions;
+	PWCHAR  ldapai_vendor_name;
+	int     ldapai_vendor_version;
+}
+alias LDAPAPIInfoW* PLDAPAPIInfoW;
+
+struct LDAPAPIFeatureInfoA {
+	int   ldapaif_info_version;
+	char* ldapaif_name;
+	int   ldapaif_version;
+}
+alias LDAPAPIFeatureInfoA* PLDAPAPIFeatureInfoA;
+
+struct LDAPAPIFeatureInfoW {
+	int    ldapaif_info_version;
+	PWCHAR ldapaif_name;
+	int    ldapaif_version;
+}
+alias LDAPAPIFeatureInfoW* PLDAPAPIFeatureInfoW;
+
+struct LDAPControlA {
+	PCHAR    ldctl_oid;
+	BerValue ldctl_value;
+	BOOLEAN  ldctl_iscritical;
+}
+alias LDAPControlA* PLDAPControlA;
+
+struct LDAPControlW {
+	PWCHAR   ldctl_oid;
+	BerValue ldctl_value;
+	BOOLEAN  ldctl_iscritical;
+}
+alias LDAPControlW* PLDAPControlW;
+
+/*	Do we really need these?  In MinGW, LDAPModA/W have only mod_op, mod_type
+ *	and mod_vals, and macros are used to simulate anonymous unions in those
+ *	structures.
+ */
+union mod_vals_u_tA {
+	PCHAR*     modv_strvals;
+	BerValue** modv_bvals;
+}
+
+union mod_vals_u_tW {
+	PWCHAR*    modv_strvals;
+	BerValue** modv_bvals;
+}
+
+struct LDAPModA {
+	ULONG         mod_op;
+	PCHAR         mod_type;
+
+	union {
+		mod_vals_u_tA mod_vals;
+		// The following members are defined as macros in MinGW.
+		PCHAR*        mod_values;
+		BerValue**    mod_bvalues;
+	}
+}
+alias LDAPModA* PLDAPModA;
+
+struct LDAPModW {
+	ULONG         mod_op;
+	PWCHAR        mod_type;
+
+	union {
+		mod_vals_u_tW mod_vals;
+		// The following members are defined as macros in MinGW.
+		PWCHAR*       mod_values;
+		BerValue**    mod_bvalues;
+	}
+}
+alias LDAPModW* PLDAPModW;
+
+/* Opaque structure
+ *	http://msdn.microsoft.com/library/en-us/ldap/ldap/ldapsearch.asp
+ */
+struct LDAPSearch;
+alias LDAPSearch* PLDAPSearch;
+
+struct LDAPSortKeyA {
+	PCHAR   sk_attrtype;
+	PCHAR   sk_matchruleoid;
+	BOOLEAN sk_reverseorder;
+}
+alias LDAPSortKeyA* PLDAPSortKeyA;
+
+struct LDAPSortKeyW {
+	PWCHAR  sk_attrtype;
+	PWCHAR  sk_matchruleoid;
+	BOOLEAN sk_reverseorder;
+}
+alias LDAPSortKeyW* PLDAPSortKeyW;
+
+/*	MinGW defines these as immediate function typedefs, which don't translate
+ *	well into D.
+ */
+extern (C) {
+	alias ULONG function(PLDAP, PLDAP, PWCHAR, PCHAR, ULONG, PVOID, PVOID,
+	  PLDAP*) QUERYFORCONNECTION;
+	alias BOOLEAN function(PLDAP, PLDAP, PWCHAR, PCHAR, PLDAP, ULONG, PVOID,
+	  PVOID, ULONG) NOTIFYOFNEWCONNECTION;
+	alias ULONG function(PLDAP, PLDAP) DEREFERENCECONNECTION;
+	alias BOOLEAN function(PLDAP, PSecPkgContext_IssuerListInfoEx,
+	  PCCERT_CONTEXT*) QUERYCLIENTCERT;
+}
+
+struct LDAP_REFERRAL_CALLBACK {
+	ULONG                  SizeOfCallbacks;
+	QUERYFORCONNECTION*    QueryForConnection;
+	NOTIFYOFNEWCONNECTION* NotifyRoutine;
+	DEREFERENCECONNECTION* DereferenceRoutine;
+}
+alias LDAP_REFERRAL_CALLBACK* PLDAP_REFERRAL_CALLBACK;
+
+struct LDAPVLVInfo {
+	int       ldvlv_version;
+	uint      ldvlv_before_count;
+	uint      ldvlv_after_count;
+	uint      ldvlv_offset;
+	uint      ldvlv_count;
+	BerValue* ldvlv_attrvalue;
+	BerValue* ldvlv_context;
+	void*     ldvlv_extradata;
+}
+
+/*
+ * Under Microsoft WinLDAP the function ldap_error is only stub.
+ * This macro uses LDAP structure to get error string and pass it to the user.
+ */
+int ldap_perror(LDAP* handle, char* message) {
+	return printf("%s: %s\n", message, handle.ld_error);
+}
+
+/*	FIXME: In MinGW, these are WINLDAPAPI == DECLSPEC_IMPORT.  Linkage
+ *	attribute?
+ */
+extern (C) {
+	PLDAP ldap_initA(PCHAR, ULONG);
+	PLDAP ldap_initW(PWCHAR, ULONG);
+	PLDAP ldap_openA(PCHAR, ULONG);
+	PLDAP ldap_openW(PWCHAR, ULONG);
+	PLDAP cldap_openA(PCHAR, ULONG);
+	PLDAP cldap_openW(PWCHAR, ULONG);
+	ULONG ldap_connect(LDAP*, LDAP_TIMEVAL*);
+	PLDAP ldap_sslinitA(PCHAR, ULONG, int);
+	PLDAP ldap_sslinitW(PWCHAR, ULONG, int);
+	ULONG ldap_start_tls_sA(LDAP*, PLDAPControlA*, PLDAPControlA*);
+	ULONG ldap_start_tls_sW(LDAP*, PLDAPControlW*, PLDAPControlW*);
+	BOOLEAN ldap_stop_tls_s(LDAP*);
+	ULONG ldap_get_optionA(LDAP*, int, void*);
+	ULONG ldap_get_optionW(LDAP*, int, void*);
+	ULONG ldap_set_optionA(LDAP*, int, void*);
+	ULONG ldap_set_optionW(LDAP*, int, void*);
+	ULONG ldap_control_freeA(LDAPControlA*);
+	ULONG ldap_control_freeW(LDAPControlW*);
+	ULONG ldap_controls_freeA(LDAPControlA**);
+	ULONG ldap_controls_freeW(LDAPControlW**);
+	ULONG ldap_free_controlsA(LDAPControlA**);
+	ULONG ldap_free_controlsW(LDAPControlW**);
+	ULONG ldap_sasl_bindA(LDAP*, PCHAR, PCHAR, BERVAL*, PLDAPControlA*,
+	  PLDAPControlA*, int*);
+	ULONG ldap_sasl_bindW(LDAP*, PWCHAR, PWCHAR, BERVAL*, PLDAPControlW*,
+	  PLDAPControlW*, int*);
+	ULONG ldap_sasl_bind_sA(LDAP*, PCHAR, PCHAR, BERVAL*, PLDAPControlA*,
+	  PLDAPControlA*, PBERVAL*);
+	ULONG ldap_sasl_bind_sW(LDAP*, PWCHAR, PWCHAR, BERVAL*, PLDAPControlW*,
+	  PLDAPControlW*, PBERVAL*);
+	ULONG ldap_simple_bindA(LDAP*, PCHAR, PCHAR);
+	ULONG ldap_simple_bindW(LDAP*, PWCHAR, PWCHAR);
+	ULONG ldap_simple_bind_sA(LDAP*, PCHAR, PCHAR);
+	ULONG ldap_simple_bind_sW(LDAP*, PWCHAR, PWCHAR);
+	ULONG ldap_unbind(LDAP*);
+	ULONG ldap_unbind_s(LDAP*);
+	ULONG ldap_search_extA(LDAP*, PCHAR, ULONG, PCHAR, PCHAR[], ULONG,
+	  PLDAPControlW*, PLDAPControlW*, ULONG, ULONG, ULONG*);
+	ULONG ldap_search_extW(LDAP*, PWCHAR, ULONG, PWCHAR, PWCHAR[], ULONG,
+	  PLDAPControlW*, PLDAPControlW*, ULONG, ULONG, ULONG*);
+	ULONG ldap_search_ext_sA(LDAP*, PCHAR, ULONG, PCHAR, PCHAR[], ULONG,
+	  PLDAPControlA*, PLDAPControlA*, LDAP_TIMEVAL*, ULONG, LDAPMessage**);
+	ULONG ldap_search_ext_sW(LDAP*, PWCHAR, ULONG, PWCHAR, PWCHAR[], ULONG,
+	  PLDAPControlW*, PLDAPControlW*, LDAP_TIMEVAL*, ULONG, LDAPMessage**);
+	ULONG ldap_searchA(LDAP*, PCHAR, ULONG, PCHAR, PCHAR[], ULONG);
+	ULONG ldap_searchW(LDAP*, PWCHAR, ULONG, PWCHAR, PWCHAR[], ULONG);
+	ULONG ldap_search_sA(LDAP*, PCHAR, ULONG, PCHAR, PCHAR[], ULONG,
+	  LDAPMessage**);
+	ULONG ldap_search_sW(LDAP*, PWCHAR, ULONG, PWCHAR, PWCHAR[], ULONG,
+	  LDAPMessage**);
+	ULONG ldap_search_stA(LDAP*, PCHAR, ULONG, PCHAR, PCHAR[], ULONG,
+	  LDAP_TIMEVAL*, LDAPMessage**);
+	ULONG ldap_search_stW(LDAP*, PWCHAR, ULONG, PWCHAR, PWCHAR[], ULONG,
+	  LDAP_TIMEVAL*, LDAPMessage**);
+	ULONG ldap_compare_extA(LDAP*, PCHAR, PCHAR, PCHAR, BerValue*,
+	  PLDAPControlA*, PLDAPControlA*, ULONG*);
+	ULONG ldap_compare_extW(LDAP*, PWCHAR, PWCHAR, PWCHAR, BerValue*,
+	  PLDAPControlW*, PLDAPControlW*, ULONG*);
+	ULONG ldap_compare_ext_sA(LDAP*, PCHAR, PCHAR, PCHAR, BerValue*,
+	  PLDAPControlA*, PLDAPControlA*);
+	ULONG ldap_compare_ext_sW(LDAP*, PWCHAR, PWCHAR, PWCHAR, BerValue*,
+	  PLDAPControlW*, PLDAPControlW*);
+	ULONG ldap_compareA(LDAP*, PCHAR, PCHAR, PCHAR);
+	ULONG ldap_compareW(LDAP*, PWCHAR, PWCHAR, PWCHAR);
+	ULONG ldap_compare_sA(LDAP*, PCHAR, PCHAR, PCHAR);
+	ULONG ldap_compare_sW(LDAP*, PWCHAR, PWCHAR, PWCHAR);
+	ULONG ldap_modify_extA(LDAP*, PCHAR, LDAPModA*[], PLDAPControlA*,
+	  PLDAPControlA*, ULONG*);
+	ULONG ldap_modify_extW(LDAP*, PWCHAR, LDAPModW*[], PLDAPControlW*,
+	  PLDAPControlW*, ULONG*);
+	ULONG ldap_modify_ext_sA(LDAP*, PCHAR, LDAPModA*[], PLDAPControlA*,
+	  PLDAPControlA*);
+	ULONG ldap_modify_ext_sW(LDAP*, PWCHAR, LDAPModW*[], PLDAPControlW*,
+	  PLDAPControlW*);
+	ULONG ldap_modifyA(LDAP*, PCHAR, LDAPModA*[]);
+	ULONG ldap_modifyW(LDAP*, PWCHAR, LDAPModW*[]);
+	ULONG ldap_modify_sA(LDAP*, PCHAR, LDAPModA*[]);
+	ULONG ldap_modify_sW(LDAP*, PWCHAR, LDAPModW*[]);
+	ULONG ldap_rename_extA(LDAP*, PCHAR, PCHAR, PCHAR, INT, PLDAPControlA*,
+	  PLDAPControlA*, ULONG*);
+	ULONG ldap_rename_extW(LDAP*, PWCHAR, PWCHAR, PWCHAR, INT, PLDAPControlW*,
+	  PLDAPControlW*, ULONG*);
+	ULONG ldap_rename_ext_sA(LDAP*, PCHAR, PCHAR, PCHAR, INT,
+	  PLDAPControlA*, PLDAPControlA*);
+	ULONG ldap_rename_ext_sW(LDAP*, PWCHAR, PWCHAR, PWCHAR, INT,
+	  PLDAPControlW*, PLDAPControlW*);
+	ULONG ldap_add_extA(LDAP*, PCHAR, LDAPModA*[], PLDAPControlA*,
+	  PLDAPControlA*, ULONG*);
+	ULONG ldap_add_extW(LDAP*, PWCHAR, LDAPModW*[], PLDAPControlW*,
+	  PLDAPControlW*, ULONG*);
+	ULONG ldap_add_ext_sA(LDAP*, PCHAR, LDAPModA*[], PLDAPControlA*,
+	  PLDAPControlA*);
+	ULONG ldap_add_ext_sW(LDAP*, PWCHAR, LDAPModW*[], PLDAPControlW*,
+	  PLDAPControlW*);
+	ULONG ldap_addA(LDAP*, PCHAR, LDAPModA*[]);
+	ULONG ldap_addW(LDAP*, PWCHAR, LDAPModW*[]);
+	ULONG ldap_add_sA(LDAP*, PCHAR, LDAPModA*[]);
+	ULONG ldap_add_sW(LDAP*, PWCHAR, LDAPModW*[]);
+	ULONG ldap_delete_extA(LDAP*, PCHAR, PLDAPControlA*, PLDAPControlA*,
+	  ULONG*);
+	ULONG ldap_delete_extW(LDAP*, PWCHAR, PLDAPControlW*, PLDAPControlW*,
+	  ULONG*);
+	ULONG ldap_delete_ext_sA(LDAP*, PCHAR, PLDAPControlA*, PLDAPControlA*);
+	ULONG ldap_delete_ext_sW(LDAP*, PWCHAR, PLDAPControlW*, PLDAPControlW*);
+	ULONG ldap_deleteA(LDAP*, PCHAR);
+	ULONG ldap_deleteW(LDAP*, PWCHAR);
+	ULONG ldap_delete_sA(LDAP*, PCHAR);
+	ULONG ldap_delete_sW(LDAP*, PWCHAR);
+	ULONG ldap_extended_operationA(LDAP*, PCHAR, BerValue*, PLDAPControlA*,
+	  PLDAPControlA*, ULONG*);
+	ULONG ldap_extended_operationW(LDAP*, PWCHAR, BerValue*, PLDAPControlW*,
+	  PLDAPControlW*, ULONG*);
+	ULONG ldap_extended_operation_sA(LDAP*, PCHAR, BerValue*, PLDAPControlA*,
+	  PLDAPControlA*, PCHAR*, BerValue**);
+	ULONG ldap_extended_operation_sW(LDAP*, PWCHAR, BerValue*, PLDAPControlW*,
+	  PLDAPControlW*, PWCHAR*, BerValue**);
+	ULONG ldap_close_extended_op(LDAP*, ULONG);
+	ULONG ldap_abandon(LDAP*, ULONG);
+	ULONG ldap_result(LDAP*, ULONG, ULONG, LDAP_TIMEVAL*, LDAPMessage**);
+	ULONG ldap_msgfree(LDAPMessage*);
+	ULONG ldap_parse_resultA(LDAP*, LDAPMessage*, ULONG*, PCHAR*, PCHAR*,
+	  PCHAR**, PLDAPControlA**, BOOLEAN);
+	ULONG ldap_parse_resultW(LDAP*, LDAPMessage*, ULONG*, PWCHAR*, PWCHAR*,
+	  PWCHAR**, PLDAPControlW**, BOOLEAN);
+	ULONG ldap_parse_extended_resultA(LDAP, LDAPMessage*, PCHAR*, BerValue**,
+	  BOOLEAN);
+	ULONG ldap_parse_extended_resultW(LDAP, LDAPMessage*, PWCHAR*, BerValue**,
+	  BOOLEAN);
+	PCHAR ldap_err2stringA(ULONG);
+	PWCHAR ldap_err2stringW(ULONG);
+	ULONG LdapGetLastError();
+	ULONG LdapMapErrorToWin32(ULONG);
+	ULONG ldap_result2error(LDAP*, LDAPMessage*, ULONG);
+	PLDAPMessage ldap_first_entry(LDAP*, LDAPMessage*);
+	PLDAPMessage ldap_next_entry(LDAP*, LDAPMessage*);
+	PLDAPMessage ldap_first_reference(LDAP*, LDAPMessage*);
+	PLDAPMessage ldap_next_reference(LDAP*, LDAPMessage*);
+	ULONG ldap_count_entries(LDAP*, LDAPMessage*);
+	ULONG ldap_count_references(LDAP*, LDAPMessage*);
+	PCHAR ldap_first_attributeA(LDAP*, LDAPMessage*, BerElement**);
+	PWCHAR ldap_first_attributeW(LDAP*, LDAPMessage*, BerElement**);
+	PCHAR ldap_next_attributeA(LDAP*, LDAPMessage*, BerElement*);
+	PWCHAR ldap_next_attributeW(LDAP*, LDAPMessage*, BerElement*);
+	VOID ldap_memfreeA(PCHAR);
+	VOID ldap_memfreeW(PWCHAR);
+	PCHAR* ldap_get_valuesA(LDAP*, LDAPMessage*, PCHAR);
+	PWCHAR* ldap_get_valuesW(LDAP*, LDAPMessage*, PWCHAR);
+	BerValue** ldap_get_values_lenA(LDAP*, LDAPMessage*, PCHAR);
+	BerValue** ldap_get_values_lenW(LDAP*, LDAPMessage*, PWCHAR);
+	ULONG ldap_count_valuesA(PCHAR*);
+	ULONG ldap_count_valuesW(PWCHAR*);
+	ULONG ldap_count_values_len(BerValue**);
+	ULONG ldap_value_freeA(PCHAR*);
+	ULONG ldap_value_freeW(PWCHAR*);
+	ULONG ldap_value_free_len(BerValue**);
+	PCHAR ldap_get_dnA(LDAP*, LDAPMessage*);
+	PWCHAR ldap_get_dnW(LDAP*, LDAPMessage*);
+	PCHAR ldap_explode_dnA(PCHAR, ULONG);
+	PWCHAR ldap_explode_dnW(PWCHAR, ULONG);
+	PCHAR ldap_dn2ufnA(PCHAR);
+	PWCHAR ldap_dn2ufnW(PWCHAR);
+	ULONG ldap_ufn2dnA(PCHAR, PCHAR*);
+	ULONG ldap_ufn2dnW(PWCHAR, PWCHAR*);
+	ULONG ldap_parse_referenceA(LDAP*, LDAPMessage*, PCHAR**);
+	ULONG ldap_parse_referenceW(LDAP*, LDAPMessage*, PWCHAR**);
+	ULONG ldap_check_filterA(LDAP*, PCHAR);
+	ULONG ldap_check_filterW(LDAP*, PWCHAR);
+	ULONG ldap_create_page_controlA(PLDAP, ULONG, BerValue*, UCHAR,
+	  PLDAPControlA*);
+	ULONG ldap_create_page_controlW(PLDAP, ULONG, BerValue*, UCHAR,
+	  PLDAPControlW*);
+	ULONG ldap_create_sort_controlA(PLDAP, PLDAPSortKeyA*, UCHAR,
+	  PLDAPControlA*);
+	ULONG ldap_create_sort_controlW(PLDAP, PLDAPSortKeyW*, UCHAR,
+	PLDAPControlW*);
+	INT ldap_create_vlv_controlA(LDAP*, LDAPVLVInfo*, UCHAR, LDAPControlA**);
+	INT ldap_create_vlv_controlW(LDAP*, LDAPVLVInfo*, UCHAR, LDAPControlW**);
+	ULONG ldap_encode_sort_controlA(PLDAP, PLDAPSortKeyA*, PLDAPControlA,
+	  BOOLEAN);
+	ULONG ldap_encode_sort_controlW(PLDAP, PLDAPSortKeyW*, PLDAPControlW,
+	  BOOLEAN);
+	ULONG ldap_escape_filter_elementA(PCHAR, ULONG, PCHAR, ULONG);
+	ULONG ldap_escape_filter_elementW(PWCHAR, ULONG, PWCHAR, ULONG);
+	ULONG ldap_get_next_page(PLDAP, PLDAPSearch, ULONG, ULONG*);
+	ULONG ldap_get_next_page_s(PLDAP, PLDAPSearch, LDAP_TIMEVAL*, ULONG,
+	  ULONG*, LDAPMessage**);
+	ULONG ldap_get_paged_count(PLDAP, PLDAPSearch, ULONG*, PLDAPMessage);
+	ULONG ldap_parse_page_controlA(PLDAP, PLDAPControlA*, ULONG*, BerValue**);
+	ULONG ldap_parse_page_controlW(PLDAP, PLDAPControlW*, ULONG*, BerValue**);
+	ULONG ldap_parse_sort_controlA(PLDAP, PLDAPControlA*, ULONG*, PCHAR*);
+	ULONG ldap_parse_sort_controlW(PLDAP, PLDAPControlW*, ULONG*, PWCHAR*);
+	INT ldap_parse_vlv_controlA(LDAP*, LDAPControlA**, uint*, uint*,
+	  BerValue**, int*);
+	INT ldap_parse_vlv_controlW(LDAP*, LDAPControlW**, uint*, uint*,
+	  BerValue**, int*);
+	PLDAPSearch ldap_search_init_pageA(PLDAP, PCHAR, ULONG, PCHAR, PCHAR[],
+	  ULONG, PLDAPControlA*, PLDAPControlA*, ULONG, ULONG, PLDAPSortKeyA*);
+	PLDAPSearch ldap_search_init_pageW(PLDAP, PWCHAR, ULONG, PWCHAR, PWCHAR[],
+	  ULONG, PLDAPControlW*, PLDAPControlW*, ULONG, ULONG, PLDAPSortKeyW*);
+	ULONG ldap_search_abandon_page(PLDAP, PLDAPSearch);
+	LDAP ldap_conn_from_msg(LDAP*, LDAPMessage*);
+	INT LdapUnicodeToUTF8(LPCWSTR, int, LPSTR, int);
+	INT LdapUTF8ToUnicode(LPCSTR, int, LPWSTR, int);
+	deprecated {
+		ULONG ldap_bindA(LDAP*, PCHAR, PCHAR, ULONG);
+		ULONG ldap_bindW(LDAP*, PWCHAR, PWCHAR, ULONG);
+		ULONG ldap_bind_sA(LDAP*, PCHAR, PCHAR, ULONG);
+		ULONG ldap_bind_sW(LDAP*, PWCHAR, PWCHAR, ULONG);
+		ULONG ldap_modrdnA(LDAP*, PCHAR, PCHAR);
+		ULONG ldap_modrdnW(LDAP*, PWCHAR, PWCHAR);
+		ULONG ldap_modrdn_sA(LDAP*, PCHAR, PCHAR);
+		ULONG ldap_modrdn_sW(LDAP*, PWCHAR, PWCHAR);
+		ULONG ldap_modrdn2A(LDAP*, PCHAR, PCHAR, INT);
+		ULONG ldap_modrdn2W(LDAP*, PWCHAR, PWCHAR, INT);
+		ULONG ldap_modrdn2_sA(LDAP*, PCHAR, PCHAR, INT);
+		ULONG ldap_modrdn2_sW(LDAP*, PWCHAR, PWCHAR, INT);
+	}
+}
+
+version (Unicode) {
+	alias LDAPControlW LDAPControl;
+	alias PLDAPControlW PLDAPControl;
+	alias LDAPModW LDAPMod;
+	alias LDAPModW PLDAPMod;
+	alias LDAPSortKeyW LDAPSortKey;
+	alias PLDAPSortKeyW PLDAPSortKey;
+	alias LDAPAPIInfoW LDAPAPIInfo;
+	alias PLDAPAPIInfoW PLDAPAPIInfo;
+	alias LDAPAPIFeatureInfoW LDAPAPIFeatureInfo;
+	alias PLDAPAPIFeatureInfoW PLDAPAPIFeatureInfo;
+	alias cldap_openW cldap_open;
+	alias ldap_openW ldap_open;
+	alias ldap_simple_bindW ldap_simple_bind;
+	alias ldap_simple_bind_sW ldap_simple_bind_s;
+	alias ldap_sasl_bindW ldap_sasl_bind;
+	alias ldap_sasl_bind_sW ldap_sasl_bind_s;
+	alias ldap_initW ldap_init;
+	alias ldap_sslinitW ldap_sslinit;
+	alias ldap_get_optionW ldap_get_option;
+	alias ldap_set_optionW ldap_set_option;
+	alias ldap_start_tls_sW ldap_start_tls_s;
+	alias ldap_addW ldap_add;
+	alias ldap_add_extW ldap_add_ext;
+	alias ldap_add_sW ldap_add_s;
+	alias ldap_add_ext_sW ldap_add_ext_s;
+	alias ldap_compareW ldap_compare;
+	alias ldap_compare_extW ldap_compare_ext;
+	alias ldap_compare_sW ldap_compare_s;
+	alias ldap_compare_ext_sW ldap_compare_ext_s;
+	alias ldap_deleteW ldap_delete;
+	alias ldap_delete_extW ldap_delete_ext;
+	alias ldap_delete_sW ldap_delete_s;
+	alias ldap_delete_ext_sW ldap_delete_ext_s;
+	alias ldap_extended_operation_sW ldap_extended_operation_s;
+	alias ldap_extended_operationW ldap_extended_operation;
+	alias ldap_modifyW ldap_modify;
+	alias ldap_modify_extW ldap_modify_ext;
+	alias ldap_modify_sW ldap_modify_s;
+	alias ldap_modify_ext_sW ldap_modify_ext_s;
+	alias ldap_check_filterW ldap_check_filter;
+	alias ldap_count_valuesW ldap_count_values;
+	alias ldap_create_page_controlW ldap_create_page_control;
+	alias ldap_create_sort_controlW ldap_create_sort_control;
+	alias ldap_create_vlv_controlW ldap_create_vlv_control;
+	alias ldap_encode_sort_controlW ldap_encode_sort_control;
+	alias ldap_escape_filter_elementW ldap_escape_filter_element;
+	alias ldap_first_attributeW ldap_first_attribute;
+	alias ldap_next_attributeW ldap_next_attribute;
+	alias ldap_get_valuesW ldap_get_values;
+	alias ldap_get_values_lenW ldap_get_values_len;
+	alias ldap_parse_extended_resultW ldap_parse_extended_result;
+	alias ldap_parse_page_controlW ldap_parse_page_control;
+	alias ldap_parse_referenceW ldap_parse_reference;
+	alias ldap_parse_resultW ldap_parse_result;
+	alias ldap_parse_sort_controlW ldap_parse_sort_control;
+	alias ldap_parse_vlv_controlW ldap_parse_vlv_control;
+	alias ldap_searchW ldap_search;
+	alias ldap_search_sW ldap_search_s;
+	alias ldap_search_stW ldap_search_st;
+	alias ldap_search_extW ldap_search_ext;
+	alias ldap_search_ext_sW ldap_search_ext_s;
+	alias ldap_search_init_pageW ldap_search_init_page;
+	alias ldap_err2stringW ldap_err2string;
+	alias ldap_control_freeW ldap_control_free;
+	alias ldap_controls_freeW ldap_controls_free;
+	alias ldap_free_controlsW ldap_free_controls;
+	alias ldap_memfreeW ldap_memfree;
+	alias ldap_value_freeW ldap_value_free;
+	alias ldap_dn2ufnW ldap_dn2ufn;
+	alias ldap_ufn2dnW ldap_ufn2dn;
+	alias ldap_explode_dnW ldap_explode_dn;
+	alias ldap_get_dnW ldap_get_dn;
+	alias ldap_rename_extW ldap_rename;
+	alias ldap_rename_ext_sW ldap_rename_s;
+	alias ldap_rename_extW ldap_rename_ext;
+	alias ldap_rename_ext_sW ldap_rename_ext_s;
+	deprecated {
+		alias ldap_bindW ldap_bind;
+		alias ldap_bind_sW ldap_bind_s;
+		alias ldap_modrdnW ldap_modrdn;
+		alias ldap_modrdn_sW ldap_modrdn_s;
+		alias ldap_modrdn2W ldap_modrdn2;
+		alias ldap_modrdn2_sW ldap_modrdn2_s;
+	}
+} else {
+	alias LDAPControlA LDAPControl;
+	alias PLDAPControlA PLDAPControl;
+	alias LDAPModA LDAPMod;
+	alias LDAPModA PLDAPMod;
+	alias LDAPSortKeyA LDAPSortKey;
+	alias PLDAPSortKeyA PLDAPSortKey;
+	alias LDAPAPIInfoA LDAPAPIInfo;
+	alias PLDAPAPIInfoA PLDAPAPIInfo;
+	alias LDAPAPIFeatureInfoA LDAPAPIFeatureInfo;
+	alias PLDAPAPIFeatureInfoA PLDAPAPIFeatureInfo;
+	alias cldap_openA cldap_open;
+	alias ldap_openA ldap_open;
+	alias ldap_simple_bindA ldap_simple_bind;
+	alias ldap_simple_bind_sA ldap_simple_bind_s;
+	alias ldap_sasl_bindA ldap_sasl_bind;
+	alias ldap_sasl_bind_sA ldap_sasl_bind_s;
+	alias ldap_initA ldap_init;
+	alias ldap_sslinitA ldap_sslinit;
+	alias ldap_get_optionA ldap_get_option;
+	alias ldap_set_optionA ldap_set_option;
+	alias ldap_start_tls_sA ldap_start_tls_s;
+	alias ldap_addA ldap_add;
+	alias ldap_add_extA ldap_add_ext;
+	alias ldap_add_sA ldap_add_s;
+	alias ldap_add_ext_sA ldap_add_ext_s;
+	alias ldap_compareA ldap_compare;
+	alias ldap_compare_extA ldap_compare_ext;
+	alias ldap_compare_sA ldap_compare_s;
+	alias ldap_compare_ext_sA ldap_compare_ext_s;
+	alias ldap_deleteA ldap_delete;
+	alias ldap_delete_extA ldap_delete_ext;
+	alias ldap_delete_sA ldap_delete_s;
+	alias ldap_delete_ext_sA ldap_delete_ext_s;
+	alias ldap_extended_operation_sA ldap_extended_operation_s;
+	alias ldap_extended_operationA ldap_extended_operation;
+	alias ldap_modifyA ldap_modify;
+	alias ldap_modify_extA ldap_modify_ext;
+	alias ldap_modify_sA ldap_modify_s;
+	alias ldap_modify_ext_sA ldap_modify_ext_s;
+	alias ldap_check_filterA ldap_check_filter;
+	alias ldap_count_valuesA ldap_count_values;
+	alias ldap_create_page_controlA ldap_create_page_control;
+	alias ldap_create_sort_controlA ldap_create_sort_control;
+	alias ldap_create_vlv_controlA ldap_create_vlv_control;
+	alias ldap_encode_sort_controlA ldap_encode_sort_control;
+	alias ldap_escape_filter_elementA ldap_escape_filter_element;
+	alias ldap_first_attributeA ldap_first_attribute;
+	alias ldap_next_attributeA ldap_next_attribute;
+	alias ldap_get_valuesA ldap_get_values;
+	alias ldap_get_values_lenA ldap_get_values_len;
+	alias ldap_parse_extended_resultA ldap_parse_extended_result;
+	alias ldap_parse_page_controlA ldap_parse_page_control;
+	alias ldap_parse_referenceA ldap_parse_reference;
+	alias ldap_parse_resultA ldap_parse_result;
+	alias ldap_parse_sort_controlA ldap_parse_sort_control;
+	alias ldap_parse_vlv_controlA ldap_parse_vlv_control;
+	alias ldap_searchA ldap_search;
+	alias ldap_search_sA ldap_search_s;
+	alias ldap_search_stA ldap_search_st;
+	alias ldap_search_extA ldap_search_ext;
+	alias ldap_search_ext_sA ldap_search_ext_s;
+	alias ldap_search_init_pageA ldap_search_init_page;
+	alias ldap_err2stringA ldap_err2string;
+	alias ldap_control_freeA ldap_control_free;
+	alias ldap_controls_freeA ldap_controls_free;
+	alias ldap_free_controlsA ldap_free_controls;
+	alias ldap_memfreeA ldap_memfree;
+	alias ldap_value_freeA ldap_value_free;
+	alias ldap_dn2ufnA ldap_dn2ufn;
+	alias ldap_ufn2dnA ldap_ufn2dn;
+	alias ldap_explode_dnA ldap_explode_dn;
+	alias ldap_get_dnA ldap_get_dn;
+	alias ldap_rename_extA ldap_rename;
+	alias ldap_rename_ext_sA ldap_rename_s;
+	alias ldap_rename_extA ldap_rename_ext;
+	alias ldap_rename_ext_sA ldap_rename_ext_s;
+	deprecated {
+		alias ldap_bindA ldap_bind;
+		alias ldap_bind_sA ldap_bind_s;
+		alias ldap_modrdnA ldap_modrdn;
+		alias ldap_modrdn_sA ldap_modrdn_s;
+		alias ldap_modrdn2A ldap_modrdn2;
+		alias ldap_modrdn2_sA ldap_modrdn2_s;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/winnetwk.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,438 @@
+/***********************************************************************\
+*                               winnetwk.d                              *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.winnetwk;
+pragma(lib, "mpr.lib");
+
+private import win32.winbase, win32.winerror, win32.winnt;
+
+enum : DWORD {
+	WNNC_NET_MSNET       = 0x00010000,
+	WNNC_NET_LANMAN      = 0x00020000,
+	WNNC_NET_NETWARE     = 0x00030000,
+	WNNC_NET_VINES       = 0x00040000,
+	WNNC_NET_10NET       = 0x00050000,
+	WNNC_NET_LOCUS       = 0x00060000,
+	WNNC_NET_SUN_PC_NFS  = 0x00070000,
+	WNNC_NET_LANSTEP     = 0x00080000,
+	WNNC_NET_9TILES      = 0x00090000,
+	WNNC_NET_LANTASTIC   = 0x000A0000,
+	WNNC_NET_AS400       = 0x000B0000,
+	WNNC_NET_FTP_NFS     = 0x000C0000,
+	WNNC_NET_PATHWORKS   = 0x000D0000,
+	WNNC_NET_LIFENET     = 0x000E0000,
+	WNNC_NET_POWERLAN    = 0x000F0000,
+	WNNC_NET_BWNFS       = 0x00100000,
+	WNNC_NET_COGENT      = 0x00110000,
+	WNNC_NET_FARALLON    = 0x00120000,
+	WNNC_NET_APPLETALK   = 0x00130000,
+	WNNC_NET_INTERGRAPH  = 0x00140000,
+	WNNC_NET_SYMFONET    = 0x00150000,
+	WNNC_NET_CLEARCASE   = 0x00160000,
+	WNNC_NET_FRONTIER    = 0x00170000,
+	WNNC_NET_BMC         = 0x00180000,
+	WNNC_NET_DCE         = 0x00190000,
+	WNNC_NET_AVID        = 0x001A0000,
+	WNNC_NET_DOCUSPACE   = 0x001B0000,
+	WNNC_NET_MANGOSOFT   = 0x001C0000,
+	WNNC_NET_SERNET      = 0x001D0000,
+	WNNC_NET_DECORB      = 0x00200000,
+	WNNC_NET_PROTSTOR    = 0x00210000,
+	WNNC_NET_FJ_REDIR    = 0x00220000,
+	WNNC_NET_DISTINCT    = 0x00230000,
+	WNNC_NET_TWINS       = 0x00240000,
+	WNNC_NET_RDR2SAMPLE  = 0x00250000,
+	WNNC_NET_CSC         = 0x00260000,
+	WNNC_NET_3IN1        = 0x00270000,
+	WNNC_NET_EXTENDNET   = 0x00290000,
+	WNNC_NET_OBJECT_DIRE = 0x00300000,
+	WNNC_NET_MASFAX      = 0x00310000,
+	WNNC_NET_HOB_NFS     = 0x00320000,
+	WNNC_NET_SHIVA       = 0x00330000,
+	WNNC_NET_IBMAL       = 0x00340000,
+	WNNC_CRED_MANAGER    = 0xFFFF0000
+}
+
+enum : DWORD {
+	RESOURCE_CONNECTED  = 1,
+	RESOURCE_GLOBALNET  = 2,
+	RESOURCE_REMEMBERED = 3,
+	RESOURCE_RECENT     = 4,
+	RESOURCE_CONTEXT    = 5
+}
+
+const DWORD
+	RESOURCETYPE_ANY      = 0,
+	RESOURCETYPE_DISK     = 1,
+	RESOURCETYPE_PRINT    = 2,
+	RESOURCETYPE_RESERVED = 8,
+	RESOURCETYPE_UNKNOWN  = 0xFFFFFFFF;
+
+const DWORD
+	RESOURCEUSAGE_CONNECTABLE   = 0x00000001,
+	RESOURCEUSAGE_CONTAINER     = 0x00000002,
+	RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004,
+	RESOURCEUSAGE_SIBLING       = 0x00000008,
+	RESOURCEUSAGE_ATTACHED      = 0x00000010,
+	RESOURCEUSAGE_ALL           = (RESOURCEUSAGE_CONNECTABLE
+	                              | RESOURCEUSAGE_CONTAINER
+	                              | RESOURCEUSAGE_ATTACHED),
+	RESOURCEUSAGE_RESERVED      = 0x80000000;
+
+enum : DWORD {
+	RESOURCEDISPLAYTYPE_GENERIC,
+	RESOURCEDISPLAYTYPE_DOMAIN,
+	RESOURCEDISPLAYTYPE_SERVER,
+	RESOURCEDISPLAYTYPE_SHARE,
+	RESOURCEDISPLAYTYPE_FILE,
+	RESOURCEDISPLAYTYPE_GROUP,
+	RESOURCEDISPLAYTYPE_NETWORK,
+	RESOURCEDISPLAYTYPE_ROOT,
+	RESOURCEDISPLAYTYPE_SHAREADMIN,
+	RESOURCEDISPLAYTYPE_DIRECTORY,
+	RESOURCEDISPLAYTYPE_TREE // = 10
+}
+
+const NETPROPERTY_PERSISTENT = 1;
+
+const DWORD
+	CONNECT_UPDATE_PROFILE =   1,
+	CONNECT_UPDATE_RECENT  =   2,
+	CONNECT_TEMPORARY      =   4,
+	CONNECT_INTERACTIVE    =   8,
+	CONNECT_PROMPT         =  16,
+	CONNECT_NEED_DRIVE     =  32,
+	CONNECT_REFCOUNT       =  64,
+	CONNECT_REDIRECT       = 128,
+	CONNECT_LOCALDRIVE     = 256,
+	CONNECT_CURRENT_MEDIA  = 512;
+
+const DWORD
+	CONNDLG_RO_PATH     =  1,
+	CONNDLG_CONN_POINT  =  2,
+	CONNDLG_USE_MRU     =  4,
+	CONNDLG_HIDE_BOX    =  8,
+	CONNDLG_PERSIST     = 16,
+	CONNDLG_NOT_PERSIST = 32;
+
+const DWORD
+	DISC_UPDATE_PROFILE =  1,
+	DISC_NO_FORCE       = 64;
+
+const DWORD
+	WNFMT_MULTILINE   =  1,
+	WNFMT_ABBREVIATED =  2,
+	WNFMT_INENUM      = 16,
+	WNFMT_CONNECTION  = 32;
+
+enum : DWORD {
+	WN_SUCCESS                   = NO_ERROR,
+	WN_NO_ERROR                  = NO_ERROR,
+	WN_NOT_SUPPORTED             = ERROR_NOT_SUPPORTED,
+	WN_CANCEL                    = ERROR_CANCELLED,
+	WN_RETRY                     = ERROR_RETRY,
+	WN_NET_ERROR                 = ERROR_UNEXP_NET_ERR,
+	WN_MORE_DATA                 = ERROR_MORE_DATA,
+	WN_BAD_POINTER               = ERROR_INVALID_ADDRESS,
+	WN_BAD_VALUE                 = ERROR_INVALID_PARAMETER,
+	WN_BAD_USER                  = ERROR_BAD_USERNAME,
+	WN_BAD_PASSWORD              = ERROR_INVALID_PASSWORD,
+	WN_ACCESS_DENIED             = ERROR_ACCESS_DENIED,
+	WN_FUNCTION_BUSY             = ERROR_BUSY,
+	WN_WINDOWS_ERROR             = ERROR_UNEXP_NET_ERR,
+	WN_OUT_OF_MEMORY             = ERROR_NOT_ENOUGH_MEMORY,
+	WN_NO_NETWORK                = ERROR_NO_NETWORK,
+	WN_EXTENDED_ERROR            = ERROR_EXTENDED_ERROR,
+	WN_BAD_LEVEL                 = ERROR_INVALID_LEVEL,
+	WN_BAD_HANDLE                = ERROR_INVALID_HANDLE,
+	WN_NOT_INITIALIZING          = ERROR_ALREADY_INITIALIZED,
+	WN_NO_MORE_DEVICES           = ERROR_NO_MORE_DEVICES,
+	WN_NOT_CONNECTED             = ERROR_NOT_CONNECTED,
+	WN_OPEN_FILES                = ERROR_OPEN_FILES,
+	WN_DEVICE_IN_USE             = ERROR_DEVICE_IN_USE,
+	WN_BAD_NETNAME               = ERROR_BAD_NET_NAME,
+	WN_BAD_LOCALNAME             = ERROR_BAD_DEVICE,
+	WN_ALREADY_CONNECTED         = ERROR_ALREADY_ASSIGNED,
+	WN_DEVICE_ERROR              = ERROR_GEN_FAILURE,
+	WN_CONNECTION_CLOSED         = ERROR_CONNECTION_UNAVAIL,
+	WN_NO_NET_OR_BAD_PATH        = ERROR_NO_NET_OR_BAD_PATH,
+	WN_BAD_PROVIDER              = ERROR_BAD_PROVIDER,
+	WN_CANNOT_OPEN_PROFILE       = ERROR_CANNOT_OPEN_PROFILE,
+	WN_BAD_PROFILE               = ERROR_BAD_PROFILE,
+	WN_BAD_DEV_TYPE              = ERROR_BAD_DEV_TYPE,
+	WN_DEVICE_ALREADY_REMEMBERED = ERROR_DEVICE_ALREADY_REMEMBERED,
+	WN_NO_MORE_ENTRIES           = ERROR_NO_MORE_ITEMS,
+	WN_NOT_CONTAINER             = ERROR_NOT_CONTAINER,
+	WN_NOT_AUTHENTICATED         = ERROR_NOT_AUTHENTICATED,
+	WN_NOT_LOGGED_ON             = ERROR_NOT_LOGGED_ON,
+	WN_NOT_VALIDATED             = ERROR_NO_LOGON_SERVERS
+}
+
+enum : DWORD {
+	UNIVERSAL_NAME_INFO_LEVEL = 1,
+	REMOTE_NAME_INFO_LEVEL
+}
+
+const DWORD
+	NETINFO_DLL16      = 1,
+	NETINFO_DISKRED    = 4,
+	NETINFO_PRINTERRED = 8;
+
+const DWORD
+	RP_LOGON   = 1,
+	RP_INIFILE = 2;
+
+const DWORD PP_DISPLAYERRORS = 1;
+
+const DWORD
+	WNCON_FORNETCARD = 1,
+	WNCON_NOTROUTED  = 2,
+	WNCON_SLOWLINK   = 4,
+	WNCON_DYNAMIC    = 8;
+
+struct NETRESOURCEA {
+	DWORD dwScope;
+	DWORD dwType;
+	DWORD dwDisplayType;
+	DWORD dwUsage;
+	LPSTR lpLocalName;
+	LPSTR lpRemoteName;
+	LPSTR lpComment;
+	LPSTR lpProvider;
+}
+alias NETRESOURCEA* LPNETRESOURCEA;
+
+struct NETRESOURCEW {
+	DWORD  dwScope;
+	DWORD  dwType;
+	DWORD  dwDisplayType;
+	DWORD  dwUsage;
+	LPWSTR lpLocalName;
+	LPWSTR lpRemoteName;
+	LPWSTR lpComment ;
+	LPWSTR lpProvider;
+}
+alias NETRESOURCEW* LPNETRESOURCEW;
+
+struct CONNECTDLGSTRUCTA {
+	DWORD          cbStructure;
+	HWND           hwndOwner;
+	LPNETRESOURCEA lpConnRes;
+	DWORD          dwFlags;
+	DWORD          dwDevNum;
+}
+alias CONNECTDLGSTRUCTA* LPCONNECTDLGSTRUCTA;
+
+struct CONNECTDLGSTRUCTW {
+	DWORD          cbStructure;
+	HWND           hwndOwner;
+	LPNETRESOURCEW lpConnRes;
+	DWORD          dwFlags;
+	DWORD          dwDevNum;
+}
+alias CONNECTDLGSTRUCTW* LPCONNECTDLGSTRUCTW;
+
+struct DISCDLGSTRUCTA {
+	DWORD cbStructure;
+	HWND  hwndOwner;
+	LPSTR lpLocalName;
+	LPSTR lpRemoteName;
+	DWORD dwFlags;
+}
+alias DISCDLGSTRUCTA* LPDISCDLGSTRUCTA;
+
+struct DISCDLGSTRUCTW {
+	DWORD  cbStructure;
+	HWND   hwndOwner;
+	LPWSTR lpLocalName;
+	LPWSTR lpRemoteName;
+	DWORD  dwFlags;
+}
+alias DISCDLGSTRUCTW* LPDISCDLGSTRUCTW;
+
+struct UNIVERSAL_NAME_INFOA {
+	LPSTR lpUniversalName;
+}
+alias UNIVERSAL_NAME_INFOA* LPUNIVERSAL_NAME_INFOA;
+
+struct UNIVERSAL_NAME_INFOW {
+	LPWSTR lpUniversalName;
+}
+alias UNIVERSAL_NAME_INFOW* LPUNIVERSAL_NAME_INFOW;
+
+struct REMOTE_NAME_INFOA {
+	LPSTR lpUniversalName;
+	LPSTR lpConnectionName;
+	LPSTR lpRemainingPath;
+}
+alias REMOTE_NAME_INFOA* LPREMOTE_NAME_INFOA;
+
+struct REMOTE_NAME_INFOW {
+	LPWSTR lpUniversalName;
+	LPWSTR lpConnectionName;
+	LPWSTR lpRemainingPath;
+}
+alias REMOTE_NAME_INFOW* LPREMOTE_NAME_INFOW;
+
+struct NETINFOSTRUCT {
+	DWORD cbStructure;
+	DWORD dwProviderVersion;
+	DWORD dwStatus;
+	DWORD dwCharacteristics;
+	DWORD dwHandle;
+	WORD  wNetType;
+	DWORD dwPrinters;
+	DWORD dwDrives;
+}
+alias NETINFOSTRUCT* LPNETINFOSTRUCT;
+
+extern (Pascal) {
+	alias UINT function(LPCSTR, LPSTR, UINT) PFNGETPROFILEPATHA;
+	alias UINT function(LPCWSTR, LPWSTR, UINT) PFNGETPROFILEPATHW;
+	alias UINT function(LPCSTR, LPCSTR, DWORD) PFNRECONCILEPROFILEA;
+	alias UINT function(LPCWSTR, LPCWSTR, DWORD) PFNRECONCILEPROFILEW;
+	alias BOOL function(HWND, LPCSTR, LPCSTR, LPCSTR, DWORD)
+	  PFNPROCESSPOLICIESA;
+	alias BOOL function(HWND, LPCWSTR, LPCWSTR, LPCWSTR, DWORD)
+	  PFNPROCESSPOLICIESW;
+}
+
+struct NETCONNECTINFOSTRUCT {
+	DWORD cbStructure;
+	DWORD dwFlags;
+	DWORD dwSpeed;
+	DWORD dwDelay;
+	DWORD dwOptDataSize;
+}
+alias NETCONNECTINFOSTRUCT* LPNETCONNECTINFOSTRUCT;
+
+extern (Windows) {
+	DWORD WNetAddConnection2A(LPNETRESOURCEA, LPCSTR, LPCSTR, DWORD);
+	DWORD WNetAddConnection2W(LPNETRESOURCEW, LPCWSTR, LPCWSTR, DWORD);
+	DWORD WNetAddConnection3A(HWND, LPNETRESOURCEA, LPCSTR, LPCSTR, DWORD);
+	DWORD WNetAddConnection3W(HWND, LPNETRESOURCEW, LPCWSTR, LPCWSTR, DWORD);
+	DWORD WNetCancelConnection2A(LPCSTR, DWORD, BOOL);
+	DWORD WNetCancelConnection2W(LPCWSTR, DWORD, BOOL);
+	DWORD WNetGetConnectionA(LPCSTR, LPSTR, PDWORD);
+	DWORD WNetGetConnectionW(LPCWSTR, LPWSTR, PDWORD);
+	DWORD WNetUseConnectionA(HWND, LPNETRESOURCEA, LPCSTR, LPCSTR, DWORD,
+	  LPSTR, PDWORD, PDWORD);
+	DWORD WNetUseConnectionW(HWND, LPNETRESOURCEW, LPCWSTR, LPCWSTR, DWORD,
+	  LPWSTR, PDWORD, PDWORD);
+	DWORD WNetSetConnectionA(LPCSTR, DWORD, PVOID);
+	DWORD WNetSetConnectionW(LPCWSTR, DWORD, PVOID);
+	DWORD WNetConnectionDialog(HWND, DWORD);
+	DWORD WNetDisconnectDialog(HWND, DWORD);
+	DWORD WNetConnectionDialog1A(LPCONNECTDLGSTRUCTA);
+	DWORD WNetConnectionDialog1W(LPCONNECTDLGSTRUCTW);
+	DWORD WNetDisconnectDialog1A(LPDISCDLGSTRUCTA);
+	DWORD WNetDisconnectDialog1W(LPDISCDLGSTRUCTW);
+	DWORD WNetOpenEnumA(DWORD, DWORD, DWORD, LPNETRESOURCEA, LPHANDLE);
+	DWORD WNetOpenEnumW(DWORD, DWORD, DWORD, LPNETRESOURCEW, LPHANDLE);
+	DWORD WNetEnumResourceA(HANDLE, PDWORD, PVOID, PDWORD);
+	DWORD WNetEnumResourceW(HANDLE, PDWORD, PVOID, PDWORD);
+	DWORD WNetCloseEnum(HANDLE);
+	DWORD WNetGetUniversalNameA(LPCSTR, DWORD, PVOID, PDWORD);
+	DWORD WNetGetUniversalNameW(LPCWSTR, DWORD, PVOID, PDWORD);
+	DWORD WNetGetUserA(LPCSTR, LPSTR, PDWORD);
+	DWORD WNetGetUserW(LPCWSTR, LPWSTR, PDWORD);
+	DWORD WNetGetProviderNameA(DWORD, LPSTR, PDWORD);
+	DWORD WNetGetProviderNameW(DWORD, LPWSTR, PDWORD);
+	DWORD WNetGetNetworkInformationA(LPCSTR, LPNETINFOSTRUCT);
+	DWORD WNetGetNetworkInformationW(LPCWSTR, LPNETINFOSTRUCT);
+	DWORD WNetGetResourceInformationA(LPNETRESOURCEA, LPVOID, LPDWORD,
+	  LPSTR*);
+	DWORD WNetGetResourceInformationW(LPNETRESOURCEA, LPVOID, LPDWORD,
+	  LPWSTR*);
+	DWORD WNetGetResourceParentA(LPNETRESOURCEA, LPVOID, LPDWORD);
+	DWORD WNetGetResourceParentW(LPNETRESOURCEW, LPVOID, LPDWORD);
+	DWORD WNetGetLastErrorA(PDWORD, LPSTR, DWORD, LPSTR, DWORD);
+	DWORD WNetGetLastErrorW(PDWORD, LPWSTR, DWORD, LPWSTR, DWORD);
+	DWORD MultinetGetConnectionPerformanceA(LPNETRESOURCEA,
+	  LPNETCONNECTINFOSTRUCT);
+	DWORD MultinetGetConnectionPerformanceW(LPNETRESOURCEW,
+	  LPNETCONNECTINFOSTRUCT);
+	deprecated {
+		DWORD WNetAddConnectionA(LPCSTR, LPCSTR, LPCSTR);
+		DWORD WNetAddConnectionW(LPCWSTR, LPCWSTR, LPCWSTR);
+		DWORD WNetCancelConnectionA(LPCSTR, BOOL);
+		DWORD WNetCancelConnectionW(LPCWSTR, BOOL);
+	}
+}
+
+version (Unicode) {
+	alias PFNGETPROFILEPATHW PFNGETPROFILEPATH;
+	alias PFNRECONCILEPROFILEW PFNRECONCILEPROFILE;
+	alias PFNPROCESSPOLICIESW PFNPROCESSPOLICIES;
+	alias NETRESOURCEW NETRESOURCE;
+	alias CONNECTDLGSTRUCTW CONNECTDLGSTRUCT;
+	alias DISCDLGSTRUCTW DISCDLGSTRUCT;
+	alias REMOTE_NAME_INFOW REMOTE_NAME_INFO;
+	alias UNIVERSAL_NAME_INFOW UNIVERSAL_NAME_INFO;
+	alias WNetAddConnection2W WNetAddConnection2;
+	alias WNetAddConnection3W WNetAddConnection3;
+	alias WNetCancelConnection2W WNetCancelConnection2;
+	alias WNetGetConnectionW WNetGetConnection;
+	alias WNetUseConnectionW WNetUseConnection;
+	alias WNetSetConnectionW WNetSetConnection;
+	alias WNetConnectionDialog1W WNetConnectionDialog1;
+	alias WNetDisconnectDialog1W WNetDisconnectDialog1;
+	alias WNetOpenEnumW WNetOpenEnum;
+	alias WNetEnumResourceW WNetEnumResource;
+	alias WNetGetUniversalNameW WNetGetUniversalName;
+	alias WNetGetUserW WNetGetUser;
+	alias WNetGetProviderNameW WNetGetProviderName;
+	alias WNetGetNetworkInformationW WNetGetNetworkInformation;
+	alias WNetGetResourceInformationW WNetGetResourceInformation;
+	alias WNetGetResourceParentW WNetGetResourceParent;
+	alias WNetGetLastErrorW WNetGetLastError;
+	alias MultinetGetConnectionPerformanceW MultinetGetConnectionPerformance;
+	deprecated {
+		alias WNetAddConnectionW WNetAddConnection;
+		alias WNetCancelConnectionW WNetCancelConnection;
+	}
+} else {
+	alias PFNGETPROFILEPATHA PFNGETPROFILEPATH;
+	alias PFNRECONCILEPROFILEA PFNRECONCILEPROFILE;
+	alias PFNPROCESSPOLICIESA PFNPROCESSPOLICIES;
+	alias NETRESOURCEA NETRESOURCE;
+	alias CONNECTDLGSTRUCTA CONNECTDLGSTRUCT;
+	alias DISCDLGSTRUCTA DISCDLGSTRUCT;
+	alias REMOTE_NAME_INFOA REMOTE_NAME_INFO;
+	alias UNIVERSAL_NAME_INFOA UNIVERSAL_NAME_INFO;
+	alias WNetAddConnection2A WNetAddConnection2;
+	alias WNetAddConnection3A WNetAddConnection3;
+	alias WNetCancelConnection2A WNetCancelConnection2;
+	alias WNetGetConnectionA WNetGetConnection;
+	alias WNetUseConnectionA WNetUseConnection;
+	alias WNetSetConnectionA WNetSetConnection;
+	alias WNetConnectionDialog1A WNetConnectionDialog1;
+	alias WNetDisconnectDialog1A WNetDisconnectDialog1;
+	alias WNetOpenEnumA WNetOpenEnum;
+	alias WNetEnumResourceA WNetEnumResource;
+	alias WNetGetUniversalNameA WNetGetUniversalName;
+	alias WNetGetUserA WNetGetUser;
+	alias WNetGetProviderNameA WNetGetProviderName;
+	alias WNetGetNetworkInformationA WNetGetNetworkInformation;
+	alias WNetGetResourceInformationA WNetGetResourceInformation;
+	alias WNetGetResourceParentA WNetGetResourceParent;
+	alias WNetGetLastErrorA WNetGetLastError;
+	alias MultinetGetConnectionPerformanceA MultinetGetConnectionPerformance;
+	deprecated {
+		alias WNetAddConnectionA WNetAddConnection;
+		alias WNetCancelConnectionA WNetCancelConnection;
+	}
+}
+
+alias NETRESOURCE* LPNETRESOURCE;
+alias CONNECTDLGSTRUCT* LPCONNECTDLGSTRUCT;
+alias DISCDLGSTRUCT* LPDISCDLGSTRUCT;
+alias REMOTE_NAME_INFO* LPREMOTE_NAME_INFO;
+alias UNIVERSAL_NAME_INFO* LPUNIVERSAL_NAME_INFO;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/winnls.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,811 @@
+/***********************************************************************\
+*                                winnls.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.winnls;
+pragma(lib, "kernel32.lib");
+
+private import win32.basetsd, win32.w32api, win32.winbase, win32.windef;
+
+alias DWORD LCTYPE, CALTYPE, CALID, LGRPID, GEOID, GEOTYPE, GEOCLASS;
+
+const size_t
+	MAX_DEFAULTCHAR =  2,
+	MAX_LEADBYTES   = 12;
+
+const LCTYPE
+	LOCALE_USE_CP_ACP    = 0x40000000,
+	LOCALE_RETURN_NUMBER = 0x20000000;
+
+enum : LCTYPE {
+	LOCALE_ILANGUAGE = 1,
+	LOCALE_SLANGUAGE,
+	LOCALE_SABBREVLANGNAME,
+	LOCALE_SNATIVELANGNAME,
+	LOCALE_ICOUNTRY,
+	LOCALE_SCOUNTRY,
+	LOCALE_SABBREVCTRYNAME,
+	LOCALE_SNATIVECTRYNAME,
+	LOCALE_IDEFAULTLANGUAGE,
+	LOCALE_IDEFAULTCOUNTRY,
+	LOCALE_IDEFAULTCODEPAGE,
+	LOCALE_SLIST,
+	LOCALE_IMEASURE,
+	LOCALE_SDECIMAL,
+	LOCALE_STHOUSAND,
+	LOCALE_SGROUPING,
+	LOCALE_IDIGITS,
+	LOCALE_ILZERO,
+	LOCALE_SNATIVEDIGITS,
+	LOCALE_SCURRENCY,
+	LOCALE_SINTLSYMBOL,
+	LOCALE_SMONDECIMALSEP,
+	LOCALE_SMONTHOUSANDSEP,
+	LOCALE_SMONGROUPING,
+	LOCALE_ICURRDIGITS,
+	LOCALE_IINTLCURRDIGITS,
+	LOCALE_ICURRENCY,
+	LOCALE_INEGCURR,
+	LOCALE_SDATE,
+	LOCALE_STIME,
+	LOCALE_SSHORTDATE,
+	LOCALE_SLONGDATE,
+	LOCALE_IDATE,
+	LOCALE_ILDATE,
+	LOCALE_ITIME,
+	LOCALE_ICENTURY,
+	LOCALE_ITLZERO,
+	LOCALE_IDAYLZERO,
+	LOCALE_IMONLZERO,
+	LOCALE_S1159,
+	LOCALE_S2359,
+	LOCALE_SDAYNAME1,
+	LOCALE_SDAYNAME2,
+	LOCALE_SDAYNAME3,
+	LOCALE_SDAYNAME4,
+	LOCALE_SDAYNAME5,
+	LOCALE_SDAYNAME6,
+	LOCALE_SDAYNAME7,
+	LOCALE_SABBREVDAYNAME1,
+	LOCALE_SABBREVDAYNAME2,
+	LOCALE_SABBREVDAYNAME3,
+	LOCALE_SABBREVDAYNAME4,
+	LOCALE_SABBREVDAYNAME5,
+	LOCALE_SABBREVDAYNAME6,
+	LOCALE_SABBREVDAYNAME7,
+	LOCALE_SMONTHNAME1,
+	LOCALE_SMONTHNAME2,
+	LOCALE_SMONTHNAME3,
+	LOCALE_SMONTHNAME4,
+	LOCALE_SMONTHNAME5,
+	LOCALE_SMONTHNAME6,
+	LOCALE_SMONTHNAME7,
+	LOCALE_SMONTHNAME8,
+	LOCALE_SMONTHNAME9,
+	LOCALE_SMONTHNAME10,
+	LOCALE_SMONTHNAME11,
+	LOCALE_SMONTHNAME12,
+	LOCALE_SABBREVMONTHNAME1,
+	LOCALE_SABBREVMONTHNAME2,
+	LOCALE_SABBREVMONTHNAME3,
+	LOCALE_SABBREVMONTHNAME4,
+	LOCALE_SABBREVMONTHNAME5,
+	LOCALE_SABBREVMONTHNAME6,
+	LOCALE_SABBREVMONTHNAME7,
+	LOCALE_SABBREVMONTHNAME8,
+	LOCALE_SABBREVMONTHNAME9,
+	LOCALE_SABBREVMONTHNAME10,
+	LOCALE_SABBREVMONTHNAME11,
+	LOCALE_SABBREVMONTHNAME12,
+	LOCALE_SPOSITIVESIGN,
+	LOCALE_SNEGATIVESIGN,
+	LOCALE_IPOSSIGNPOSN,
+	LOCALE_INEGSIGNPOSN,
+	LOCALE_IPOSSYMPRECEDES,
+	LOCALE_IPOSSEPBYSPACE,
+	LOCALE_INEGSYMPRECEDES,
+	LOCALE_INEGSEPBYSPACE,
+	LOCALE_FONTSIGNATURE,
+	LOCALE_SISO639LANGNAME,
+	LOCALE_SISO3166CTRYNAME, // = 90
+	LOCALE_SENGLANGUAGE         = 0x1001,
+	LOCALE_SENGCOUNTRY          = 0x1002,
+	LOCALE_IDEFAULTANSICODEPAGE = 0x1004,
+	LOCALE_INEGNUMBER           = 0x1010,
+	LOCALE_STIMEFORMAT          = 0x1003,
+	LOCALE_ITIMEMARKPOSN        = 0x1005,
+	LOCALE_ICALENDARTYPE        = 0x1009,
+	LOCALE_IOPTIONALCALENDAR    = 0x100B,
+	LOCALE_IFIRSTDAYOFWEEK      = 0x100C,
+	LOCALE_IFIRSTWEEKOFYEAR     = 0x100D,
+	LOCALE_SMONTHNAME13         = 0x100E,
+	LOCALE_SABBREVMONTHNAME13   = 0x100F
+}
+
+enum : LCID {
+	LOCALE_USER_DEFAULT   = 0x400,
+	LOCALE_SYSTEM_DEFAULT = 0x800
+}
+
+const DWORD
+	NORM_IGNORECASE     =       1,
+	NORM_IGNORENONSPACE =       2,
+	NORM_IGNORESYMBOLS  =       4,
+	SORT_STRINGSORT     = 0x01000,
+	NORM_IGNOREKANATYPE = 0x10000,
+	NORM_IGNOREWIDTH    = 0x20000;
+
+const DWORD
+	LCMAP_LOWERCASE           = 0x00000100,
+	LCMAP_UPPERCASE           = 0x00000200,
+	LCMAP_SORTKEY             = 0x00000400,
+	LCMAP_BYTEREV             = 0x00000800,
+	LCMAP_HIRAGANA            = 0x00100000,
+	LCMAP_KATAKANA            = 0x00200000,
+	LCMAP_HALFWIDTH           = 0x00400000,
+	LCMAP_FULLWIDTH           = 0x00800000,
+	LCMAP_LINGUISTIC_CASING   = 0x01000000,
+	LCMAP_SIMPLIFIED_CHINESE  = 0x02000000,
+	LCMAP_TRADITIONAL_CHINESE = 0x04000000;
+
+const CALID ENUM_ALL_CALENDARS = -1;
+
+const DWORD
+	DATE_SHORTDATE        =          1,
+	DATE_LONGDATE         =          2,
+	DATE_USE_ALT_CALENDAR =          4,
+	LOCALE_NOUSEROVERRIDE = 0x80000000;
+
+enum : DWORD {
+	CP_INSTALLED = 1,
+	CP_SUPPORTED
+}
+
+enum : DWORD {
+	LCID_INSTALLED       = 1,
+	LCID_SUPPORTED       = 2,
+	LCID_ALTERNATE_SORTS = 4
+}
+
+const DWORD
+	MAP_FOLDCZONE   =  16,
+	MAP_PRECOMPOSED =  32,
+	MAP_COMPOSITE   =  64,
+	MAP_FOLDDIGITS  = 128;
+
+enum : UINT {
+	CP_ACP,
+	CP_OEMCP,
+	CP_MACCP,
+	CP_THREAD_ACP, // =     3
+	CP_SYMBOL         =    42,
+	CP_UTF7           = 65000,
+	CP_UTF8           = 65001
+}
+
+enum : DWORD {
+	CT_CTYPE1 = 1,
+	CT_CTYPE2 = 2,
+	CT_CTYPE3 = 4
+}
+
+const WORD
+	C1_UPPER  =   1,
+	C1_LOWER  =   2,
+	C1_DIGIT  =   4,
+	C1_SPACE  =   8,
+	C1_PUNCT  =  16,
+	C1_CNTRL  =  32,
+	C1_BLANK  =  64,
+	C1_XDIGIT = 128,
+	C1_ALPHA  = 256;
+
+enum : WORD {
+	C2_NOTAPPLICABLE,
+	C2_LEFTTORIGHT,
+	C2_RIGHTTOLEFT,
+	C2_EUROPENUMBER,
+	C2_EUROPESEPARATOR,
+	C2_EUROPETERMINATOR,
+	C2_ARABICNUMBER,
+	C2_COMMONSEPARATOR,
+	C2_BLOCKSEPARATOR,
+	C2_SEGMENTSEPARATOR,
+	C2_WHITESPACE,
+	C2_OTHERNEUTRAL  // = 11
+}
+
+const WORD
+	C3_NOTAPPLICABLE =      0,
+	C3_NONSPACING    =      1,
+	C3_DIACRITIC     =      2,
+	C3_VOWELMARK     =      4,
+	C3_SYMBOL        =      8,
+	C3_KATAKANA      = 0x0010,
+	C3_HIRAGANA      = 0x0020,
+	C3_HALFWIDTH     = 0x0040,
+	C3_FULLWIDTH     = 0x0080,
+	C3_IDEOGRAPH     = 0x0100,
+	C3_KASHIDA       = 0x0200,
+	C3_LEXICAL       = 0x0400,
+	C3_ALPHA         = 0x8000;
+
+const DWORD
+	TIME_NOMINUTESORSECONDS = 1,
+	TIME_NOSECONDS          = 2,
+	TIME_NOTIMEMARKER       = 4,
+	TIME_FORCE24HOURFORMAT  = 8;
+
+const DWORD
+	MB_PRECOMPOSED       = 1,
+	MB_COMPOSITE         = 2,
+	MB_USEGLYPHCHARS     = 4,
+	MB_ERR_INVALID_CHARS = 8;
+
+const DWORD
+	WC_DISCARDNS      =  16,
+	WC_SEPCHARS       =  32,
+	WC_DEFAULTCHAR    =  64,
+	WC_COMPOSITECHECK = 512;
+
+enum : LONG {
+	CTRY_DEFAULT            =   0,
+	CTRY_DOMINICAN_REPUBLIC =   1,
+	CTRY_PUERTO_RICO        =   1,
+	CTRY_CARIBBEAN          =   1,
+	CTRY_JAMAICA            =   1,
+	CTRY_UNITED_STATES      =   1,
+	CTRY_TRINIDAD_Y_TOBAGO  =   1,
+	CTRY_CANADA             =   2,
+	CTRY_RUSSIA             =   7,
+	CTRY_UZBEKISTAN         =   7,
+	CTRY_KAZAKSTAN          =   7,
+	CTRY_TATARSTAN          =   7,
+	CTRY_EGYPT              =  20,
+	CTRY_SOUTH_AFRICA       =  27,
+	CTRY_GREECE             =  30,
+	CTRY_NETHERLANDS        =  31,
+	CTRY_BELGIUM            =  32,
+	CTRY_FRANCE             =  33,
+	CTRY_MONACO             =  33,
+	CTRY_SPAIN              =  34,
+	CTRY_HUNGARY            =  36,
+	CTRY_ITALY              =  39,
+	CTRY_ROMANIA            =  40,
+	CTRY_SWITZERLAND        =  41,
+	CTRY_LIECHTENSTEIN      =  41,
+	CTRY_AUSTRIA            =  43,
+	CTRY_UNITED_KINGDOM     =  44,
+	CTRY_DENMARK            =  45,
+	CTRY_SWEDEN             =  46,
+	CTRY_NORWAY             =  47,
+	CTRY_POLAND             =  48,
+	CTRY_GERMANY            =  49,
+	CTRY_PERU               =  51,
+	CTRY_MEXICO             =  52,
+	CTRY_ARGENTINA          =  54,
+	CTRY_BRAZIL             =  55,
+	CTRY_CHILE              =  56,
+	CTRY_COLOMBIA           =  57,
+	CTRY_VENEZUELA          =  58,
+	CTRY_MALAYSIA           =  60,
+	CTRY_AUSTRALIA          =  61,
+	CTRY_INDONESIA          =  62,
+	CTRY_PHILIPPINES        =  63,
+	CTRY_NEW_ZEALAND        =  64,
+	CTRY_SINGAPORE          =  65,
+	CTRY_THAILAND           =  66,
+	CTRY_JAPAN              =  81,
+	CTRY_SOUTH_KOREA        =  82,
+	CTRY_VIET_NAM           =  84,
+	CTRY_PRCHINA            =  86,
+	CTRY_TURKEY             =  90,
+	CTRY_INDIA              =  91,
+	CTRY_PAKISTAN           =  92,
+	CTRY_MOROCCO            = 212,
+	CTRY_ALGERIA            = 213,
+	CTRY_TUNISIA            = 216,
+	CTRY_LIBYA              = 218,
+	CTRY_KENYA              = 254,
+	CTRY_ZIMBABWE           = 263,
+	CTRY_FAEROE_ISLANDS     = 298,
+	CTRY_PORTUGAL           = 351,
+	CTRY_LUXEMBOURG         = 352,
+	CTRY_IRELAND            = 353,
+	CTRY_ICELAND            = 354,
+	CTRY_ALBANIA            = 355,
+	CTRY_FINLAND            = 358,
+	CTRY_BULGARIA           = 359,
+	CTRY_LITHUANIA          = 370,
+	CTRY_LATVIA             = 371,
+	CTRY_ESTONIA            = 372,
+	CTRY_ARMENIA            = 374,
+	CTRY_BELARUS            = 375,
+	CTRY_UKRAINE            = 380,
+	CTRY_SERBIA             = 381,
+	CTRY_CROATIA            = 385,
+	CTRY_SLOVENIA           = 386,
+	CTRY_MACEDONIA          = 389,
+	CTRY_CZECH              = 420,
+	CTRY_SLOVAK             = 421,
+	CTRY_BELIZE             = 501,
+	CTRY_GUATEMALA          = 502,
+	CTRY_EL_SALVADOR        = 503,
+	CTRY_HONDURAS           = 504,
+	CTRY_NICARAGUA          = 505,
+	CTRY_COSTA_RICA         = 506,
+	CTRY_PANAMA             = 507,
+	CTRY_BOLIVIA            = 591,
+	CTRY_ECUADOR            = 593,
+	CTRY_PARAGUAY           = 595,
+	CTRY_URUGUAY            = 598,
+	CTRY_BRUNEI_DARUSSALAM  = 673,
+	CTRY_HONG_KONG          = 852,
+	CTRY_MACAU              = 853,
+	CTRY_TAIWAN             = 886,
+	CTRY_MALDIVES           = 960,
+	CTRY_LEBANON            = 961,
+	CTRY_JORDAN             = 962,
+	CTRY_SYRIA              = 963,
+	CTRY_IRAQ               = 964,
+	CTRY_KUWAIT             = 965,
+	CTRY_SAUDI_ARABIA       = 966,
+	CTRY_YEMEN              = 967,
+	CTRY_OMAN               = 968,
+	CTRY_UAE                = 971,
+	CTRY_ISRAEL             = 972,
+	CTRY_BAHRAIN            = 973,
+	CTRY_QATAR              = 974,
+	CTRY_MONGOLIA           = 976,
+	CTRY_IRAN               = 981,
+	CTRY_AZERBAIJAN         = 994,
+	CTRY_GEORGIA            = 995,
+	CTRY_KYRGYZSTAN         = 996
+}
+
+enum : CALTYPE {
+	CAL_ICALINTVALUE          = 1,
+	CAL_SCALNAME,
+	CAL_IYEAROFFSETRANGE,
+	CAL_SERASTRING,
+	CAL_SSHORTDATE,
+	CAL_SLONGDATE,
+	CAL_SDAYNAME1,
+	CAL_SDAYNAME2,
+	CAL_SDAYNAME3,
+	CAL_SDAYNAME4,
+	CAL_SDAYNAME5,
+	CAL_SDAYNAME6,
+	CAL_SDAYNAME7,
+	CAL_SABBREVDAYNAME1,
+	CAL_SABBREVDAYNAME2,
+	CAL_SABBREVDAYNAME3,
+	CAL_SABBREVDAYNAME4,
+	CAL_SABBREVDAYNAME5,
+	CAL_SABBREVDAYNAME6,
+	CAL_SABBREVDAYNAME7,
+	CAL_SMONTHNAME1,
+	CAL_SMONTHNAME2,
+	CAL_SMONTHNAME3,
+	CAL_SMONTHNAME4,
+	CAL_SMONTHNAME5,
+	CAL_SMONTHNAME6,
+	CAL_SMONTHNAME7,
+	CAL_SMONTHNAME8,
+	CAL_SMONTHNAME9,
+	CAL_SMONTHNAME10,
+	CAL_SMONTHNAME11,
+	CAL_SMONTHNAME12,
+	CAL_SMONTHNAME13,
+	CAL_SABBREVMONTHNAME1,
+	CAL_SABBREVMONTHNAME2,
+	CAL_SABBREVMONTHNAME3,
+	CAL_SABBREVMONTHNAME4,
+	CAL_SABBREVMONTHNAME5,
+	CAL_SABBREVMONTHNAME6,
+	CAL_SABBREVMONTHNAME7,
+	CAL_SABBREVMONTHNAME8,
+	CAL_SABBREVMONTHNAME9,
+	CAL_SABBREVMONTHNAME10,
+	CAL_SABBREVMONTHNAME11,
+	CAL_SABBREVMONTHNAME12,
+	CAL_SABBREVMONTHNAME13 // = 46
+}
+
+
+enum : CALTYPE {
+	CAL_GREGORIAN                =  1,
+	CAL_GREGORIAN_US,
+	CAL_JAPAN,
+	CAL_TAIWAN,
+	CAL_KOREA,
+	CAL_HIJRI,
+	CAL_THAI,
+	CAL_HEBREW,
+	CAL_GREGORIAN_ME_FRENCH,
+	CAL_GREGORIAN_ARABIC,
+	CAL_GREGORIAN_XLIT_ENGLISH,
+	CAL_GREGORIAN_XLIT_FRENCH // = 12
+}
+
+enum : int {
+	CSTR_LESS_THAN    = 1,
+	CSTR_EQUAL,
+	CSTR_GREATER_THAN
+}
+
+enum : DWORD {
+	LGRPID_INSTALLED = 1,
+	LGRPID_SUPPORTED
+}
+
+enum : LGRPID {
+	LGRPID_WESTERN_EUROPE = 1,
+	LGRPID_CENTRAL_EUROPE,
+	LGRPID_BALTIC,
+	LGRPID_GREEK,
+	LGRPID_CYRILLIC,
+	LGRPID_TURKISH,
+	LGRPID_JAPANESE,
+	LGRPID_KOREAN,
+	LGRPID_TRADITIONAL_CHINESE,
+	LGRPID_SIMPLIFIED_CHINESE,
+	LGRPID_THAI,
+	LGRPID_HEBREW,
+	LGRPID_ARABIC,
+	LGRPID_VIETNAMESE,
+	LGRPID_INDIC,
+	LGRPID_GEORGIAN,
+	LGRPID_ARMENIAN // = 17
+}
+
+static if (WINVER >= 0x500) {
+	enum : LCTYPE {
+		LOCALE_SYEARMONTH             = 0x1006,
+		LOCALE_SENGCURRNAME           = 0x1007,
+		LOCALE_SNATIVECURRNAME        = 0x1008,
+		LOCALE_IDEFAULTEBCDICCODEPAGE = 0x1012,
+		LOCALE_SSORTNAME              = 0x1013,
+		LOCALE_IDIGITSUBSTITUTION     = 0x1014,
+		LOCALE_IPAPERSIZE             = 0x100A
+	}
+
+	const DWORD
+		DATE_YEARMONTH  =  8,
+		DATE_LTRREADING = 16,
+		DATE_RTLREADING = 32;
+
+	const DWORD MAP_EXPAND_LIGATURES = 0x2000;
+	const DWORD WC_NO_BEST_FIT_CHARS = 1024;
+
+	enum : CALTYPE {
+		CAL_SYEARMONTH       = 47,
+		CAL_ITWODIGITYEARMAX = 48,
+		CAL_NOUSEROVERRIDE   = LOCALE_NOUSEROVERRIDE,
+		CAL_RETURN_NUMBER    = LOCALE_RETURN_NUMBER,
+		CAL_USE_CP_ACP       = LOCALE_USE_CP_ACP
+	}
+} // (WINVER >= 0x500)
+
+extern (Windows) {
+	alias BOOL function(LPSTR) CALINFO_ENUMPROCA;
+	alias BOOL function(LPWSTR) CALINFO_ENUMPROCW;
+	alias BOOL function(LPSTR, CALID) CALINFO_ENUMPROCEXA;
+	alias BOOL function(LPWSTR, CALID) CALINFO_ENUMPROCEXW;
+	alias BOOL function(LGRPID, LPSTR, LPSTR, DWORD, LONG_PTR)
+	  LANGUAGEGROUP_ENUMPROCA;
+	alias BOOL function(LGRPID, LPWSTR, LPWSTR, DWORD, LONG_PTR)
+	  LANGUAGEGROUP_ENUMPROCW;
+	alias BOOL function(LGRPID, LCID, LPSTR, LONG_PTR)
+	  LANGGROUPLOCALE_ENUMPROCA;
+	alias BOOL function(LGRPID, LCID, LPWSTR, LONG_PTR)
+	  LANGGROUPLOCALE_ENUMPROCW;
+	alias BOOL function(LPWSTR, LONG_PTR) UILANGUAGE_ENUMPROCW;
+	alias BOOL function(LPSTR, LONG_PTR) UILANGUAGE_ENUMPROCA;
+	alias BOOL function(LPSTR) LOCALE_ENUMPROCA;
+	alias BOOL function(LPWSTR) LOCALE_ENUMPROCW;
+	alias BOOL function(LPSTR) CODEPAGE_ENUMPROCA;
+	alias BOOL function(LPWSTR) CODEPAGE_ENUMPROCW;
+	alias BOOL function(LPSTR) DATEFMT_ENUMPROCA;
+	alias BOOL function(LPWSTR) DATEFMT_ENUMPROCW;
+	alias BOOL function(LPSTR, CALID) DATEFMT_ENUMPROCEXA;
+	alias BOOL function(LPWSTR, CALID) DATEFMT_ENUMPROCEXW;
+	alias BOOL function(LPSTR) TIMEFMT_ENUMPROCA;
+	alias BOOL function(LPWSTR) TIMEFMT_ENUMPROCW;
+	alias BOOL function(GEOID) GEO_ENUMPROC;
+}
+
+enum NLS_FUNCTION {
+	COMPARE_STRING = 0x0001
+}
+
+enum SYSGEOCLASS {
+	GEOCLASS_NATION = 16,
+	GEOCLASS_REGION = 14
+}
+
+enum SYSGEOTYPE {
+	GEO_NATION            = 0x0001,
+	GEO_LATITUDE          = 0x0002,
+	GEO_LONGITUDE         = 0x0003,
+	GEO_ISO2              = 0x0004,
+	GEO_ISO3              = 0x0005,
+	GEO_RFC1766           = 0x0006,
+	GEO_LCID              = 0x0007,
+	GEO_FRIENDLYNAME      = 0x0008,
+	GEO_OFFICIALNAME      = 0x0009,
+	GEO_TIMEZONES         = 0x000a,
+	GEO_OFFICIALLANGUAGES = 0x000a
+}
+
+struct CPINFO {
+	UINT                  MaxCharSize;
+	BYTE[MAX_DEFAULTCHAR] DefaultChar;
+	BYTE[MAX_LEADBYTES]   LeadByte;
+}
+alias CPINFO* LPCPINFO;
+
+struct CPINFOEXA {
+	UINT                  MaxCharSize;
+	BYTE[MAX_DEFAULTCHAR] DefaultChar;
+	BYTE[MAX_LEADBYTES]   LeadByte;
+	WCHAR                 UnicodeDefaultChar;
+	UINT                  CodePage;
+	CHAR[MAX_PATH]        CodePageName;
+}
+alias CPINFOEXA* LPCPINFOEXA;
+
+struct CPINFOEXW {
+	UINT                  MaxCharSize;
+	BYTE[MAX_DEFAULTCHAR] DefaultChar;
+	BYTE[MAX_LEADBYTES]   LeadByte;
+	WCHAR                 UnicodeDefaultChar;
+	UINT                  CodePage;
+	WCHAR[MAX_PATH]       CodePageName;
+}
+alias CPINFOEXW* LPCPINFOEXW;
+
+struct CURRENCYFMTA {
+	UINT  NumDigits;
+	UINT  LeadingZero;
+	UINT  Grouping;
+	LPSTR lpDecimalSep;
+	LPSTR lpThousandSep;
+	UINT  NegativeOrder;
+	UINT  PositiveOrder;
+	LPSTR lpCurrencySymbol;
+}
+alias CURRENCYFMTA* LPCURRENCYFMTA;
+
+struct CURRENCYFMTW {
+	UINT   NumDigits;
+	UINT   LeadingZero;
+	UINT   Grouping;
+	LPWSTR lpDecimalSep;
+	LPWSTR lpThousandSep;
+	UINT   NegativeOrder;
+	UINT   PositiveOrder;
+	LPWSTR lpCurrencySymbol;
+}
+alias CURRENCYFMTW* LPCURRENCYFMTW;
+
+struct NLSVERSIONINFO {
+	DWORD dwNLSVersionInfoSize;
+	DWORD dwNLSVersion;
+	DWORD dwDefinedVersion;
+}
+alias NLSVERSIONINFO* LPNLSVERSIONINFO;
+
+struct NUMBERFMTA {
+	UINT  NumDigits;
+	UINT  LeadingZero;
+	UINT  Grouping;
+	LPSTR lpDecimalSep;
+	LPSTR lpThousandSep;
+	UINT  NegativeOrder;
+}
+alias NUMBERFMTA* LPNUMBERFMTA;
+
+struct NUMBERFMTW {
+	UINT   NumDigits;
+	UINT   LeadingZero;
+	UINT   Grouping;
+	LPWSTR lpDecimalSep;
+	LPWSTR lpThousandSep;
+	UINT   NegativeOrder;
+}
+alias NUMBERFMTW* LPNUMBERFMTW;
+
+extern (Windows) {
+	int CompareStringA(LCID, DWORD, LPCSTR, int, LPCSTR, int);
+	int CompareStringW(LCID, DWORD, LPCWSTR, int, LPCWSTR, int);
+	LCID ConvertDefaultLocale(LCID);
+	BOOL EnumCalendarInfoA(CALINFO_ENUMPROCA, LCID, CALID, CALTYPE);
+	BOOL EnumCalendarInfoW(CALINFO_ENUMPROCW, LCID, CALID, CALTYPE);
+	BOOL EnumDateFormatsA(DATEFMT_ENUMPROCA, LCID, DWORD);
+	BOOL EnumDateFormatsW(DATEFMT_ENUMPROCW, LCID, DWORD);
+	BOOL EnumSystemCodePagesA(CODEPAGE_ENUMPROCA, DWORD);
+	BOOL EnumSystemCodePagesW(CODEPAGE_ENUMPROCW, DWORD);
+	BOOL EnumSystemGeoID(GEOCLASS, GEOID, GEO_ENUMPROC);
+	BOOL EnumSystemLocalesA(LOCALE_ENUMPROCA, DWORD);
+	BOOL EnumSystemLocalesW(LOCALE_ENUMPROCW, DWORD);
+	BOOL EnumTimeFormatsA(TIMEFMT_ENUMPROCA, LCID, DWORD);
+	BOOL EnumTimeFormatsW(TIMEFMT_ENUMPROCW, LCID, DWORD);
+	int FoldStringA(DWORD, LPCSTR, int, LPSTR, int);
+	int FoldStringW(DWORD, LPCWSTR, int, LPWSTR, int);
+	UINT GetACP();
+	int GetCalendarInfoA(LCID, CALID, CALTYPE, LPSTR, int, LPDWORD);
+	int GetCalendarInfoW(LCID, CALID, CALTYPE, LPWSTR, int, LPDWORD);
+	BOOL GetCPInfo(UINT, LPCPINFO);
+	BOOL GetCPInfoExA(UINT, DWORD, LPCPINFOEXA);
+	BOOL GetCPInfoExW(UINT, DWORD, LPCPINFOEXW);
+	int GetCurrencyFormatA(LCID, DWORD, LPCSTR,  CURRENCYFMTA*, LPSTR, int);
+	int GetCurrencyFormatW(LCID, DWORD, LPCWSTR,  CURRENCYFMTW*, LPWSTR,
+	  int);
+	int GetDateFormatA(LCID, DWORD,  SYSTEMTIME*, LPCSTR, LPSTR, int);
+	int GetDateFormatW(LCID, DWORD,  SYSTEMTIME*, LPCWSTR, LPWSTR, int);
+	int GetGeoInfoA(GEOID, GEOTYPE, LPSTR, int, LANGID);
+	int GetGeoInfoW(GEOID, GEOTYPE, LPWSTR, int, LANGID);
+	int GetLocaleInfoA(LCID, LCTYPE, LPSTR, int);
+	int GetLocaleInfoW(LCID, LCTYPE, LPWSTR, int);
+	BOOL GetNLSVersion(NLS_FUNCTION, LCID, LPNLSVERSIONINFO);
+	int GetNumberFormatA(LCID, DWORD, LPCSTR,  NUMBERFMTA*, LPSTR, int);
+	int GetNumberFormatW(LCID, DWORD, LPCWSTR,  NUMBERFMTW*, LPWSTR, int);
+	UINT GetOEMCP();
+	BOOL GetStringTypeA(LCID, DWORD, LPCSTR, int, LPWORD);
+	BOOL GetStringTypeW(DWORD, LPCWSTR, int, LPWORD);
+	BOOL GetStringTypeExA(LCID, DWORD, LPCSTR, int, LPWORD);
+	BOOL GetStringTypeExW(LCID, DWORD, LPCWSTR, int, LPWORD);
+	LANGID GetSystemDefaultLangID();
+	LCID GetSystemDefaultLCID();
+	LCID GetThreadLocale();
+	int GetTimeFormatA(LCID, DWORD,  SYSTEMTIME*, LPCSTR, LPSTR, int);
+	int GetTimeFormatW(LCID, DWORD,  SYSTEMTIME*, LPCWSTR, LPWSTR, int);
+	LANGID GetUserDefaultLangID();
+	LCID GetUserDefaultLCID();
+	GEOID GetUserGeoID(GEOCLASS);
+	BOOL IsDBCSLeadByte(BYTE);
+	BOOL IsDBCSLeadByteEx(UINT, BYTE);
+	BOOL IsNLSDefinedString(NLS_FUNCTION, DWORD, LPNLSVERSIONINFO, LPCWSTR,
+	  int);
+	BOOL IsValidCodePage(UINT);
+	BOOL IsValidLocale(LCID, DWORD);
+	int LCMapStringA(LCID, DWORD, LPCSTR, int, LPSTR, int);
+	int LCMapStringW(LCID, DWORD, LPCWSTR, int, LPWSTR, int);
+	int MultiByteToWideChar(UINT, DWORD, LPCSTR, int, LPWSTR, int);
+	int SetCalendarInfoA(LCID, CALID, CALTYPE, LPCSTR);
+	int SetCalendarInfoW(LCID, CALID, CALTYPE, LPCWSTR);
+	BOOL SetLocaleInfoA(LCID, LCTYPE, LPCSTR);
+	BOOL SetLocaleInfoW(LCID, LCTYPE, LPCWSTR);
+	BOOL SetThreadLocale(LCID);
+	BOOL SetUserGeoID(GEOID);
+	int WideCharToMultiByte(UINT, DWORD, LPCWSTR, int, LPSTR, int, LPCSTR,
+	  LPBOOL);
+
+	static if (WINVER >= 0x410) {
+		BOOL EnumCalendarInfoExA(CALINFO_ENUMPROCEXA, LCID, CALID, CALTYPE);
+		BOOL EnumCalendarInfoExW(CALINFO_ENUMPROCEXW, LCID, CALID, CALTYPE);
+		BOOL EnumDateFormatsExA(DATEFMT_ENUMPROCEXA, LCID, DWORD);
+		BOOL EnumDateFormatsExW(DATEFMT_ENUMPROCEXW, LCID, DWORD);
+		BOOL IsValidLanguageGroup(LGRPID, DWORD);
+	}
+
+	static if (WINVER >= 0x500) {
+		LANGID GetSystemDefaultUILanguage();
+		LANGID GetUserDefaultUILanguage();
+
+		static if (_WIN32_WINNT_ONLY) {
+			BOOL EnumSystemLanguageGroupsA(LANGUAGEGROUP_ENUMPROCA, DWORD,
+			  LONG_PTR);
+			BOOL EnumSystemLanguageGroupsW(LANGUAGEGROUP_ENUMPROCW, DWORD,
+			  LONG_PTR);
+			BOOL EnumLanguageGroupLocalesA(LANGGROUPLOCALE_ENUMPROCA, LGRPID,
+			  DWORD, LONG_PTR);
+			BOOL EnumLanguageGroupLocalesW(LANGGROUPLOCALE_ENUMPROCW, LGRPID,
+			  DWORD, LONG_PTR);
+			BOOL EnumUILanguagesA(UILANGUAGE_ENUMPROCA, DWORD, LONG_PTR);
+			BOOL EnumUILanguagesW(UILANGUAGE_ENUMPROCW, DWORD, LONG_PTR);
+		}
+	}
+}
+
+version (Unicode) {
+	alias CALINFO_ENUMPROCW CALINFO_ENUMPROC;
+	alias CALINFO_ENUMPROCEXW CALINFO_ENUMPROCEX;
+	alias LOCALE_ENUMPROCW LOCALE_ENUMPROC;
+	alias CODEPAGE_ENUMPROCW CODEPAGE_ENUMPROC;
+	alias DATEFMT_ENUMPROCW DATEFMT_ENUMPROC;
+	alias DATEFMT_ENUMPROCEXW DATEFMT_ENUMPROCEX;
+	alias TIMEFMT_ENUMPROCW TIMEFMT_ENUMPROC;
+	alias LANGUAGEGROUP_ENUMPROCW LANGUAGEGROUP_ENUMPROC;
+	alias LANGGROUPLOCALE_ENUMPROCW LANGGROUPLOCALE_ENUMPROC;
+	alias UILANGUAGE_ENUMPROCW UILANGUAGE_ENUMPROC;
+	alias CPINFOEXW CPINFOEX;
+	alias LPCPINFOEXW LPCPINFOEX;
+	alias CURRENCYFMTW CURRENCYFMT;
+	alias LPCURRENCYFMTW LPCURRENCYFMT;
+	alias NUMBERFMTW NUMBERFMT;
+	alias LPNUMBERFMTW LPNUMBERFMT;
+	alias CompareStringW CompareString;
+	alias EnumCalendarInfoW EnumCalendarInfo;
+	alias EnumSystemCodePagesW EnumSystemCodePages;
+	alias EnumSystemLocalesW EnumSystemLocales;
+	alias EnumTimeFormatsW EnumTimeFormats;
+	alias FoldStringW FoldString;
+	alias GetCalendarInfoW GetCalendarInfo;
+	alias GetCPInfoExW GetCPInfoEx;
+	alias GetCurrencyFormatW GetCurrencyFormat;
+	alias GetDateFormatW GetDateFormat;
+	alias GetGeoInfoW GetGeoInfo;
+	alias GetLocaleInfoW GetLocaleInfo;
+	alias GetNumberFormatW GetNumberFormat;
+	alias GetStringTypeExW GetStringTypeEx;
+	alias GetTimeFormatW GetTimeFormat;
+	alias LCMapStringW LCMapString;
+	alias SetCalendarInfoW SetCalendarInfo;
+	alias SetLocaleInfoW SetLocaleInfo;
+
+	static if (WINVER >= 0x410) {
+		alias EnumCalendarInfoExW EnumCalendarInfoEx;
+		alias EnumDateFormatsExW EnumDateFormatsEx;
+	}
+
+	static if (_WIN32_WINNT_ONLY && WINVER >= 0x500) {
+		alias EnumSystemLanguageGroupsW EnumSystemLanguageGroups;
+		alias EnumLanguageGroupLocalesW EnumLanguageGroupLocales;
+		alias EnumUILanguagesW EnumUILanguages;
+	}
+
+} else {
+	alias CALINFO_ENUMPROCA CALINFO_ENUMPROC;
+	alias CALINFO_ENUMPROCEXA CALINFO_ENUMPROCEX;
+	alias LOCALE_ENUMPROCA LOCALE_ENUMPROC;
+	alias CODEPAGE_ENUMPROCA CODEPAGE_ENUMPROC;
+	alias DATEFMT_ENUMPROCA DATEFMT_ENUMPROC;
+	alias DATEFMT_ENUMPROCEXA DATEFMT_ENUMPROCEX;
+	alias TIMEFMT_ENUMPROCA TIMEFMT_ENUMPROC;
+	alias LANGUAGEGROUP_ENUMPROCA LANGUAGEGROUP_ENUMPROC;
+	alias LANGGROUPLOCALE_ENUMPROCA LANGGROUPLOCALE_ENUMPROC;
+	alias UILANGUAGE_ENUMPROCA UILANGUAGE_ENUMPROC;
+	alias CPINFOEXA CPINFOEX;
+	alias LPCPINFOEXA LPCPINFOEX;
+	alias CURRENCYFMTA CURRENCYFMT;
+	alias LPCURRENCYFMTA LPCURRENCYFMT;
+	alias NUMBERFMTA NUMBERFMT;
+	alias LPNUMBERFMTA LPNUMBERFMT;
+	alias CompareStringA CompareString;
+	alias EnumCalendarInfoA EnumCalendarInfo;
+	alias EnumSystemCodePagesA EnumSystemCodePages;
+	alias EnumSystemLocalesA EnumSystemLocales;
+	alias EnumTimeFormatsA EnumTimeFormats;
+	alias FoldStringA FoldString;
+	alias GetCalendarInfoA GetCalendarInfo;
+	alias GetCPInfoExA GetCPInfoEx;
+	alias GetCurrencyFormatA GetCurrencyFormat;
+	alias GetDateFormatA GetDateFormat;
+	alias GetGeoInfoA GetGeoInfo;
+	alias GetLocaleInfoA GetLocaleInfo;
+	alias GetNumberFormatA GetNumberFormat;
+	alias GetStringTypeExA GetStringTypeEx;
+	alias GetTimeFormatA GetTimeFormat;
+	alias LCMapStringA LCMapString;
+	alias SetCalendarInfoA SetCalendarInfo;
+	alias SetLocaleInfoA SetLocaleInfo;
+
+	static if (WINVER >= 0x410) {
+		alias EnumCalendarInfoExA EnumCalendarInfoEx;
+		alias EnumDateFormatsExA EnumDateFormatsEx;
+	}
+
+	static if (_WIN32_WINNT_ONLY && WINVER >= 0x500) {
+		alias EnumSystemLanguageGroupsA EnumSystemLanguageGroups;
+		alias EnumLanguageGroupLocalesA EnumLanguageGroupLocales;
+		alias EnumUILanguagesA EnumUILanguages;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/winnt.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,3980 @@
+/***********************************************************************\
+*                                winnt.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*             Translated from MinGW API for MS-Windows 3.12             *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.winnt;
+
+public import win32.basetsd, win32.windef, win32.winerror;
+private import win32.w32api;
+
+/* Translation Notes:
+The following macros are unneeded for D:
+FIELD_OFFSET(t,f), CONTAINING_RECORD(address, type, field)
+*/
+
+alias void   VOID;
+alias char   CHAR, CCHAR;
+alias wchar  WCHAR;
+alias bool   BOOLEAN;
+alias byte   FCHAR;
+alias ubyte  UCHAR;
+alias short  SHORT;
+alias ushort LANGID, FSHORT;
+alias uint   LCID, FLONG, ACCESS_MASK;
+alias long   LONGLONG, USN;
+alias ulong  DWORDLONG, ULONGLONG;
+
+alias void*  PVOID, LPVOID;
+alias char*  PSZ, PCHAR, PCCHAR, LPCH, PCH, LPSTR, PSTR;
+alias wchar* PWCHAR, LPWCH, PWCH, LPWSTR, PWSTR;
+alias bool*  PBOOLEAN;
+alias ubyte* PUCHAR;
+alias short* PSHORT;
+alias int*   PLONG;
+alias uint*  PLCID, PACCESS_MASK;
+alias long*  PLONGLONG;
+alias ulong* PDWORDLONG, PULONGLONG;
+
+// FIXME(MinGW) for __WIN64
+alias void*  PVOID64;
+
+// const versions
+alias CPtr!(char)  LPCCH, PCSTR, LPCSTR;
+alias CPtr!(wchar) LPCWCH, PCWCH, LPCWSTR, PCWSTR;
+
+version (Unicode) {
+	alias WCHAR TCHAR, _TCHAR;
+} else {
+	alias CHAR TCHAR, _TCHAR;
+}
+
+alias TCHAR        TBYTE;
+alias TCHAR*       PTCH, PTBYTE, LPTCH, PTSTR, LPTSTR, LP, PTCHAR;
+alias CPtr!(TCHAR) LPCTSTR;
+
+const char ANSI_NULL = '\0';
+const wchar UNICODE_NULL = '\0';
+
+const APPLICATION_ERROR_MASK       = 0x20000000;
+const ERROR_SEVERITY_SUCCESS       = 0x00000000;
+const ERROR_SEVERITY_INFORMATIONAL = 0x40000000;
+const ERROR_SEVERITY_WARNING       = 0x80000000;
+const ERROR_SEVERITY_ERROR         = 0xC0000000;
+
+// MinGW: also in ddk/ntifs.h
+enum : USHORT {
+	COMPRESSION_FORMAT_NONE     = 0x0000,
+	COMPRESSION_FORMAT_DEFAULT  = 0x0001,
+	COMPRESSION_FORMAT_LZNT1    = 0x0002,
+	COMPRESSION_ENGINE_STANDARD = 0x0000,
+	COMPRESSION_ENGINE_MAXIMUM  = 0x0100,
+	COMPRESSION_ENGINE_HIBER    = 0x0200
+}
+
+// ACCESS_DENIED_OBJECT_ACE, etc
+const DWORD
+	ACE_OBJECT_TYPE_PRESENT           = 0x00000001,
+	ACE_INHERITED_OBJECT_TYPE_PRESENT = 0x00000002;
+
+// ACE_HEADER.AceType
+// also in ddk/ntifs.h
+enum : BYTE {
+	ACCESS_ALLOWED_ACE_TYPE,
+	ACCESS_DENIED_ACE_TYPE,
+	SYSTEM_AUDIT_ACE_TYPE,
+	SYSTEM_ALARM_ACE_TYPE
+}
+
+// ACE_HEADER.AceFlags
+const BYTE
+	OBJECT_INHERIT_ACE         = 0x01,
+	CONTAINER_INHERIT_ACE      = 0x02,
+	NO_PROPAGATE_INHERIT_ACE   = 0x04,
+	INHERIT_ONLY_ACE           = 0x08,
+	INHERITED_ACE              = 0x10,
+	VALID_INHERIT_FLAGS        = 0x1F,
+	SUCCESSFUL_ACCESS_ACE_FLAG = 0x40,
+	FAILED_ACCESS_ACE_FLAG     = 0x80;
+
+// Access Mask Format
+const ACCESS_MASK
+	DELETE                   = 0x00010000,
+	READ_CONTROL             = 0x00020000,
+	WRITE_DAC                = 0x00040000,
+	WRITE_OWNER              = 0x00080000,
+	SYNCHRONIZE              = 0x00100000,
+	ACCESS_SYSTEM_SECURITY   = 0x01000000,
+	MAXIMUM_ALLOWED          = 0x02000000,
+	GENERIC_READ             = 0x80000000,
+	GENERIC_WRITE            = 0x40000000,
+	GENERIC_EXECUTE          = 0x20000000,
+	GENERIC_ALL              = 0x10000000,
+	STANDARD_RIGHTS_REQUIRED = 0x000F0000,
+	STANDARD_RIGHTS_READ     = 0x00020000,
+	STANDARD_RIGHTS_WRITE    = 0x00020000,
+	STANDARD_RIGHTS_EXECUTE  = 0x00020000,
+	STANDARD_RIGHTS_ALL      = 0x001F0000,
+	SPECIFIC_RIGHTS_ALL      = 0x0000FFFF;
+
+
+const DWORD INVALID_FILE_ATTRIBUTES = -1;
+
+// MinGW: Also in ddk/winddk.h
+const DWORD
+	FILE_LIST_DIRECTORY       = 0x00000001,
+	FILE_READ_DATA            = 0x00000001,
+	FILE_ADD_FILE             = 0x00000002,
+	FILE_WRITE_DATA           = 0x00000002,
+	FILE_ADD_SUBDIRECTORY     = 0x00000004,
+	FILE_APPEND_DATA          = 0x00000004,
+	FILE_CREATE_PIPE_INSTANCE = 0x00000004,
+	FILE_READ_EA              = 0x00000008,
+	FILE_READ_PROPERTIES      = 0x00000008,
+	FILE_WRITE_EA             = 0x00000010,
+	FILE_WRITE_PROPERTIES     = 0x00000010,
+	FILE_EXECUTE              = 0x00000020,
+	FILE_TRAVERSE             = 0x00000020,
+	FILE_DELETE_CHILD         = 0x00000040,
+	FILE_READ_ATTRIBUTES      = 0x00000080,
+	FILE_WRITE_ATTRIBUTES     = 0x00000100;
+
+const DWORD
+	FILE_SHARE_READ        = 0x00000001,
+	FILE_SHARE_WRITE       = 0x00000002,
+	FILE_SHARE_DELETE      = 0x00000004,
+	FILE_SHARE_VALID_FLAGS = 0x00000007;
+
+const DWORD
+	FILE_ATTRIBUTE_READONLY            = 0x00000001,
+	FILE_ATTRIBUTE_HIDDEN              = 0x00000002,
+	FILE_ATTRIBUTE_SYSTEM              = 0x00000004,
+	FILE_ATTRIBUTE_DIRECTORY           = 0x00000010,
+	FILE_ATTRIBUTE_ARCHIVE             = 0x00000020,
+	FILE_ATTRIBUTE_DEVICE              = 0x00000040,
+	FILE_ATTRIBUTE_NORMAL              = 0x00000080,
+	FILE_ATTRIBUTE_TEMPORARY           = 0x00000100,
+	FILE_ATTRIBUTE_SPARSE_FILE         = 0x00000200,
+	FILE_ATTRIBUTE_REPARSE_POINT       = 0x00000400,
+	FILE_ATTRIBUTE_COMPRESSED          = 0x00000800,
+	FILE_ATTRIBUTE_OFFLINE             = 0x00001000,
+	FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000,
+	FILE_ATTRIBUTE_ENCRYPTED           = 0x00004000,
+	FILE_ATTRIBUTE_VALID_FLAGS         = 0x00007fb7,
+	FILE_ATTRIBUTE_VALID_SET_FLAGS     = 0x000031a7;
+
+// These are not documented on MSDN
+const FILE_COPY_STRUCTURED_STORAGE = 0x00000041;
+const FILE_STRUCTURED_STORAGE      = 0x00000441;
+
+// Nor are these
+const FILE_VALID_OPTION_FLAGS          = 0x00ffffff;
+const FILE_VALID_PIPE_OPTION_FLAGS     = 0x00000032;
+const FILE_VALID_MAILSLOT_OPTION_FLAGS = 0x00000032;
+const FILE_VALID_SET_FLAGS             = 0x00000036;
+
+const ULONG
+	FILE_SUPERSEDE           = 0x00000000,
+	FILE_OPEN                = 0x00000001,
+	FILE_CREATE              = 0x00000002,
+	FILE_OPEN_IF             = 0x00000003,
+	FILE_OVERWRITE           = 0x00000004,
+	FILE_OVERWRITE_IF        = 0x00000005,
+	FILE_MAXIMUM_DISPOSITION = 0x00000005;
+
+const ULONG
+	FILE_DIRECTORY_FILE            = 0x00000001,
+	FILE_WRITE_THROUGH             = 0x00000002,
+	FILE_SEQUENTIAL_ONLY           = 0x00000004,
+	FILE_NO_INTERMEDIATE_BUFFERING = 0x00000008,
+	FILE_SYNCHRONOUS_IO_ALERT      = 0x00000010,
+	FILE_SYNCHRONOUS_IO_NONALERT   = 0x00000020,
+	FILE_NON_DIRECTORY_FILE        = 0x00000040,
+	FILE_CREATE_TREE_CONNECTION    = 0x00000080,
+	FILE_COMPLETE_IF_OPLOCKED      = 0x00000100,
+	FILE_NO_EA_KNOWLEDGE           = 0x00000200,
+	FILE_OPEN_FOR_RECOVERY         = 0x00000400,
+	FILE_RANDOM_ACCESS             = 0x00000800,
+	FILE_DELETE_ON_CLOSE           = 0x00001000,
+	FILE_OPEN_BY_FILE_ID           = 0x00002000,
+	FILE_OPEN_FOR_BACKUP_INTENT    = 0x00004000,
+	FILE_NO_COMPRESSION            = 0x00008000,
+	FILE_RESERVE_OPFILTER          = 0x00100000,
+	FILE_OPEN_REPARSE_POINT        = 0x00200000,
+	FILE_OPEN_NO_RECALL            = 0x00400000,
+	FILE_OPEN_FOR_FREE_SPACE_QUERY = 0x00800000;
+
+
+const ACCESS_MASK
+	FILE_ALL_ACCESS      = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x01FF,
+	FILE_GENERIC_EXECUTE = STANDARD_RIGHTS_EXECUTE | FILE_READ_ATTRIBUTES
+	                       | FILE_EXECUTE | SYNCHRONIZE,
+	FILE_GENERIC_READ    = STANDARD_RIGHTS_READ | FILE_READ_DATA
+	                       | FILE_READ_ATTRIBUTES | FILE_READ_EA | SYNCHRONIZE,
+	FILE_GENERIC_WRITE   = STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA
+	                       | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA
+	                       | SYNCHRONIZE;
+
+// MinGW: end winddk.h
+// MinGW: also in ddk/ntifs.h
+const DWORD
+	FILE_NOTIFY_CHANGE_FILE_NAME    = 0x00000001,
+	FILE_NOTIFY_CHANGE_DIR_NAME     = 0x00000002,
+	FILE_NOTIFY_CHANGE_NAME         = 0x00000003,
+	FILE_NOTIFY_CHANGE_ATTRIBUTES   = 0x00000004,
+	FILE_NOTIFY_CHANGE_SIZE         = 0x00000008,
+	FILE_NOTIFY_CHANGE_LAST_WRITE   = 0x00000010,
+	FILE_NOTIFY_CHANGE_LAST_ACCESS  = 0x00000020,
+	FILE_NOTIFY_CHANGE_CREATION     = 0x00000040,
+	FILE_NOTIFY_CHANGE_EA           = 0x00000080,
+	FILE_NOTIFY_CHANGE_SECURITY     = 0x00000100,
+	FILE_NOTIFY_CHANGE_STREAM_NAME  = 0x00000200,
+	FILE_NOTIFY_CHANGE_STREAM_SIZE  = 0x00000400,
+	FILE_NOTIFY_CHANGE_STREAM_WRITE = 0x00000800,
+	FILE_NOTIFY_VALID_MASK          = 0x00000fff;
+
+const DWORD
+	FILE_CASE_SENSITIVE_SEARCH      = 0x00000001,
+	FILE_CASE_PRESERVED_NAMES       = 0x00000002,
+	FILE_UNICODE_ON_DISK            = 0x00000004,
+	FILE_PERSISTENT_ACLS            = 0x00000008,
+	FILE_FILE_COMPRESSION           = 0x00000010,
+	FILE_VOLUME_QUOTAS              = 0x00000020,
+	FILE_SUPPORTS_SPARSE_FILES      = 0x00000040,
+	FILE_SUPPORTS_REPARSE_POINTS    = 0x00000080,
+	FILE_SUPPORTS_REMOTE_STORAGE    = 0x00000100,
+	FS_LFN_APIS                     = 0x00004000,
+	FILE_VOLUME_IS_COMPRESSED       = 0x00008000,
+	FILE_SUPPORTS_OBJECT_IDS        = 0x00010000,
+	FILE_SUPPORTS_ENCRYPTION        = 0x00020000,
+	FILE_NAMED_STREAMS              = 0x00040000,
+	FILE_READ_ONLY_VOLUME           = 0x00080000,
+	FILE_SEQUENTIAL_WRITE_ONCE      = 0x00100000,
+	FILE_SUPPORTS_TRANSACTIONS      = 0x00200000;
+
+// These are not documented on MSDN
+const ACCESS_MASK
+	IO_COMPLETION_QUERY_STATE  = 1,
+	IO_COMPLETION_MODIFY_STATE = 2,
+	IO_COMPLETION_ALL_ACCESS   = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 3;
+// MinGW: end ntifs.h
+
+// MinGW: also in ddk/winddk.h
+const DWORD
+	DUPLICATE_CLOSE_SOURCE    = 1,
+	DUPLICATE_SAME_ACCESS     = 2,
+	DUPLICATE_SAME_ATTRIBUTES = 4;
+// MinGW: end winddk.k
+
+const DWORD
+	MAILSLOT_NO_MESSAGE   = -1,
+	MAILSLOT_WAIT_FOREVER = -1;
+
+const ACCESS_MASK
+	PROCESS_TERMINATE         = 0x0001,
+	PROCESS_CREATE_THREAD     = 0x0002,
+	PROCESS_SET_SESSIONID     = 0x0004,
+	PROCESS_VM_OPERATION      = 0x0008,
+	PROCESS_VM_READ           = 0x0010,
+	PROCESS_VM_WRITE          = 0x0020,
+	PROCESS_DUP_HANDLE        = 0x0040,
+	PROCESS_CREATE_PROCESS    = 0x0080,
+	PROCESS_SET_QUOTA         = 0x0100,
+	PROCESS_SET_INFORMATION   = 0x0200,
+	PROCESS_QUERY_INFORMATION = 0x0400,
+	PROCESS_ALL_ACCESS        = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x0FFF;
+
+const ACCESS_MASK
+	THREAD_TERMINATE            = 0x0001,
+	THREAD_SUSPEND_RESUME       = 0x0002,
+	THREAD_GET_CONTEXT          = 0x0008,
+	THREAD_SET_CONTEXT          = 0x0010,
+	THREAD_SET_INFORMATION      = 0x0020,
+	THREAD_QUERY_INFORMATION    = 0x0040,
+	THREAD_SET_THREAD_TOKEN     = 0x0080,
+	THREAD_IMPERSONATE          = 0x0100,
+	THREAD_DIRECT_IMPERSONATION = 0x0200,
+	THREAD_ALL_ACCESS           = STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3FF;
+
+// These are not documented on MSDN
+const THREAD_BASE_PRIORITY_LOWRT =  15;
+const THREAD_BASE_PRIORITY_MAX   =   2;
+const THREAD_BASE_PRIORITY_MIN   =  -2;
+const THREAD_BASE_PRIORITY_IDLE  = -15;
+
+const DWORD EXCEPTION_NONCONTINUABLE      =  1;
+const size_t EXCEPTION_MAXIMUM_PARAMETERS = 15;
+
+// These are not documented on MSDN
+const ACCESS_MASK
+	MUTANT_QUERY_STATE = 1,
+	MUTANT_ALL_ACCESS =  STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | MUTANT_QUERY_STATE;
+
+const ACCESS_MASK
+	TIMER_QUERY_STATE  = 1,
+	TIMER_MODIFY_STATE = 2,
+	TIMER_ALL_ACCESS   = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | TIMER_QUERY_STATE
+	                     | TIMER_MODIFY_STATE;
+
+const SID_IDENTIFIER_AUTHORITY
+	SECURITY_NULL_SID_AUTHORITY        = {[5: 0]},
+	SECURITY_WORLD_SID_AUTHORITY       = {[5: 1]},
+	SECURITY_LOCAL_SID_AUTHORITY       = {[5: 2]},
+	SECURITY_CREATOR_SID_AUTHORITY     = {[5: 3]},
+	SECURITY_NON_UNIQUE_AUTHORITY      = {[5: 4]},
+	SECURITY_NT_AUTHORITY              = {[5: 5]},
+	SECURITY_MANDATORY_LABEL_AUTHORITY = {[5: 6]};
+
+const DWORD
+	SECURITY_NULL_RID                   =  0,
+	SECURITY_WORLD_RID                  =  0,
+	SECURITY_LOCAL_RID                  =  0,
+	SECURITY_CREATOR_OWNER_RID          =  0,
+	SECURITY_CREATOR_GROUP_RID          =  1,
+	SECURITY_DIALUP_RID                 =  1,
+	SECURITY_NETWORK_RID                =  2,
+	SECURITY_BATCH_RID                  =  3,
+	SECURITY_INTERACTIVE_RID            =  4,
+	SECURITY_LOGON_IDS_RID              =  5,
+	SECURITY_SERVICE_RID                =  6,
+	SECURITY_LOCAL_SYSTEM_RID           = 18,
+	SECURITY_BUILTIN_DOMAIN_RID         = 32,
+	SECURITY_PRINCIPAL_SELF_RID         = 10,
+	SECURITY_CREATOR_OWNER_SERVER_RID   =  2,
+	SECURITY_CREATOR_GROUP_SERVER_RID   =  3,
+	SECURITY_LOGON_IDS_RID_COUNT        =  3,
+	SECURITY_ANONYMOUS_LOGON_RID        =  7,
+	SECURITY_PROXY_RID                  =  8,
+	SECURITY_ENTERPRISE_CONTROLLERS_RID =  9,
+	SECURITY_SERVER_LOGON_RID           = SECURITY_ENTERPRISE_CONTROLLERS_RID,
+	SECURITY_AUTHENTICATED_USER_RID     = 11,
+	SECURITY_RESTRICTED_CODE_RID        = 12,
+	SECURITY_NT_NON_UNIQUE_RID          = 21,
+	SID_REVISION                        =  1;
+
+enum : DWORD {
+	DOMAIN_USER_RID_ADMIN        = 0x01F4,
+	DOMAIN_USER_RID_GUEST        = 0x01F5,
+	DOMAIN_GROUP_RID_ADMINS      = 0x0200,
+	DOMAIN_GROUP_RID_USERS       = 0x0201,
+	DOMAIN_ALIAS_RID_ADMINS      = 0x0220,
+	DOMAIN_ALIAS_RID_USERS       = 0x0221,
+	DOMAIN_ALIAS_RID_GUESTS      = 0x0222,
+	DOMAIN_ALIAS_RID_POWER_USERS = 0x0223,
+	DOMAIN_ALIAS_RID_ACCOUNT_OPS = 0x0224,
+	DOMAIN_ALIAS_RID_SYSTEM_OPS  = 0x0225,
+	DOMAIN_ALIAS_RID_PRINT_OPS   = 0x0226,
+	DOMAIN_ALIAS_RID_BACKUP_OPS  = 0x0227,
+	DOMAIN_ALIAS_RID_REPLICATOR  = 0x0228
+}
+
+enum : WORD {
+	SECURITY_MANDATORY_UNTRUSTED_RID         = 0,
+	SECURITY_MANDATORY_LOW_RID               = 0x1000,
+	SECURITY_MANDATORY_MEDIUM_RID            = 0x2000,
+	SECURITY_MANDATORY_HIGH_RID              = 0x3000,
+	SECURITY_MANDATORY_SYSTEM_RID            = 0x4000,
+	SECURITY_MANDATORY_PROTECTED_PROCESS_RID = 0x5000,
+	SECURITY_MANDATORY_MAXIMUM_USER_RID      = SECURITY_MANDATORY_SYSTEM_RID
+}
+
+const TCHAR[]
+	SE_CREATE_TOKEN_NAME           = "SeCreateTokenPrivilege",
+	SE_ASSIGNPRIMARYTOKEN_NAME     = "SeAssignPrimaryTokenPrivilege",
+	SE_LOCK_MEMORY_NAME            = "SeLockMemoryPrivilege",
+	SE_INCREASE_QUOTA_NAME         = "SeIncreaseQuotaPrivilege",
+	SE_UNSOLICITED_INPUT_NAME      = "SeUnsolicitedInputPrivilege",
+	SE_MACHINE_ACCOUNT_NAME        = "SeMachineAccountPrivilege",
+	SE_TCB_NAME                    = "SeTcbPrivilege",
+	SE_SECURITY_NAME               = "SeSecurityPrivilege",
+	SE_TAKE_OWNERSHIP_NAME         = "SeTakeOwnershipPrivilege",
+	SE_LOAD_DRIVER_NAME            = "SeLoadDriverPrivilege",
+	SE_SYSTEM_PROFILE_NAME         = "SeSystemProfilePrivilege",
+	SE_SYSTEMTIME_NAME             = "SeSystemtimePrivilege",
+	SE_PROF_SINGLE_PROCESS_NAME    = "SeProfileSingleProcessPrivilege",
+	SE_INC_BASE_PRIORITY_NAME      = "SeIncreaseBasePriorityPrivilege",
+	SE_CREATE_PAGEFILE_NAME        = "SeCreatePagefilePrivilege",
+	SE_CREATE_PERMANENT_NAME       = "SeCreatePermanentPrivilege",
+	SE_BACKUP_NAME                 = "SeBackupPrivilege",
+	SE_RESTORE_NAME                = "SeRestorePrivilege",
+	SE_SHUTDOWN_NAME               = "SeShutdownPrivilege",
+	SE_DEBUG_NAME                  = "SeDebugPrivilege",
+	SE_AUDIT_NAME                  = "SeAuditPrivilege",
+	SE_SYSTEM_ENVIRONMENT_NAME     = "SeSystemEnvironmentPrivilege",
+	SE_CHANGE_NOTIFY_NAME          = "SeChangeNotifyPrivilege",
+	SE_REMOTE_SHUTDOWN_NAME        = "SeRemoteShutdownPrivilege",
+	SE_CREATE_GLOBAL_NAME          = "SeCreateGlobalPrivilege",
+	SE_UNDOCK_NAME                 = "SeUndockPrivilege",
+	SE_MANAGE_VOLUME_NAME          = "SeManageVolumePrivilege",
+	SE_IMPERSONATE_NAME            = "SeImpersonatePrivilege",
+	SE_ENABLE_DELEGATION_NAME      = "SeEnableDelegationPrivilege",
+	SE_SYNC_AGENT_NAME             = "SeSyncAgentPrivilege",
+	SE_TRUSTED_CREDMAN_ACCESS_NAME = "SeTrustedCredManAccessPrivilege",
+	SE_RELABEL_NAME                = "SeRelabelPrivilege",
+	SE_INCREASE_WORKING_SET_NAME   = "SeIncreaseWorkingSetPrivilege",
+	SE_TIME_ZONE_NAME              = "SeTimeZonePrivilege",
+	SE_CREATE_SYMBOLIC_LINK_NAME   = "SeCreateSymbolicLinkPrivilege";
+
+const DWORD
+	SE_GROUP_MANDATORY          = 0x00000001,
+	SE_GROUP_ENABLED_BY_DEFAULT = 0x00000002,
+	SE_GROUP_ENABLED            = 0x00000004,
+	SE_GROUP_OWNER              = 0x00000008,
+	SE_GROUP_USE_FOR_DENY_ONLY  = 0x00000010,
+	SE_GROUP_INTEGRITY          = 0x00000020,
+	SE_GROUP_INTEGRITY_ENABLED  = 0x00000040,
+	SE_GROUP_RESOURCE           = 0x20000000,
+	SE_GROUP_LOGON_ID           = 0xC0000000;
+
+// Primary language identifiers
+enum : USHORT {
+	LANG_NEUTRAL,
+	LANG_ARABIC,
+	LANG_BULGARIAN,
+	LANG_CATALAN,
+	LANG_CHINESE,
+	LANG_CZECH,
+	LANG_DANISH,
+	LANG_GERMAN,
+	LANG_GREEK,
+	LANG_ENGLISH,
+	LANG_SPANISH,
+	LANG_FINNISH,
+	LANG_FRENCH,
+	LANG_HEBREW,
+	LANG_HUNGARIAN,
+	LANG_ICELANDIC,
+	LANG_ITALIAN,
+	LANG_JAPANESE,
+	LANG_KOREAN,
+	LANG_DUTCH,
+	LANG_NORWEGIAN,
+	LANG_POLISH,
+	LANG_PORTUGUESE,    // = 0x16
+	LANG_ROMANIAN          = 0x18,
+	LANG_RUSSIAN,
+	LANG_CROATIAN,      // = 0x1A
+	LANG_SERBIAN           = 0x1A,
+	LANG_BOSNIAN           = 0x1A,
+	LANG_SLOVAK,
+	LANG_ALBANIAN,
+	LANG_SWEDISH,
+	LANG_THAI,
+	LANG_TURKISH,
+	LANG_URDU,
+	LANG_INDONESIAN,
+	LANG_UKRAINIAN,
+	LANG_BELARUSIAN,
+	LANG_SLOVENIAN,
+	LANG_ESTONIAN,
+	LANG_LATVIAN,
+	LANG_LITHUANIAN,    // = 0x27
+	LANG_FARSI             = 0x29,
+	LANG_PERSIAN           = 0x29,
+	LANG_VIETNAMESE,
+	LANG_ARMENIAN,
+	LANG_AZERI,
+	LANG_BASQUE,
+	LANG_LOWER_SORBIAN, // = 0x2E
+	LANG_UPPER_SORBIAN     = 0x2E,
+	LANG_MACEDONIAN,    // = 0x2F
+	LANG_TSWANA            = 0x32,
+	LANG_XHOSA             = 0x34,
+	LANG_ZULU,
+	LANG_AFRIKAANS,
+	LANG_GEORGIAN,
+	LANG_FAEROESE,
+	LANG_HINDI,
+	LANG_MALTESE,
+	LANG_SAMI,
+	LANG_IRISH,         // = 0x3C
+	LANG_MALAY             = 0x3E,
+	LANG_KAZAK,
+	LANG_KYRGYZ,
+	LANG_SWAHILI,       // = 0x41
+	LANG_UZBEK             = 0x43,
+	LANG_TATAR,
+	LANG_BENGALI,
+	LANG_PUNJABI,
+	LANG_GUJARATI,
+	LANG_ORIYA,
+	LANG_TAMIL,
+	LANG_TELUGU,
+	LANG_KANNADA,
+	LANG_MALAYALAM,
+	LANG_ASSAMESE,
+	LANG_MARATHI,
+	LANG_SANSKRIT,
+	LANG_MONGOLIAN,
+	LANG_TIBETAN,
+	LANG_WELSH,
+	LANG_KHMER,
+	LANG_LAO,           // = 0x54
+	LANG_GALICIAN          = 0x56,
+	LANG_KONKANI,
+	LANG_MANIPURI,
+	LANG_SINDHI,
+	LANG_SYRIAC,
+	LANG_SINHALESE,     // = 0x5B
+	LANG_INUKTITUT         = 0x5D,
+	LANG_AMHARIC,
+	LANG_TAMAZIGHT,
+	LANG_KASHMIRI,
+	LANG_NEPALI,
+	LANG_FRISIAN,
+	LANG_PASHTO,
+	LANG_FILIPINO,
+	LANG_DIVEHI,        // = 0x65
+	LANG_HAUSA             = 0x68,
+	LANG_YORUBA            = 0x6A,
+	LANG_QUECHUA,
+	LANG_SOTHO,
+	LANG_BASHKIR,
+	LANG_LUXEMBOURGISH,
+	LANG_GREENLANDIC,
+	LANG_IGBO,          // = 0x70
+	LANG_TIGRIGNA          = 0x73,
+	LANG_YI                = 0x78,
+	LANG_MAPUDUNGUN        = 0x7A,
+	LANG_MOHAWK            = 0x7C,
+	LANG_BRETON            = 0x7E,
+	LANG_UIGHUR            = 0x80,
+	LANG_MAORI,
+	LANG_OCCITAN,
+	LANG_CORSICAN,
+	LANG_ALSATIAN,
+	LANG_YAKUT,
+	LANG_KICHE,
+	LANG_KINYARWANDA,
+	LANG_WOLOF,         // = 0x88
+	LANG_DARI              = 0x8C,
+	LANG_MALAGASY,      // = 0x8D
+
+	LANG_SERBIAN_NEUTRAL   = 0x7C1A,
+	LANG_BOSNIAN_NEUTRAL   = 0x781A,
+
+	LANG_INVARIANT         = 0x7F
+}
+
+
+// Sublanguage identifiers
+enum : USHORT {
+	SUBLANG_NEUTRAL,
+	SUBLANG_DEFAULT,
+	SUBLANG_SYS_DEFAULT,
+	SUBLANG_CUSTOM_DEFAULT,                  // =  3
+	SUBLANG_UI_CUSTOM_DEFAULT                   =  3,
+	SUBLANG_CUSTOM_UNSPECIFIED,              // =  4
+
+	SUBLANG_AFRIKAANS_SOUTH_AFRICA              =  1,
+	SUBLANG_ALBANIAN_ALBANIA                    =  1,
+	SUBLANG_ALSATIAN_FRANCE                     =  1,
+	SUBLANG_AMHARIC_ETHIOPIA                    =  1,
+
+	SUBLANG_ARABIC_SAUDI_ARABIA                 =  1,
+	SUBLANG_ARABIC_IRAQ,
+	SUBLANG_ARABIC_EGYPT,
+	SUBLANG_ARABIC_LIBYA,
+	SUBLANG_ARABIC_ALGERIA,
+	SUBLANG_ARABIC_MOROCCO,
+	SUBLANG_ARABIC_TUNISIA,
+	SUBLANG_ARABIC_OMAN,
+	SUBLANG_ARABIC_YEMEN,
+	SUBLANG_ARABIC_SYRIA,
+	SUBLANG_ARABIC_JORDAN,
+	SUBLANG_ARABIC_LEBANON,
+	SUBLANG_ARABIC_KUWAIT,
+	SUBLANG_ARABIC_UAE,
+	SUBLANG_ARABIC_BAHRAIN,
+	SUBLANG_ARABIC_QATAR,                    // = 16
+
+	SUBLANG_ARMENIAN_ARMENIA                    =  1,
+	SUBLANG_ASSAMESE_INDIA                      =  1,
+
+	SUBLANG_AZERI_LATIN                         =  1,
+	SUBLANG_AZERI_CYRILLIC,                  // =  2
+
+	SUBLANG_BASHKIR_RUSSIA                      =  1,
+	SUBLANG_BASQUE_BASQUE                       =  1,
+	SUBLANG_BELARUSIAN_BELARUS                  =  1,
+	SUBLANG_BENGALI_INDIA                       =  1,
+
+	SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN    =  5,
+	SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC =  8,
+
+	SUBLANG_BRETON_FRANCE                       =  1,
+	SUBLANG_BULGARIAN_BULGARIA                  =  1,
+	SUBLANG_CATALAN_CATALAN                     =  1,
+
+	SUBLANG_CHINESE_TRADITIONAL                 =  1,
+	SUBLANG_CHINESE_SIMPLIFIED,
+	SUBLANG_CHINESE_HONGKONG,
+	SUBLANG_CHINESE_SINGAPORE,
+	SUBLANG_CHINESE_MACAU,                   // =  5
+
+	SUBLANG_CORSICAN_FRANCE                     =  1,
+
+	SUBLANG_CROATIAN_CROATIA                    =  1,
+	SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN   =  4,
+
+	SUBLANG_CZECH_CZECH_REPUBLIC                =  1,
+	SUBLANG_DANISH_DENMARK                      =  1,
+	SUBLANG_DIVEHI_MALDIVES                     =  1,
+
+	SUBLANG_DUTCH                               =  1,
+	SUBLANG_DUTCH_BELGIAN,                   // =  2
+
+	SUBLANG_ENGLISH_US                          =  1,
+	SUBLANG_ENGLISH_UK,
+	SUBLANG_ENGLISH_AUS,
+	SUBLANG_ENGLISH_CAN,
+	SUBLANG_ENGLISH_NZ,
+	SUBLANG_ENGLISH_EIRE,                    // =  6
+	SUBLANG_ENGLISH_IRELAND                     =  6,
+	SUBLANG_ENGLISH_SOUTH_AFRICA,
+	SUBLANG_ENGLISH_JAMAICA,
+	SUBLANG_ENGLISH_CARIBBEAN,
+	SUBLANG_ENGLISH_BELIZE,
+	SUBLANG_ENGLISH_TRINIDAD,
+	SUBLANG_ENGLISH_ZIMBABWE,
+	SUBLANG_ENGLISH_PHILIPPINES,             // = 13
+	SUBLANG_ENGLISH_INDIA                       = 16,
+	SUBLANG_ENGLISH_MALAYSIA,
+	SUBLANG_ENGLISH_SINGAPORE,               // = 18
+
+	SUBLANG_ESTONIAN_ESTONIA                    =  1,
+	SUBLANG_FAEROESE_FAROE_ISLANDS              =  1,
+	SUBLANG_FILIPINO_PHILIPPINES                =  1,
+	SUBLANG_FINNISH_FINLAND                     =  1,
+
+	SUBLANG_FRENCH                              =  1,
+	SUBLANG_FRENCH_BELGIAN,
+	SUBLANG_FRENCH_CANADIAN,
+	SUBLANG_FRENCH_SWISS,
+	SUBLANG_FRENCH_LUXEMBOURG,
+	SUBLANG_FRENCH_MONACO,                   // =  6
+
+	SUBLANG_FRISIAN_NETHERLANDS                 =  1,
+	SUBLANG_GALICIAN_GALICIAN                   =  1,
+	SUBLANG_GEORGIAN_GEORGIA                    =  1,
+
+	SUBLANG_GERMAN                              =  1,
+	SUBLANG_GERMAN_SWISS,
+	SUBLANG_GERMAN_AUSTRIAN,
+	SUBLANG_GERMAN_LUXEMBOURG,
+	SUBLANG_GERMAN_LIECHTENSTEIN,            // =  5
+
+	SUBLANG_GREEK_GREECE                        =  1,
+	SUBLANG_GREENLANDIC_GREENLAND               =  1,
+	SUBLANG_GUJARATI_INDIA                      =  1,
+	SUBLANG_HAUSA_NIGERIA                       =  1,
+	SUBLANG_HEBREW_ISRAEL                       =  1,
+	SUBLANG_HINDI_INDIA                         =  1,
+	SUBLANG_HUNGARIAN_HUNGARY                   =  1,
+	SUBLANG_ICELANDIC_ICELAND                   =  1,
+	SUBLANG_IGBO_NIGERIA                        =  1,
+	SUBLANG_INDONESIAN_INDONESIA                =  1,
+
+	SUBLANG_INUKTITUT_CANADA                    =  1,
+	SUBLANG_INUKTITUT_CANADA_LATIN              =  1,
+
+	SUBLANG_IRISH_IRELAND                       =  1,
+
+	SUBLANG_ITALIAN                             =  1,
+	SUBLANG_ITALIAN_SWISS,                   // =  2
+
+	SUBLANG_JAPANESE_JAPAN                      =  1,
+
+	SUBLANG_KASHMIRI_INDIA                      =  2,
+	SUBLANG_KASHMIRI_SASIA                      =  2,
+
+	SUBLANG_KAZAK_KAZAKHSTAN                    =  1,
+	SUBLANG_KHMER_CAMBODIA                      =  1,
+	SUBLANG_KICHE_GUATEMALA                     =  1,
+	SUBLANG_KINYARWANDA_RWANDA                  =  1,
+	SUBLANG_KONKANI_INDIA                       =  1,
+	SUBLANG_KOREAN                              =  1,
+	SUBLANG_KYRGYZ_KYRGYZSTAN                   =  1,
+	SUBLANG_LAO_LAO_PDR                         =  1,
+	SUBLANG_LATVIAN_LATVIA                      =  1,
+
+	SUBLANG_LITHUANIAN                          =  1,
+	SUBLANG_LITHUANIAN_LITHUANIA                =  1,
+
+	SUBLANG_LOWER_SORBIAN_GERMANY               =  1,
+	SUBLANG_LUXEMBOURGISH_LUXEMBOURG            =  1,
+	SUBLANG_MACEDONIAN_MACEDONIA                =  1,
+	SUBLANG_MALAYALAM_INDIA                     =  1,
+	SUBLANG_MALTESE_MALTA                       =  1,
+	SUBLANG_MAORI_NEW_ZEALAND                   =  1,
+	SUBLANG_MAPUDUNGUN_CHILE                    =  1,
+	SUBLANG_MARATHI_INDIA                       =  1,
+	SUBLANG_MOHAWK_MOHAWK                       =  1,
+
+	SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA         =  1,
+	SUBLANG_MONGOLIAN_PRC,                   // =  2
+
+	SUBLANG_MALAY_MALAYSIA                      =  1,
+	SUBLANG_MALAY_BRUNEI_DARUSSALAM,         // =  2
+
+	SUBLANG_NEPALI_NEPAL                        =  1,
+	SUBLANG_NEPALI_INDIA,                    // =  2
+
+	SUBLANG_NORWEGIAN_BOKMAL                    =  1,
+	SUBLANG_NORWEGIAN_NYNORSK,               // =  2
+
+	SUBLANG_OCCITAN_FRANCE                      =  1,
+	SUBLANG_ORIYA_INDIA                         =  1,
+	SUBLANG_PASHTO_AFGHANISTAN                  =  1,
+	SUBLANG_PERSIAN_IRAN                        =  1,
+	SUBLANG_POLISH_POLAND                       =  1,
+
+	SUBLANG_PORTUGUESE_BRAZILIAN                =  1,
+	SUBLANG_PORTUGUESE                          =  2,
+	SUBLANG_PORTUGUESE_PORTUGAL,             // =  2
+
+	SUBLANG_PUNJABI_INDIA                       =  1,
+
+	SUBLANG_QUECHUA_BOLIVIA                     =  1,
+	SUBLANG_QUECHUA_ECUADOR,
+	SUBLANG_QUECHUA_PERU,                    // =  3
+
+	SUBLANG_ROMANIAN_ROMANIA                    =  1,
+	SUBLANG_ROMANSH_SWITZERLAND                 =  1,
+	SUBLANG_RUSSIAN_RUSSIA                      =  1,
+
+	SUBLANG_SAMI_NORTHERN_NORWAY                =  1,
+	SUBLANG_SAMI_NORTHERN_SWEDEN,
+	SUBLANG_SAMI_NORTHERN_FINLAND,           // =  3
+	SUBLANG_SAMI_SKOLT_FINLAND                  =  3,
+	SUBLANG_SAMI_INARI_FINLAND                  =  3,
+	SUBLANG_SAMI_LULE_NORWAY,
+	SUBLANG_SAMI_LULE_SWEDEN,
+	SUBLANG_SAMI_SOUTHERN_NORWAY,
+	SUBLANG_SAMI_SOUTHERN_SWEDEN,            // =  7
+
+	SUBLANG_SANSKRIT_INDIA                      =  1,
+
+	SUBLANG_SERBIAN_LATIN                       =  2,
+	SUBLANG_SERBIAN_CYRILLIC,                // =  3
+	SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_LATIN    =  6,
+	SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_CYRILLIC =  7,
+
+	SUBLANG_SINDHI_AFGHANISTAN                  =  2,
+	SUBLANG_SINHALESE_SRI_LANKA                 =  1,
+	SUBLANG_SOTHO_NORTHERN_SOUTH_AFRICA         =  1,
+	SUBLANG_SLOVAK_SLOVAKIA                     =  1,
+	SUBLANG_SLOVENIAN_SLOVENIA                  =  1,
+
+	SUBLANG_SPANISH                             =  1,
+	SUBLANG_SPANISH_MEXICAN,
+	SUBLANG_SPANISH_MODERN,
+	SUBLANG_SPANISH_GUATEMALA,
+	SUBLANG_SPANISH_COSTA_RICA,
+	SUBLANG_SPANISH_PANAMA,
+	SUBLANG_SPANISH_DOMINICAN_REPUBLIC,
+	SUBLANG_SPANISH_VENEZUELA,
+	SUBLANG_SPANISH_COLOMBIA,
+	SUBLANG_SPANISH_PERU,
+	SUBLANG_SPANISH_ARGENTINA,
+	SUBLANG_SPANISH_ECUADOR,
+	SUBLANG_SPANISH_CHILE,
+	SUBLANG_SPANISH_URUGUAY,
+	SUBLANG_SPANISH_PARAGUAY,
+	SUBLANG_SPANISH_BOLIVIA,
+	SUBLANG_SPANISH_EL_SALVADOR,
+	SUBLANG_SPANISH_HONDURAS,
+	SUBLANG_SPANISH_NICARAGUA,
+	SUBLANG_SPANISH_PUERTO_RICO,
+	SUBLANG_SPANISH_US,                      // = 21
+
+	SUBLANG_SWEDISH                             =  1,
+	SUBLANG_SWEDISH_SWEDEN                      =  1,
+	SUBLANG_SWEDISH_FINLAND,                 // =  2
+
+	SUBLANG_SYRIAC                              =  1,
+	SUBLANG_TAJIK_TAJIKISTAN                    =  1,
+	SUBLANG_TAMAZIGHT_ALGERIA_LATIN             =  2,
+	SUBLANG_TAMIL_INDIA                         =  1,
+	SUBLANG_TATAR_RUSSIA                        =  1,
+	SUBLANG_TELUGU_INDIA                        =  1,
+	SUBLANG_THAI_THAILAND                       =  1,
+	SUBLANG_TIBETAN_PRC                         =  1,
+	SUBLANG_TIBETAN_BHUTAN                      =  2,
+	SUBLANG_TIGRIGNA_ERITREA                    =  1,
+	SUBLANG_TSWANA_SOUTH_AFRICA                 =  1,
+	SUBLANG_TURKISH_TURKEY                      =  1,
+	SUBLANG_TURKMEN_TURKMENISTAN                =  1,
+	SUBLANG_UIGHUR_PRC                          =  1,
+	SUBLANG_UKRAINIAN_UKRAINE                   =  1,
+	SUBLANG_UPPER_SORBIAN_GERMANY               =  1,
+
+	SUBLANG_URDU_PAKISTAN                       =  1,
+	SUBLANG_URDU_INDIA,                      // =  2
+
+	SUBLANG_UZBEK_LATIN                         =  1,
+	SUBLANG_UZBEK_CYRILLIC,                  // =  2
+
+	SUBLANG_VIETNAMESE_VIETNAM                  =  1,
+	SUBLANG_WELSH_UNITED_KINGDOM                =  1,
+	SUBLANG_WOLOF_SENEGAL                       =  1,
+	SUBLANG_YORUBA_NIGERIA                      =  1,
+	SUBLANG_XHOSA_SOUTH_AFRICA                  =  1,
+	SUBLANG_YAKUT_RUSSIA                        =  1,
+	SUBLANG_YI_PRC                              =  1,
+	SUBLANG_ZULU_SOUTH_AFRICA                   =  1
+}
+
+// This is not documented on MSDN
+const NLS_VALID_LOCALE_MASK = 1048575;
+
+// Sorting identifiers
+enum : WORD {
+	SORT_DEFAULT              = 0,
+	SORT_JAPANESE_XJIS        = 0,
+	SORT_JAPANESE_UNICODE     = 1,
+	SORT_CHINESE_BIG5         = 0,
+	SORT_CHINESE_PRCP         = 0,
+	SORT_CHINESE_UNICODE      = 1,
+	SORT_CHINESE_PRC          = 2,
+	SORT_CHINESE_BOPOMOFO     = 3,
+	SORT_KOREAN_KSC           = 0,
+	SORT_KOREAN_UNICODE       = 1,
+	SORT_GERMAN_PHONE_BOOK    = 1,
+	SORT_HUNGARIAN_DEFAULT    = 0,
+	SORT_HUNGARIAN_TECHNICAL  = 1,
+	SORT_GEORGIAN_TRADITIONAL = 0,
+	SORT_GEORGIAN_MODERN      = 1
+}
+
+WORD MAKELANGID(USHORT p, USHORT s) { return cast(WORD)((s << 10) | p); }
+WORD PRIMARYLANGID(WORD lgid) { return cast(WORD)(lgid & 0x3FF); }
+WORD SUBLANGID(WORD lgid) { return cast(WORD)(lgid >>> 10); }
+
+DWORD MAKELCID(WORD lgid, WORD srtid) { return (cast(DWORD) srtid << 16) | cast(DWORD) lgid; }
+// ???
+//DWORD MAKESORTLCID(WORD lgid, WORD srtid, WORD ver) { return (MAKELCID(lgid, srtid)) | ((cast(DWORD)ver) << 20); }
+WORD LANGIDFROMLCID(LCID lcid) { return cast(WORD) lcid; }
+WORD SORTIDFROMLCID(LCID lcid) { return cast(WORD) ((lcid >>> 16) & 0x0F); }
+WORD SORTVERSIONFROMLCID(LCID lcid) { return cast(WORD) ((lcid >>> 20) & 0x0F); }
+
+const WORD LANG_SYSTEM_DEFAULT = (SUBLANG_SYS_DEFAULT << 10) | LANG_NEUTRAL;
+const WORD LANG_USER_DEFAULT   = (SUBLANG_DEFAULT << 10) | LANG_NEUTRAL;
+const DWORD LOCALE_NEUTRAL     = (SORT_DEFAULT << 16)
+                                 | (SUBLANG_NEUTRAL << 10) | LANG_NEUTRAL;
+
+// ---
+enum : BYTE {
+	ACL_REVISION    = 2,
+	ACL_REVISION_DS = 4
+}
+
+// These are not documented on MSDN
+enum : BYTE {
+	ACL_REVISION1    = 1,
+	ACL_REVISION2,
+	ACL_REVISION3,
+	ACL_REVISION4 // = 4
+}
+
+const BYTE
+	MIN_ACL_REVISION = 2,
+	MAX_ACL_REVISION = 4;
+
+/+
+// These aren't necessary for D.
+const MINCHAR=0x80;
+const MAXCHAR=0x7f;
+const MINSHORT=0x8000;
+const MAXSHORT=0x7fff;
+const MINLONG=0x80000000;
+const MAXLONG=0x7fffffff;
+const MAXBYTE=0xff;
+const MAXWORD=0xffff;
+const MAXDWORD=0xffffffff;
++/
+
+// SYSTEM_INFO.dwProcessorType
+enum : DWORD {
+	PROCESSOR_INTEL_386     =   386,
+	PROCESSOR_INTEL_486     =   486,
+	PROCESSOR_INTEL_PENTIUM =   586,
+	PROCESSOR_MIPS_R4000    =  4000,
+	PROCESSOR_ALPHA_21064   = 21064,
+	PROCESSOR_INTEL_IA64    =  2200
+}
+
+// SYSTEM_INFO.wProcessorArchitecture
+enum : WORD {
+	PROCESSOR_ARCHITECTURE_INTEL,
+	PROCESSOR_ARCHITECTURE_MIPS,
+	PROCESSOR_ARCHITECTURE_ALPHA,
+	PROCESSOR_ARCHITECTURE_PPC,
+	PROCESSOR_ARCHITECTURE_SHX,
+	PROCESSOR_ARCHITECTURE_ARM,
+	PROCESSOR_ARCHITECTURE_IA64,
+	PROCESSOR_ARCHITECTURE_ALPHA64,
+	PROCESSOR_ARCHITECTURE_MSIL,
+	PROCESSOR_ARCHITECTURE_AMD64,
+	PROCESSOR_ARCHITECTURE_IA32_ON_WIN64, // = 10
+	PROCESSOR_ARCHITECTURE_UNKNOWN = 0xFFFF
+}
+
+// IsProcessorFeaturePresent()
+enum : DWORD {
+	PF_FLOATING_POINT_PRECISION_ERRATA,
+	PF_FLOATING_POINT_EMULATED,
+	PF_COMPARE_EXCHANGE_DOUBLE,
+	PF_MMX_INSTRUCTIONS_AVAILABLE,
+	PF_PPC_MOVEMEM_64BIT_OK,
+	PF_ALPHA_BYTE_INSTRUCTIONS,
+	PF_XMMI_INSTRUCTIONS_AVAILABLE,
+	PF_3DNOW_INSTRUCTIONS_AVAILABLE,
+	PF_RDTSC_INSTRUCTION_AVAILABLE,
+	PF_PAE_ENABLED,
+	PF_XMMI64_INSTRUCTIONS_AVAILABLE
+}
+
+// MinGW: also in ddk/ntifs.h
+enum : DWORD {
+	FILE_ACTION_ADDED = 1,
+	FILE_ACTION_REMOVED,
+	FILE_ACTION_MODIFIED,
+	FILE_ACTION_RENAMED_OLD_NAME,
+	FILE_ACTION_RENAMED_NEW_NAME,
+	FILE_ACTION_ADDED_STREAM,
+	FILE_ACTION_REMOVED_STREAM,
+	FILE_ACTION_MODIFIED_STREAM,
+	FILE_ACTION_REMOVED_BY_DELETE,
+	FILE_ACTION_ID_NOT_TUNNELLED,
+	FILE_ACTION_TUNNELLED_ID_COLLISION // = 11
+}
+// MinGW: end ntifs.h
+
+const DWORD
+	HEAP_NO_SERIALIZE             = 0x01,
+	HEAP_GROWABLE                 = 0x02,
+	HEAP_GENERATE_EXCEPTIONS      = 0x04,
+	HEAP_ZERO_MEMORY              = 0x08,
+	HEAP_REALLOC_IN_PLACE_ONLY    = 0x10,
+	HEAP_TAIL_CHECKING_ENABLED    = 0x20,
+	HEAP_FREE_CHECKING_ENABLED    = 0x40,
+	HEAP_DISABLE_COALESCE_ON_FREE = 0x80;
+
+// These are not documented on MSDN
+const HEAP_CREATE_ALIGN_16       = 0;
+const HEAP_CREATE_ENABLE_TRACING = 0x020000;
+const HEAP_MAXIMUM_TAG           = 0x000FFF;
+const HEAP_PSEUDO_TAG_FLAG       = 0x008000;
+const HEAP_TAG_SHIFT             = 16;
+// ???
+//MACRO #define HEAP_MAKE_TAG_FLAGS(b,o) ((DWORD)((b)+(o)<<16)))
+
+const ACCESS_MASK
+	KEY_QUERY_VALUE        = 0x000001,
+	KEY_SET_VALUE          = 0x000002,
+	KEY_CREATE_SUB_KEY     = 0x000004,
+	KEY_ENUMERATE_SUB_KEYS = 0x000008,
+	KEY_NOTIFY             = 0x000010,
+	KEY_CREATE_LINK        = 0x000020,
+	KEY_WRITE              = 0x020006,
+	KEY_EXECUTE            = 0x020019,
+	KEY_READ               = 0x020019,
+	KEY_ALL_ACCESS         = 0x0F003F;
+
+static if (WINVER >= 0x502) {
+	const ACCESS_MASK
+		KEY_WOW64_64KEY    = 0x000100,
+		KEY_WOW64_32KEY    = 0x000200;
+}
+
+const DWORD
+	REG_WHOLE_HIVE_VOLATILE = 1,
+	REG_REFRESH_HIVE        = 2,
+	REG_NO_LAZY_FLUSH       = 4;
+
+const DWORD
+	REG_OPTION_RESERVED       =  0,
+	REG_OPTION_NON_VOLATILE   =  0,
+	REG_OPTION_VOLATILE       =  1,
+	REG_OPTION_CREATE_LINK    =  2,
+	REG_OPTION_BACKUP_RESTORE =  4,
+	REG_OPTION_OPEN_LINK      =  8,
+	REG_LEGAL_OPTION          = 15;
+
+const SECURITY_INFORMATION
+	OWNER_SECURITY_INFORMATION            = 0x00000001,
+	GROUP_SECURITY_INFORMATION            = 0x00000002,
+	DACL_SECURITY_INFORMATION             = 0x00000004,
+	SACL_SECURITY_INFORMATION             = 0x00000008,
+	LABEL_SECURITY_INFORMATION            = 0x00000010,
+	UNPROTECTED_SACL_SECURITY_INFORMATION = 0x10000000,
+	UNPROTECTED_DACL_SECURITY_INFORMATION = 0x20000000,
+	PROTECTED_SACL_SECURITY_INFORMATION   = 0x40000000,
+	PROTECTED_DACL_SECURITY_INFORMATION   = 0x80000000;
+
+const DWORD MAXIMUM_PROCESSORS = 32;
+
+// VirtualAlloc(), etc
+// -------------------
+
+enum : DWORD {
+	PAGE_NOACCESS          = 0x0001,
+	PAGE_READONLY          = 0x0002,
+	PAGE_READWRITE         = 0x0004,
+	PAGE_WRITECOPY         = 0x0008,
+	PAGE_EXECUTE           = 0x0010,
+	PAGE_EXECUTE_READ      = 0x0020,
+	PAGE_EXECUTE_READWRITE = 0x0040,
+	PAGE_EXECUTE_WRITECOPY = 0x0080,
+	PAGE_GUARD             = 0x0100,
+	PAGE_NOCACHE           = 0x0200
+}
+
+enum : DWORD {
+	MEM_COMMIT      = 0x00001000,
+	MEM_RESERVE     = 0x00002000,
+	MEM_DECOMMIT    = 0x00004000,
+	MEM_RELEASE     = 0x00008000,
+	MEM_FREE        = 0x00010000,
+	MEM_PRIVATE     = 0x00020000,
+	MEM_MAPPED      = 0x00040000,
+	MEM_RESET       = 0x00080000,
+	MEM_TOP_DOWN    = 0x00100000,
+	MEM_WRITE_WATCH = 0x00200000, // MinGW (???): 98/Me
+	MEM_PHYSICAL    = 0x00400000,
+	MEM_4MB_PAGES   = 0x80000000
+}
+
+// MinGW: also in ddk/ntifs.h
+// CreateFileMapping()
+const DWORD
+	SEC_BASED     = 0x00200000,
+	SEC_NO_CHANGE = 0x00400000,
+	SEC_FILE      = 0x00800000,
+	SEC_IMAGE     = 0x01000000,
+	SEC_VLM       = 0x02000000,
+	SEC_RESERVE   = 0x04000000,
+	SEC_COMMIT    = 0x08000000,
+	SEC_NOCACHE   = 0x10000000,
+	MEM_IMAGE     = SEC_IMAGE;
+// MinGW: end ntifs.h
+
+// ???
+const ACCESS_MASK
+	SECTION_QUERY       = 0x000001,
+	SECTION_MAP_WRITE   = 0x000002,
+	SECTION_MAP_READ    = 0x000004,
+	SECTION_MAP_EXECUTE = 0x000008,
+	SECTION_EXTEND_SIZE = 0x000010,
+	SECTION_ALL_ACCESS  = 0x0F001F;
+
+// These are not documented on MSDN
+const MESSAGE_RESOURCE_UNICODE = 1;
+const RTL_CRITSECT_TYPE        = 0;
+const RTL_RESOURCE_TYPE        = 1;
+
+// COFF file format
+// ----------------
+
+// IMAGE_FILE_HEADER.Characteristics
+const WORD
+	IMAGE_FILE_RELOCS_STRIPPED         = 0x0001,
+	IMAGE_FILE_EXECUTABLE_IMAGE        = 0x0002,
+	IMAGE_FILE_LINE_NUMS_STRIPPED      = 0x0004,
+	IMAGE_FILE_LOCAL_SYMS_STRIPPED     = 0x0008,
+	IMAGE_FILE_AGGRESIVE_WS_TRIM       = 0x0010,
+	IMAGE_FILE_LARGE_ADDRESS_AWARE     = 0x0020,
+	IMAGE_FILE_BYTES_REVERSED_LO       = 0x0080,
+	IMAGE_FILE_32BIT_MACHINE           = 0x0100,
+	IMAGE_FILE_DEBUG_STRIPPED          = 0x0200,
+	IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = 0x0400,
+	IMAGE_FILE_NET_RUN_FROM_SWAP       = 0x0800,
+	IMAGE_FILE_SYSTEM                  = 0x1000,
+	IMAGE_FILE_DLL                     = 0x2000,
+	IMAGE_FILE_UP_SYSTEM_ONLY          = 0x4000,
+	IMAGE_FILE_BYTES_REVERSED_HI       = 0x8000;
+
+// IMAGE_FILE_HEADER.Machine
+enum : WORD {
+	IMAGE_FILE_MACHINE_UNKNOWN   = 0x0000,
+	IMAGE_FILE_MACHINE_I386      = 0x014C,
+	IMAGE_FILE_MACHINE_R3000     = 0x0162,
+	IMAGE_FILE_MACHINE_R4000     = 0x0166,
+	IMAGE_FILE_MACHINE_R10000    = 0x0168,
+	IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x0169,
+	IMAGE_FILE_MACHINE_ALPHA     = 0x0184,
+	IMAGE_FILE_MACHINE_SH3       = 0x01A2,
+	IMAGE_FILE_MACHINE_SH3DSP    = 0x01A3,
+	IMAGE_FILE_MACHINE_SH4       = 0x01A6,
+	IMAGE_FILE_MACHINE_SH5       = 0x01A8,
+	IMAGE_FILE_MACHINE_ARM       = 0x01C0,
+	IMAGE_FILE_MACHINE_THUMB     = 0x01C2,
+	IMAGE_FILE_MACHINE_AM33      = 0x01D3,
+	IMAGE_FILE_MACHINE_POWERPC   = 0x01F0,
+	IMAGE_FILE_MACHINE_POWERPCFP = 0x01F1,
+	IMAGE_FILE_MACHINE_IA64      = 0x0200,
+	IMAGE_FILE_MACHINE_MIPS16    = 0x0266,
+	IMAGE_FILE_MACHINE_MIPSFPU   = 0x0366,
+	IMAGE_FILE_MACHINE_MIPSFPU16 = 0x0466,
+	IMAGE_FILE_MACHINE_EBC       = 0x0EBC,
+	IMAGE_FILE_MACHINE_AMD64     = 0x8664,
+	IMAGE_FILE_MACHINE_M32R      = 0x9041
+}
+
+// ???
+enum  {
+	IMAGE_DOS_SIGNATURE    = 0x5A4D,
+	IMAGE_OS2_SIGNATURE    = 0x454E,
+	IMAGE_OS2_SIGNATURE_LE = 0x454C,
+	IMAGE_VXD_SIGNATURE    = 0x454C,
+	IMAGE_NT_SIGNATURE     = 0x4550
+}
+
+// IMAGE_OPTIONAL_HEADER.Magic
+enum : WORD {
+	IMAGE_NT_OPTIONAL_HDR32_MAGIC = 0x010B,
+	IMAGE_ROM_OPTIONAL_HDR_MAGIC  = 0x0107,
+	IMAGE_NT_OPTIONAL_HDR64_MAGIC = 0x020B
+}
+
+// IMAGE_OPTIONAL_HEADER.Subsystem
+enum : WORD {
+	IMAGE_SUBSYSTEM_UNKNOWN                  =  0,
+	IMAGE_SUBSYSTEM_NATIVE,
+	IMAGE_SUBSYSTEM_WINDOWS_GUI,
+	IMAGE_SUBSYSTEM_WINDOWS_CUI,          // =  3
+	IMAGE_SUBSYSTEM_OS2_CUI                  =  5,
+	IMAGE_SUBSYSTEM_POSIX_CUI                =  7,
+	IMAGE_SUBSYSTEM_NATIVE_WINDOWS,
+	IMAGE_SUBSYSTEM_WINDOWS_CE_GUI,
+	IMAGE_SUBSYSTEM_EFI_APPLICATION,
+	IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER,
+	IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER,
+	IMAGE_SUBSYSTEM_EFI_ROM,
+	IMAGE_SUBSYSTEM_XBOX,                 // = 14
+	IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION = 16
+}
+
+// IMAGE_OPTIONAL_HEADER.DllCharacteristics
+const WORD
+	IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE         = 0x0040,
+	IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY      = 0x0080,
+	IMAGE_DLL_CHARACTERISTICS_NX_COMPAT            = 0x0100,
+	IMAGE_DLLCHARACTERISTICS_NO_ISOLATION          = 0x0200,
+	IMAGE_DLLCHARACTERISTICS_NO_SEH	               = 0x0400,
+	IMAGE_DLLCHARACTERISTICS_NO_BIND               = 0x0800,
+	IMAGE_DLLCHARACTERISTICS_WDM_DRIVER            = 0x2000,
+	IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000;
+
+// ???
+const IMAGE_SEPARATE_DEBUG_SIGNATURE = 0x4944;
+
+const size_t
+	IMAGE_NUMBEROF_DIRECTORY_ENTRIES =  16,
+	IMAGE_SIZEOF_ROM_OPTIONAL_HEADER =  56,
+	IMAGE_SIZEOF_STD_OPTIONAL_HEADER =  28,
+	IMAGE_SIZEOF_NT_OPTIONAL_HEADER  = 224,
+	IMAGE_SIZEOF_SHORT_NAME          =   8,
+	IMAGE_SIZEOF_SECTION_HEADER      =  40,
+	IMAGE_SIZEOF_SYMBOL              =  18,
+	IMAGE_SIZEOF_AUX_SYMBOL          =  18,
+	IMAGE_SIZEOF_RELOCATION          =  10,
+	IMAGE_SIZEOF_BASE_RELOCATION     =   8,
+	IMAGE_SIZEOF_LINENUMBER          =   6,
+	IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR  =  60,
+	SIZEOF_RFPO_DATA                 =  16;
+
+PIMAGE_SECTION_HEADER IMAGE_FIRST_SECTION(PIMAGE_NT_HEADERS h) {
+	return cast(PIMAGE_SECTION_HEADER)
+		(&h.OptionalHeader + h.FileHeader.SizeOfOptionalHeader);
+}
+
+// ImageDirectoryEntryToDataEx()
+enum : USHORT {
+	IMAGE_DIRECTORY_ENTRY_EXPORT             =  0,
+	IMAGE_DIRECTORY_ENTRY_IMPORT,
+	IMAGE_DIRECTORY_ENTRY_RESOURCE,
+	IMAGE_DIRECTORY_ENTRY_EXCEPTION,
+	IMAGE_DIRECTORY_ENTRY_SECURITY,
+	IMAGE_DIRECTORY_ENTRY_BASERELOC,
+	IMAGE_DIRECTORY_ENTRY_DEBUG,
+	IMAGE_DIRECTORY_ENTRY_COPYRIGHT,      // =  7
+	IMAGE_DIRECTORY_ENTRY_ARCHITECTURE       =  7,
+	IMAGE_DIRECTORY_ENTRY_GLOBALPTR,
+	IMAGE_DIRECTORY_ENTRY_TLS,
+	IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG,
+	IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT,
+	IMAGE_DIRECTORY_ENTRY_IAT,
+	IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT,
+	IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR, // = 14
+}
+
+// IMAGE_SECTION_HEADER.Characteristics
+const DWORD
+	IMAGE_SCN_TYPE_REG               = 0x00000000,
+	IMAGE_SCN_TYPE_DSECT             = 0x00000001,
+	IMAGE_SCN_TYPE_NOLOAD            = 0x00000002,
+	IMAGE_SCN_TYPE_GROUP             = 0x00000004,
+	IMAGE_SCN_TYPE_NO_PAD            = 0x00000008,
+	IMAGE_SCN_TYPE_COPY              = 0x00000010,
+	IMAGE_SCN_CNT_CODE               = 0x00000020,
+	IMAGE_SCN_CNT_INITIALIZED_DATA   = 0x00000040,
+	IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080,
+	IMAGE_SCN_LNK_OTHER              = 0x00000100,
+	IMAGE_SCN_LNK_INFO               = 0x00000200,
+	IMAGE_SCN_TYPE_OVER              = 0x00000400,
+	IMAGE_SCN_LNK_REMOVE             = 0x00000800,
+	IMAGE_SCN_LNK_COMDAT             = 0x00001000,
+	IMAGE_SCN_MEM_FARDATA            = 0x00008000,
+	IMAGE_SCN_GPREL                  = 0x00008000,
+	IMAGE_SCN_MEM_PURGEABLE          = 0x00020000,
+	IMAGE_SCN_MEM_16BIT              = 0x00020000,
+	IMAGE_SCN_MEM_LOCKED             = 0x00040000,
+	IMAGE_SCN_MEM_PRELOAD            = 0x00080000,
+	IMAGE_SCN_ALIGN_1BYTES           = 0x00100000,
+	IMAGE_SCN_ALIGN_2BYTES           = 0x00200000,
+	IMAGE_SCN_ALIGN_4BYTES           = 0x00300000,
+	IMAGE_SCN_ALIGN_8BYTES           = 0x00400000,
+	IMAGE_SCN_ALIGN_16BYTES          = 0x00500000,
+	IMAGE_SCN_ALIGN_32BYTES          = 0x00600000,
+	IMAGE_SCN_ALIGN_64BYTES          = 0x00700000,
+	IMAGE_SCN_ALIGN_128BYTES         = 0x00800000,
+	IMAGE_SCN_ALIGN_256BYTES         = 0x00900000,
+	IMAGE_SCN_ALIGN_512BYTES         = 0x00A00000,
+	IMAGE_SCN_ALIGN_1024BYTES        = 0x00B00000,
+	IMAGE_SCN_ALIGN_2048BYTES        = 0x00C00000,
+	IMAGE_SCN_ALIGN_4096BYTES        = 0x00D00000,
+	IMAGE_SCN_ALIGN_8192BYTES        = 0x00E00000,
+	IMAGE_SCN_LNK_NRELOC_OVFL        = 0x01000000,
+	IMAGE_SCN_MEM_DISCARDABLE        = 0x02000000,
+	IMAGE_SCN_MEM_NOT_CACHED         = 0x04000000,
+	IMAGE_SCN_MEM_NOT_PAGED          = 0x08000000,
+	IMAGE_SCN_MEM_SHARED             = 0x10000000,
+	IMAGE_SCN_MEM_EXECUTE            = 0x20000000,
+	IMAGE_SCN_MEM_READ               = 0x40000000,
+	IMAGE_SCN_MEM_WRITE              = 0x80000000;
+
+/*	The following constants are mostlydocumented at
+ *	http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/pecoff.doc
+ *	but don't seem to be defined in the HTML docs.
+ */
+enum : SHORT {
+	IMAGE_SYM_UNDEFINED =  0,
+	IMAGE_SYM_ABSOLUTE  = -1,
+	IMAGE_SYM_DEBUG     = -2
+}
+
+enum : ubyte {
+	IMAGE_SYM_TYPE_NULL,
+	IMAGE_SYM_TYPE_VOID,
+	IMAGE_SYM_TYPE_CHAR,
+	IMAGE_SYM_TYPE_SHORT,
+	IMAGE_SYM_TYPE_INT,
+	IMAGE_SYM_TYPE_LONG,
+	IMAGE_SYM_TYPE_FLOAT,
+	IMAGE_SYM_TYPE_DOUBLE,
+	IMAGE_SYM_TYPE_STRUCT,
+	IMAGE_SYM_TYPE_UNION,
+	IMAGE_SYM_TYPE_ENUM,
+	IMAGE_SYM_TYPE_MOE,
+	IMAGE_SYM_TYPE_BYTE,
+	IMAGE_SYM_TYPE_WORD,
+	IMAGE_SYM_TYPE_UINT,
+	IMAGE_SYM_TYPE_DWORD // = 15
+}
+const IMAGE_SYM_TYPE_PCODE = 32768; // ???
+
+enum : ubyte {
+	IMAGE_SYM_DTYPE_NULL,
+	IMAGE_SYM_DTYPE_POINTER,
+	IMAGE_SYM_DTYPE_FUNCTION,
+	IMAGE_SYM_DTYPE_ARRAY
+}
+
+enum : BYTE {
+	IMAGE_SYM_CLASS_END_OF_FUNCTION  = 0xFF,
+	IMAGE_SYM_CLASS_NULL             =   0,
+	IMAGE_SYM_CLASS_AUTOMATIC,
+	IMAGE_SYM_CLASS_EXTERNAL,
+	IMAGE_SYM_CLASS_STATIC,
+	IMAGE_SYM_CLASS_REGISTER,
+	IMAGE_SYM_CLASS_EXTERNAL_DEF,
+	IMAGE_SYM_CLASS_LABEL,
+	IMAGE_SYM_CLASS_UNDEFINED_LABEL,
+	IMAGE_SYM_CLASS_MEMBER_OF_STRUCT,
+	IMAGE_SYM_CLASS_ARGUMENT,
+	IMAGE_SYM_CLASS_STRUCT_TAG,
+	IMAGE_SYM_CLASS_MEMBER_OF_UNION,
+	IMAGE_SYM_CLASS_UNION_TAG,
+	IMAGE_SYM_CLASS_TYPE_DEFINITION,
+	IMAGE_SYM_CLASS_UNDEFINED_STATIC,
+	IMAGE_SYM_CLASS_ENUM_TAG,
+	IMAGE_SYM_CLASS_MEMBER_OF_ENUM,
+	IMAGE_SYM_CLASS_REGISTER_PARAM,
+	IMAGE_SYM_CLASS_BIT_FIELD,    // =  18
+	IMAGE_SYM_CLASS_FAR_EXTERNAL     =  68,
+	IMAGE_SYM_CLASS_BLOCK            = 100,
+	IMAGE_SYM_CLASS_FUNCTION,
+	IMAGE_SYM_CLASS_END_OF_STRUCT,
+	IMAGE_SYM_CLASS_FILE,
+	IMAGE_SYM_CLASS_SECTION,
+	IMAGE_SYM_CLASS_WEAK_EXTERNAL,// = 105
+	IMAGE_SYM_CLASS_CLR_TOKEN        = 107
+}
+
+enum : BYTE {
+	IMAGE_COMDAT_SELECT_NODUPLICATES = 1,
+	IMAGE_COMDAT_SELECT_ANY,
+	IMAGE_COMDAT_SELECT_SAME_SIZE,
+	IMAGE_COMDAT_SELECT_EXACT_MATCH,
+	IMAGE_COMDAT_SELECT_ASSOCIATIVE,
+	IMAGE_COMDAT_SELECT_LARGEST,
+	IMAGE_COMDAT_SELECT_NEWEST    // = 7
+}
+
+enum : DWORD {
+	IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY = 1,
+	IMAGE_WEAK_EXTERN_SEARCH_LIBRARY,
+	IMAGE_WEAK_EXTERN_SEARCH_ALIAS
+}
+
+enum : WORD {
+	IMAGE_REL_I386_ABSOLUTE       = 0x0000,
+	IMAGE_REL_I386_DIR16          = 0x0001,
+	IMAGE_REL_I386_REL16          = 0x0002,
+	IMAGE_REL_I386_DIR32          = 0x0006,
+	IMAGE_REL_I386_DIR32NB        = 0x0007,
+	IMAGE_REL_I386_SEG12          = 0x0009,
+	IMAGE_REL_I386_SECTION        = 0x000A,
+	IMAGE_REL_I386_SECREL         = 0x000B,
+	IMAGE_REL_I386_TOKEN          = 0x000C,
+	IMAGE_REL_I386_SECREL7        = 0x000D,
+	IMAGE_REL_I386_REL32          = 0x0014
+}
+
+enum : WORD {
+	IMAGE_REL_AMD64_ABSOLUTE      = 0x0000,
+	IMAGE_REL_AMD64_ADDR64        = 0x0001,
+	IMAGE_REL_AMD64_ADDR32        = 0x0002,
+	IMAGE_REL_AMD64_ADDR32NB      = 0x0003,
+	IMAGE_REL_AMD64_REL32         = 0x0004,
+	IMAGE_REL_AMD64_REL32_1       = 0x0005,
+	IMAGE_REL_AMD64_REL32_2       = 0x0006,
+	IMAGE_REL_AMD64_REL32_3       = 0x0007,
+	IMAGE_REL_AMD64_REL32_4       = 0x0008,
+	IMAGE_REL_AMD64_REL32_5       = 0x0009,
+	IMAGE_REL_AMD64_SECTION       = 0x000A,
+	IMAGE_REL_AMD64_SECREL        = 0x000B,
+	IMAGE_REL_AMD64_SECREL7       = 0x000C,
+	IMAGE_REL_AMD64_TOKEN         = 0x000D,
+	IMAGE_REL_AMD64_SREL32        = 0x000E,
+	IMAGE_REL_AMD64_PAIR          = 0x000F,
+	IMAGE_REL_AMD64_SSPAN32       = 0x0010
+}
+
+enum : WORD {
+	IMAGE_REL_IA64_ABSOLUTE       = 0x0000,
+	IMAGE_REL_IA64_IMM14          = 0x0001,
+	IMAGE_REL_IA64_IMM22          = 0x0002,
+	IMAGE_REL_IA64_IMM64          = 0x0003,
+	IMAGE_REL_IA64_DIR32          = 0x0004,
+	IMAGE_REL_IA64_DIR64          = 0x0005,
+	IMAGE_REL_IA64_PCREL21B       = 0x0006,
+	IMAGE_REL_IA64_PCREL21M       = 0x0007,
+	IMAGE_REL_IA64_PCREL21F       = 0x0008,
+	IMAGE_REL_IA64_GPREL22        = 0x0009,
+	IMAGE_REL_IA64_LTOFF22        = 0x000A,
+	IMAGE_REL_IA64_SECTION        = 0x000B,
+	IMAGE_REL_IA64_SECREL22       = 0x000C,
+	IMAGE_REL_IA64_SECREL64I      = 0x000D,
+	IMAGE_REL_IA64_SECREL32       = 0x000E,
+	IMAGE_REL_IA64_DIR32NB        = 0x0010,
+	IMAGE_REL_IA64_SREL14         = 0x0011,
+	IMAGE_REL_IA64_SREL22         = 0x0012,
+	IMAGE_REL_IA64_SREL32         = 0x0013,
+	IMAGE_REL_IA64_UREL32         = 0x0014,
+	IMAGE_REL_IA64_PCREL60X       = 0x0015,
+	IMAGE_REL_IA64_PCREL60B       = 0x0016,
+	IMAGE_REL_IA64_PCREL60F       = 0x0017,
+	IMAGE_REL_IA64_PCREL60I       = 0x0018,
+	IMAGE_REL_IA64_PCREL60M       = 0x0019,
+	IMAGE_REL_IA64_IMMGPREL64     = 0x001A,
+	IMAGE_REL_IA64_TOKEN          = 0x001B,
+	IMAGE_REL_IA64_GPREL32        = 0x001C,
+	IMAGE_REL_IA64_ADDEND         = 0x001F
+}
+
+enum : WORD {
+	IMAGE_REL_SH3_ABSOLUTE        = 0x0000,
+	IMAGE_REL_SH3_DIRECT16        = 0x0001,
+	IMAGE_REL_SH3_DIRECT32        = 0x0002,
+	IMAGE_REL_SH3_DIRECT8         = 0x0003,
+	IMAGE_REL_SH3_DIRECT8_WORD    = 0x0004,
+	IMAGE_REL_SH3_DIRECT8_LONG    = 0x0005,
+	IMAGE_REL_SH3_DIRECT4         = 0x0006,
+	IMAGE_REL_SH3_DIRECT4_WORD    = 0x0007,
+	IMAGE_REL_SH3_DIRECT4_LONG    = 0x0008,
+	IMAGE_REL_SH3_PCREL8_WORD     = 0x0009,
+	IMAGE_REL_SH3_PCREL8_LONG     = 0x000A,
+	IMAGE_REL_SH3_PCREL12_WORD    = 0x000B,
+	IMAGE_REL_SH3_STARTOF_SECTION = 0x000C,
+	IMAGE_REL_SH3_SIZEOF_SECTION  = 0x000D,
+	IMAGE_REL_SH3_SECTION         = 0x000E,
+	IMAGE_REL_SH3_SECREL          = 0x000F,
+	IMAGE_REL_SH3_DIRECT32_NB     = 0x0010,
+	IMAGE_REL_SH3_GPREL4_LONG     = 0x0011,
+	IMAGE_REL_SH3_TOKEN           = 0x0012,
+	IMAGE_REL_SHM_PCRELPT         = 0x0013,
+	IMAGE_REL_SHM_REFLO           = 0x0014,
+	IMAGE_REL_SHM_REFHALF         = 0x0015,
+	IMAGE_REL_SHM_RELLO           = 0x0016,
+	IMAGE_REL_SHM_RELHALF         = 0x0017,
+	IMAGE_REL_SHM_PAIR            = 0x0018,
+	IMAGE_REL_SHM_NOMODE          = 0x8000
+}
+
+enum : WORD {
+	IMAGE_REL_M32R_ABSOLUTE       = 0x0000,
+	IMAGE_REL_M32R_ADDR32         = 0x0001,
+	IMAGE_REL_M32R_ADDR32NB       = 0x0002,
+	IMAGE_REL_M32R_ADDR24         = 0x0003,
+	IMAGE_REL_M32R_GPREL16        = 0x0004,
+	IMAGE_REL_M32R_PCREL24        = 0x0005,
+	IMAGE_REL_M32R_PCREL16        = 0x0006,
+	IMAGE_REL_M32R_PCREL8         = 0x0007,
+	IMAGE_REL_M32R_REFHALF        = 0x0008,
+	IMAGE_REL_M32R_REFHI          = 0x0009,
+	IMAGE_REL_M32R_REFLO          = 0x000A,
+	IMAGE_REL_M32R_PAIR           = 0x000B,
+	IMAGE_REL_M32R_SECTION        = 0x000C,
+	IMAGE_REL_M32R_SECREL         = 0x000D,
+	IMAGE_REL_M32R_TOKEN          = 0x000E
+}
+
+enum : WORD {
+	IMAGE_REL_MIPS_ABSOLUTE       = 0x0000,
+	IMAGE_REL_MIPS_REFHALF        = 0x0001,
+	IMAGE_REL_MIPS_REFWORD        = 0x0002,
+	IMAGE_REL_MIPS_JMPADDR        = 0x0003,
+	IMAGE_REL_MIPS_REFHI          = 0x0004,
+	IMAGE_REL_MIPS_REFLO          = 0x0005,
+	IMAGE_REL_MIPS_GPREL          = 0x0006,
+	IMAGE_REL_MIPS_LITERAL        = 0x0007,
+	IMAGE_REL_MIPS_SECTION        = 0x000A,
+	IMAGE_REL_MIPS_SECREL         = 0x000B,
+	IMAGE_REL_MIPS_SECRELLO       = 0x000C,
+	IMAGE_REL_MIPS_SECRELHI       = 0x000D,
+	IMAGE_REL_MIPS_JMPADDR16      = 0x0010,
+	IMAGE_REL_MIPS_REFWORDNB      = 0x0022,
+	IMAGE_REL_MIPS_PAIR           = 0x0025
+}
+
+
+enum : WORD {
+	IMAGE_REL_ALPHA_ABSOLUTE,
+	IMAGE_REL_ALPHA_REFLONG,
+	IMAGE_REL_ALPHA_REFQUAD,
+	IMAGE_REL_ALPHA_GPREL32,
+	IMAGE_REL_ALPHA_LITERAL,
+	IMAGE_REL_ALPHA_LITUSE,
+	IMAGE_REL_ALPHA_GPDISP,
+	IMAGE_REL_ALPHA_BRADDR,
+	IMAGE_REL_ALPHA_HINT,
+	IMAGE_REL_ALPHA_INLINE_REFLONG,
+	IMAGE_REL_ALPHA_REFHI,
+	IMAGE_REL_ALPHA_REFLO,
+	IMAGE_REL_ALPHA_PAIR,
+	IMAGE_REL_ALPHA_MATCH,
+	IMAGE_REL_ALPHA_SECTION,
+	IMAGE_REL_ALPHA_SECREL,
+	IMAGE_REL_ALPHA_REFLONGNB,
+	IMAGE_REL_ALPHA_SECRELLO,
+	IMAGE_REL_ALPHA_SECRELHI // = 18
+}
+
+enum : WORD {
+	IMAGE_REL_PPC_ABSOLUTE,
+	IMAGE_REL_PPC_ADDR64,
+	IMAGE_REL_PPC_ADDR32,
+	IMAGE_REL_PPC_ADDR24,
+	IMAGE_REL_PPC_ADDR16,
+	IMAGE_REL_PPC_ADDR14,
+	IMAGE_REL_PPC_REL24,
+	IMAGE_REL_PPC_REL14,
+	IMAGE_REL_PPC_TOCREL16,
+	IMAGE_REL_PPC_TOCREL14,
+	IMAGE_REL_PPC_ADDR32NB,
+	IMAGE_REL_PPC_SECREL,
+	IMAGE_REL_PPC_SECTION,
+	IMAGE_REL_PPC_IFGLUE,
+	IMAGE_REL_PPC_IMGLUE,
+	IMAGE_REL_PPC_SECREL16,
+	IMAGE_REL_PPC_REFHI,
+	IMAGE_REL_PPC_REFLO,
+	IMAGE_REL_PPC_PAIR // = 18
+}
+
+// ???
+const IMAGE_REL_PPC_TYPEMASK = 0x00FF;
+const IMAGE_REL_PPC_NEG      = 0x0100;
+const IMAGE_REL_PPC_BRTAKEN  = 0x0200;
+const IMAGE_REL_PPC_BRNTAKEN = 0x0400;
+const IMAGE_REL_PPC_TOCDEFN  = 0x0800;
+
+enum {
+	IMAGE_REL_BASED_ABSOLUTE,
+	IMAGE_REL_BASED_HIGH,
+	IMAGE_REL_BASED_LOW,
+	IMAGE_REL_BASED_HIGHLOW,
+	IMAGE_REL_BASED_HIGHADJ,
+	IMAGE_REL_BASED_MIPS_JMPADDR
+}
+// End of constants documented in pecoff.doc
+
+const size_t IMAGE_ARCHIVE_START_SIZE = 8;
+
+const TCHAR[]
+	IMAGE_ARCHIVE_START            = "!<arch>\n",
+	IMAGE_ARCHIVE_END              = "`\n",
+	IMAGE_ARCHIVE_PAD              = "\n",
+	IMAGE_ARCHIVE_LINKER_MEMBER    = "/               ",
+	IMAGE_ARCHIVE_LONGNAMES_MEMBER = "//              ";
+
+const IMAGE_ORDINAL_FLAG32 = 0x80000000;
+
+ulong IMAGE_ORDINAL64(ulong Ordinal) { return Ordinal & 0xFFFF; }
+uint IMAGE_ORDINAL32(uint Ordinal)   { return Ordinal & 0xFFFF; }
+
+bool IMAGE_SNAP_BY_ORDINAL32(uint Ordinal) {
+	return (Ordinal & IMAGE_ORDINAL_FLAG32) != 0;
+}
+
+const ulong IMAGE_ORDINAL_FLAG64 = 0x8000000000000000;
+
+bool IMAGE_SNAP_BY_ORDINAL64(ulong Ordinal) {
+	return (Ordinal & IMAGE_ORDINAL_FLAG64) != 0;
+}
+
+// ???
+const IMAGE_RESOURCE_NAME_IS_STRING    = 0x80000000;
+const IMAGE_RESOURCE_DATA_IS_DIRECTORY = 0x80000000;
+
+enum : DWORD {
+	IMAGE_DEBUG_TYPE_UNKNOWN,
+	IMAGE_DEBUG_TYPE_COFF,
+	IMAGE_DEBUG_TYPE_CODEVIEW,
+	IMAGE_DEBUG_TYPE_FPO,
+	IMAGE_DEBUG_TYPE_MISC,
+	IMAGE_DEBUG_TYPE_EXCEPTION,
+	IMAGE_DEBUG_TYPE_FIXUP,
+	IMAGE_DEBUG_TYPE_OMAP_TO_SRC,
+	IMAGE_DEBUG_TYPE_OMAP_FROM_SRC,
+	IMAGE_DEBUG_TYPE_BORLAND // = 9
+}
+
+enum : ubyte {
+	FRAME_FPO,
+	FRAME_TRAP,
+	FRAME_TSS,
+	FRAME_NONFPO
+}
+
+// ???
+const IMAGE_DEBUG_MISC_EXENAME = 1;
+
+// ???
+const N_BTMASK = 0x000F;
+const N_TMASK  = 0x0030;
+const N_TMASK1 = 0x00C0;
+const N_TMASK2 = 0x00F0;
+const N_BTSHFT = 4;
+const N_TSHIFT = 2;
+
+const int
+	IS_TEXT_UNICODE_ASCII16            = 0x0001,
+	IS_TEXT_UNICODE_STATISTICS         = 0x0002,
+	IS_TEXT_UNICODE_CONTROLS           = 0x0004,
+	IS_TEXT_UNICODE_SIGNATURE          = 0x0008,
+	IS_TEXT_UNICODE_REVERSE_ASCII16    = 0x0010,
+	IS_TEXT_UNICODE_REVERSE_STATISTICS = 0x0020,
+	IS_TEXT_UNICODE_REVERSE_CONTROLS   = 0x0040,
+	IS_TEXT_UNICODE_REVERSE_SIGNATURE  = 0x0080,
+	IS_TEXT_UNICODE_ILLEGAL_CHARS      = 0x0100,
+	IS_TEXT_UNICODE_ODD_LENGTH         = 0x0200,
+	IS_TEXT_UNICODE_NULL_BYTES         = 0x1000,
+	IS_TEXT_UNICODE_UNICODE_MASK       = 0x000F,
+	IS_TEXT_UNICODE_REVERSE_MASK       = 0x00F0,
+	IS_TEXT_UNICODE_NOT_UNICODE_MASK   = 0x0F00,
+	IS_TEXT_UNICODE_NOT_ASCII_MASK     = 0xF000;
+
+const DWORD
+	SERVICE_KERNEL_DRIVER       = 0x0001,
+	SERVICE_FILE_SYSTEM_DRIVER  = 0x0002,
+	SERVICE_ADAPTER             = 0x0004,
+	SERVICE_RECOGNIZER_DRIVER   = 0x0008,
+	SERVICE_WIN32_OWN_PROCESS   = 0x0010,
+	SERVICE_WIN32_SHARE_PROCESS = 0x0020,
+	SERVICE_INTERACTIVE_PROCESS = 0x0100,
+	SERVICE_DRIVER              = 0x000B,
+	SERVICE_WIN32               = 0x0030,
+	SERVICE_TYPE_ALL            = 0x013F;
+
+enum : DWORD {
+	SERVICE_BOOT_START   = 0,
+	SERVICE_SYSTEM_START = 1,
+	SERVICE_AUTO_START   = 2,
+	SERVICE_DEMAND_START = 3,
+	SERVICE_DISABLED     = 4
+}
+
+enum : DWORD {
+	SERVICE_ERROR_IGNORE   = 0,
+	SERVICE_ERROR_NORMAL   = 1,
+	SERVICE_ERROR_SEVERE   = 2,
+	SERVICE_ERROR_CRITICAL = 3
+}
+
+
+const uint
+	SE_OWNER_DEFAULTED          = 0x0001,
+	SE_GROUP_DEFAULTED          = 0x0002,
+	SE_DACL_PRESENT             = 0x0004,
+	SE_DACL_DEFAULTED           = 0x0008,
+	SE_SACL_PRESENT             = 0x0010,
+	SE_SACL_DEFAULTED           = 0x0020,
+	SE_DACL_AUTO_INHERIT_REQ    = 0x0100,
+	SE_SACL_AUTO_INHERIT_REQ    = 0x0200,
+	SE_DACL_AUTO_INHERITED      = 0x0400,
+	SE_SACL_AUTO_INHERITED      = 0x0800,
+	SE_DACL_PROTECTED           = 0x1000,
+	SE_SACL_PROTECTED           = 0x2000,
+	SE_SELF_RELATIVE            = 0x8000;
+
+enum SECURITY_IMPERSONATION_LEVEL {
+	SecurityAnonymous,
+	SecurityIdentification,
+	SecurityImpersonation,
+	SecurityDelegation
+}
+alias SECURITY_IMPERSONATION_LEVEL* PSECURITY_IMPERSONATION_LEVEL;
+
+alias BOOLEAN SECURITY_CONTEXT_TRACKING_MODE;
+alias BOOLEAN* PSECURITY_CONTEXT_TRACKING_MODE;
+
+const size_t SECURITY_DESCRIPTOR_MIN_LENGTH = 20;
+
+const DWORD
+	SECURITY_DESCRIPTOR_REVISION  = 1,
+	SECURITY_DESCRIPTOR_REVISION1 = 1;
+
+const DWORD
+	SE_PRIVILEGE_ENABLED_BY_DEFAULT = 0x00000001,
+	SE_PRIVILEGE_ENABLED            = 0x00000002,
+	SE_PRIVILEGE_USED_FOR_ACCESS    = 0x80000000;
+
+const DWORD PRIVILEGE_SET_ALL_NECESSARY = 1;
+
+const SECURITY_IMPERSONATION_LEVEL
+	SECURITY_MAX_IMPERSONATION_LEVEL = SECURITY_IMPERSONATION_LEVEL.SecurityDelegation,
+	DEFAULT_IMPERSONATION_LEVEL      = SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation;
+
+const BOOLEAN
+	SECURITY_DYNAMIC_TRACKING = true,
+	SECURITY_STATIC_TRACKING  = false;
+
+// also in ddk/ntifs.h
+const DWORD
+	TOKEN_ASSIGN_PRIMARY    = 0x0001,
+	TOKEN_DUPLICATE         = 0x0002,
+	TOKEN_IMPERSONATE       = 0x0004,
+	TOKEN_QUERY             = 0x0008,
+	TOKEN_QUERY_SOURCE      = 0x0010,
+	TOKEN_ADJUST_PRIVILEGES = 0x0020,
+	TOKEN_ADJUST_GROUPS     = 0x0040,
+	TOKEN_ADJUST_DEFAULT    = 0x0080,
+
+	TOKEN_ALL_ACCESS        = STANDARD_RIGHTS_REQUIRED
+                              | TOKEN_ASSIGN_PRIMARY
+                              | TOKEN_DUPLICATE
+                              | TOKEN_IMPERSONATE
+                              | TOKEN_QUERY
+                              | TOKEN_QUERY_SOURCE
+                              | TOKEN_ADJUST_PRIVILEGES
+                              | TOKEN_ADJUST_GROUPS
+                              | TOKEN_ADJUST_DEFAULT,
+	TOKEN_READ              = STANDARD_RIGHTS_READ | TOKEN_QUERY,
+	TOKEN_WRITE             = STANDARD_RIGHTS_WRITE
+                              | TOKEN_ADJUST_PRIVILEGES
+                              | TOKEN_ADJUST_GROUPS
+                              | TOKEN_ADJUST_DEFAULT,
+	TOKEN_EXECUTE           = STANDARD_RIGHTS_EXECUTE;
+
+const size_t TOKEN_SOURCE_LENGTH = 8;
+// end ddk/ntifs.h
+
+enum : DWORD {
+	DLL_PROCESS_DETACH,
+	DLL_PROCESS_ATTACH,
+	DLL_THREAD_ATTACH,
+	DLL_THREAD_DETACH
+}
+
+enum : DWORD {
+	DBG_CONTINUE              = 0x00010002,
+	DBG_TERMINATE_THREAD      = 0x40010003,
+	DBG_TERMINATE_PROCESS     = 0x40010004,
+	DBG_CONTROL_C             = 0x40010005,
+	DBG_CONTROL_BREAK         = 0x40010008,
+	DBG_EXCEPTION_NOT_HANDLED = 0x80010001
+}
+
+enum : DWORD {
+	TAPE_ABSOLUTE_POSITION,
+	TAPE_LOGICAL_POSITION,
+	TAPE_PSEUDO_LOGICAL_POSITION
+}
+
+enum : DWORD {
+	TAPE_REWIND,
+	TAPE_ABSOLUTE_BLOCK,
+	TAPE_LOGICAL_BLOCK,
+	TAPE_PSEUDO_LOGICAL_BLOCK,
+	TAPE_SPACE_END_OF_DATA,
+	TAPE_SPACE_RELATIVE_BLOCKS,
+	TAPE_SPACE_FILEMARKS,
+	TAPE_SPACE_SEQUENTIAL_FMKS,
+	TAPE_SPACE_SETMARKS,
+	TAPE_SPACE_SEQUENTIAL_SMKS
+}
+
+const DWORD
+	TAPE_DRIVE_FIXED            = 0x00000001,
+	TAPE_DRIVE_SELECT           = 0x00000002,
+	TAPE_DRIVE_INITIATOR        = 0x00000004,
+	TAPE_DRIVE_ERASE_SHORT      = 0x00000010,
+	TAPE_DRIVE_ERASE_LONG       = 0x00000020,
+	TAPE_DRIVE_ERASE_BOP_ONLY   = 0x00000040,
+	TAPE_DRIVE_ERASE_IMMEDIATE  = 0x00000080,
+	TAPE_DRIVE_TAPE_CAPACITY    = 0x00000100,
+	TAPE_DRIVE_TAPE_REMAINING   = 0x00000200,
+	TAPE_DRIVE_FIXED_BLOCK      = 0x00000400,
+	TAPE_DRIVE_VARIABLE_BLOCK   = 0x00000800,
+	TAPE_DRIVE_WRITE_PROTECT    = 0x00001000,
+	TAPE_DRIVE_EOT_WZ_SIZE      = 0x00002000,
+	TAPE_DRIVE_ECC              = 0x00010000,
+	TAPE_DRIVE_COMPRESSION      = 0x00020000,
+	TAPE_DRIVE_PADDING          = 0x00040000,
+	TAPE_DRIVE_REPORT_SMKS      = 0x00080000,
+	TAPE_DRIVE_GET_ABSOLUTE_BLK = 0x00100000,
+	TAPE_DRIVE_GET_LOGICAL_BLK  = 0x00200000,
+	TAPE_DRIVE_SET_EOT_WZ_SIZE  = 0x00400000,
+	TAPE_DRIVE_EJECT_MEDIA      = 0x01000000,
+	TAPE_DRIVE_CLEAN_REQUESTS   = 0x02000000,
+	TAPE_DRIVE_SET_CMP_BOP_ONLY = 0x04000000,
+	TAPE_DRIVE_RESERVED_BIT     = 0x80000000;
+
+const DWORD
+	TAPE_DRIVE_LOAD_UNLOAD      = 0x80000001,
+	TAPE_DRIVE_TENSION          = 0x80000002,
+	TAPE_DRIVE_LOCK_UNLOCK      = 0x80000004,
+	TAPE_DRIVE_REWIND_IMMEDIATE = 0x80000008,
+	TAPE_DRIVE_SET_BLOCK_SIZE   = 0x80000010,
+	TAPE_DRIVE_LOAD_UNLD_IMMED  = 0x80000020,
+	TAPE_DRIVE_TENSION_IMMED    = 0x80000040,
+	TAPE_DRIVE_LOCK_UNLK_IMMED  = 0x80000080,
+	TAPE_DRIVE_SET_ECC          = 0x80000100,
+	TAPE_DRIVE_SET_COMPRESSION  = 0x80000200,
+	TAPE_DRIVE_SET_PADDING      = 0x80000400,
+	TAPE_DRIVE_SET_REPORT_SMKS  = 0x80000800,
+	TAPE_DRIVE_ABSOLUTE_BLK     = 0x80001000,
+	TAPE_DRIVE_ABS_BLK_IMMED    = 0x80002000,
+	TAPE_DRIVE_LOGICAL_BLK      = 0x80004000,
+	TAPE_DRIVE_LOG_BLK_IMMED    = 0x80008000,
+	TAPE_DRIVE_END_OF_DATA      = 0x80010000,
+	TAPE_DRIVE_RELATIVE_BLKS    = 0x80020000,
+	TAPE_DRIVE_FILEMARKS        = 0x80040000,
+	TAPE_DRIVE_SEQUENTIAL_FMKS  = 0x80080000,
+	TAPE_DRIVE_SETMARKS         = 0x80100000,
+	TAPE_DRIVE_SEQUENTIAL_SMKS  = 0x80200000,
+	TAPE_DRIVE_REVERSE_POSITION = 0x80400000,
+	TAPE_DRIVE_SPACE_IMMEDIATE  = 0x80800000,
+	TAPE_DRIVE_WRITE_SETMARKS   = 0x81000000,
+	TAPE_DRIVE_WRITE_FILEMARKS  = 0x82000000,
+	TAPE_DRIVE_WRITE_SHORT_FMKS = 0x84000000,
+	TAPE_DRIVE_WRITE_LONG_FMKS  = 0x88000000,
+	TAPE_DRIVE_WRITE_MARK_IMMED = 0x90000000,
+	TAPE_DRIVE_FORMAT           = 0xA0000000,
+	TAPE_DRIVE_FORMAT_IMMEDIATE = 0xC0000000,
+	TAPE_DRIVE_HIGH_FEATURES    = 0x80000000;
+
+enum : DWORD {
+	TAPE_FIXED_PARTITIONS     = 0,
+	TAPE_SELECT_PARTITIONS    = 1,
+	TAPE_INITIATOR_PARTITIONS = 2
+}
+
+enum : DWORD {
+	TAPE_SETMARKS,
+	TAPE_FILEMARKS,
+	TAPE_SHORT_FILEMARKS,
+	TAPE_LONG_FILEMARKS
+}
+
+enum : DWORD {
+	TAPE_ERASE_SHORT,
+	TAPE_ERASE_LONG
+}
+
+enum : DWORD {
+	TAPE_LOAD,
+	TAPE_UNLOAD,
+	TAPE_TENSION,
+	TAPE_LOCK,
+	TAPE_UNLOCK,
+	TAPE_FORMAT
+}
+
+enum : ULONG32 {
+	VER_PLATFORM_WIN32s,
+	VER_PLATFORM_WIN32_WINDOWS,
+	VER_PLATFORM_WIN32_NT
+}
+
+enum : UCHAR {
+	VER_NT_WORKSTATION = 1,
+	VER_NT_DOMAIN_CONTROLLER,
+	VER_NT_SERVER
+}
+
+const USHORT
+	VER_SUITE_SMALLBUSINESS            = 0x0001,
+	VER_SUITE_ENTERPRISE               = 0x0002,
+	VER_SUITE_BACKOFFICE               = 0x0004,
+	VER_SUITE_TERMINAL                 = 0x0010,
+	VER_SUITE_SMALLBUSINESS_RESTRICTED = 0x0020,
+	VER_SUITE_EMBEDDEDNT               = 0x0040,
+	VER_SUITE_DATACENTER               = 0x0080,
+	VER_SUITE_SINGLEUSERTS             = 0x0100,
+	VER_SUITE_PERSONAL                 = 0x0200,
+	VER_SUITE_BLADE                    = 0x0400,
+	VER_SUITE_STORAGE_SERVER           = 0x2000,
+	VER_SUITE_COMPUTE_SERVER           = 0x4000;
+
+const ULONG
+	WT_EXECUTEDEFAULT            = 0x00000000,
+	WT_EXECUTEINIOTHREAD         = 0x00000001,
+	WT_EXECUTEINWAITTHREAD       = 0x00000004,
+	WT_EXECUTEONLYONCE           = 0x00000008,
+	WT_EXECUTELONGFUNCTION       = 0x00000010,
+	WT_EXECUTEINTIMERTHREAD      = 0x00000020,
+	WT_EXECUTEINPERSISTENTTHREAD = 0x00000080,
+	WT_TRANSFER_IMPERSONATION    = 0x00000100;
+
+static if (_WIN32_WINNT_ONLY) {
+	static if (_WIN32_WINNT >= 0x500) {
+		const DWORD
+			VER_MINORVERSION     = 0x01,
+			VER_MAJORVERSION     = 0x02,
+			VER_BUILDNUMBER      = 0x04,
+			VER_PLATFORMID       = 0x08,
+			VER_SERVICEPACKMINOR = 0x10,
+			VER_SERVICEPACKMAJOR = 0x20,
+			VER_SUITENAME        = 0x40,
+			VER_PRODUCT_TYPE     = 0x80;
+
+		enum : DWORD {
+			VER_EQUAL = 1,
+			VER_GREATER,
+			VER_GREATER_EQUAL,
+			VER_LESS,
+			VER_LESS_EQUAL,
+			VER_AND,
+			VER_OR // = 7
+		}
+	}
+
+	static if (_WIN32_WINNT >= 0x501) {
+		enum : ULONG {
+			ACTIVATION_CONTEXT_SECTION_ASSEMBLY_INFORMATION       = 1,
+			ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION,
+			ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION,
+			ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION,
+			ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION,
+			ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION,
+			ACTIVATION_CONTEXT_SECTION_COM_PROGID_REDIRECTION, // = 7
+			ACTIVATION_CONTEXT_SECTION_CLR_SURROGATES             = 9
+		}
+	}
+}
+
+// Macros
+BYTE BTYPE(BYTE x) { return cast(BYTE) (x & N_BTMASK); }
+bool ISPTR(uint x) { return (x & N_TMASK) == (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT); }
+bool ISFCN(uint x) { return (x & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT); }
+bool ISARY(uint x) { return (x & N_TMASK) == (IMAGE_SYM_DTYPE_ARRAY << N_BTSHFT); }
+bool ISTAG(uint x) {
+	return x == IMAGE_SYM_CLASS_STRUCT_TAG
+	    || x == IMAGE_SYM_CLASS_UNION_TAG
+	    || x == IMAGE_SYM_CLASS_ENUM_TAG;
+}
+uint INCREF(uint x) {
+	return ((x & ~N_BTMASK) << N_TSHIFT) | (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT)
+	  | (x & N_BTMASK);
+}
+uint DECREF(uint x) { return ((x >>> N_TSHIFT) & ~N_BTMASK) | (x & N_BTMASK); }
+
+const DWORD TLS_MINIMUM_AVAILABLE = 64;
+
+const ULONG
+	IO_REPARSE_TAG_RESERVED_ZERO  = 0,
+	IO_REPARSE_TAG_RESERVED_ONE   = 1,
+	IO_REPARSE_TAG_RESERVED_RANGE = IO_REPARSE_TAG_RESERVED_ONE,
+	IO_REPARSE_TAG_SYMBOLIC_LINK  = IO_REPARSE_TAG_RESERVED_ZERO,
+	IO_REPARSE_TAG_MOUNT_POINT    = 0xA0000003,
+	IO_REPARSE_TAG_SYMLINK        = 0xA000000C,
+	IO_REPARSE_TAG_VALID_VALUES   = 0xE000FFFF;
+
+/*	Although these are semantically boolean, they are documented and
+ *	implemented to return ULONG; this behaviour is preserved for compatibility
+ */
+ULONG IsReparseTagMicrosoft(ULONG x)     { return x & 0x80000000; }
+ULONG IsReparseTagHighLatency(ULONG x)   { return x & 0x40000000; }
+ULONG IsReparseTagNameSurrogate(ULONG x) { return x & 0x20000000; }
+
+bool IsReparseTagValid(ULONG x) {
+	return !(x & ~IO_REPARSE_TAG_VALID_VALUES) && (x > IO_REPARSE_TAG_RESERVED_RANGE);
+}
+
+// Doesn't seem to make sense, but anyway....
+ULONG WT_SET_MAX_THREADPOOL_THREADS(inout ULONG Flags, ushort Limit) {
+	return Flags |= Limit << 16;
+}
+
+import win32.basetyps;
+/* also in win32.basetyps
+struct GUID {
+	uint  Data1;
+	ushort Data2;
+	ushort Data3;
+	ubyte  Data4[8];
+}
+alias GUID* REFGUID, LPGUID;
+*/
+
+struct GENERIC_MAPPING {
+	ACCESS_MASK GenericRead;
+	ACCESS_MASK GenericWrite;
+	ACCESS_MASK GenericExecute;
+	ACCESS_MASK GenericAll;
+}
+alias GENERIC_MAPPING* PGENERIC_MAPPING;
+
+struct ACE_HEADER {
+	BYTE AceType;
+	BYTE AceFlags;
+	WORD AceSize;
+}
+alias ACE_HEADER* PACE_HEADER;
+
+struct ACCESS_ALLOWED_ACE {
+	ACE_HEADER  Header;
+	ACCESS_MASK Mask;
+	DWORD       SidStart;
+}
+alias ACCESS_ALLOWED_ACE* PACCESS_ALLOWED_ACE;
+
+struct ACCESS_DENIED_ACE {
+	ACE_HEADER  Header;
+	ACCESS_MASK Mask;
+	DWORD       SidStart;
+}
+alias ACCESS_DENIED_ACE* PACCESS_DENIED_ACE;
+
+struct SYSTEM_AUDIT_ACE {
+	ACE_HEADER  Header;
+	ACCESS_MASK Mask;
+	DWORD       SidStart;
+}
+alias SYSTEM_AUDIT_ACE *PSYSTEM_AUDIT_ACE;
+
+struct SYSTEM_ALARM_ACE {
+	ACE_HEADER  Header;
+	ACCESS_MASK Mask;
+	DWORD       SidStart;
+}
+alias SYSTEM_ALARM_ACE* PSYSTEM_ALARM_ACE;
+
+struct ACCESS_ALLOWED_OBJECT_ACE {
+	ACE_HEADER  Header;
+	ACCESS_MASK Mask;
+	DWORD       Flags;
+	GUID        ObjectType;
+	GUID        InheritedObjectType;
+	DWORD       SidStart;
+}
+alias ACCESS_ALLOWED_OBJECT_ACE* PACCESS_ALLOWED_OBJECT_ACE;
+
+struct ACCESS_DENIED_OBJECT_ACE {
+	ACE_HEADER  Header;
+	ACCESS_MASK Mask;
+	DWORD       Flags;
+	GUID        ObjectType;
+	GUID        InheritedObjectType;
+	DWORD       SidStart;
+}
+alias ACCESS_DENIED_OBJECT_ACE* PACCESS_DENIED_OBJECT_ACE;
+
+struct SYSTEM_AUDIT_OBJECT_ACE {
+	ACE_HEADER  Header;
+	ACCESS_MASK Mask;
+	DWORD       Flags;
+	GUID        ObjectType;
+	GUID        InheritedObjectType;
+	DWORD       SidStart;
+}
+alias SYSTEM_AUDIT_OBJECT_ACE* PSYSTEM_AUDIT_OBJECT_ACE;
+
+struct SYSTEM_ALARM_OBJECT_ACE {
+	ACE_HEADER  Header;
+	ACCESS_MASK Mask;
+	DWORD       Flags;
+	GUID        ObjectType;
+	GUID        InheritedObjectType;
+	DWORD       SidStart;
+}
+alias SYSTEM_ALARM_OBJECT_ACE* PSYSTEM_ALARM_OBJECT_ACE;
+
+struct ACL {
+	BYTE AclRevision;
+	BYTE Sbz1;
+	WORD AclSize;
+	WORD AceCount;
+	WORD Sbz2;
+}
+alias ACL* PACL;
+
+struct ACL_REVISION_INFORMATION {
+	DWORD AclRevision;
+}
+
+struct ACL_SIZE_INFORMATION {
+	DWORD AceCount;
+	DWORD AclBytesInUse;
+	DWORD AclBytesFree;
+}
+
+version (X86) {
+	// ???
+	const SIZE_OF_80387_REGISTERS     = 80;
+	const CONTEXT_i386                = 0x010000;
+	const CONTEXT_i486                = 0x010000;
+	const CONTEXT_CONTROL             = CONTEXT_i386 | 0x01;
+	const CONTEXT_INTEGER             = CONTEXT_i386 | 0x02;
+	const CONTEXT_SEGMENTS            = CONTEXT_i386 | 0x04;
+	const CONTEXT_FLOATING_POINT      = CONTEXT_i386 | 0x08;
+	const CONTEXT_DEBUG_REGISTERS     = CONTEXT_i386 | 0x10;
+	const CONTEXT_EXTENDED_REGISTERS  = CONTEXT_i386 | 0x20;
+	const CONTEXT_FULL                = CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS;
+	const MAXIMUM_SUPPORTED_EXTENSION = 512;
+
+	struct FLOATING_SAVE_AREA {
+		DWORD    ControlWord;
+		DWORD    StatusWord;
+		DWORD    TagWord;
+		DWORD    ErrorOffset;
+		DWORD    ErrorSelector;
+		DWORD    DataOffset;
+		DWORD    DataSelector;
+		BYTE[80] RegisterArea;
+		DWORD    Cr0NpxState;
+	}
+
+	struct CONTEXT {
+		DWORD ContextFlags;
+		DWORD Dr0;
+		DWORD Dr1;
+		DWORD Dr2;
+		DWORD Dr3;
+		DWORD Dr6;
+		DWORD Dr7;
+		FLOATING_SAVE_AREA FloatSave;
+		DWORD SegGs;
+		DWORD SegFs;
+		DWORD SegEs;
+		DWORD SegDs;
+		DWORD Edi;
+		DWORD Esi;
+		DWORD Ebx;
+		DWORD Edx;
+		DWORD Ecx;
+		DWORD Eax;
+		DWORD Ebp;
+		DWORD Eip;
+		DWORD SegCs;
+		DWORD EFlags;
+		DWORD Esp;
+		DWORD SegSs;
+		BYTE[MAXIMUM_SUPPORTED_EXTENSION] ExtendedRegisters;
+	}
+
+} else {
+	static assert(false, "Unsupported CPU");
+	// Versions for PowerPC, Alpha, SHX, and MIPS removed.
+}
+
+alias CONTEXT* PCONTEXT, LPCONTEXT;
+
+struct EXCEPTION_RECORD {
+	DWORD ExceptionCode;
+	DWORD ExceptionFlags;
+	EXCEPTION_RECORD* ExceptionRecord;
+	PVOID ExceptionAddress;
+	DWORD NumberParameters;
+	DWORD[EXCEPTION_MAXIMUM_PARAMETERS] ExceptionInformation;
+}
+alias EXCEPTION_RECORD* PEXCEPTION_RECORD, LPEXCEPTION_RECORD;
+
+struct EXCEPTION_POINTERS {
+	PEXCEPTION_RECORD ExceptionRecord;
+	PCONTEXT          ContextRecord;
+}
+alias EXCEPTION_POINTERS* PEXCEPTION_POINTERS, LPEXCEPTION_POINTERS;
+
+union LARGE_INTEGER {
+	struct {
+		uint LowPart;
+		int  HighPart;
+	}
+	long QuadPart;
+}
+alias LARGE_INTEGER* PLARGE_INTEGER;
+
+union ULARGE_INTEGER {
+	struct {
+		uint LowPart;
+		uint HighPart;
+	}
+	ulong QuadPart;
+}
+alias ULARGE_INTEGER* PULARGE_INTEGER;
+
+alias LARGE_INTEGER LUID;
+alias LUID* PLUID;
+
+const LUID SYSTEM_LUID = { QuadPart:999 };
+
+align(4) struct LUID_AND_ATTRIBUTES {
+	LUID  Luid;
+	DWORD Attributes;
+}
+alias LUID_AND_ATTRIBUTES* PLUID_AND_ATTRIBUTES;
+
+struct PRIVILEGE_SET {
+	DWORD PrivilegeCount;
+	DWORD Control;
+	LUID_AND_ATTRIBUTES _Privilege;
+
+	LUID_AND_ATTRIBUTES* Privilege() { return &_Privilege; }
+}
+alias PRIVILEGE_SET* PPRIVILEGE_SET;
+
+struct SECURITY_ATTRIBUTES {
+	DWORD  nLength;
+	LPVOID lpSecurityDescriptor;
+	BOOL   bInheritHandle;
+}
+alias SECURITY_ATTRIBUTES* PSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES;
+
+struct SECURITY_QUALITY_OF_SERVICE {
+	DWORD   Length;
+	SECURITY_IMPERSONATION_LEVEL   ImpersonationLevel;
+	SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
+	BOOLEAN EffectiveOnly;
+}
+alias SECURITY_QUALITY_OF_SERVICE* PSECURITY_QUALITY_OF_SERVICE;
+
+alias PVOID PACCESS_TOKEN;
+
+struct SE_IMPERSONATION_STATE {
+	PACCESS_TOKEN Token;
+	BOOLEAN       CopyOnOpen;
+	BOOLEAN       EffectiveOnly;
+	SECURITY_IMPERSONATION_LEVEL Level;
+}
+alias SE_IMPERSONATION_STATE* PSE_IMPERSONATION_STATE;
+
+struct SID_IDENTIFIER_AUTHORITY {
+	BYTE[6] Value;
+}
+alias SID_IDENTIFIER_AUTHORITY* PSID_IDENTIFIER_AUTHORITY, LPSID_IDENTIFIER_AUTHORITY;
+
+alias PVOID PSID;
+
+struct SID {
+	BYTE  Revision;
+	BYTE  SubAuthorityCount;
+	SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
+	DWORD _SubAuthority;
+
+	DWORD* SubAuthority() { return &_SubAuthority; }
+}
+alias SID* PISID;
+
+struct SID_AND_ATTRIBUTES {
+	PSID  Sid;
+	DWORD Attributes;
+}
+alias SID_AND_ATTRIBUTES* PSID_AND_ATTRIBUTES;
+
+struct TOKEN_SOURCE {
+	CHAR[TOKEN_SOURCE_LENGTH] SourceName;
+	LUID SourceIdentifier;
+}
+alias TOKEN_SOURCE* PTOKEN_SOURCE;
+
+struct TOKEN_CONTROL {
+	LUID         TokenId;
+	LUID         AuthenticationId;
+	LUID         ModifiedId;
+	TOKEN_SOURCE TokenSource;
+}
+alias TOKEN_CONTROL* PTOKEN_CONTROL;
+
+struct TOKEN_DEFAULT_DACL {
+	PACL DefaultDacl;
+}
+alias TOKEN_DEFAULT_DACL* PTOKEN_DEFAULT_DACL;
+
+struct TOKEN_GROUPS {
+	DWORD GroupCount;
+	SID_AND_ATTRIBUTES _Groups;
+
+	SID_AND_ATTRIBUTES* Groups() { return &_Groups; }
+}
+alias TOKEN_GROUPS* PTOKEN_GROUPS, LPTOKEN_GROUPS;
+
+struct TOKEN_OWNER {
+	PSID Owner;
+}
+alias TOKEN_OWNER* PTOKEN_OWNER;
+
+struct TOKEN_PRIMARY_GROUP {
+	PSID PrimaryGroup;
+}
+alias TOKEN_PRIMARY_GROUP* PTOKEN_PRIMARY_GROUP;
+
+struct TOKEN_PRIVILEGES {
+	DWORD PrivilegeCount;
+	LUID_AND_ATTRIBUTES _Privileges;
+
+	LUID_AND_ATTRIBUTES* Privileges() { return &_Privileges; }
+}
+alias TOKEN_PRIVILEGES* PTOKEN_PRIVILEGES, LPTOKEN_PRIVILEGES;
+
+enum TOKEN_TYPE {
+	TokenPrimary = 1,
+	TokenImpersonation
+}
+alias TOKEN_TYPE* PTOKEN_TYPE;
+
+struct TOKEN_STATISTICS {
+	LUID          TokenId;
+	LUID          AuthenticationId;
+	LARGE_INTEGER ExpirationTime;
+	TOKEN_TYPE    TokenType;
+	SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
+	DWORD         DynamicCharged;
+	DWORD         DynamicAvailable;
+	DWORD         GroupCount;
+	DWORD         PrivilegeCount;
+	LUID          ModifiedId;
+}
+alias TOKEN_STATISTICS* PTOKEN_STATISTICS;
+
+struct TOKEN_USER {
+	SID_AND_ATTRIBUTES User;
+}
+alias TOKEN_USER* PTOKEN_USER;
+
+alias DWORD SECURITY_INFORMATION;
+alias SECURITY_INFORMATION* PSECURITY_INFORMATION;
+alias WORD SECURITY_DESCRIPTOR_CONTROL;
+alias SECURITY_DESCRIPTOR_CONTROL* PSECURITY_DESCRIPTOR_CONTROL;
+
+struct SECURITY_DESCRIPTOR {
+	BYTE Revision;
+	BYTE Sbz1;
+	SECURITY_DESCRIPTOR_CONTROL Control;
+	PSID Owner;
+	PSID Group;
+	PACL Sacl;
+	PACL Dacl;
+}
+alias SECURITY_DESCRIPTOR* PSECURITY_DESCRIPTOR, PISECURITY_DESCRIPTOR;
+
+enum TOKEN_INFORMATION_CLASS {
+	TokenUser = 1,
+	TokenGroups,
+	TokenPrivileges,
+	TokenOwner,
+	TokenPrimaryGroup,
+	TokenDefaultDacl,
+	TokenSource,
+	TokenType,
+	TokenImpersonationLevel,
+	TokenStatistics,
+	TokenRestrictedSids,
+	TokenSessionId,
+	TokenGroupsAndPrivileges,
+	TokenSessionReference,
+	TokenSandBoxInert,
+	TokenAuditPolicy,
+	TokenOrigin
+}
+
+enum SID_NAME_USE {
+	SidTypeUser = 1,
+	SidTypeGroup,
+	SidTypeDomain,
+	SidTypeAlias,
+	SidTypeWellKnownGroup,
+	SidTypeDeletedAccount,
+	SidTypeInvalid,
+	SidTypeUnknown,
+	SidTypeComputer
+}
+alias SID_NAME_USE* PSID_NAME_USE;
+
+struct QUOTA_LIMITS {
+	SIZE_T PagedPoolLimit;
+	SIZE_T NonPagedPoolLimit;
+	SIZE_T MinimumWorkingSetSize;
+	SIZE_T MaximumWorkingSetSize;
+	SIZE_T PagefileLimit;
+	LARGE_INTEGER TimeLimit;
+}
+alias QUOTA_LIMITS* PQUOTA_LIMITS;
+
+struct IO_COUNTERS {
+	ULONGLONG ReadOperationCount;
+	ULONGLONG WriteOperationCount;
+	ULONGLONG OtherOperationCount;
+	ULONGLONG ReadTransferCount;
+	ULONGLONG WriteTransferCount;
+	ULONGLONG OtherTransferCount;
+}
+alias IO_COUNTERS* PIO_COUNTERS;
+
+struct FILE_NOTIFY_INFORMATION {
+	DWORD NextEntryOffset;
+	DWORD Action;
+	DWORD FileNameLength;
+	WCHAR _FileName;
+
+	WCHAR* FileName() { return &_FileName; }
+}
+alias FILE_NOTIFY_INFORMATION* PFILE_NOTIFY_INFORMATION;
+
+struct TAPE_ERASE {
+	DWORD   Type;
+	BOOLEAN Immediate;
+}
+alias TAPE_ERASE* PTAPE_ERASE;
+
+struct TAPE_GET_DRIVE_PARAMETERS {
+	BOOLEAN ECC;
+	BOOLEAN Compression;
+	BOOLEAN DataPadding;
+	BOOLEAN ReportSetmarks;
+	DWORD   DefaultBlockSize;
+	DWORD   MaximumBlockSize;
+	DWORD   MinimumBlockSize;
+	DWORD   MaximumPartitionCount;
+	DWORD   FeaturesLow;
+	DWORD   FeaturesHigh;
+	DWORD   EOTWarningZoneSize;
+}
+alias TAPE_GET_DRIVE_PARAMETERS* PTAPE_GET_DRIVE_PARAMETERS;
+
+struct TAPE_GET_MEDIA_PARAMETERS {
+	LARGE_INTEGER Capacity;
+	LARGE_INTEGER Remaining;
+	DWORD         BlockSize;
+	DWORD         PartitionCount;
+	BOOLEAN       WriteProtected;
+}
+alias TAPE_GET_MEDIA_PARAMETERS* PTAPE_GET_MEDIA_PARAMETERS;
+
+struct TAPE_GET_POSITION {
+	ULONG Type;
+	ULONG Partition;
+	ULONG OffsetLow;
+	ULONG OffsetHigh;
+}
+alias TAPE_GET_POSITION* PTAPE_GET_POSITION;
+
+struct TAPE_PREPARE {
+	DWORD   Operation;
+	BOOLEAN Immediate;
+}
+alias TAPE_PREPARE* PTAPE_PREPARE;
+
+struct TAPE_SET_DRIVE_PARAMETERS {
+	BOOLEAN ECC;
+	BOOLEAN Compression;
+	BOOLEAN DataPadding;
+	BOOLEAN ReportSetmarks;
+	ULONG   EOTWarningZoneSize;
+}
+alias TAPE_SET_DRIVE_PARAMETERS* PTAPE_SET_DRIVE_PARAMETERS;
+
+struct TAPE_SET_MEDIA_PARAMETERS {
+	ULONG BlockSize;
+}
+alias TAPE_SET_MEDIA_PARAMETERS* PTAPE_SET_MEDIA_PARAMETERS;
+
+struct TAPE_SET_POSITION {
+	DWORD         Method;
+	DWORD         Partition;
+	LARGE_INTEGER Offset;
+	BOOLEAN       Immediate;
+}
+alias TAPE_SET_POSITION* PTAPE_SET_POSITION;
+
+struct TAPE_WRITE_MARKS {
+	DWORD   Type;
+	DWORD   Count;
+	BOOLEAN Immediate;
+}
+alias TAPE_WRITE_MARKS* PTAPE_WRITE_MARKS;
+
+struct TAPE_CREATE_PARTITION {
+	DWORD Method;
+	DWORD Count;
+	DWORD Size;
+}
+alias TAPE_CREATE_PARTITION* PTAPE_CREATE_PARTITION;
+
+struct MEMORY_BASIC_INFORMATION {
+	PVOID BaseAddress;
+	PVOID AllocationBase;
+	DWORD AllocationProtect;
+	DWORD RegionSize;
+	DWORD State;
+	DWORD Protect;
+	DWORD Type;
+}
+alias MEMORY_BASIC_INFORMATION* PMEMORY_BASIC_INFORMATION;
+
+struct MESSAGE_RESOURCE_ENTRY {
+	WORD Length;
+	WORD Flags;
+	BYTE _Text;
+
+	BYTE* Text() { return &_Text; }
+}
+alias MESSAGE_RESOURCE_ENTRY* PMESSAGE_RESOURCE_ENTRY;
+
+struct MESSAGE_RESOURCE_BLOCK {
+	DWORD LowId;
+	DWORD HighId;
+	DWORD OffsetToEntries;
+}
+alias MESSAGE_RESOURCE_BLOCK* PMESSAGE_RESOURCE_BLOCK;
+
+struct MESSAGE_RESOURCE_DATA {
+	DWORD NumberOfBlocks;
+	MESSAGE_RESOURCE_BLOCK _Blocks;
+
+	MESSAGE_RESOURCE_BLOCK* Blocks() { return &_Blocks; }
+}
+alias MESSAGE_RESOURCE_DATA* PMESSAGE_RESOURCE_DATA;
+
+struct LIST_ENTRY {
+	LIST_ENTRY* Flink;
+	LIST_ENTRY* Blink;
+}
+alias LIST_ENTRY* PLIST_ENTRY;
+
+struct SINGLE_LIST_ENTRY {
+	SINGLE_LIST_ENTRY* Next;
+}
+alias SINGLE_LIST_ENTRY SLIST_ENTRY;
+alias SINGLE_LIST_ENTRY* PSINGLE_LIST_ENTRY, PSLIST_ENTRY;
+
+union SLIST_HEADER {
+	ULONGLONG       Alignment;
+	struct {
+		SLIST_ENTRY Next;
+		WORD        Depth;
+		WORD        Sequence;
+	}
+}
+alias SLIST_HEADER* PSLIST_HEADER;
+
+struct RTL_CRITICAL_SECTION_DEBUG {
+	WORD       Type;
+	WORD       CreatorBackTraceIndex;
+	RTL_CRITICAL_SECTION* CriticalSection;
+	LIST_ENTRY ProcessLocksList;
+	DWORD      EntryCount;
+	DWORD      ContentionCount;
+	DWORD[2]   Spare;
+}
+alias RTL_CRITICAL_SECTION_DEBUG* PRTL_CRITICAL_SECTION_DEBUG;
+
+struct RTL_CRITICAL_SECTION {
+	PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
+	LONG   LockCount;
+	LONG   RecursionCount;
+	HANDLE OwningThread;
+	HANDLE LockSemaphore;
+	DWORD  Reserved;
+}
+alias RTL_CRITICAL_SECTION* PRTL_CRITICAL_SECTION;
+
+struct EVENTLOGRECORD {
+	DWORD Length;
+	DWORD Reserved;
+	DWORD RecordNumber;
+	DWORD TimeGenerated;
+	DWORD TimeWritten;
+	DWORD EventID;
+	WORD  EventType;
+	WORD  NumStrings;
+	WORD  EventCategory;
+	WORD  ReservedFlags;
+	DWORD ClosingRecordNumber;
+	DWORD StringOffset;
+	DWORD UserSidLength;
+	DWORD UserSidOffset;
+	DWORD DataLength;
+	DWORD DataOffset;
+}
+alias EVENTLOGRECORD* PEVENTLOGRECORD;
+
+struct OSVERSIONINFOA {
+	DWORD     dwOSVersionInfoSize;
+	DWORD     dwMajorVersion;
+	DWORD     dwMinorVersion;
+	DWORD     dwBuildNumber;
+	DWORD     dwPlatformId;
+	CHAR[128] szCSDVersion;
+}
+alias OSVERSIONINFOA* POSVERSIONINFOA, LPOSVERSIONINFOA;
+
+struct OSVERSIONINFOW {
+	DWORD      dwOSVersionInfoSize;
+	DWORD      dwMajorVersion;
+	DWORD      dwMinorVersion;
+	DWORD      dwBuildNumber;
+	DWORD      dwPlatformId;
+	WCHAR[128] szCSDVersion;
+}
+alias OSVERSIONINFOW* POSVERSIONINFOW, LPOSVERSIONINFOW;
+
+struct OSVERSIONINFOEXA {
+	DWORD     dwOSVersionInfoSize;
+	DWORD     dwMajorVersion;
+	DWORD     dwMinorVersion;
+	DWORD     dwBuildNumber;
+	DWORD     dwPlatformId;
+	CHAR[128] szCSDVersion;
+	WORD      wServicePackMajor;
+	WORD      wServicePackMinor;
+	WORD      wSuiteMask;
+	BYTE      wProductType;
+	BYTE      wReserved;
+}
+alias OSVERSIONINFOEXA* POSVERSIONINFOEXA, LPOSVERSIONINFOEXA;
+
+struct OSVERSIONINFOEXW {
+	DWORD      dwOSVersionInfoSize;
+	DWORD      dwMajorVersion;
+	DWORD      dwMinorVersion;
+	DWORD      dwBuildNumber;
+	DWORD      dwPlatformId;
+	WCHAR[128] szCSDVersion;
+	WORD       wServicePackMajor;
+	WORD       wServicePackMinor;
+	WORD       wSuiteMask;
+	BYTE       wProductType;
+	BYTE       wReserved;
+}
+alias OSVERSIONINFOEXW* POSVERSIONINFOEXW, LPOSVERSIONINFOEXW;
+
+align(2) struct IMAGE_VXD_HEADER {
+	WORD     e32_magic;
+	BYTE     e32_border;
+	BYTE     e32_worder;
+	DWORD    e32_level;
+	WORD     e32_cpu;
+	WORD     e32_os;
+	DWORD    e32_ver;
+	DWORD    e32_mflags;
+	DWORD    e32_mpages;
+	DWORD    e32_startobj;
+	DWORD    e32_eip;
+	DWORD    e32_stackobj;
+	DWORD    e32_esp;
+	DWORD    e32_pagesize;
+	DWORD    e32_lastpagesize;
+	DWORD    e32_fixupsize;
+	DWORD    e32_fixupsum;
+	DWORD    e32_ldrsize;
+	DWORD    e32_ldrsum;
+	DWORD    e32_objtab;
+	DWORD    e32_objcnt;
+	DWORD    e32_objmap;
+	DWORD    e32_itermap;
+	DWORD    e32_rsrctab;
+	DWORD    e32_rsrccnt;
+	DWORD    e32_restab;
+	DWORD    e32_enttab;
+	DWORD    e32_dirtab;
+	DWORD    e32_dircnt;
+	DWORD    e32_fpagetab;
+	DWORD    e32_frectab;
+	DWORD    e32_impmod;
+	DWORD    e32_impmodcnt;
+	DWORD    e32_impproc;
+	DWORD    e32_pagesum;
+	DWORD    e32_datapage;
+	DWORD    e32_preload;
+	DWORD    e32_nrestab;
+	DWORD    e32_cbnrestab;
+	DWORD    e32_nressum;
+	DWORD    e32_autodata;
+	DWORD    e32_debuginfo;
+	DWORD    e32_debuglen;
+	DWORD    e32_instpreload;
+	DWORD    e32_instdemand;
+	DWORD    e32_heapsize;
+	BYTE[12] e32_res3;
+	DWORD    e32_winresoff;
+	DWORD    e32_winreslen;
+	WORD     e32_devid;
+	WORD     e32_ddkver;
+}
+alias IMAGE_VXD_HEADER* PIMAGE_VXD_HEADER;
+
+align(4):
+struct IMAGE_FILE_HEADER {
+	WORD  Machine;
+	WORD  NumberOfSections;
+	DWORD TimeDateStamp;
+	DWORD PointerToSymbolTable;
+	DWORD NumberOfSymbols;
+	WORD  SizeOfOptionalHeader;
+	WORD  Characteristics;
+}
+alias IMAGE_FILE_HEADER* PIMAGE_FILE_HEADER;
+// const IMAGE_SIZEOF_FILE_HEADER = IMAGE_FILE_HEADER.sizeof;
+
+struct IMAGE_DATA_DIRECTORY {
+	DWORD VirtualAddress;
+	DWORD Size;
+}
+alias IMAGE_DATA_DIRECTORY* PIMAGE_DATA_DIRECTORY;
+
+struct IMAGE_OPTIONAL_HEADER32 {
+	WORD  Magic;
+	BYTE  MajorLinkerVersion;
+	BYTE  MinorLinkerVersion;
+	DWORD SizeOfCode;
+	DWORD SizeOfInitializedData;
+	DWORD SizeOfUninitializedData;
+	DWORD AddressOfEntryPoint;
+	DWORD BaseOfCode;
+	DWORD BaseOfData;
+	DWORD ImageBase;
+	DWORD SectionAlignment;
+	DWORD FileAlignment;
+	WORD  MajorOperatingSystemVersion;
+	WORD  MinorOperatingSystemVersion;
+	WORD  MajorImageVersion;
+	WORD  MinorImageVersion;
+	WORD  MajorSubsystemVersion;
+	WORD  MinorSubsystemVersion;
+	DWORD Win32VersionValue;
+	DWORD SizeOfImage;
+	DWORD SizeOfHeaders;
+	DWORD CheckSum;
+	WORD  Subsystem;
+	WORD  DllCharacteristics;
+	DWORD SizeOfStackReserve;
+	DWORD SizeOfStackCommit;
+	DWORD SizeOfHeapReserve;
+	DWORD SizeOfHeapCommit;
+	DWORD LoaderFlags;
+	DWORD NumberOfRvaAndSizes;
+	IMAGE_DATA_DIRECTORY[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] DataDirectory;
+}
+alias IMAGE_OPTIONAL_HEADER32* PIMAGE_OPTIONAL_HEADER32;
+
+struct IMAGE_OPTIONAL_HEADER64 {
+	WORD      Magic;
+	BYTE      MajorLinkerVersion;
+	BYTE      MinorLinkerVersion;
+	DWORD     SizeOfCode;
+	DWORD     SizeOfInitializedData;
+	DWORD     SizeOfUninitializedData;
+	DWORD     AddressOfEntryPoint;
+	DWORD     BaseOfCode;
+	ULONGLONG ImageBase;
+	DWORD     SectionAlignment;
+	DWORD     FileAlignment;
+	WORD      MajorOperatingSystemVersion;
+	WORD      MinorOperatingSystemVersion;
+	WORD      MajorImageVersion;
+	WORD      MinorImageVersion;
+	WORD      MajorSubsystemVersion;
+	WORD      MinorSubsystemVersion;
+	DWORD     Win32VersionValue;
+	DWORD     SizeOfImage;
+	DWORD     SizeOfHeaders;
+	DWORD     CheckSum;
+	WORD      Subsystem;
+	WORD      DllCharacteristics;
+	ULONGLONG SizeOfStackReserve;
+	ULONGLONG SizeOfStackCommit;
+	ULONGLONG SizeOfHeapReserve;
+	ULONGLONG SizeOfHeapCommit;
+	DWORD     LoaderFlags;
+	DWORD     NumberOfRvaAndSizes;
+	IMAGE_DATA_DIRECTORY[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] DataDirectory;
+}
+alias IMAGE_OPTIONAL_HEADER64* PIMAGE_OPTIONAL_HEADER64;
+
+struct IMAGE_ROM_OPTIONAL_HEADER {
+	WORD     Magic;
+	BYTE     MajorLinkerVersion;
+	BYTE     MinorLinkerVersion;
+	DWORD    SizeOfCode;
+	DWORD    SizeOfInitializedData;
+	DWORD    SizeOfUninitializedData;
+	DWORD    AddressOfEntryPoint;
+	DWORD    BaseOfCode;
+	DWORD    BaseOfData;
+	DWORD    BaseOfBss;
+	DWORD    GprMask;
+	DWORD[4] CprMask;
+	DWORD    GpValue;
+}
+alias IMAGE_ROM_OPTIONAL_HEADER* PIMAGE_ROM_OPTIONAL_HEADER;
+
+align(2):
+struct IMAGE_DOS_HEADER {
+	WORD     e_magic;
+	WORD     e_cblp;
+	WORD     e_cp;
+	WORD     e_crlc;
+	WORD     e_cparhdr;
+	WORD     e_minalloc;
+	WORD     e_maxalloc;
+	WORD     e_ss;
+	WORD     e_sp;
+	WORD     e_csum;
+	WORD     e_ip;
+	WORD     e_cs;
+	WORD     e_lfarlc;
+	WORD     e_ovno;
+	WORD[4] e_res;
+	WORD     e_oemid;
+	WORD     e_oeminfo;
+	WORD[10] e_res2;
+	LONG     e_lfanew;
+}
+alias IMAGE_DOS_HEADER* PIMAGE_DOS_HEADER;
+
+struct IMAGE_OS2_HEADER {
+	WORD ne_magic;
+	CHAR ne_ver;
+	CHAR ne_rev;
+	WORD ne_enttab;
+	WORD ne_cbenttab;
+	LONG ne_crc;
+	WORD ne_flags;
+	WORD ne_autodata;
+	WORD ne_heap;
+	WORD ne_stack;
+	LONG ne_csip;
+	LONG ne_sssp;
+	WORD ne_cseg;
+	WORD ne_cmod;
+	WORD ne_cbnrestab;
+	WORD ne_segtab;
+	WORD ne_rsrctab;
+	WORD ne_restab;
+	WORD ne_modtab;
+	WORD ne_imptab;
+	LONG ne_nrestab;
+	WORD ne_cmovent;
+	WORD ne_align;
+	WORD ne_cres;
+	BYTE ne_exetyp;
+	BYTE ne_flagsothers;
+	WORD ne_pretthunks;
+	WORD ne_psegrefbytes;
+	WORD ne_swaparea;
+	WORD ne_expver;
+}
+alias IMAGE_OS2_HEADER* PIMAGE_OS2_HEADER;
+
+align(4) struct IMAGE_NT_HEADERS32 {
+	DWORD                 Signature;
+	IMAGE_FILE_HEADER     FileHeader;
+	IMAGE_OPTIONAL_HEADER OptionalHeader;
+}
+alias IMAGE_NT_HEADERS32* PIMAGE_NT_HEADERS32;
+
+align(4) struct IMAGE_NT_HEADERS64 {
+	DWORD                 Signature;
+	IMAGE_FILE_HEADER     FileHeader;
+	IMAGE_OPTIONAL_HEADER OptionalHeader;
+}
+alias IMAGE_NT_HEADERS64* PIMAGE_NT_HEADERS64;
+
+struct IMAGE_ROM_HEADERS {
+	IMAGE_FILE_HEADER         FileHeader;
+	IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;
+}
+alias IMAGE_ROM_HEADERS* PIMAGE_ROM_HEADERS;
+
+struct IMAGE_SECTION_HEADER {
+	BYTE[IMAGE_SIZEOF_SHORT_NAME] Name;
+	union _Misc {
+		DWORD PhysicalAddress;
+		DWORD VirtualSize;
+	}
+	_Misc Misc;
+	DWORD VirtualAddress;
+	DWORD SizeOfRawData;
+	DWORD PointerToRawData;
+	DWORD PointerToRelocations;
+	DWORD PointerToLinenumbers;
+	WORD  NumberOfRelocations;
+	WORD  NumberOfLinenumbers;
+	DWORD Characteristics;
+}
+alias IMAGE_SECTION_HEADER* PIMAGE_SECTION_HEADER;
+
+struct IMAGE_SYMBOL {
+	union _N {
+		BYTE[8]   ShortName;
+		struct Name {
+			DWORD Short;
+			DWORD Long;
+		}
+		PBYTE[2]  LongName;
+	}
+	_N    N;
+	DWORD Value;
+	SHORT SectionNumber;
+	WORD  Type;
+	BYTE  StorageClass;
+	BYTE  NumberOfAuxSymbols;
+}
+alias IMAGE_SYMBOL* PIMAGE_SYMBOL;
+
+union IMAGE_AUX_SYMBOL {
+	struct _Sym {
+		DWORD           TagIndex;
+		union _Misc {
+			struct _LnSz {
+				WORD    Linenumber;
+				WORD    Size;
+			}
+			_LnSz       LnSz;
+			DWORD       TotalSize;
+		}
+		_Misc Misc;
+		union _FcnAry {
+			struct _Function {
+				DWORD   PointerToLinenumber;
+				DWORD   PointerToNextFunction;
+			}
+			_Function   Function;
+			struct _Array {
+				WORD[4] Dimension;
+			}
+			_Array      Array;
+		}
+		_FcnAry         FcnAry;
+		WORD            TvIndex;
+	}
+	_Sym                Sym;
+	struct _File {
+		BYTE[IMAGE_SIZEOF_SYMBOL] Name;
+	}
+	_File               File;
+	struct _Section {
+		DWORD           Length;
+		WORD            NumberOfRelocations;
+		WORD            NumberOfLinenumbers;
+		DWORD           CheckSum;
+		SHORT           Number;
+		BYTE            Selection;
+	}
+	_Section            Section;
+}
+alias IMAGE_AUX_SYMBOL* PIMAGE_AUX_SYMBOL;
+
+struct IMAGE_COFF_SYMBOLS_HEADER {
+	DWORD NumberOfSymbols;
+	DWORD LvaToFirstSymbol;
+	DWORD NumberOfLinenumbers;
+	DWORD LvaToFirstLinenumber;
+	DWORD RvaToFirstByteOfCode;
+	DWORD RvaToLastByteOfCode;
+	DWORD RvaToFirstByteOfData;
+	DWORD RvaToLastByteOfData;
+}
+alias IMAGE_COFF_SYMBOLS_HEADER* PIMAGE_COFF_SYMBOLS_HEADER;
+
+struct IMAGE_RELOCATION {
+	union {
+		DWORD VirtualAddress;
+		DWORD RelocCount;
+	}
+	DWORD     SymbolTableIndex;
+	WORD      Type;
+}
+alias IMAGE_RELOCATION* PIMAGE_RELOCATION;
+
+align(4) struct IMAGE_BASE_RELOCATION {
+	DWORD VirtualAddress;
+	DWORD SizeOfBlock;
+}
+alias IMAGE_BASE_RELOCATION* PIMAGE_BASE_RELOCATION;
+
+align(2) struct IMAGE_LINENUMBER {
+	union _Type {
+		DWORD SymbolTableIndex;
+		DWORD VirtualAddress;
+	}
+	_Type Type;
+	WORD  Linenumber;
+}
+alias IMAGE_LINENUMBER* PIMAGE_LINENUMBER;
+
+align(4):
+struct IMAGE_ARCHIVE_MEMBER_HEADER {
+	BYTE[16] Name;
+	BYTE[12] Date;
+	BYTE[6]  UserID;
+	BYTE[6]  GroupID;
+	BYTE[8]  Mode;
+	BYTE[10] Size;
+	BYTE[2]  EndHeader;
+}
+alias IMAGE_ARCHIVE_MEMBER_HEADER* PIMAGE_ARCHIVE_MEMBER_HEADER;
+
+struct IMAGE_EXPORT_DIRECTORY {
+	DWORD Characteristics;
+	DWORD TimeDateStamp;
+	WORD  MajorVersion;
+	WORD  MinorVersion;
+	DWORD Name;
+	DWORD Base;
+	DWORD NumberOfFunctions;
+	DWORD NumberOfNames;
+	DWORD AddressOfFunctions;
+	DWORD AddressOfNames;
+	DWORD AddressOfNameOrdinals;
+}
+alias IMAGE_EXPORT_DIRECTORY* PIMAGE_EXPORT_DIRECTORY;
+
+struct IMAGE_IMPORT_BY_NAME {
+	WORD Hint;
+	BYTE _Name;
+
+	BYTE* Name() {
+		return &_Name;
+	}
+}
+alias IMAGE_IMPORT_BY_NAME* PIMAGE_IMPORT_BY_NAME;
+
+struct IMAGE_THUNK_DATA32 {
+	union _u1 {
+		DWORD ForwarderString;
+		DWORD Function;
+		DWORD Ordinal;
+		DWORD AddressOfData;
+	}
+	_u1 u1;
+}
+alias IMAGE_THUNK_DATA32* PIMAGE_THUNK_DATA32;
+
+struct IMAGE_THUNK_DATA64 {
+	union _u1 {
+		ULONGLONG ForwarderString;
+		ULONGLONG Function;
+		ULONGLONG Ordinal;
+		ULONGLONG AddressOfData;
+	}
+	_u1 u1;
+}
+alias IMAGE_THUNK_DATA64* PIMAGE_THUNK_DATA64;
+
+struct IMAGE_IMPORT_DESCRIPTOR {
+	union {
+		DWORD Characteristics;
+		DWORD OriginalFirstThunk;
+	}
+	DWORD TimeDateStamp;
+	DWORD ForwarderChain;
+	DWORD Name;
+	DWORD FirstThunk;
+}
+alias IMAGE_IMPORT_DESCRIPTOR* PIMAGE_IMPORT_DESCRIPTOR;
+
+struct IMAGE_BOUND_IMPORT_DESCRIPTOR {
+	DWORD TimeDateStamp;
+	WORD  OffsetModuleName;
+	WORD  NumberOfModuleForwarderRefs;
+}
+alias IMAGE_BOUND_IMPORT_DESCRIPTOR* PIMAGE_BOUND_IMPORT_DESCRIPTOR;
+
+struct IMAGE_BOUND_FORWARDER_REF {
+	DWORD TimeDateStamp;
+	WORD  OffsetModuleName;
+	WORD  Reserved;
+}
+alias IMAGE_BOUND_FORWARDER_REF* PIMAGE_BOUND_FORWARDER_REF;
+
+struct IMAGE_TLS_DIRECTORY32 {
+	DWORD StartAddressOfRawData;
+	DWORD EndAddressOfRawData;
+	DWORD AddressOfIndex;
+	DWORD AddressOfCallBacks;
+	DWORD SizeOfZeroFill;
+	DWORD Characteristics;
+}
+alias IMAGE_TLS_DIRECTORY32* PIMAGE_TLS_DIRECTORY32;
+
+struct IMAGE_TLS_DIRECTORY64 {
+	ULONGLONG StartAddressOfRawData;
+	ULONGLONG EndAddressOfRawData;
+	ULONGLONG AddressOfIndex;
+	ULONGLONG AddressOfCallBacks;
+	DWORD     SizeOfZeroFill;
+	DWORD     Characteristics;
+}
+alias IMAGE_TLS_DIRECTORY64* PIMAGE_TLS_DIRECTORY64;
+
+struct IMAGE_RESOURCE_DIRECTORY {
+	DWORD Characteristics;
+	DWORD TimeDateStamp;
+	WORD  MajorVersion;
+	WORD  MinorVersion;
+	WORD  NumberOfNamedEntries;
+	WORD  NumberOfIdEntries;
+}
+alias IMAGE_RESOURCE_DIRECTORY* PIMAGE_RESOURCE_DIRECTORY;
+
+struct IMAGE_RESOURCE_DIRECTORY_ENTRY {
+	union {
+		/+struct {
+			DWORD NameOffset:31;
+			DWORD NameIsString:1;
+		}+/
+		DWORD Name;
+		WORD Id;
+	}
+	DWORD OffsetToData;
+		/+struct {
+			DWORD OffsetToDirectory:31;
+			DWORD DataIsDirectory:1;
+		}+/
+
+	uint NameOffset()        { return Name & 0x7FFFFFFF; }
+	bool NameIsString()      { return cast(bool)(Name & 0x80000000); }
+	uint OffsetToDirectory() { return OffsetToData & 0x7FFFFFFF; }
+	bool DataIsDirectory()   { return cast(bool)(OffsetToData & 0x80000000); }
+
+	uint NameOffset(uint n) {
+		Name = (Name & 0x80000000) | (n & 0x7FFFFFFF);
+		return n & 0x7FFFFFFF;
+	}
+
+	bool NameIsString(bool n) {
+		Name = (Name & 0x7FFFFFFF) | (n << 31); return n;
+	}
+
+	uint OffsetToDirectory(uint o) {
+		OffsetToData = (OffsetToData & 0x80000000) | (o & 0x7FFFFFFF);
+		return o & 0x7FFFFFFF;
+	}
+
+	bool DataIsDirectory(bool d) {
+		OffsetToData = (OffsetToData & 0x7FFFFFFF) | (d << 31); return d;
+	}
+}
+alias IMAGE_RESOURCE_DIRECTORY_ENTRY* PIMAGE_RESOURCE_DIRECTORY_ENTRY;
+
+struct IMAGE_RESOURCE_DIRECTORY_STRING {
+	WORD Length;
+	CHAR _NameString;
+
+	CHAR* NameString() { return &_NameString; }
+}
+alias IMAGE_RESOURCE_DIRECTORY_STRING* PIMAGE_RESOURCE_DIRECTORY_STRING;
+
+struct IMAGE_RESOURCE_DIR_STRING_U {
+	WORD  Length;
+	WCHAR _NameString;
+
+	WCHAR* NameString() { return &_NameString; }
+}
+alias IMAGE_RESOURCE_DIR_STRING_U* PIMAGE_RESOURCE_DIR_STRING_U;
+
+struct IMAGE_RESOURCE_DATA_ENTRY {
+	DWORD OffsetToData;
+	DWORD Size;
+	DWORD CodePage;
+	DWORD Reserved;
+}
+alias IMAGE_RESOURCE_DATA_ENTRY* PIMAGE_RESOURCE_DATA_ENTRY;
+
+struct IMAGE_LOAD_CONFIG_DIRECTORY {
+	DWORD    Characteristics;
+	DWORD    TimeDateStamp;
+	WORD     MajorVersion;
+	WORD     MinorVersion;
+	DWORD    GlobalFlagsClear;
+	DWORD    GlobalFlagsSet;
+	DWORD    CriticalSectionDefaultTimeout;
+	DWORD    DeCommitFreeBlockThreshold;
+	DWORD    DeCommitTotalFreeThreshold;
+	PVOID    LockPrefixTable;
+	DWORD    MaximumAllocationSize;
+	DWORD    VirtualMemoryThreshold;
+	DWORD    ProcessHeapFlags;
+	DWORD[4] Reserved;
+}
+alias IMAGE_LOAD_CONFIG_DIRECTORY* PIMAGE_LOAD_CONFIG_DIRECTORY;
+
+struct IMAGE_LOAD_CONFIG_DIRECTORY64 {
+	DWORD     Characteristics;
+	DWORD     TimeDateStamp;
+	WORD      MajorVersion;
+	WORD      MinorVersion;
+	DWORD     GlobalFlagsClear;
+	DWORD     GlobalFlagsSet;
+	DWORD     CriticalSectionDefaultTimeout;
+	ULONGLONG DeCommitFreeBlockThreshold;
+	ULONGLONG DeCommitTotalFreeThreshold;
+	ULONGLONG LockPrefixTable;
+	ULONGLONG MaximumAllocationSize;
+	ULONGLONG VirtualMemoryThreshold;
+	ULONGLONG ProcessAffinityMask;
+	DWORD     ProcessHeapFlags;
+	WORD      CSDFlags;
+	WORD      Reserved1;
+	ULONGLONG EditList;
+	DWORD[2]  Reserved;
+}
+alias IMAGE_LOAD_CONFIG_DIRECTORY64* PIMAGE_LOAD_CONFIG_DIRECTORY64;
+
+struct IMAGE_RUNTIME_FUNCTION_ENTRY {
+	DWORD BeginAddress;
+	DWORD EndAddress;
+	PVOID ExceptionHandler;
+	PVOID HandlerData;
+	DWORD PrologEndAddress;
+}
+alias IMAGE_RUNTIME_FUNCTION_ENTRY* PIMAGE_RUNTIME_FUNCTION_ENTRY;
+
+struct IMAGE_CE_RUNTIME_FUNCTION_ENTRY {
+	uint      FuncStart;
+	union {
+		ubyte PrologLen;
+		uint  _bf;
+	}
+/+
+	unsigned int FuncLen:22;
+	unsigned int ThirtyTwoBit:1;
+	unsigned int ExceptionFlag:1;
++/
+	uint FuncLen()       { return (_bf >> 8) & 0x3FFFFF; }
+	bool ThirtyTwoBit()  { return cast(bool)(_bf & 0x40000000); }
+	bool ExceptionFlag() { return cast(bool)(_bf & 0x80000000); }
+
+	uint FuncLen(uint f) {
+		_bf = (_bf & ~0x3FFFFF00) | ((f & 0x3FFFFF) << 8); return f & 0x3FFFFF;
+	}
+
+	bool ThirtyTwoBit(bool t) {
+		_bf = (_bf & ~0x40000000) | (t << 30); return t;
+	}
+
+	bool ExceptionFlag(bool e) {
+		_bf = (_bf & ~0x80000000) | (e << 31); return e;
+	}
+}
+alias IMAGE_CE_RUNTIME_FUNCTION_ENTRY* PIMAGE_CE_RUNTIME_FUNCTION_ENTRY;
+
+struct IMAGE_DEBUG_DIRECTORY {
+	DWORD Characteristics;
+	DWORD TimeDateStamp;
+	WORD  MajorVersion;
+	WORD  MinorVersion;
+	DWORD Type;
+	DWORD SizeOfData;
+	DWORD AddressOfRawData;
+	DWORD PointerToRawData;
+}
+alias IMAGE_DEBUG_DIRECTORY* PIMAGE_DEBUG_DIRECTORY;
+
+struct FPO_DATA {
+	DWORD  ulOffStart;
+	DWORD  cbProcSize;
+	DWORD  cdwLocals;
+	WORD   cdwParams;
+	ubyte  cbProlog;
+	ubyte  _bf;
+/+
+	WORD cbRegs:3;
+	WORD fHasSEH:1;
+	WORD fUseBP:1;
+	WORD reserved:1;
+	WORD cbFrame:2;
++/
+	ubyte cbRegs()  { return cast(ubyte)(_bf & 0x07); }
+	bool fHasSEH()  { return cast(bool)(_bf & 0x08); }
+	bool fUseBP()   { return cast(bool)(_bf & 0x10); }
+	bool reserved() { return cast(bool)(_bf & 0x20); }
+	ubyte cbFrame() { return cast(ubyte)(_bf >> 6); }
+
+	ubyte cbRegs(ubyte c) {
+		_bf = cast(ubyte) ((_bf & ~0x07) | (c & 0x07));
+		return cast(ubyte)(c & 0x07);
+	}
+
+	bool fHasSEH(bool f)  { _bf = cast(ubyte)((_bf & ~0x08) | (f << 3)); return f; }
+	bool fUseBP(bool f)   { _bf = cast(ubyte)((_bf & ~0x10) | (f << 4)); return f; }
+	bool reserved(bool r) { _bf = cast(ubyte)((_bf & ~0x20) | (r << 5)); return r; }
+
+	ubyte cbFrame(ubyte c) {
+		_bf = cast(ubyte) ((_bf & ~0xC0) | ((c & 0x03) << 6));
+		return cast(ubyte)(c & 0x03);
+	}
+}
+alias FPO_DATA* PFPO_DATA;
+
+struct IMAGE_DEBUG_MISC {
+	DWORD   DataType;
+	DWORD   Length;
+	BOOLEAN Unicode;
+	BYTE[3] Reserved;
+	BYTE    _Data;
+
+	BYTE*   Data() { return &_Data; }
+}
+alias IMAGE_DEBUG_MISC* PIMAGE_DEBUG_MISC;
+
+struct IMAGE_FUNCTION_ENTRY {
+	DWORD StartingAddress;
+	DWORD EndingAddress;
+	DWORD EndOfPrologue;
+}
+alias IMAGE_FUNCTION_ENTRY* PIMAGE_FUNCTION_ENTRY;
+
+struct IMAGE_FUNCTION_ENTRY64 {
+	ULONGLONG     StartingAddress;
+	ULONGLONG     EndingAddress;
+	union {
+		ULONGLONG EndOfPrologue;
+		ULONGLONG UnwindInfoAddress;
+	}
+}
+alias IMAGE_FUNCTION_ENTRY64* PIMAGE_FUNCTION_ENTRY64;
+
+struct IMAGE_SEPARATE_DEBUG_HEADER {
+	WORD     Signature;
+	WORD     Flags;
+	WORD     Machine;
+	WORD     Characteristics;
+	DWORD    TimeDateStamp;
+	DWORD    CheckSum;
+	DWORD    ImageBase;
+	DWORD    SizeOfImage;
+	DWORD    NumberOfSections;
+	DWORD    ExportedNamesSize;
+	DWORD    DebugDirectorySize;
+	DWORD    SectionAlignment;
+	DWORD[2] Reserved;
+}
+alias IMAGE_SEPARATE_DEBUG_HEADER* PIMAGE_SEPARATE_DEBUG_HEADER;
+
+enum SERVICE_NODE_TYPE {
+	DriverType               = SERVICE_KERNEL_DRIVER,
+	FileSystemType           = SERVICE_FILE_SYSTEM_DRIVER,
+	Win32ServiceOwnProcess   = SERVICE_WIN32_OWN_PROCESS,
+	Win32ServiceShareProcess = SERVICE_WIN32_SHARE_PROCESS,
+	AdapterType              = SERVICE_ADAPTER,
+	RecognizerType           = SERVICE_RECOGNIZER_DRIVER
+}
+
+enum SERVICE_LOAD_TYPE {
+	BootLoad    = SERVICE_BOOT_START,
+	SystemLoad  = SERVICE_SYSTEM_START,
+	AutoLoad    = SERVICE_AUTO_START,
+	DemandLoad  = SERVICE_DEMAND_START,
+	DisableLoad = SERVICE_DISABLED
+}
+
+enum SERVICE_ERROR_TYPE {
+	IgnoreError   = SERVICE_ERROR_IGNORE,
+	NormalError   = SERVICE_ERROR_NORMAL,
+	SevereError   = SERVICE_ERROR_SEVERE,
+	CriticalError = SERVICE_ERROR_CRITICAL
+}
+alias SERVICE_ERROR_TYPE _CM_ERROR_CONTROL_TYPE;
+
+//DAC: According to MSJ, 'UnderTheHood', May 1996, this
+// structure is not documented in any official Microsoft header file.
+alias void EXCEPTION_REGISTRATION_RECORD;
+
+align:
+struct NT_TIB {
+	EXCEPTION_REGISTRATION_RECORD *ExceptionList;
+	PVOID StackBase;
+	PVOID StackLimit;
+	PVOID SubSystemTib;
+	union {
+		PVOID FiberData;
+		DWORD Version;
+	}
+	PVOID ArbitraryUserPointer;
+	NT_TIB *Self;
+}
+alias NT_TIB* PNT_TIB;
+
+struct REPARSE_DATA_BUFFER {
+	DWORD  ReparseTag;
+	WORD   ReparseDataLength;
+	WORD   Reserved;
+	union {
+		struct _GenericReparseBuffer {
+			BYTE  _DataBuffer;
+
+			BYTE* DataBuffer() { return &_DataBuffer; }
+		}
+		_GenericReparseBuffer GenericReparseBuffer;
+		struct _SymbolicLinkReparseBuffer {
+			WORD  SubstituteNameOffset;
+			WORD  SubstituteNameLength;
+			WORD  PrintNameOffset;
+			WORD  PrintNameLength;
+			// ??? This is in MinGW, but absent in MSDN docs
+			ULONG Flags;
+			WCHAR _PathBuffer;
+
+			WCHAR* PathBuffer() { return &_PathBuffer; }
+		}
+		_SymbolicLinkReparseBuffer SymbolicLinkReparseBuffer;
+		struct _MountPointReparseBuffer {
+			WORD  SubstituteNameOffset;
+			WORD  SubstituteNameLength;
+			WORD  PrintNameOffset;
+			WORD  PrintNameLength;
+			WCHAR _PathBuffer;
+
+			WCHAR* PathBuffer() { return &_PathBuffer; }
+		}
+		_MountPointReparseBuffer MountPointReparseBuffer;
+	}
+}
+alias REPARSE_DATA_BUFFER *PREPARSE_DATA_BUFFER;
+
+struct REPARSE_GUID_DATA_BUFFER {
+	DWORD    ReparseTag;
+	WORD     ReparseDataLength;
+	WORD     Reserved;
+	GUID     ReparseGuid;
+	struct _GenericReparseBuffer {
+		BYTE _DataBuffer;
+
+		BYTE* DataBuffer() { return &_DataBuffer; }
+	}
+	_GenericReparseBuffer GenericReparseBuffer;
+}
+alias REPARSE_GUID_DATA_BUFFER* PREPARSE_GUID_DATA_BUFFER;
+
+const size_t
+	REPARSE_DATA_BUFFER_HEADER_SIZE = REPARSE_DATA_BUFFER.GenericReparseBuffer.offsetof,
+	REPARSE_GUID_DATA_BUFFER_HEADER_SIZE = REPARSE_GUID_DATA_BUFFER.GenericReparseBuffer.offsetof,
+	MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16384;
+
+
+struct REPARSE_POINT_INFORMATION {
+	WORD ReparseDataLength;
+	WORD UnparsedNameLength;
+}
+alias REPARSE_POINT_INFORMATION* PREPARSE_POINT_INFORMATION;
+
+union FILE_SEGMENT_ELEMENT {
+	PVOID64   Buffer;
+	ULONGLONG Alignment;
+}
+alias FILE_SEGMENT_ELEMENT* PFILE_SEGMENT_ELEMENT;
+
+// JOBOBJECT_BASIC_LIMIT_INFORMATION.LimitFlags constants
+const DWORD
+	JOB_OBJECT_LIMIT_WORKINGSET                 = 0x0001,
+	JOB_OBJECT_LIMIT_PROCESS_TIME               = 0x0002,
+	JOB_OBJECT_LIMIT_JOB_TIME                   = 0x0004,
+	JOB_OBJECT_LIMIT_ACTIVE_PROCESS             = 0x0008,
+	JOB_OBJECT_LIMIT_AFFINITY                   = 0x0010,
+	JOB_OBJECT_LIMIT_PRIORITY_CLASS             = 0x0020,
+	JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME          = 0x0040,
+	JOB_OBJECT_LIMIT_SCHEDULING_CLASS           = 0x0080,
+	JOB_OBJECT_LIMIT_PROCESS_MEMORY             = 0x0100,
+	JOB_OBJECT_LIMIT_JOB_MEMORY                 = 0x0200,
+	JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION = 0x0400,
+	JOB_OBJECT_BREAKAWAY_OK                     = 0x0800,
+	JOB_OBJECT_SILENT_BREAKAWAY                 = 0x1000;
+
+// JOBOBJECT_BASIC_UI_RESTRICTIONS.UIRestrictionsClass constants
+const DWORD
+	JOB_OBJECT_UILIMIT_HANDLES          = 0x0001,
+	JOB_OBJECT_UILIMIT_READCLIPBOARD    = 0x0002,
+	JOB_OBJECT_UILIMIT_WRITECLIPBOARD   = 0x0004,
+	JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS = 0x0008,
+	JOB_OBJECT_UILIMIT_DISPLAYSETTINGS  = 0x0010,
+	JOB_OBJECT_UILIMIT_GLOBALATOMS      = 0x0020,
+	JOB_OBJECT_UILIMIT_DESKTOP          = 0x0040,
+	JOB_OBJECT_UILIMIT_EXITWINDOWS      = 0x0080;
+
+// JOBOBJECT_SECURITY_LIMIT_INFORMATION.SecurityLimitFlags constants
+const DWORD
+	JOB_OBJECT_SECURITY_NO_ADMIN         = 0x0001,
+	JOB_OBJECT_SECURITY_RESTRICTED_TOKEN = 0x0002,
+	JOB_OBJECT_SECURITY_ONLY_TOKEN       = 0x0004,
+	JOB_OBJECT_SECURITY_FILTER_TOKENS    = 0x0008;
+
+// JOBOBJECT_END_OF_JOB_TIME_INFORMATION.EndOfJobTimeAction constants
+enum : DWORD {
+	JOB_OBJECT_TERMINATE_AT_END_OF_JOB,
+	JOB_OBJECT_POST_AT_END_OF_JOB
+}
+
+enum : DWORD {
+	JOB_OBJECT_MSG_END_OF_JOB_TIME = 1,
+	JOB_OBJECT_MSG_END_OF_PROCESS_TIME,
+	JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT,
+	JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO,
+	JOB_OBJECT_MSG_NEW_PROCESS,
+	JOB_OBJECT_MSG_EXIT_PROCESS,
+	JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS,
+	JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT,
+	JOB_OBJECT_MSG_JOB_MEMORY_LIMIT
+}
+
+enum JOBOBJECTINFOCLASS {
+	JobObjectBasicAccountingInformation = 1,
+	JobObjectBasicLimitInformation,
+	JobObjectBasicProcessIdList,
+	JobObjectBasicUIRestrictions,
+	JobObjectSecurityLimitInformation,
+	JobObjectEndOfJobTimeInformation,
+	JobObjectAssociateCompletionPortInformation,
+	JobObjectBasicAndIoAccountingInformation,
+	JobObjectExtendedLimitInformation,
+	JobObjectJobSetInformation,
+	MaxJobObjectInfoClass
+}
+
+struct JOBOBJECT_BASIC_ACCOUNTING_INFORMATION {
+	LARGE_INTEGER TotalUserTime;
+	LARGE_INTEGER TotalKernelTime;
+	LARGE_INTEGER ThisPeriodTotalUserTime;
+	LARGE_INTEGER ThisPeriodTotalKernelTime;
+	DWORD         TotalPageFaultCount;
+	DWORD         TotalProcesses;
+	DWORD         ActiveProcesses;
+	DWORD         TotalTerminatedProcesses;
+}
+alias JOBOBJECT_BASIC_ACCOUNTING_INFORMATION* PJOBOBJECT_BASIC_ACCOUNTING_INFORMATION;
+
+struct JOBOBJECT_BASIC_LIMIT_INFORMATION {
+	LARGE_INTEGER PerProcessUserTimeLimit;
+	LARGE_INTEGER PerJobUserTimeLimit;
+	DWORD         LimitFlags;
+	SIZE_T        MinimumWorkingSetSize;
+	SIZE_T        MaximumWorkingSetSize;
+	DWORD         ActiveProcessLimit;
+	ULONG_PTR     Affinity;
+	DWORD         PriorityClass;
+	DWORD         SchedulingClass;
+}
+alias JOBOBJECT_BASIC_LIMIT_INFORMATION* PJOBOBJECT_BASIC_LIMIT_INFORMATION;
+
+struct JOBOBJECT_BASIC_PROCESS_ID_LIST {
+	DWORD     NumberOfAssignedProcesses;
+	DWORD     NumberOfProcessIdsInList;
+	ULONG_PTR _ProcessIdList;
+
+	ULONG_PTR* ProcessIdList() { return &_ProcessIdList; }
+}
+alias JOBOBJECT_BASIC_PROCESS_ID_LIST* PJOBOBJECT_BASIC_PROCESS_ID_LIST;
+
+struct JOBOBJECT_BASIC_UI_RESTRICTIONS {
+	DWORD UIRestrictionsClass;
+}
+alias JOBOBJECT_BASIC_UI_RESTRICTIONS* PJOBOBJECT_BASIC_UI_RESTRICTIONS;
+
+struct JOBOBJECT_SECURITY_LIMIT_INFORMATION {
+	DWORD             SecurityLimitFlags;
+	HANDLE            JobToken;
+	PTOKEN_GROUPS     SidsToDisable;
+	PTOKEN_PRIVILEGES PrivilegesToDelete;
+	PTOKEN_GROUPS     RestrictedSids;
+}
+alias JOBOBJECT_SECURITY_LIMIT_INFORMATION* PJOBOBJECT_SECURITY_LIMIT_INFORMATION;
+
+struct JOBOBJECT_END_OF_JOB_TIME_INFORMATION {
+	DWORD EndOfJobTimeAction;
+}
+alias JOBOBJECT_END_OF_JOB_TIME_INFORMATION* PJOBOBJECT_END_OF_JOB_TIME_INFORMATION;
+
+struct JOBOBJECT_ASSOCIATE_COMPLETION_PORT {
+	PVOID  CompletionKey;
+	HANDLE CompletionPort;
+}
+alias JOBOBJECT_ASSOCIATE_COMPLETION_PORT* PJOBOBJECT_ASSOCIATE_COMPLETION_PORT;
+
+struct JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION {
+	JOBOBJECT_BASIC_ACCOUNTING_INFORMATION BasicInfo;
+	IO_COUNTERS IoInfo;
+}
+alias JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION *PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION;
+
+struct JOBOBJECT_EXTENDED_LIMIT_INFORMATION {
+	JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation;
+	IO_COUNTERS IoInfo;
+	SIZE_T      ProcessMemoryLimit;
+	SIZE_T      JobMemoryLimit;
+	SIZE_T      PeakProcessMemoryUsed;
+	SIZE_T      PeakJobMemoryUsed;
+}
+alias JOBOBJECT_EXTENDED_LIMIT_INFORMATION* PJOBOBJECT_EXTENDED_LIMIT_INFORMATION;
+
+struct JOBOBJECT_JOBSET_INFORMATION {
+	DWORD MemberLevel;
+}
+alias JOBOBJECT_JOBSET_INFORMATION* PJOBOBJECT_JOBSET_INFORMATION;
+
+// MinGW: Making these defines conditional on WINVER will break ddk includes
+//static if (WINVER >= 0x0500) {
+
+const DWORD
+	ES_SYSTEM_REQUIRED  = 0x00000001,
+	ES_DISPLAY_REQUIRED = 0x00000002,
+	ES_USER_PRESENT     = 0x00000004,
+	ES_CONTINUOUS       = 0x80000000;
+
+enum LATENCY_TIME {
+	LT_DONT_CARE,
+	LT_LOWEST_LATENCY
+}
+alias LATENCY_TIME* PLATENCY_TIME;
+
+enum SYSTEM_POWER_STATE {
+	PowerSystemUnspecified,
+	PowerSystemWorking,
+	PowerSystemSleeping1,
+	PowerSystemSleeping2,
+	PowerSystemSleeping3,
+	PowerSystemHibernate,
+	PowerSystemShutdown,
+	PowerSystemMaximum
+}
+alias SYSTEM_POWER_STATE* PSYSTEM_POWER_STATE;
+
+const POWER_SYSTEM_MAXIMUM = SYSTEM_POWER_STATE.PowerSystemMaximum;
+
+enum POWER_ACTION {
+	PowerActionNone,
+	PowerActionReserved,
+	PowerActionSleep,
+	PowerActionHibernate,
+	PowerActionShutdown,
+	PowerActionShutdownReset,
+	PowerActionShutdownOff,
+	PowerActionWarmEject
+}
+alias POWER_ACTION* PPOWER_ACTION;
+
+static if (WINVER >= 0x600) {
+	enum SYSTEM_POWER_CONDITION {
+		PoAc,
+		PoDc,
+		PoHot,
+		PoConditionMaximum
+	}
+	alias SYSTEM_POWER_CONDITION* PSYSTEM_POWER_CONDITION;
+}
+
+enum DEVICE_POWER_STATE {
+	PowerDeviceUnspecified,
+	PowerDeviceD0,
+	PowerDeviceD1,
+	PowerDeviceD2,
+	PowerDeviceD3,
+	PowerDeviceMaximum
+}
+alias DEVICE_POWER_STATE* PDEVICE_POWER_STATE;
+
+align(4):
+struct BATTERY_REPORTING_SCALE {
+	DWORD Granularity;
+	DWORD Capacity;
+}
+alias BATTERY_REPORTING_SCALE* PBATTERY_REPORTING_SCALE;
+
+struct POWER_ACTION_POLICY {
+	POWER_ACTION Action;
+	ULONG        Flags;
+	ULONG        EventCode;
+}
+alias POWER_ACTION_POLICY* PPOWER_ACTION_POLICY;
+
+// POWER_ACTION_POLICY.Flags constants
+const ULONG
+	POWER_ACTION_QUERY_ALLOWED  = 0x00000001,
+	POWER_ACTION_UI_ALLOWED     = 0x00000002,
+	POWER_ACTION_OVERRIDE_APPS  = 0x00000004,
+	POWER_ACTION_LIGHTEST_FIRST = 0x10000000,
+	POWER_ACTION_LOCK_CONSOLE   = 0x20000000,
+	POWER_ACTION_DISABLE_WAKES  = 0x40000000,
+	POWER_ACTION_CRITICAL       = 0x80000000;
+
+// POWER_ACTION_POLICY.EventCode constants
+const ULONG
+	POWER_LEVEL_USER_NOTIFY_TEXT  = 0x00000001,
+	POWER_LEVEL_USER_NOTIFY_SOUND = 0x00000002,
+	POWER_LEVEL_USER_NOTIFY_EXEC  = 0x00000004,
+	POWER_USER_NOTIFY_BUTTON      = 0x00000008,
+	POWER_USER_NOTIFY_SHUTDOWN    = 0x00000010,
+	POWER_FORCE_TRIGGER_RESET     = 0x80000000;
+
+const size_t
+	DISCHARGE_POLICY_CRITICAL = 0,
+	DISCHARGE_POLICY_LOW      = 1,
+	NUM_DISCHARGE_POLICIES    = 4;
+
+enum : BYTE {
+	PO_THROTTLE_NONE,
+	PO_THROTTLE_CONSTANT,
+	PO_THROTTLE_DEGRADE,
+	PO_THROTTLE_ADAPTIVE,
+	PO_THROTTLE_MAXIMUM
+}
+
+struct SYSTEM_POWER_LEVEL {
+	BOOLEAN             Enable;
+	UCHAR[3]            Spare;
+	ULONG               BatteryLevel;
+	POWER_ACTION_POLICY PowerPolicy;
+	SYSTEM_POWER_STATE  MinSystemState;
+}
+alias SYSTEM_POWER_LEVEL* PSYSTEM_POWER_LEVEL;
+
+struct SYSTEM_POWER_POLICY {
+	ULONG               Revision;
+	POWER_ACTION_POLICY PowerButton;
+	POWER_ACTION_POLICY SleepButton;
+	POWER_ACTION_POLICY LidClose;
+	SYSTEM_POWER_STATE  LidOpenWake;
+	ULONG               Reserved;
+	POWER_ACTION_POLICY Idle;
+	ULONG               IdleTimeout;
+	UCHAR               IdleSensitivity;
+	UCHAR               DynamicThrottle;
+	UCHAR[2]            Spare2;
+	SYSTEM_POWER_STATE  MinSleep;
+	SYSTEM_POWER_STATE  MaxSleep;
+	SYSTEM_POWER_STATE  ReducedLatencySleep;
+	ULONG               WinLogonFlags;
+	ULONG               Spare3;
+	ULONG               DozeS4Timeout;
+	ULONG               BroadcastCapacityResolution;
+	SYSTEM_POWER_LEVEL[NUM_DISCHARGE_POLICIES] DischargePolicy;
+	ULONG               VideoTimeout;
+	BOOLEAN             VideoDimDisplay;
+	ULONG[3]            VideoReserved;
+	ULONG               SpindownTimeout;
+	BOOLEAN             OptimizeForPower;
+	UCHAR               FanThrottleTolerance;
+	UCHAR               ForcedThrottle;
+	UCHAR               MinThrottle;
+	POWER_ACTION_POLICY OverThrottled;
+}
+alias SYSTEM_POWER_POLICY* PSYSTEM_POWER_POLICY;
+
+struct SYSTEM_POWER_CAPABILITIES {
+	BOOLEAN                    PowerButtonPresent;
+	BOOLEAN                    SleepButtonPresent;
+	BOOLEAN                    LidPresent;
+	BOOLEAN                    SystemS1;
+	BOOLEAN                    SystemS2;
+	BOOLEAN                    SystemS3;
+	BOOLEAN                    SystemS4;
+	BOOLEAN                    SystemS5;
+	BOOLEAN                    HiberFilePresent;
+	BOOLEAN                    FullWake;
+	BOOLEAN                    VideoDimPresent;
+	BOOLEAN                    ApmPresent;
+	BOOLEAN                    UpsPresent;
+	BOOLEAN                    ThermalControl;
+	BOOLEAN                    ProcessorThrottle;
+	UCHAR                      ProcessorMinThrottle;
+	UCHAR                      ProcessorMaxThrottle;
+	UCHAR[4]                   spare2;
+	BOOLEAN                    DiskSpinDown;
+	UCHAR[8]                   spare3;
+	BOOLEAN                    SystemBatteriesPresent;
+	BOOLEAN                    BatteriesAreShortTerm;
+	BATTERY_REPORTING_SCALE[3] BatteryScale;
+	SYSTEM_POWER_STATE         AcOnLineWake;
+	SYSTEM_POWER_STATE         SoftLidWake;
+	SYSTEM_POWER_STATE         RtcWake;
+	SYSTEM_POWER_STATE         MinDeviceWakeState;
+	SYSTEM_POWER_STATE         DefaultLowLatencyWake;
+}
+alias SYSTEM_POWER_CAPABILITIES* PSYSTEM_POWER_CAPABILITIES;
+
+struct SYSTEM_BATTERY_STATE {
+	BOOLEAN    AcOnLine;
+	BOOLEAN    BatteryPresent;
+	BOOLEAN    Charging;
+	BOOLEAN    Discharging;
+	BOOLEAN[4] Spare1;
+	ULONG      MaxCapacity;
+	ULONG      RemainingCapacity;
+	ULONG      Rate;
+	ULONG      EstimatedTime;
+	ULONG      DefaultAlert1;
+	ULONG      DefaultAlert2;
+}
+alias SYSTEM_BATTERY_STATE* PSYSTEM_BATTERY_STATE;
+
+enum POWER_INFORMATION_LEVEL {
+	SystemPowerPolicyAc,
+	SystemPowerPolicyDc,
+	VerifySystemPolicyAc,
+	VerifySystemPolicyDc,
+	SystemPowerCapabilities,
+	SystemBatteryState,
+	SystemPowerStateHandler,
+	ProcessorStateHandler,
+	SystemPowerPolicyCurrent,
+	AdministratorPowerPolicy,
+	SystemReserveHiberFile,
+	ProcessorInformation,
+	SystemPowerInformation,
+	ProcessorStateHandler2,
+	LastWakeTime,
+	LastSleepTime,
+	SystemExecutionState,
+	SystemPowerStateNotifyHandler,
+	ProcessorPowerPolicyAc,
+	ProcessorPowerPolicyDc,
+	VerifyProcessorPowerPolicyAc,
+	VerifyProcessorPowerPolicyDc,
+	ProcessorPowerPolicyCurrent
+}
+
+//#if 1 /* (WIN32_WINNT >= 0x0500) */
+struct SYSTEM_POWER_INFORMATION {
+	ULONG MaxIdlenessAllowed;
+	ULONG Idleness;
+	ULONG TimeRemaining;
+	UCHAR CoolingMode;
+}
+alias SYSTEM_POWER_INFORMATION* PSYSTEM_POWER_INFORMATION;
+//#endif
+
+struct PROCESSOR_POWER_POLICY_INFO {
+	ULONG    TimeCheck;
+	ULONG    DemoteLimit;
+	ULONG    PromoteLimit;
+	UCHAR    DemotePercent;
+	UCHAR    PromotePercent;
+	UCHAR[2] Spare;
+	uint     _bf;
+
+	bool AllowDemotion()  { return cast(bool)(_bf & 1); }
+	bool AllowPromotion() { return cast(bool)(_bf & 2); }
+
+	bool AllowDemotion(bool a)  { _bf = (_bf & ~1) | a; return a; }
+	bool AllowPromotion(bool a) { _bf = (_bf & ~2) | (a << 1); return a; }
+/+
+	ULONG  AllowDemotion : 1;
+	ULONG  AllowPromotion : 1;
+	ULONG  Reserved : 30;
++/
+}
+alias PROCESSOR_POWER_POLICY_INFO* PPROCESSOR_POWER_POLICY_INFO;
+
+struct PROCESSOR_POWER_POLICY {
+	ULONG    Revision;
+	UCHAR    DynamicThrottle;
+	UCHAR[3] Spare;
+	ULONG    Reserved;
+	ULONG    PolicyCount;
+	PROCESSOR_POWER_POLICY_INFO[3] Policy;
+}
+alias PROCESSOR_POWER_POLICY* PPROCESSOR_POWER_POLICY;
+
+struct ADMINISTRATOR_POWER_POLICY {
+	SYSTEM_POWER_STATE MinSleep;
+	SYSTEM_POWER_STATE MaxSleep;
+	ULONG              MinVideoTimeout;
+	ULONG              MaxVideoTimeout;
+	ULONG              MinSpindownTimeout;
+	ULONG              MaxSpindownTimeout;
+}
+alias ADMINISTRATOR_POWER_POLICY* PADMINISTRATOR_POWER_POLICY;
+
+//}//#endif /* WINVER >= 0x0500 */
+
+extern (Windows) {
+	alias void function(PVOID, DWORD, PVOID) PIMAGE_TLS_CALLBACK;
+
+	static if (_WIN32_WINNT_ONLY && _WIN32_WINNT >= 0x500) {
+		alias LONG function(PEXCEPTION_POINTERS) PVECTORED_EXCEPTION_HANDLER;
+		alias void function(PVOID, BOOLEAN) WAITORTIMERCALLBACKFUNC;
+	}
+}
+
+static if (WINVER >= 0x501) {
+	enum HEAP_INFORMATION_CLASS {
+		HeapCompatibilityInformation
+	}
+
+	enum ACTIVATION_CONTEXT_INFO_CLASS {
+		ActivationContextBasicInformation = 1,
+		ActivationContextDetailedInformation,
+		AssemblyDetailedInformationInActivationContext,
+		FileInformationInAssemblyOfAssemblyInActivationContext
+	}
+
+	struct ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION {
+		DWORD         ulFlags;
+		DWORD         ulEncodedAssemblyIdentityLength;
+		DWORD         ulManifestPathType;
+		DWORD         ulManifestPathLength;
+		LARGE_INTEGER liManifestLastWriteTime;
+		DWORD         ulPolicyPathType;
+		DWORD         ulPolicyPathLength;
+		LARGE_INTEGER liPolicyLastWriteTime;
+		DWORD         ulMetadataSatelliteRosterIndex;
+		DWORD         ulManifestVersionMajor;
+		DWORD         ulManifestVersionMinor;
+		DWORD         ulPolicyVersionMajor;
+		DWORD         ulPolicyVersionMinor;
+		DWORD         ulAssemblyDirectoryNameLength;
+		PCWSTR        lpAssemblyEncodedAssemblyIdentity;
+		PCWSTR        lpAssemblyManifestPath;
+		PCWSTR        lpAssemblyPolicyPath;
+		PCWSTR        lpAssemblyDirectoryName;
+	}
+	alias ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION*
+	  PACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION;
+	alias CPtr!(ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION)
+	  PCACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION;
+
+	struct ACTIVATION_CONTEXT_DETAILED_INFORMATION {
+		DWORD  dwFlags;
+		DWORD  ulFormatVersion;
+		DWORD  ulAssemblyCount;
+		DWORD  ulRootManifestPathType;
+		DWORD  ulRootManifestPathChars;
+		DWORD  ulRootConfigurationPathType;
+		DWORD  ulRootConfigurationPathChars;
+		DWORD  ulAppDirPathType;
+		DWORD  ulAppDirPathChars;
+		PCWSTR lpRootManifestPath;
+		PCWSTR lpRootConfigurationPath;
+		PCWSTR lpAppDirPath;
+	}
+	alias ACTIVATION_CONTEXT_DETAILED_INFORMATION*
+	  PACTIVATION_CONTEXT_DETAILED_INFORMATION;
+	alias CPtr!(ACTIVATION_CONTEXT_DETAILED_INFORMATION)
+	  PCACTIVATION_CONTEXT_DETAILED_INFORMATION;
+
+	struct ACTIVATION_CONTEXT_QUERY_INDEX {
+		ULONG ulAssemblyIndex;
+		ULONG ulFileIndexInAssembly;
+	}
+	alias ACTIVATION_CONTEXT_QUERY_INDEX*       PACTIVATION_CONTEXT_QUERY_INDEX;
+	alias CPtr!(ACTIVATION_CONTEXT_QUERY_INDEX) PCACTIVATION_CONTEXT_QUERY_INDEX;
+
+	struct ASSEMBLY_FILE_DETAILED_INFORMATION {
+		DWORD  ulFlags;
+		DWORD  ulFilenameLength;
+		DWORD  ulPathLength;
+		PCWSTR lpFileName;
+		PCWSTR lpFilePath;
+	}
+	alias ASSEMBLY_FILE_DETAILED_INFORMATION*
+	  PASSEMBLY_FILE_DETAILED_INFORMATION;
+	alias CPtr!(ASSEMBLY_FILE_DETAILED_INFORMATION)
+	  PCASSEMBLY_FILE_DETAILED_INFORMATION;
+}
+
+version (Unicode) {
+	alias OSVERSIONINFOW OSVERSIONINFO;
+	alias OSVERSIONINFOEXW OSVERSIONINFOEX;
+} else {
+	alias OSVERSIONINFOA OSVERSIONINFO;
+	alias OSVERSIONINFOEXA OSVERSIONINFOEX;
+}
+
+alias OSVERSIONINFO*   POSVERSIONINFO,   LPOSVERSIONINFO;
+alias OSVERSIONINFOEX* POSVERSIONINFOEX, LPOSVERSIONINFOEX;
+
+
+static if (_WIN32_WINNT_ONLY && _WIN32_WINNT >= 0x500) {
+	extern (Windows) ULONGLONG VerSetConditionMask(ULONGLONG, DWORD, BYTE);
+}
+
+version (Win64) {
+	const WORD IMAGE_NT_OPTIONAL_HDR_MAGIC = IMAGE_NT_OPTIONAL_HDR64_MAGIC;
+
+	alias IMAGE_ORDINAL_FLAG64 IMAGE_ORDINAL_FLAG;
+	alias IMAGE_SNAP_BY_ORDINAL64 IMAGE_SNAP_BY_ORDINAL;
+	alias IMAGE_ORDINAL64 IMAGE_ORDINAL;
+	alias IMAGE_OPTIONAL_HEADER64 IMAGE_OPTIONAL_HEADER;
+	alias IMAGE_NT_HEADERS64 IMAGE_NT_HEADERS;
+	alias IMAGE_THUNK_DATA64 IMAGE_THUNK_DATA;
+	alias IMAGE_TLS_DIRECTORY64 IMAGE_TLS_DIRECTORY;
+} else {
+	const WORD IMAGE_NT_OPTIONAL_HDR_MAGIC = IMAGE_NT_OPTIONAL_HDR32_MAGIC;
+
+	alias IMAGE_ORDINAL_FLAG32 IMAGE_ORDINAL_FLAG;
+	alias IMAGE_ORDINAL32 IMAGE_ORDINAL;
+	alias IMAGE_SNAP_BY_ORDINAL32 IMAGE_SNAP_BY_ORDINAL;
+	alias IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER;
+	alias IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS;
+	alias IMAGE_THUNK_DATA32 IMAGE_THUNK_DATA;
+	alias IMAGE_TLS_DIRECTORY32 IMAGE_TLS_DIRECTORY;
+}
+
+alias IMAGE_OPTIONAL_HEADER* PIMAGE_OPTIONAL_HEADER;
+alias IMAGE_NT_HEADERS* PIMAGE_NT_HEADERS;
+alias IMAGE_THUNK_DATA* PIMAGE_THUNK_DATA;
+alias IMAGE_TLS_DIRECTORY* PIMAGE_TLS_DIRECTORY;
+
+// TODO: MinGW implements these in assembly.  How to translate?
+PVOID GetCurrentFiber();
+PVOID GetFiberData();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/winperf.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,152 @@
+/***********************************************************************\
+*                               winperf.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.winperf;
+
+import win32.windef;
+import win32.winbase; // for SYSTEMTIME
+
+const PERF_DATA_VERSION=1;
+const PERF_DATA_REVISION=1;
+const PERF_NO_INSTANCES=-1;
+const PERF_SIZE_DWORD=0;
+const PERF_SIZE_LARGE=256;
+const PERF_SIZE_ZERO=512;
+const PERF_SIZE_VARIABLE_LEN=768;
+const PERF_TYPE_NUMBER=0;
+const PERF_TYPE_COUNTER=1024;
+const PERF_TYPE_TEXT=2048;
+const PERF_TYPE_ZERO=0xC00;
+const PERF_NUMBER_HEX=0;
+const PERF_NUMBER_DECIMAL=0x10000;
+const PERF_NUMBER_DEC_1000=0x20000;
+const PERF_COUNTER_VALUE=0;
+const PERF_COUNTER_RATE=0x10000;
+const PERF_COUNTER_FRACTION=0x20000;
+const PERF_COUNTER_BASE=0x30000;
+const PERF_COUNTER_ELAPSED=0x40000;
+const PERF_COUNTER_QUEUELEN=0x50000;
+const PERF_COUNTER_HISTOGRAM=0x60000;
+const PERF_TEXT_UNICODE=0;
+const PERF_TEXT_ASCII=0x10000;
+const PERF_TIMER_TICK=0;
+const PERF_TIMER_100NS=0x100000;
+const PERF_OBJECT_TIMER=0x200000;
+const PERF_DELTA_COUNTER=0x400000;
+const PERF_DELTA_BASE=0x800000;
+const PERF_INVERSE_COUNTER=0x1000000;
+const PERF_MULTI_COUNTER=0x2000000;
+const PERF_DISPLAY_NO_SUFFIX=0;
+const PERF_DISPLAY_PER_SEC=0x10000000;
+const PERF_DISPLAY_PERCENT=0x20000000;
+const PERF_DISPLAY_SECONDS=0x30000000;
+const PERF_DISPLAY_NOSHOW=0x40000000;
+const PERF_COUNTER_HISTOGRAM_TYPE=0x80000000;
+const PERF_NO_UNIQUE_ID=(-1);
+const PERF_DETAIL_NOVICE=100;
+const PERF_DETAIL_ADVANCED=200;
+const PERF_DETAIL_EXPERT=300;
+const PERF_DETAIL_WIZARD=400;
+const PERF_COUNTER_COUNTER=(PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_TICK|PERF_DELTA_COUNTER|PERF_DISPLAY_PER_SEC);
+const PERF_COUNTER_TIMER=(PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_TICK|PERF_DELTA_COUNTER|PERF_DISPLAY_PERCENT);
+const PERF_COUNTER_QUEUELEN_TYPE=(PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_QUEUELEN|PERF_TIMER_TICK|PERF_DELTA_COUNTER|PERF_DISPLAY_NO_SUFFIX);
+const PERF_COUNTER_BULK_COUNT=(PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_TICK|PERF_DELTA_COUNTER|PERF_DISPLAY_PER_SEC);
+const PERF_COUNTER_TEXT=(PERF_SIZE_VARIABLE_LEN|PERF_TYPE_TEXT|PERF_TEXT_UNICODE|PERF_DISPLAY_NO_SUFFIX);
+const PERF_COUNTER_RAWCOUNT=(PERF_SIZE_DWORD|PERF_TYPE_NUMBER|PERF_NUMBER_DECIMAL|PERF_DISPLAY_NO_SUFFIX);
+const PERF_COUNTER_LARGE_RAWCOUNT=(PERF_SIZE_LARGE|PERF_TYPE_NUMBER|PERF_NUMBER_DECIMAL|PERF_DISPLAY_NO_SUFFIX);
+const PERF_COUNTER_RAWCOUNT_HEX=(PERF_SIZE_DWORD|PERF_TYPE_NUMBER|PERF_NUMBER_HEX|PERF_DISPLAY_NO_SUFFIX);
+const PERF_COUNTER_LARGE_RAWCOUNT_HEX=(PERF_SIZE_LARGE|PERF_TYPE_NUMBER|PERF_NUMBER_HEX|PERF_DISPLAY_NO_SUFFIX);
+const PERF_SAMPLE_FRACTION=(PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_FRACTION|PERF_DELTA_COUNTER|PERF_DELTA_BASE|PERF_DISPLAY_PERCENT);
+const PERF_SAMPLE_COUNTER=(PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_TICK|PERF_DELTA_COUNTER|PERF_DISPLAY_NO_SUFFIX);
+const PERF_COUNTER_NODATA=(PERF_SIZE_ZERO|PERF_DISPLAY_NOSHOW);
+const PERF_COUNTER_TIMER_INV=(PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_TICK|PERF_DELTA_COUNTER|PERF_INVERSE_COUNTER|PERF_DISPLAY_PERCENT);
+const PERF_SAMPLE_BASE=(PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_BASE|PERF_DISPLAY_NOSHOW|1);
+const PERF_AVERAGE_TIMER=(PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_FRACTION|PERF_DISPLAY_SECONDS);
+const PERF_AVERAGE_BASE=(PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_BASE|PERF_DISPLAY_NOSHOW|2);
+const PERF_AVERAGE_BULK=(PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_FRACTION|PERF_DISPLAY_NOSHOW);
+const PERF_100NSEC_TIMER=(PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_100NS|PERF_DELTA_COUNTER|PERF_DISPLAY_PERCENT);
+const PERF_100NSEC_TIMER_INV=(PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_100NS|PERF_DELTA_COUNTER|PERF_INVERSE_COUNTER|PERF_DISPLAY_PERCENT);
+const PERF_COUNTER_MULTI_TIMER=(PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_DELTA_COUNTER|PERF_TIMER_TICK|PERF_MULTI_COUNTER|PERF_DISPLAY_PERCENT);
+const PERF_COUNTER_MULTI_TIMER_INV=(PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_RATE|PERF_DELTA_COUNTER|PERF_MULTI_COUNTER|PERF_TIMER_TICK|PERF_INVERSE_COUNTER|PERF_DISPLAY_PERCENT);
+const PERF_COUNTER_MULTI_BASE=(PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_BASE|PERF_MULTI_COUNTER|PERF_DISPLAY_NOSHOW);
+const PERF_100NSEC_MULTI_TIMER=(PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_DELTA_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_100NS|PERF_MULTI_COUNTER|PERF_DISPLAY_PERCENT);
+const PERF_100NSEC_MULTI_TIMER_INV=(PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_DELTA_COUNTER|PERF_COUNTER_RATE|PERF_TIMER_100NS|PERF_MULTI_COUNTER|PERF_INVERSE_COUNTER|PERF_DISPLAY_PERCENT);
+const PERF_RAW_FRACTION=(PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_FRACTION|PERF_DISPLAY_PERCENT);
+const PERF_RAW_BASE=(PERF_SIZE_DWORD|PERF_TYPE_COUNTER|PERF_COUNTER_BASE|PERF_DISPLAY_NOSHOW|3);
+const PERF_ELAPSED_TIME=(PERF_SIZE_LARGE|PERF_TYPE_COUNTER|PERF_COUNTER_ELAPSED|PERF_OBJECT_TIMER|PERF_DISPLAY_SECONDS);
+
+struct PERF_DATA_BLOCK {
+	WCHAR Signature[4];
+	DWORD LittleEndian;
+	DWORD Version;
+	DWORD Revision;
+	DWORD TotalByteLength;
+	DWORD HeaderLength;
+	DWORD NumObjectTypes;
+	LONG DefaultObject;
+	SYSTEMTIME SystemTime;
+	LARGE_INTEGER PerfTime;
+	LARGE_INTEGER PerfFreq;
+	LARGE_INTEGER PerfTime100nSec;
+	DWORD SystemNameLength;
+	DWORD SystemNameOffset;
+}
+alias PERF_DATA_BLOCK * PPERF_DATA_BLOCK;
+
+struct PERF_OBJECT_TYPE {
+	DWORD TotalByteLength;
+	DWORD DefinitionLength;
+	DWORD HeaderLength;
+	DWORD ObjectNameTitleIndex;
+	LPWSTR ObjectNameTitle;
+	DWORD ObjectHelpTitleIndex;
+	LPWSTR ObjectHelpTitle;
+	DWORD DetailLevel;
+	DWORD NumCounters;
+	LONG DefaultCounter;
+	LONG NumInstances;
+	DWORD CodePage;
+	LARGE_INTEGER PerfTime;
+	LARGE_INTEGER PerfFreq;
+}
+alias PERF_OBJECT_TYPE * PPERF_OBJECT_TYPE;
+
+struct PERF_COUNTER_DEFINITION {
+	DWORD ByteLength;
+	DWORD CounterNameTitleIndex;
+	LPWSTR CounterNameTitle;
+	DWORD CounterHelpTitleIndex;
+	LPWSTR CounterHelpTitle;
+	LONG DefaultScale;
+	DWORD DetailLevel;
+	DWORD CounterType;
+	DWORD CounterSize;
+	DWORD CounterOffset;
+}
+alias PERF_COUNTER_DEFINITION * PPERF_COUNTER_DEFINITION;
+
+struct PERF_INSTANCE_DEFINITION {
+	DWORD ByteLength;
+	DWORD ParentObjectTitleIndex;
+	DWORD ParentObjectInstance;
+	LONG UniqueID;
+	DWORD NameOffset;
+	DWORD NameLength;
+}
+alias PERF_INSTANCE_DEFINITION * PPERF_INSTANCE_DEFINITION;
+
+struct PERF_COUNTER_BLOCK {
+	DWORD ByteLength;
+}
+alias PERF_COUNTER_BLOCK * PPERF_COUNTER_BLOCK;
+
+extern (Windows):
+alias DWORD function (LPWSTR) PM_OPEN_PROC;
+alias DWORD function (LPWSTR,PVOID*,PDWORD,PDWORD) PM_COLLECT_PROC;
+alias DWORD function () PM_CLOSE_PROC;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/winreg.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,258 @@
+/***********************************************************************\
+*                                winreg.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.winreg;
+pragma(lib, "advapi32.lib");
+
+private import win32.w32api, win32.winbase, win32.windef;
+
+const HKEY
+	HKEY_CLASSES_ROOT     = cast(HKEY) 0x80000000,
+	HKEY_CURRENT_USER     = cast(HKEY) 0x80000001,
+	HKEY_LOCAL_MACHINE    = cast(HKEY) 0x80000002,
+	HKEY_USERS            = cast(HKEY) 0x80000003,
+	HKEY_PERFORMANCE_DATA = cast(HKEY) 0x80000004,
+	HKEY_CURRENT_CONFIG   = cast(HKEY) 0x80000005,
+	HKEY_DYN_DATA         = cast(HKEY) 0x80000006;
+
+enum : DWORD {
+	REG_OPTION_NON_VOLATILE,
+	REG_OPTION_VOLATILE
+}
+
+enum : DWORD {
+	REG_CREATED_NEW_KEY = 1,
+	REG_OPENED_EXISTING_KEY
+}
+
+enum : DWORD {
+	REG_NONE                       = 0,
+	REG_SZ,
+	REG_EXPAND_SZ,
+	REG_BINARY,
+	REG_DWORD_LITTLE_ENDIAN,
+	REG_DWORD                      = REG_DWORD_LITTLE_ENDIAN,
+	REG_DWORD_BIG_ENDIAN,
+	REG_LINK,
+	REG_MULTI_SZ,
+	REG_RESOURCE_LIST,
+	REG_FULL_RESOURCE_DESCRIPTOR,
+	REG_RESOURCE_REQUIREMENTS_LIST,
+	REG_QWORD_LITTLE_ENDIAN,
+	REG_QWORD                      = REG_QWORD_LITTLE_ENDIAN
+}
+
+const DWORD
+	REG_NOTIFY_CHANGE_NAME       = 1,
+	REG_NOTIFY_CHANGE_ATTRIBUTES = 2,
+	REG_NOTIFY_CHANGE_LAST_SET   = 4,
+	REG_NOTIFY_CHANGE_SECURITY   = 8;
+
+alias ACCESS_MASK REGSAM;
+
+struct VALENTA {
+	LPSTR ve_valuename;
+	DWORD ve_valuelen;
+	DWORD ve_valueptr;
+	DWORD ve_type;
+}
+alias VALENTA* PVALENTA;
+
+struct VALENTW {
+	LPWSTR ve_valuename;
+	DWORD  ve_valuelen;
+	DWORD  ve_valueptr;
+	DWORD  ve_type;
+}
+alias VALENTW* PVALENTW;
+
+// RRF - Registry Routine Flags (for RegGetValue)
+static if (WINVER >= 0x600) {
+	enum : DWORD {
+		RRF_RT_REG_NONE      = 0x00000001,
+		RRF_RT_REG_SZ        = 0x00000002,
+		RRF_RT_REG_EXPAND_SZ = 0x00000004,
+		RRF_RT_REG_BINARY    = 0x00000008,
+		RRF_RT_REG_DWORD     = 0x00000010,
+		RRF_RT_REG_MULTI_SZ  = 0x00000020,
+		RRF_RT_REG_QWORD     = 0x00000040,
+		RRF_RT_DWORD         = RRF_RT_REG_BINARY | RRF_RT_REG_DWORD,
+		RRF_RT_QWORD         = RRF_RT_REG_BINARY | RRF_RT_REG_QWORD,
+		RRF_RT_ANY           = 0x0000FFFF,
+		RRF_NOEXPAND         = 0x10000000,
+		RRF_ZEROONFAILURE    = 0x20000000
+	}
+}
+
+extern (Windows) {
+	LONG RegCloseKey(HKEY);
+	LONG RegConnectRegistryA(LPCSTR, HKEY, PHKEY);
+	LONG RegConnectRegistryW(LPCWSTR, HKEY, PHKEY);
+	LONG RegCreateKeyExA(HKEY, LPCSTR, DWORD, LPSTR, DWORD, REGSAM,
+	  LPSECURITY_ATTRIBUTES, PHKEY, PDWORD);
+	LONG RegCreateKeyExW(HKEY, LPCWSTR, DWORD, LPWSTR, DWORD, REGSAM,
+	  LPSECURITY_ATTRIBUTES, PHKEY, PDWORD);
+	LONG RegDeleteKeyA(HKEY, LPCSTR);
+	LONG RegDeleteKeyW(HKEY, LPCWSTR);
+	LONG RegDeleteValueA(HKEY, LPCSTR);
+	LONG RegDeleteValueW(HKEY, LPCWSTR);
+	LONG RegEnumKeyExA(HKEY, DWORD, LPSTR, PDWORD, PDWORD, LPSTR, PDWORD,
+	  PFILETIME);
+	LONG RegEnumKeyExW(HKEY, DWORD, LPWSTR, PDWORD, PDWORD, LPWSTR, PDWORD,
+	  PFILETIME);
+	LONG RegEnumValueA(HKEY, DWORD, LPSTR, PDWORD, PDWORD, PDWORD, LPBYTE,
+	  PDWORD);
+	LONG RegEnumValueW(HKEY, DWORD, LPWSTR, PDWORD, PDWORD, PDWORD, LPBYTE,
+	  PDWORD);
+	LONG RegFlushKey(HKEY);
+	LONG RegLoadKeyA(HKEY, LPCSTR, LPCSTR);
+	LONG RegLoadKeyW(HKEY, LPCWSTR, LPCWSTR);
+	LONG RegOpenKeyExA(HKEY, LPCSTR, DWORD, REGSAM, PHKEY);
+	LONG RegOpenKeyExW(HKEY, LPCWSTR, DWORD, REGSAM, PHKEY);
+	LONG RegQueryInfoKeyA(HKEY, LPSTR, PDWORD, PDWORD, PDWORD, PDWORD,
+	  PDWORD, PDWORD, PDWORD, PDWORD, PDWORD, PFILETIME);
+	LONG RegQueryInfoKeyW(HKEY, LPWSTR, PDWORD, PDWORD, PDWORD, PDWORD,
+	  PDWORD, PDWORD, PDWORD, PDWORD, PDWORD, PFILETIME);
+	LONG RegQueryMultipleValuesA(HKEY, PVALENTA, DWORD, LPSTR, LPDWORD);
+	LONG RegQueryMultipleValuesW(HKEY, PVALENTW, DWORD, LPWSTR, LPDWORD);
+	LONG RegQueryValueExA(HKEY, LPCSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD);
+	LONG RegQueryValueExW(HKEY, LPCWSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD);
+	LONG RegReplaceKeyA(HKEY, LPCSTR, LPCSTR, LPCSTR);
+	LONG RegReplaceKeyW(HKEY, LPCWSTR, LPCWSTR, LPCWSTR);
+	LONG RegSaveKeyA(HKEY, LPCSTR, LPSECURITY_ATTRIBUTES);
+	LONG RegSaveKeyW(HKEY, LPCWSTR, LPSECURITY_ATTRIBUTES);
+	LONG RegSetKeySecurity(HKEY, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR);
+	LONG RegSetValueExA(HKEY, LPCSTR, DWORD, DWORD, BYTE*, DWORD);
+	LONG RegSetValueExW(HKEY, LPCWSTR, DWORD, DWORD, BYTE*, DWORD);
+	LONG RegUnLoadKeyA(HKEY, LPCSTR);
+	LONG RegUnLoadKeyW(HKEY, LPCWSTR);
+	static if (_WIN32_WINDOWS >= 0x410) {
+		LONG RegNotifyChangeKeyValue(HKEY, BOOL, DWORD, HANDLE, BOOL);
+	}
+
+	static if (_WIN32_WINNT_ONLY) {
+		BOOL AbortSystemShutdownA(LPCSTR);
+		BOOL AbortSystemShutdownW(LPCWSTR);
+		BOOL InitiateSystemShutdownA(LPSTR, LPSTR, DWORD, BOOL, BOOL);
+		BOOL InitiateSystemShutdownW(LPWSTR, LPWSTR, DWORD, BOOL, BOOL);
+		LONG RegGetKeySecurity(HKEY, SECURITY_INFORMATION,
+		  PSECURITY_DESCRIPTOR, PDWORD);
+		LONG RegRestoreKeyA(HKEY, LPCSTR, DWORD);
+		LONG RegRestoreKeyW(HKEY, LPCWSTR, DWORD);
+		LONG RegSetKeySecurity(HKEY, SECURITY_INFORMATION,
+		  PSECURITY_DESCRIPTOR);
+
+		static if (_WIN32_WINNT >= 0x500) {
+			LONG RegDisablePredefinedCache();
+			LONG RegOpenCurrentUser(REGSAM, PHKEY);
+			LONG RegOpenUserClassesRoot(HANDLE, DWORD, REGSAM, PHKEY);
+		}
+
+		static if (_WIN32_WINNT >= 0x501) {
+			LONG RegSaveKeyExA(HKEY, LPCSTR, LPSECURITY_ATTRIBUTES, DWORD);
+			LONG RegSaveKeyExW(HKEY, LPCWSTR, LPSECURITY_ATTRIBUTES, DWORD);
+		}
+
+		static if (_WIN32_WINNT >= 0x600) {
+			LONG RegGetValueA(HKEY hkey, LPCSTR lpSubKey, LPCSTR lpValue,
+			  DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData);
+			LONG RegGetValueW(HKEY hkey, LPCWSTR lpSubKey, LPCWSTR lpValue,
+			  DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData);
+		}
+	}
+
+	deprecated {
+		LONG RegCreateKeyA(HKEY, LPCSTR, PHKEY);
+		LONG RegCreateKeyW(HKEY, LPCWSTR, PHKEY);
+		LONG RegEnumKeyA(HKEY, DWORD, LPSTR, DWORD);
+		LONG RegEnumKeyW(HKEY, DWORD, LPWSTR, DWORD);
+		LONG RegOpenKeyA(HKEY, LPCSTR, PHKEY);
+		LONG RegOpenKeyW(HKEY, LPCWSTR, PHKEY);
+		LONG RegQueryValueA(HKEY, LPCSTR, LPSTR, PLONG);
+		LONG RegQueryValueW(HKEY, LPCWSTR, LPWSTR, PLONG);
+		LONG RegSetValueA(HKEY, LPCSTR, DWORD, LPCSTR, DWORD);
+		LONG RegSetValueW(HKEY, LPCWSTR, DWORD, LPCWSTR, DWORD);
+	}
+}
+
+version (Unicode) {
+	alias VALENTW VALENT;
+	alias RegConnectRegistryW RegConnectRegistry;
+	alias RegCreateKeyExW RegCreateKeyEx;
+	alias RegDeleteKeyW RegDeleteKey;
+	alias RegDeleteValueW RegDeleteValue;
+	alias RegEnumKeyExW RegEnumKeyEx;
+	alias RegEnumValueW RegEnumValue;
+	alias RegLoadKeyW RegLoadKey;
+	alias RegOpenKeyExW RegOpenKeyEx;
+	alias RegQueryInfoKeyW RegQueryInfoKey;
+	alias RegQueryMultipleValuesW RegQueryMultipleValues;
+	alias RegQueryValueExW RegQueryValueEx;
+	alias RegReplaceKeyW RegReplaceKey;
+	alias RegSaveKeyW RegSaveKey;
+	alias RegSetValueExW RegSetValueEx;
+	alias RegUnLoadKeyW RegUnLoadKey;
+
+	static if (_WIN32_WINNT_ONLY) {
+		alias AbortSystemShutdownW AbortSystemShutdown;
+		alias InitiateSystemShutdownW InitiateSystemShutdown;
+		alias RegRestoreKeyW RegRestoreKey;
+		static if (_WIN32_WINNT >= 0x501) {
+			alias RegSaveKeyExA RegSaveKeyEx;
+		}
+		static if (_WIN32_WINNT >= 0x600) {
+			alias RegGetValueW RegGetValue;
+		}
+	}
+	deprecated {
+		alias RegCreateKeyW RegCreateKey;
+		alias RegEnumKeyW RegEnumKey;
+		alias RegOpenKeyW RegOpenKey;
+		alias RegQueryValueW RegQueryValue;
+		alias RegSetValueW RegSetValue;
+	}
+} else {
+	alias VALENTA VALENT;
+	alias RegConnectRegistryA RegConnectRegistry;
+	alias RegCreateKeyExA RegCreateKeyEx;
+	alias RegDeleteKeyA RegDeleteKey;
+	alias RegDeleteValueA RegDeleteValue;
+	alias RegEnumKeyExA RegEnumKeyEx;
+	alias RegEnumValueA RegEnumValue;
+	alias RegLoadKeyA RegLoadKey;
+	alias RegOpenKeyExA RegOpenKeyEx;
+	alias RegQueryInfoKeyA RegQueryInfoKey;
+	alias RegQueryMultipleValuesA RegQueryMultipleValues;
+	alias RegQueryValueExA RegQueryValueEx;
+	alias RegReplaceKeyA RegReplaceKey;
+	alias RegSaveKeyA RegSaveKey;
+	alias RegSetValueExA RegSetValueEx;
+	alias RegUnLoadKeyA RegUnLoadKey;
+	static if (_WIN32_WINNT_ONLY) {
+		alias AbortSystemShutdownA AbortSystemShutdown;
+		alias InitiateSystemShutdownA InitiateSystemShutdown;
+		alias RegRestoreKeyW RegRestoreKey;
+		static if (_WIN32_WINNT >= 0x501) {
+			alias RegSaveKeyExA RegSaveKeyEx;
+		}
+		static if (_WIN32_WINNT >= 0x600) {
+			alias RegGetValueA RegGetValue;
+		}
+	}
+	deprecated {
+		alias RegCreateKeyA RegCreateKey;
+		alias RegEnumKeyA RegEnumKey;
+		alias RegOpenKeyA RegOpenKey;
+		alias RegQueryValueA RegQueryValue;
+		alias RegSetValueA RegSetValue;
+	}
+}
+
+alias VALENT* PVALENT;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/winsock.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,583 @@
+/***********************************************************************\
+*                               winsock.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+\***********************************************************************/
+module win32.winsock;
+
+/*
+  Definitions for winsock 1.1
+
+  Portions Copyright (c) 1980, 1983, 1988, 1993
+  The Regents of the University of California.  All rights reserved.
+
+  Portions Copyright (c) 1993 by Digital Equipment Corporation.
+ */
+
+/*	DRK: This module should not be included if -version=Win32_Winsock2 has
+ *	been set.  If it has, assert.  I think it's better that way than letting
+ *	the user believe that it's worked.
+ *
+ *	SG: It has now been changed so that winsock2 is the default, and
+ *	-version=Win32_Winsock1 must be set to use winsock.
+ */
+version(Win32_Winsock1) {}
+else {
+    pragma(msg, "Cannot use win32.winsock without "
+			~ "Win32_Winsock1 defined.");
+    static assert(false);
+}
+
+import win32.windef;
+
+alias char u_char;
+alias ushort u_short;
+alias uint u_int, u_long, SOCKET;
+
+const size_t FD_SETSIZE = 64;
+
+// shutdown() how types
+enum : int {
+	SD_RECEIVE,
+	SD_SEND,
+	SD_BOTH
+}
+
+struct FD_SET {
+	u_int              fd_count;
+	SOCKET[FD_SETSIZE] fd_array;
+
+	static void opCall(SOCKET fd, FD_SET* set) {
+		if (set.fd_count < FD_SETSIZE) set.fd_array[set.fd_count++] = fd;
+	}
+}
+alias FD_SET* PFD_SET, LPFD_SET;
+
+extern(Pascal) int __WSAFDIsSet(SOCKET, FD_SET*);
+alias __WSAFDIsSet FD_ISSET;
+
+void FD_CLR(SOCKET fd, FD_SET* set) {
+	for (u_int i = 0; i < set.fd_count; i++) {
+		if (set.fd_array[i] == fd) {
+			while (i < set.fd_count - 1) {
+				set.fd_array[i] = set.fd_array[i+1];
+				i++;
+			}
+			set.fd_count--;
+			break;
+		}
+	}
+}
+
+/+void FD_SET(SOCKET fd, FD_SET* set) {
+	if (set.fd_count < FD_SETSIZE) set.fd_array[set.fd_count++] = fd;
+}+/
+
+void FD_ZERO(FD_SET* set) {
+	set.fd_count = 0;
+}
+
+
+struct TIMEVAL {
+	int tv_sec;
+	int tv_usec;
+
+	int opCmp(TIMEVAL tv) {
+		if (tv_sec < tv.tv_sec)   return -1;
+		if (tv_sec > tv.tv_sec)   return  1;
+		if (tv_usec < tv.tv_usec) return -1;
+		if (tv_usec > tv.tv_usec) return  1;
+		return 0;
+	}
+}
+alias TIMEVAL* PTIMEVAL, LPTIMEVAL;
+
+bool timerisset(TIMEVAL tvp) {
+	return tvp.tv_sec || tvp.tv_usec;
+}
+
+void timerclear(inout TIMEVAL tvp) {
+	tvp.tv_sec = tvp.tv_usec = 0;
+}
+
+struct HOSTENT {
+	char*  h_name;
+	char** h_aliases;
+	short  h_addrtype;
+	short  h_length;
+	char** h_addr_list;
+
+	char* h_addr() { return h_addr_list[0]; }
+	char* h_addr(char* h) { return h_addr_list[0] = h; }
+}
+alias HOSTENT* PHOSTENT, LPHOSTENT;
+
+struct LINGER {
+	u_short l_onoff;
+	u_short l_linger;
+}
+alias LINGER* PLINGER, LPLINGER;
+
+// TOTHINKABOUT: do we need these, or are they just for internal use?
+/+
+#define IOCPARM_MASK	0x7f
+#define IOC_VOID	0x20000000
+#define IOC_OUT	0x40000000
+#define IOC_IN	0x80000000
+#define IOC_INOUT	(IOC_IN|IOC_OUT)
+
+#define _IO(x,y)	(IOC_VOID|((x)<<8)|(y))
+#define _IOR(x,y,t)	(IOC_OUT|(((int)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
+#define _IOW(x,y,t)	(IOC_IN|(((int)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
+
+#define FIONBIO	_IOW('f', 126, u_long)
+#define FIONREAD	_IOR('f', 127, u_long)
+#define FIOASYNC	_IOW('f', 125, u_long)
+#define SIOCSHIWAT	_IOW('s',  0, u_long)
+#define SIOCGHIWAT	_IOR('s',  1, u_long)
+#define SIOCSLOWAT	_IOW('s',  2, u_long)
+#define SIOCGLOWAT	_IOR('s',  3, u_long)
+#define SIOCATMARK	_IOR('s',  7, u_long)
++/
+
+enum : DWORD {
+	FIONBIO    = 0x8004667E,
+	FIONREAD   = 0x4004667F,
+	FIOASYNC   = 0x8004667D,
+	SIOCSHIWAT = 0x80047300,
+	SIOCGHIWAT = 0x40047301,
+	SIOCSLOWAT = 0x80047302,
+	SIOCGLOWAT = 0x40047303,
+	SIOCATMARK = 0x40047307
+}
+
+struct netent {
+	char*  n_name;
+	char** n_aliases;
+	short  n_addrtype;
+	u_long n_net;
+}
+
+struct SERVENT {
+	char*  s_name;
+	char** s_aliases;
+	short  s_port;
+	char*  s_proto;
+}
+alias SERVENT* PSERVENT, LPSERVENT;
+
+struct PROTOENT {
+	char*  p_name;
+	char** p_aliases;
+	short  p_proto;
+}
+alias PROTOENT* PPROTOENT, LPPROTOENT;
+
+enum : int {
+	IPPROTO_IP   =   0,
+	IPPROTO_ICMP =   1,
+	IPPROTO_IGMP =   2,
+	IPPROTO_GGP  =   3,
+	IPPROTO_TCP  =   6,
+	IPPROTO_PUP  =  12,
+	IPPROTO_UDP  =  17,
+	IPPROTO_IDP  =  22,
+	IPPROTO_ND   =  77,
+	IPPROTO_RAW  = 255,
+	IPPROTO_MAX  = 256
+}
+
+// These are not documented on the MSDN site
+enum {
+	IPPORT_ECHO        =    7,
+	IPPORT_DISCARD     =    9,
+	IPPORT_SYSTAT      =   11,
+	IPPORT_DAYTIME     =   13,
+	IPPORT_NETSTAT     =   15,
+	IPPORT_FTP         =   21,
+	IPPORT_TELNET      =   23,
+	IPPORT_SMTP        =   25,
+	IPPORT_TIMESERVER  =   37,
+	IPPORT_NAMESERVER  =   42,
+	IPPORT_WHOIS       =   43,
+	IPPORT_MTP         =   57,
+	IPPORT_TFTP        =   69,
+	IPPORT_RJE         =   77,
+	IPPORT_FINGER      =   79,
+	IPPORT_TTYLINK     =   87,
+	IPPORT_SUPDUP      =   95,
+	IPPORT_EXECSERVER  =  512,
+	IPPORT_LOGINSERVER =  513,
+	IPPORT_CMDSERVER   =  514,
+	IPPORT_EFSSERVER   =  520,
+	IPPORT_BIFFUDP     =  512,
+	IPPORT_WHOSERVER   =  513,
+	IPPORT_ROUTESERVER =  520,
+	IPPORT_RESERVED    = 1024
+}
+
+// These are not documented on the MSDN site
+enum {
+	IMPLINK_IP        = 155,
+	IMPLINK_LOWEXPER  = 156,
+	IMPLINK_HIGHEXPER = 158
+}
+
+struct IN_ADDR {
+	union {
+		struct { u_char s_net, s_host, s_lh, s_impno; }
+		struct { u_short s_w1, s_imp; }
+		u_long s_addr;
+	}
+}
+alias IN_ADDR* PIN_ADDR, LPIN_ADDR;
+
+// IN_CLASSx are not used anywhere or documented on MSDN.
+bool IN_CLASSA(int i) {
+	return (i & 0x80000000) == 0;
+}
+
+const IN_CLASSA_NET    = 0xff000000;
+const IN_CLASSA_NSHIFT =  24;
+const IN_CLASSA_HOST   = 0x00ffffff;
+const IN_CLASSA_MAX    = 128;
+
+bool IN_CLASSB(int i) {
+	return (i & 0xC0000000) == 0x80000000;
+}
+
+const IN_CLASSB_NET    = 0xffff0000;
+const IN_CLASSB_NSHIFT = 16;
+const IN_CLASSB_HOST   = 0x0000ffff;
+const IN_CLASSB_MAX    = 65536;
+
+bool IN_CLASSC(int i) {
+	return (i & 0xE0000000) == 0xC0000000;
+}
+
+const IN_CLASSC_NET    = 0xffffff00;
+const IN_CLASSC_NSHIFT = 8;
+const IN_CLASSC_HOST   = 0x000000ff;
+
+const u_long
+	INADDR_ANY       = 0,
+	INADDR_LOOPBACK  = 0x7F000001,
+	INADDR_BROADCAST = 0xFFFFFFFF,
+	INADDR_NONE      = 0xFFFFFFFF;
+
+struct SOCKADDR_IN {
+	short   sin_family;
+	u_short sin_port;
+	IN_ADDR sin_addr;
+	char[8] sin_zero;
+}
+alias SOCKADDR_IN* PSOCKADDR_IN, LPSOCKADDR_IN;
+
+const size_t
+	WSADESCRIPTION_LEN = 256,
+	WSASYS_STATUS_LEN  = 128;
+
+struct WSADATA {
+	WORD   wVersion;
+	WORD   wHighVersion;
+	char[WSADESCRIPTION_LEN+1] szDescription;
+	char[WSASYS_STATUS_LEN+1]  szSystemStatus;
+	ushort iMaxSockets;
+	ushort iMaxUdpDg;
+	char*  lpVendorInfo;
+}
+alias WSADATA* LPWSADATA;
+
+// This is not documented on the MSDN site
+const IP_OPTIONS = 1;
+
+const int
+	SO_DEBUG       =   1,
+	SO_ACCEPTCONN  =   2,
+	SO_REUSEADDR   =   4,
+	SO_KEEPALIVE   =   8,
+	SO_DONTROUTE   =  16,
+	SO_BROADCAST   =  32,
+	SO_USELOOPBACK =  64,
+	SO_LINGER      = 128,
+	SO_OOBINLINE   = 256,
+	SO_DONTLINGER  = ~SO_LINGER;
+
+enum : int {
+	SO_SNDBUF = 0x1001,
+	SO_RCVBUF,
+	SO_SNDLOWAT,
+	SO_RCVLOWAT,
+	SO_SNDTIMEO,
+	SO_RCVTIMEO,
+	SO_ERROR,
+	SO_TYPE // = 0x1008
+}
+
+/*
+ * Note that the next 5 IP defines are specific to WinSock 1.1 (wsock32.dll).
+ * They will cause errors or unexpected results if used with the
+ * (gs)etsockopts exported from the WinSock 2 lib, ws2_32.dll. Refer ws2tcpip.h.
+ */
+enum : int {
+	IP_MULTICAST_IF = 2,
+	IP_MULTICAST_TTL,
+	IP_MULTICAST_LOOP,
+	IP_ADD_MEMBERSHIP,
+	IP_DROP_MEMBERSHIP
+}
+
+// These are not documented on the MSDN site
+const IP_DEFAULT_MULTICAST_TTL  =  1;
+const IP_DEFAULT_MULTICAST_LOOP =  1;
+const IP_MAX_MEMBERSHIPS        = 20;
+
+struct ip_mreq {
+	IN_ADDR imr_multiaddr;
+	IN_ADDR imr_interface;
+}
+
+const SOCKET INVALID_SOCKET = uint.max;
+const int SOCKET_ERROR = -1;
+
+enum : int {
+	SOCK_STREAM = 1,
+	SOCK_DGRAM,
+	SOCK_RAW,
+	SOCK_RDM,
+	SOCK_SEQPACKET
+}
+
+const int TCP_NODELAY = 1;
+
+enum : int {
+	AF_UNSPEC,
+	AF_UNIX,
+	AF_INET,
+	AF_IMPLINK,
+	AF_PUP,
+	AF_CHAOS,
+	AF_IPX,  // =  6
+	AF_NS       =  6,
+	AF_ISO,
+	AF_OSI      = AF_ISO,
+	AF_ECMA,
+	AF_DATAKIT,
+	AF_CCITT,
+	AF_SNA,
+	AF_DECnet,
+	AF_DLI,
+	AF_LAT,
+	AF_HYLINK,
+	AF_APPLETALK,
+	AF_NETBIOS,
+	AF_VOICEVIEW,
+	AF_FIREFOX,
+	AF_UNKNOWN1,
+	AF_BAN,
+	AF_ATM,
+	AF_INET6,
+	AF_MAX  // = 24
+}
+
+struct SOCKADDR {
+	u_short  sa_family;
+	char[14] sa_data;
+}
+alias SOCKADDR* PSOCKADDR, LPSOCKADDR;
+
+struct sockproto {
+	u_short sp_family;
+	u_short sp_protocol;
+}
+
+enum : int {
+	PF_UNSPEC    = AF_UNSPEC,
+	PF_UNIX      = AF_UNIX,
+	PF_INET      = AF_INET,
+	PF_IMPLINK   = AF_IMPLINK,
+	PF_PUP       = AF_PUP,
+	PF_CHAOS     = AF_CHAOS,
+	PF_NS        = AF_NS,
+	PF_IPX       = AF_IPX,
+	PF_ISO       = AF_ISO,
+	PF_OSI       = AF_OSI,
+	PF_ECMA      = AF_ECMA,
+	PF_DATAKIT   = AF_DATAKIT,
+	PF_CCITT     = AF_CCITT,
+	PF_SNA       = AF_SNA,
+	PF_DECnet    = AF_DECnet,
+	PF_DLI       = AF_DLI,
+	PF_LAT       = AF_LAT,
+	PF_HYLINK    = AF_HYLINK,
+	PF_APPLETALK = AF_APPLETALK,
+	PF_VOICEVIEW = AF_VOICEVIEW,
+	PF_FIREFOX   = AF_FIREFOX,
+	PF_UNKNOWN1  = AF_UNKNOWN1,
+	PF_BAN       = AF_BAN,
+	PF_ATM       = AF_ATM,
+	PF_INET6     = AF_INET6,
+	PF_MAX       = AF_MAX
+}
+
+const int SOL_SOCKET = 0xFFFF;
+
+const int SOMAXCONN = 5;
+
+const int
+	MSG_OOB       = 1,
+	MSG_PEEK      = 2,
+	MSG_DONTROUTE = 4,
+	MSG_MAXIOVLEN = 16,
+	MSG_PARTIAL   = 0x8000;
+
+const size_t MAXGETHOSTSTRUCT = 1024;
+
+const int
+	FD_READ    =  1,
+	FD_WRITE   =  2,
+	FD_OOB     =  4,
+	FD_ACCEPT  =  8,
+	FD_CONNECT = 16,
+	FD_CLOSE   = 32;
+
+enum : int {
+	WSABASEERR         = 10000,
+	WSAEINTR           = 10004,
+	WSAEBADF           = 10009,
+	WSAEACCES          = 10013,
+	WSAEFAULT          = 10014,
+	WSAEINVAL          = 10022,
+	WSAEMFILE          = 10024,
+	WSAEWOULDBLOCK     = 10035,
+	WSAEINPROGRESS     = 10036,
+	WSAEALREADY        = 10037,
+	WSAENOTSOCK        = 10038,
+	WSAEDESTADDRREQ    = 10039,
+	WSAEMSGSIZE        = 10040,
+	WSAEPROTOTYPE      = 10041,
+	WSAENOPROTOOPT     = 10042,
+	WSAEPROTONOSUPPORT = 10043,
+	WSAESOCKTNOSUPPORT = 10044,
+	WSAEOPNOTSUPP      = 10045,
+	WSAEPFNOSUPPORT    = 10046,
+	WSAEAFNOSUPPORT    = 10047,
+	WSAEADDRINUSE      = 10048,
+	WSAEADDRNOTAVAIL   = 10049,
+	WSAENETDOWN        = 10050,
+	WSAENETUNREACH     = 10051,
+	WSAENETRESET       = 10052,
+	WSAECONNABORTED    = 10053,
+	WSAECONNRESET      = 10054,
+	WSAENOBUFS         = 10055,
+	WSAEISCONN         = 10056,
+	WSAENOTCONN        = 10057,
+	WSAESHUTDOWN       = 10058,
+	WSAETOOMANYREFS    = 10059,
+	WSAETIMEDOUT       = 10060,
+	WSAECONNREFUSED    = 10061,
+	WSAELOOP           = 10062,
+	WSAENAMETOOLONG    = 10063,
+	WSAEHOSTDOWN       = 10064,
+	WSAEHOSTUNREACH    = 10065,
+	WSAENOTEMPTY       = 10066,
+	WSAEPROCLIM        = 10067,
+	WSAEUSERS          = 10068,
+	WSAEDQUOT          = 10069,
+	WSAESTALE          = 10070,
+	WSAEREMOTE         = 10071,
+	WSAEDISCON         = 10101,
+	WSASYSNOTREADY     = 10091,
+	WSAVERNOTSUPPORTED = 10092,
+	WSANOTINITIALISED  = 10093,
+	WSAHOST_NOT_FOUND  = 11001,
+	WSATRY_AGAIN       = 11002,
+	WSANO_RECOVERY     = 11003,
+	WSANO_DATA         = 11004,
+	WSANO_ADDRESS      = WSANO_DATA
+}
+
+alias WSAGetLastError h_errno;
+
+enum : int {
+	HOST_NOT_FOUND = WSAHOST_NOT_FOUND,
+	TRY_AGAIN      = WSATRY_AGAIN,
+	NO_RECOVERY    = WSANO_RECOVERY,
+	NO_DATA        = WSANO_DATA,
+	NO_ADDRESS     = WSANO_ADDRESS
+}
+
+extern (Pascal) {
+	SOCKET accept(SOCKET, SOCKADDR*, int*);
+	int bind(SOCKET, SOCKADDR*, int);
+	int closesocket(SOCKET);
+	int connect(SOCKET, SOCKADDR*, int);
+	int ioctlsocket(SOCKET, int, u_long*);
+	int getpeername(SOCKET, SOCKADDR*, int*);
+	int getsockname(SOCKET, SOCKADDR*, int*);
+	int getsockopt(SOCKET, int, int, char*, int*);
+	uint inet_addr(char*);
+	int listen(SOCKET, int);
+	int recv(SOCKET, char*, int, int);
+	int recvfrom(SOCKET, char*, int, int, SOCKADDR*, int*);
+	int send(SOCKET, char*, int, int);
+	int sendto(SOCKET, char*, int, int, SOCKADDR*, int);
+	int setsockopt(SOCKET, int, int, char*, int);
+	int shutdown(SOCKET, int);
+	SOCKET socket(int, int, int);
+	int WSAStartup(WORD, LPWSADATA);
+	int WSACleanup();
+	void WSASetLastError(int);
+	int WSAGetLastError();
+	BOOL WSAIsBlocking();
+	int WSAUnhookBlockingHook();
+	FARPROC WSASetBlockingHook(FARPROC);
+	int WSACancelBlockingCall();
+	HANDLE WSAAsyncGetServByName(HWND, u_int, char*, char*, char*, int);
+	HANDLE WSAAsyncGetServByPort(HWND, u_int, int, char*, char*, int);
+	HANDLE WSAAsyncGetProtoByName(HWND, u_int, char*, char*, int);
+	HANDLE WSAAsyncGetProtoByNumber(HWND, u_int, int, char*, int);
+	HANDLE WSAAsyncGetHostByName(HWND, u_int, char*, char*, int);
+	HANDLE WSAAsyncGetHostByAddr(HWND, u_int, char*, int, int, char*, int);
+	int WSACancelAsyncRequest(HANDLE);
+	int WSAAsyncSelect(SOCKET, HWND, u_int, int);
+	u_long htonl(u_long);
+	u_long ntohl(u_long);
+	u_short htons(u_short);
+	u_short ntohs(u_short);
+	int select(int nfds, FD_SET*, FD_SET*, FD_SET*, TIMEVAL*);
+	int gethostname(char*, int);
+}
+
+extern (Windows) {
+	char* inet_ntoa(IN_ADDR);
+	HOSTENT* gethostbyaddr(char*, int, int);
+	HOSTENT* gethostbyname(char*);
+	SERVENT* getservbyport(int, char*);
+	SERVENT* getservbyname(char*, char*);
+	PROTOENT* getprotobynumber(int);
+	PROTOENT* getprotobyname(char*);
+}
+
+alias MAKELONG WSAMAKEASYNCREPLY, WSAMAKESELECTREPLY;
+alias LOWORD WSAGETASYNCBUFLEN, WSAGETSELECTEVENT;
+alias HIWORD WSAGETASYNCERROR, WSAGETSELECTERROR;
+
+
+/*
+ * Recent MSDN docs indicate that the MS-specific extensions exported from
+ * mswsock.dll (AcceptEx, TransmitFile. WSARecEx and GetAcceptExSockaddrs) are
+ * declared in mswsock.h. These extensions are not supported on W9x or WinCE.
+ * However, code using WinSock 1.1 API may expect the declarations and
+ * associated defines to be in this header. Thus we include mswsock.h here.
+ *
+ * When linking against the WinSock 1.1 lib, wsock32.dll, the mswsock functions
+ * are automatically routed to mswsock.dll (on platforms with support).
+ * The WinSock 2 lib, ws2_32.dll, does not contain any references to
+ * the mswsock extensions.
+ */
+
+import win32.mswsock;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/winsock2.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,1464 @@
+/***********************************************************************\
+*                              winsock2.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                             by Daniel Keep                            *
+\***********************************************************************/
+module win32.winsock2;
+pragma(lib, "Ws2_32.lib");
+
+/*
+  Definitions for winsock 2
+
+  Contributed by the WINE project.
+
+  Portions Copyright (c) 1980, 1983, 1988, 1993
+  The Regents of the University of California.  All rights reserved.
+
+  Portions Copyright (c) 1993 by Digital Equipment Corporation.
+ */
+
+/*	DRK: This module should not be included if -version=Win32_Winsock2 has
+ *	not been set.  If it has, assert.  I think it's better this way than
+ *	letting the user believe that it's worked.
+ *
+ *	SG: It has now been changed so that winsock2 is the default, and
+ *	-version=Win32_Winsock1 must be set to use winsock.
+ */
+version(Win32_Winsock1) {
+	pragma(msg, "Cannot use win32.winsock2 with Win32_Winsock1 defined.");
+	static assert(false);
+}
+
+import win32.winbase;
+import win32.windef;
+import win32.basetyps;
+
+alias char u_char;
+alias ushort u_short;
+alias uint u_int, u_long, SOCKET;
+
+const size_t FD_SETSIZE = 64;
+
+/* shutdown() how types */
+enum : int {
+	SD_RECEIVE,
+	SD_SEND,
+	SD_BOTH
+}
+
+/* Good grief this is stupid... is it a struct?  A preprocessor macro?  A
+   struct tag?  Who the hell knows!? */
+struct FD_SET {
+	u_int               fd_count;
+	SOCKET[FD_SETSIZE]  fd_array;
+
+	/* this differs from the define in winsock.h and in cygwin sys/types.h */
+	static void opCall(SOCKET fd, FD_SET set) {
+		u_int i;
+		for (i = 0; i < set.fd_count; i++)
+			if (set.fd_array[i] == fd)
+				break;
+		if (i == set.fd_count)
+			if (set.fd_count < FD_SETSIZE) {
+				set.fd_array[i] = fd;
+				set.fd_count++;
+			}
+	}
+}
+alias FD_SET* PFD_SET, LPFD_SET;
+
+// Keep this alias, since fd_set isn't a tag name in the original header.
+alias FD_SET fd_set;
+
+extern(Windows) int __WSAFDIsSet(SOCKET, FD_SET*);
+alias __WSAFDIsSet FD_ISSET;
+
+void FD_CLR(SOCKET fd, FD_SET* set) {
+	for (u_int i = 0; i < set.fd_count; i++) {
+		if (set.fd_array[i] == fd) {
+			while (i < set.fd_count - 1) {
+				set.fd_array[i] = set.fd_array[i+1];
+				i++;
+			}
+			set.fd_count--;
+			break;
+		}
+	}
+}
+
+void FD_ZERO(FD_SET* set) {
+	set.fd_count = 0;
+}
+
+
+struct TIMEVAL {
+	int tv_sec;
+	int tv_usec;
+
+	int opCmp(TIMEVAL tv) {
+		if (tv_sec < tv.tv_sec)   return -1;
+		if (tv_sec > tv.tv_sec)   return  1;
+		if (tv_usec < tv.tv_usec) return -1;
+		if (tv_usec > tv.tv_usec) return  1;
+		return 0;
+	}
+}
+alias TIMEVAL* PTIMEVAL, LPTIMEVAL;
+
+bool timerisset(TIMEVAL* tvp) {
+	return tvp.tv_sec || tvp.tv_usec;
+}
+
+/+
+/* DRK: These have been commented out because it was felt that using
+ * omCmp on the TIMEVAL struct was cleaner.  Still, perhaps these should
+ * be enabled under a version tag for compatibility's sake?
+ * If it is decided that it's just ugly and unwanted, then feel free to
+ * delete this section :)
+ */
+int timercmp(TIMEVAL* tvp, TIMEVAL* uvp) {
+	return tvp.tv_sec != uvp.tv_sec ?
+	    (tvp.tv_sec < uvp.tv_sec ? -1 :
+            (tvp.tv_sec > uvp.tv_sec ? 1 : 0)) :
+	    (tvp.tv_usec < uvp.tv_usec ? -1 :
+	        (tvp.tv_usec > uvp.tv_usec ? 1 : 0));
+}
+
+int timercmp(TIMEVAL* tvp, TIMEVAL* uvp, int function(long,long) cmp) {
+	return tvp.tv_sec != uvp.tv_sec ?
+	    cmp(tvp.tv_sec, uvp.tv_sec) :
+	    cmp(tvp.tv_usec, uvp.tv_usec);
+}+/
+
+void timerclear(inout TIMEVAL tvp) {
+	tvp.tv_sec = tvp.tv_usec = 0;
+}
+
+struct HOSTENT {
+	char*  h_name;
+	char** h_aliases;
+	short  h_addrtype;
+	short  h_length;
+	char** h_addr_list;
+
+	char* h_addr() { return h_addr_list[0]; }
+	char* h_addr(char* h) { return h_addr_list[0] = h; }
+}
+alias HOSTENT* PHOSTENT, LPHOSTENT;
+
+struct LINGER {
+	u_short l_onoff;
+	u_short l_linger;
+}
+alias LINGER* PLINGER, LPLINGER;
+
+enum : DWORD {
+	IOCPARAM_MASK = 0x7f,
+	IOC_VOID      = 0x20000000,
+	IOC_OUT       = 0x40000000,
+	IOC_IN        = 0x80000000,
+	IOC_INOUT     = IOC_IN|IOC_OUT
+}
+
+// NOTE: This isn't even used anywhere...
+private template _IO(char x, ubyte y) {
+	const DWORD _IO = IOC_VOID | (cast(ubyte)x<<8) | y;
+}
+
+private template _IOR(char x, ubyte y, t) {
+	const DWORD _IOR = IOC_OUT | ((t.sizeof & IOCPARAM_MASK)<<16)
+		| (cast(ubyte)x<<8) | y;
+}
+
+private template _IOW(char x, ubyte y, t) {
+	const DWORD _IOW = IOC_IN | ((t.sizeof & IOCPARAM_MASK)<<16)
+		| (cast(ubyte)x<<8) | y;
+}
+
+enum : DWORD {
+	FIONBIO    = _IOW!('f', 126, u_long),
+	FIONREAD   = _IOR!('f', 127, u_long),
+	FIOASYNC   = _IOW!('f', 125, u_long),
+	SIOCSHIWAT = _IOW!('s',   0, u_long),
+	SIOCGHIWAT = _IOR!('s',   1, u_long),
+	SIOCSLOWAT = _IOW!('s',   2, u_long),
+	SIOCGLOWAT = _IOR!('s',   3, u_long),
+	SIOCATMARK = _IOR!('s',   7, u_long)
+}
+
+struct netent {
+	char*  n_name;
+	char** n_aliases;
+	short  n_addrtype;
+	u_long n_net;
+}
+
+struct SERVENT {
+	char*  s_name;
+	char** s_aliases;
+	short  s_port;
+	char*  s_proto;
+}
+alias SERVENT* PSERVENT, LPSERVENT;
+
+struct PROTOENT {
+	char*  p_name;
+	char** p_aliases;
+	short  p_proto;
+}
+alias PROTOENT* PPROTOENT, LPPROTOENT;
+
+enum : int {
+	IPPROTO_IP   =   0,
+	IPPROTO_ICMP =   1,
+	IPPROTO_IGMP =   2,
+	IPPROTO_GGP  =   3,
+	IPPROTO_TCP  =   6,
+	IPPROTO_PUP  =  12,
+	IPPROTO_UDP  =  17,
+	IPPROTO_IDP  =  22,
+	IPPROTO_ND   =  77,
+	IPPROTO_RAW  = 255,
+	IPPROTO_MAX  = 256,
+
+	// IPv6 options
+	IPPROTO_HOPOPTS  =  0, // IPv6 Hop-by-Hop options
+	IPPROTO_IPV6     = 41, // IPv6 header
+	IPPROTO_ROUTING  = 43, // IPv6 Routing header
+	IPPROTO_FRAGMENT = 44, // IPv6 fragmentation header
+	IPPROTO_ESP      = 50, // encapsulating security payload
+	IPPROTO_AH       = 51, // authentication header
+	IPPROTO_ICMPV6   = 58, // ICMPv6
+	IPPROTO_NONE     = 59, // IPv6 no next header
+	IPPROTO_DSTOPTS  = 60  // IPv6 Destination options
+}
+
+enum {
+	IPPORT_ECHO        =    7,
+	IPPORT_DISCARD     =    9,
+	IPPORT_SYSTAT      =   11,
+	IPPORT_DAYTIME     =   13,
+	IPPORT_NETSTAT     =   15,
+	IPPORT_FTP         =   21,
+	IPPORT_TELNET      =   23,
+	IPPORT_SMTP        =   25,
+	IPPORT_TIMESERVER  =   37,
+	IPPORT_NAMESERVER  =   42,
+	IPPORT_WHOIS       =   43,
+	IPPORT_MTP         =   57,
+	IPPORT_TFTP        =   69,
+	IPPORT_RJE         =   77,
+	IPPORT_FINGER      =   79,
+	IPPORT_TTYLINK     =   87,
+	IPPORT_SUPDUP      =   95,
+	IPPORT_EXECSERVER  =  512,
+	IPPORT_LOGINSERVER =  513,
+	IPPORT_CMDSERVER   =  514,
+	IPPORT_EFSSERVER   =  520,
+	IPPORT_BIFFUDP     =  512,
+	IPPORT_WHOSERVER   =  513,
+	IPPORT_ROUTESERVER =  520,
+	IPPORT_RESERVED    = 1024
+}
+
+enum {
+	IMPLINK_IP         =  155,
+	IMPLINK_LOWEXPER   =  156,
+	IMPLINK_HIGHEXPER  =  158
+}
+
+struct IN_ADDR {
+	union {
+		struct { u_char  s_b1, s_b2, s_b3, s_b4; }
+		struct { u_char  s_net, s_host, s_lh, s_impno; }
+		struct { u_short s_w1, s_w2; }
+		struct { u_short s_w_, s_imp; } // Can I get rid of s_w_ using alignment tricks?
+		u_long S_addr;
+		u_long s_addr;
+	}
+}
+alias IN_ADDR* PIN_ADDR, LPIN_ADDR;
+
+// IN_CLASSx are not used anywhere or documented on MSDN.
+bool IN_CLASSA(int i) { return (i & 0x80000000) == 0; }
+
+const IN_CLASSA_NET    = 0xff000000;
+const IN_CLASSA_NSHIFT =         24;
+const IN_CLASSA_HOST   = 0x00ffffff;
+const IN_CLASSA_MAX    =        128;
+
+bool IN_CLASSB(int i) { return (i & 0xc0000000) == 0x80000000; }
+
+const IN_CLASSB_NET    = 0xffff0000;
+const IN_CLASSB_NSHIFT =         16;
+const IN_CLASSB_HOST   = 0x0000ffff;
+const IN_CLASSB_MAX    =      65536;
+
+bool IN_CLASSC(int i) { return (i & 0xe0000000) == 0xc0000000; }
+
+const IN_CLASSC_NET    = 0xffffff00;
+const IN_CLASSC_NSHIFT =          8;
+const IN_CLASSC_HOST   = 0x000000ff;
+
+const u_long
+	INADDR_ANY       = 0,
+	INADDR_LOOPBACK  = 0x7F000001,
+	INADDR_BROADCAST = 0xFFFFFFFF,
+	INADDR_NONE      = 0xFFFFFFFF;
+
+struct SOCKADDR_IN {
+	short   sin_family;
+	u_short sin_port;
+	IN_ADDR sin_addr;
+	char[8] sin_zero;
+}
+alias SOCKADDR_IN* PSOCKADDR_IN, LPSOCKADDR_IN;
+
+const size_t
+	WSADESCRIPTION_LEN = 256,
+	WSASYS_STATUS_LEN  = 128;
+
+struct WSADATA {
+	WORD   wVersion;
+	WORD   wHighVersion;
+	char[WSADESCRIPTION_LEN+1] szDescription;
+	char[WSASYS_STATUS_LEN+1]  szSystemStatus;
+	ushort iMaxSockets;
+	ushort iMaxUdpDg;
+	char*  lpVendorInfo;
+}
+alias WSADATA* LPWSADATA;
+
+// This is not documented on the MSDN site
+const IP_OPTIONS = 1;
+
+const int
+	SO_OPTIONS     =   1,
+	SO_DEBUG       =   1,
+	SO_ACCEPTCONN  =   2,
+	SO_REUSEADDR   =   4,
+	SO_KEEPALIVE   =   8,
+	SO_DONTROUTE   =  16,
+	SO_BROADCAST   =  32,
+	SO_USELOOPBACK =  64,
+	SO_LINGER      = 128,
+	SO_OOBINLINE   = 256,
+	SO_DONTLINGER  = ~SO_LINGER,
+	SO_EXCLUSIVEADDRUSE= ~SO_REUSEADDR;
+
+enum : int {
+	SO_SNDBUF = 0x1001,
+	SO_RCVBUF,
+	SO_SNDLOWAT,
+	SO_RCVLOWAT,
+	SO_SNDTIMEO,
+	SO_RCVTIMEO,
+	SO_ERROR,
+	SO_TYPE // = 0x1008
+}
+
+const SOCKET INVALID_SOCKET = cast(SOCKET)(~0);
+const int SOCKET_ERROR = -1;
+
+enum : int {
+	SOCK_STREAM = 1,
+	SOCK_DGRAM,
+	SOCK_RAW,
+	SOCK_RDM,
+	SOCK_SEQPACKET
+}
+
+const int TCP_NODELAY = 0x0001;
+
+enum : int {
+	AF_UNSPEC,
+	AF_UNIX,
+	AF_INET,
+	AF_IMPLINK,
+	AF_PUP,
+	AF_CHAOS,
+	AF_IPX,  // =  6
+	AF_NS       =  6,
+	AF_ISO,
+	AF_OSI      = AF_ISO,
+	AF_ECMA,
+	AF_DATAKIT,
+	AF_CCITT,
+	AF_SNA,
+	AF_DECnet,
+	AF_DLI,
+	AF_LAT,
+	AF_HYLINK,
+	AF_APPLETALK,
+	AF_NETBIOS,
+	AF_VOICEVIEW,
+	AF_FIREFOX,
+	AF_UNKNOWN1,
+	AF_BAN,
+	AF_ATM,
+	AF_INET6,
+	// AF_CLUSTER, AF_12844 nad AF_NETDES are not documented on MSDN
+	AF_CLUSTER,
+	AF_12844,
+	AF_IRDA, // = 26
+	AF_NETDES   = 28,
+	AF_MAX   // = 29
+}
+
+struct SOCKADDR {
+	u_short  sa_family;
+	char[14] sa_data;
+}
+alias SOCKADDR* PSOCKADDR, LPSOCKADDR;
+
+/* Portable IPv6/IPv4 version of sockaddr.
+   Uses padding to force 8 byte alignment
+   and maximum size of 128 bytes */
+struct SOCKADDR_STORAGE {
+    short     ss_family;
+    char[6]   __ss_pad1;   // pad to 8
+    long      __ss_align;  // force alignment
+    char[112] __ss_pad2;   // pad to 128
+}
+alias SOCKADDR_STORAGE* PSOCKADDR_STORAGE;
+
+struct sockproto {
+	u_short sp_family;
+	u_short sp_protocol;
+}
+
+enum : int {
+	PF_UNSPEC    = AF_UNSPEC,
+	PF_UNIX      = AF_UNIX,
+	PF_INET      = AF_INET,
+	PF_IMPLINK   = AF_IMPLINK,
+	PF_PUP       = AF_PUP,
+	PF_CHAOS     = AF_CHAOS,
+	PF_NS        = AF_NS,
+	PF_IPX       = AF_IPX,
+	PF_ISO       = AF_ISO,
+	PF_OSI       = AF_OSI,
+	PF_ECMA      = AF_ECMA,
+	PF_DATAKIT   = AF_DATAKIT,
+	PF_CCITT     = AF_CCITT,
+	PF_SNA       = AF_SNA,
+	PF_DECnet    = AF_DECnet,
+	PF_DLI       = AF_DLI,
+	PF_LAT       = AF_LAT,
+	PF_HYLINK    = AF_HYLINK,
+	PF_APPLETALK = AF_APPLETALK,
+	PF_VOICEVIEW = AF_VOICEVIEW,
+	PF_FIREFOX   = AF_FIREFOX,
+	PF_UNKNOWN1  = AF_UNKNOWN1,
+	PF_BAN       = AF_BAN,
+	PF_ATM       = AF_ATM,
+	PF_INET6     = AF_INET6,
+	PF_MAX       = AF_MAX
+}
+
+const int SOL_SOCKET = 0xFFFF;
+
+const int SOMAXCONN = 5;
+
+const int
+	MSG_OOB       = 1,
+	MSG_PEEK      = 2,
+	MSG_DONTROUTE = 4,
+	MSG_MAXIOVLEN = 16,
+	MSG_PARTIAL   = 0x8000;
+
+const size_t MAXGETHOSTSTRUCT = 1024;
+
+// Not documented on MSDN
+enum {
+	FD_READ_BIT,
+	FD_WRITE_BIT,
+	FD_OOB_BIT,
+	FD_ACCEPT_BIT,
+	FD_CONNECT_BIT,
+	FD_CLOSE_BIT,
+	FD_QOS_BIT,
+	FD_GROUP_QOS_BIT,
+	FD_ROUTING_INTERFACE_CHANGE_BIT,
+	FD_ADDRESS_LIST_CHANGE_BIT,
+	FD_MAX_EVENTS // = 10
+}
+
+const int
+	FD_READ                     = 1 << FD_READ_BIT,
+	FD_WRITE                    = 1 << FD_WRITE_BIT,
+	FD_OOB                      = 1 << FD_OOB_BIT,
+	FD_ACCEPT                   = 1 << FD_ACCEPT_BIT,
+	FD_CONNECT                  = 1 << FD_CONNECT_BIT,
+	FD_CLOSE                    = 1 << FD_CLOSE_BIT,
+	FD_QOS                      = 1 << FD_QOS_BIT,
+	FD_GROUP_QOS                = 1 << FD_GROUP_QOS_BIT,
+	FD_ROUTING_INTERFACE_CHANGE = 1 << FD_ROUTING_INTERFACE_CHANGE_BIT,
+	FD_ADDRESS_LIST_CHANGE      = 1 << FD_ADDRESS_LIST_CHANGE_BIT,
+	FD_ALL_EVENTS               = (1 << FD_MAX_EVENTS) - 1;
+
+enum : int {
+	WSABASEERR         = 10000,
+	WSAEINTR           = WSABASEERR + 4,
+	WSAEBADF           = WSABASEERR + 9,
+	WSAEACCES          = WSABASEERR + 13,
+	WSAEFAULT          = WSABASEERR + 14,
+	WSAEINVAL          = WSABASEERR + 22,
+	WSAEMFILE          = WSABASEERR + 24,
+	WSAEWOULDBLOCK     = WSABASEERR + 35,
+	WSAEINPROGRESS     = WSABASEERR + 36, // deprecated on WinSock2
+	WSAEALREADY        = WSABASEERR + 37,
+	WSAENOTSOCK        = WSABASEERR + 38,
+	WSAEDESTADDRREQ    = WSABASEERR + 39,
+	WSAEMSGSIZE        = WSABASEERR + 40,
+	WSAEPROTOTYPE      = WSABASEERR + 41,
+	WSAENOPROTOOPT     = WSABASEERR + 42,
+	WSAEPROTONOSUPPORT = WSABASEERR + 43,
+	WSAESOCKTNOSUPPORT = WSABASEERR + 44,
+	WSAEOPNOTSUPP      = WSABASEERR + 45,
+	WSAEPFNOSUPPORT    = WSABASEERR + 46,
+	WSAEAFNOSUPPORT    = WSABASEERR + 47,
+	WSAEADDRINUSE      = WSABASEERR + 48,
+	WSAEADDRNOTAVAIL   = WSABASEERR + 49,
+	WSAENETDOWN        = WSABASEERR + 50,
+	WSAENETUNREACH     = WSABASEERR + 51,
+	WSAENETRESET       = WSABASEERR + 52,
+	WSAECONNABORTED    = WSABASEERR + 53,
+	WSAECONNRESET      = WSABASEERR + 54,
+	WSAENOBUFS         = WSABASEERR + 55,
+	WSAEISCONN         = WSABASEERR + 56,
+	WSAENOTCONN        = WSABASEERR + 57,
+	WSAESHUTDOWN       = WSABASEERR + 58,
+	WSAETOOMANYREFS    = WSABASEERR + 59,
+	WSAETIMEDOUT       = WSABASEERR + 60,
+	WSAECONNREFUSED    = WSABASEERR + 61,
+	WSAELOOP           = WSABASEERR + 62,
+	WSAENAMETOOLONG    = WSABASEERR + 63,
+	WSAEHOSTDOWN       = WSABASEERR + 64,
+	WSAEHOSTUNREACH    = WSABASEERR + 65,
+	WSAENOTEMPTY       = WSABASEERR + 66,
+	WSAEPROCLIM        = WSABASEERR + 67,
+	WSAEUSERS          = WSABASEERR + 68,
+	WSAEDQUOT          = WSABASEERR + 69,
+	WSAESTALE          = WSABASEERR + 70,
+	WSAEREMOTE         = WSABASEERR + 71,
+	WSAEDISCON         = WSABASEERR + 101,
+	WSASYSNOTREADY     = WSABASEERR + 91,
+	WSAVERNOTSUPPORTED = WSABASEERR + 92,
+	WSANOTINITIALISED  = WSABASEERR + 93,
+	WSAHOST_NOT_FOUND  = WSABASEERR + 1001,
+	WSATRY_AGAIN       = WSABASEERR + 1002,
+	WSANO_RECOVERY     = WSABASEERR + 1003,
+	WSANO_DATA         = WSABASEERR + 1004,
+	WSANO_ADDRESS      = WSANO_DATA,
+
+	// WinSock2 specific error codes
+	WSAENOMORE             = WSABASEERR + 102,
+	WSAECANCELLED          = WSABASEERR + 103,
+	WSAEINVALIDPROCTABLE   = WSABASEERR + 104,
+	WSAEINVALIDPROVIDER    = WSABASEERR + 105,
+	WSAEPROVIDERFAILEDINIT = WSABASEERR + 106,
+	WSASYSCALLFAILURE      = WSABASEERR + 107,
+	WSASERVICE_NOT_FOUND   = WSABASEERR + 108,
+	WSATYPE_NOT_FOUND      = WSABASEERR + 109,
+	WSA_E_NO_MORE          = WSABASEERR + 110,
+	WSA_E_CANCELLED        = WSABASEERR + 111,
+	WSAEREFUSED            = WSABASEERR + 112,
+
+	// WS QualityofService errors
+	WSA_QOS_RECEIVERS          = WSABASEERR + 1005,
+	WSA_QOS_SENDERS            = WSABASEERR + 1006,
+	WSA_QOS_NO_SENDERS         = WSABASEERR + 1007,
+	WSA_QOS_NO_RECEIVERS       = WSABASEERR + 1008,
+	WSA_QOS_REQUEST_CONFIRMED  = WSABASEERR + 1009,
+	WSA_QOS_ADMISSION_FAILURE  = WSABASEERR + 1010,
+	WSA_QOS_POLICY_FAILURE     = WSABASEERR + 1011,
+	WSA_QOS_BAD_STYLE          = WSABASEERR + 1012,
+	WSA_QOS_BAD_OBJECT         = WSABASEERR + 1013,
+	WSA_QOS_TRAFFIC_CTRL_ERROR = WSABASEERR + 1014,
+	WSA_QOS_GENERIC_ERROR      = WSABASEERR + 1015,
+	WSA_QOS_ESERVICETYPE       = WSABASEERR + 1016,
+	WSA_QOS_EFLOWSPEC          = WSABASEERR + 1017,
+	WSA_QOS_EPROVSPECBUF       = WSABASEERR + 1018,
+	WSA_QOS_EFILTERSTYLE       = WSABASEERR + 1019,
+	WSA_QOS_EFILTERTYPE        = WSABASEERR + 1020,
+	WSA_QOS_EFILTERCOUNT       = WSABASEERR + 1021,
+	WSA_QOS_EOBJLENGTH         = WSABASEERR + 1022,
+	WSA_QOS_EFLOWCOUNT         = WSABASEERR + 1023,
+	WSA_QOS_EUNKOWNPSOBJ       = WSABASEERR + 1024,
+	WSA_QOS_EPOLICYOBJ         = WSABASEERR + 1025,
+	WSA_QOS_EFLOWDESC          = WSABASEERR + 1026,
+	WSA_QOS_EPSFLOWSPEC        = WSABASEERR + 1027,
+	WSA_QOS_EPSFILTERSPEC      = WSABASEERR + 1028,
+	WSA_QOS_ESDMODEOBJ         = WSABASEERR + 1029,
+	WSA_QOS_ESHAPERATEOBJ      = WSABASEERR + 1030,
+	WSA_QOS_RESERVED_PETYPE    = WSABASEERR + 1031
+}
+
+alias WSAGetLastError h_errno;
+
+enum : int {
+	HOST_NOT_FOUND = WSAHOST_NOT_FOUND,
+	TRY_AGAIN      = WSATRY_AGAIN,
+	NO_RECOVERY    = WSANO_RECOVERY,
+	NO_DATA        = WSANO_DATA,
+	NO_ADDRESS     = WSANO_ADDRESS
+}
+
+extern (Windows) {
+	SOCKET accept(SOCKET, SOCKADDR*, int*);
+	int bind(SOCKET, SOCKADDR*, int);
+	int closesocket(SOCKET);
+	int connect(SOCKET, SOCKADDR*, int);
+	int ioctlsocket(SOCKET, int, u_long*);
+	int getpeername(SOCKET, SOCKADDR*, int*);
+	int getsockname(SOCKET, SOCKADDR*, int*);
+	int getsockopt(SOCKET, int, int, void*, int*);
+	uint inet_addr(char*);
+	int listen(SOCKET, int);
+	int recv(SOCKET, ubyte*, int, int);
+	int recvfrom(SOCKET, ubyte*, int, int, SOCKADDR*, int*);
+	int send(SOCKET, ubyte*, int, int);
+	int sendto(SOCKET, ubyte*, int, int, SOCKADDR*, int);
+	int setsockopt(SOCKET, int, int, void*, int);
+	int shutdown(SOCKET, int);
+	SOCKET socket(int, int, int);
+
+	alias typeof(&accept) LPFN_ACCEPT;
+	alias typeof(&bind) LPFN_BIND;
+	alias typeof(&closesocket) LPFN_CLOSESOCKET;
+	alias typeof(&connect) LPFN_CONNECT;
+	alias typeof(&ioctlsocket) LPFN_IOCTLSOCKET;
+	alias typeof(&getpeername) LPFN_GETPEERNAME;
+	alias typeof(&getsockname) LPFN_GETSOCKNAME;
+	alias typeof(&getsockopt) LPFN_GETSOCKOPT;
+	alias typeof(&inet_addr) LPFN_INET_ADDR;
+	alias typeof(&listen) LPFN_LISTEN;
+	alias typeof(&recv) LPFN_RECV;
+	alias typeof(&recvfrom) LPFN_RECVFROM;
+	alias typeof(&send) LPFN_SEND;
+	alias typeof(&sendto) LPFN_SENDTO;
+	alias typeof(&setsockopt) LPFN_SETSOCKOPT;
+	alias typeof(&shutdown) LPFN_SHUTDOWN;
+	alias typeof(&socket) LPFN_SOCKET;
+}
+
+extern(Windows) {
+	char* inet_ntoa(IN_ADDR);
+	HOSTENT* gethostbyaddr(char*, int, int);
+	HOSTENT* gethostbyname(char*);
+	SERVENT* getservbyport(int, char*);
+	SERVENT* getservbyname(char*, char*);
+	PROTOENT* getprotobynumber(int);
+	PROTOENT* getprotobyname(char*);
+
+	/* NOTE: DK: in the original headers, these were declared with
+	   PASCAL linkage.  Since this is at odds with the definition
+	   of the functions themselves, and also since MinGW seems to
+	   treat the two interchangably, I have moved them here. */
+	alias typeof(&inet_ntoa) LPFN_INET_NTOA;
+	alias typeof(&gethostbyaddr) LPFN_GETHOSTBYADDR;
+	alias typeof(&gethostbyname) LPFN_GETHOSTBYNAME;
+	alias typeof(&getservbyport) LPFN_GETSERVBYPORT;
+	alias typeof(&getservbyname) LPFN_GETSERVBYNAME;
+	alias typeof(&getprotobynumber) LPFN_GETPROTOBYNUMBER;
+	alias typeof(&getprotobyname) LPFN_GETPROTOBYNAME;
+}
+
+extern(Windows) {
+	int WSAStartup(WORD, LPWSADATA);
+	int WSACleanup();
+	void WSASetLastError(int);
+	int WSAGetLastError();
+
+	alias typeof(&WSAStartup) LPFN_WSASTARTUP;
+	alias typeof(&WSACleanup) LPFN_WSACLEANUP;
+	alias typeof(&WSASetLastError) LPFN_WSASETLASTERROR;
+	alias typeof(&WSAGetLastError) LPFN_WSAGETLASTERROR;
+}
+
+/*
+ * Pseudo-blocking functions are deprecated in WinSock2
+ * spec. Use threads instead.
+ */
+deprecated extern(Windows) {
+	BOOL WSAIsBlocking();
+	int WSAUnhookBlockingHook();
+	FARPROC WSASetBlockingHook(FARPROC);
+	int WSACancelBlockingCall();
+
+	alias typeof(&WSAIsBlocking) LPFN_WSAISBLOCKING;
+	alias typeof(&WSAUnhookBlockingHook) LPFN_WSAUNHOOKBLOCKINGHOOK;
+	alias typeof(&WSASetBlockingHook) LPFN_WSASETBLOCKINGHOOK;
+	alias typeof(&WSACancelBlockingCall) LPFN_WSACANCELBLOCKINGCALL;
+}
+
+extern(Windows) {
+	HANDLE WSAAsyncGetServByName(HWND, u_int, char*, char*, char*, int);
+	HANDLE WSAAsyncGetServByPort(HWND, u_int, int, char*, char*, int);
+	HANDLE WSAAsyncGetProtoByName(HWND, u_int, char*, char*, int);
+	HANDLE WSAAsyncGetProtoByNumber(HWND, u_int, int, char*, int);
+	HANDLE WSAAsyncGetHostByName(HWND, u_int, char*, char*, int);
+	HANDLE WSAAsyncGetHostByAddr(HWND, u_int, char*, int, int, char*, int);
+	int WSACancelAsyncRequest(HANDLE);
+	int WSAAsyncSelect(SOCKET, HWND, u_int, long);
+
+	alias typeof(&WSAAsyncGetServByName) LPFN_WSAAsyncGetServByName;
+	alias typeof(&WSAAsyncGetServByPort) LPFN_WSAASYNCGETSERVBYPORT;
+	alias typeof(&WSAAsyncGetProtoByName) LPFN_WSAASYNCGETPROTOBYNAME;
+	alias typeof(&WSAAsyncGetProtoByNumber) LPFN_WSAASYNCGETPROTOBYNUMBER;
+	alias typeof(&WSAAsyncGetHostByName) LPFN_WSAASYNCGETHOSTBYNAME;
+	alias typeof(&WSAAsyncGetHostByAddr) LPFN_WSAASYNCGETHOSTBYADDR;
+	alias typeof(&WSACancelAsyncRequest) LPFN_WSACANCELASYNCREQUEST;
+	alias typeof(&WSAAsyncSelect) LPFN_WSAASYNCSELECT;
+}
+
+extern(Windows) {
+	u_long htonl(u_long);
+	u_long ntohl(u_long);
+	u_short htons(u_short);
+	u_short ntohs(u_short);
+	int select(int nfds, fd_set*, fd_set*, fd_set*, TIMEVAL*);
+
+	alias typeof(&htonl) LPFN_HTONL;
+	alias typeof(&ntohl) LPFN_NTOHL;
+	alias typeof(&htons) LPFN_HTONS;
+	alias typeof(&ntohs) LPFN_NTOHS;
+	alias typeof(&select) LPFN_SELECT;
+
+	int gethostname(char*, int);
+	alias typeof(&gethostname) LPFN_GETHOSTNAME;
+}
+
+alias MAKELONG WSAMAKEASYNCREPLY, WSAMAKESELECTREPLY;
+alias LOWORD WSAGETASYNCBUFLEN, WSAGETSELECTEVENT;
+alias HIWORD WSAGETASYNCERROR, WSAGETSELECTERROR;
+
+
+alias INADDR_ANY ADDR_ANY;
+
+bool IN_CLASSD(int i) { return (i & 0xf0000000) == 0xe0000000; }
+
+const IN_CLASSD_NET    = 0xf0000000;
+const IN_CLASSD_NSHIFT =         28;
+const IN_CLASSD_HOST   = 0x0fffffff;
+
+alias IN_CLASSD IN_MULTICAST;
+
+const FROM_PROTOCOL_INFO = -1;
+
+enum : int {
+	SO_GROUP_ID = 0x2001,
+	SO_GROUP_PRIORITY,
+	SO_MAX_MSG_SIZE,
+	SO_PROTOCOL_INFOA,
+	SO_PROTOCOL_INFOW
+}
+// NOTE: These are logically part of the previous enum, but you can't
+// have version statements in an enum body...
+version(Unicode)
+	const int SO_PROTOCOL_INFO = SO_PROTOCOL_INFOW;
+else
+	const int SO_PROTOCOL_INFO = SO_PROTOCOL_INFOA;
+
+const PVD_CONFIG = 0x3001;
+
+const MSG_INTERRUPT = 0x10;
+//const MSG_MAXIOVLEN = 16; // Already declared above
+
+alias HANDLE WSAEVENT;
+alias LPHANDLE LPWSAEVENT;
+alias OVERLAPPED WSAOVERLAPPED;
+alias OVERLAPPED* LPWSAOVERLAPPED;
+
+private import win32.winerror;
+private import win32.winbase;
+
+enum {
+	WSA_IO_PENDING        = ERROR_IO_PENDING,
+	WSA_IO_INCOMPLETE     = ERROR_IO_INCOMPLETE,
+	WSA_INVALID_HANDLE    = ERROR_INVALID_HANDLE,
+	WSA_INVALID_PARAMETER = ERROR_INVALID_PARAMETER,
+	WSA_NOT_ENOUGH_MEMORY = ERROR_NOT_ENOUGH_MEMORY,
+	WSA_OPERATION_ABORTED = ERROR_OPERATION_ABORTED
+}
+
+const WSA_INVALID_EVENT = cast(WSAEVENT)null;
+const WSA_MAXIMUM_WAIT_EVENTS = MAXIMUM_WAIT_OBJECTS;
+const WSA_WAIT_FAILED = cast(DWORD)-1;
+const WSA_WAIT_EVENT_0 = WAIT_OBJECT_0;
+const WSA_WAIT_IO_COMPLETION = WAIT_IO_COMPLETION;
+const WSA_WAIT_TIMEOUT = WAIT_TIMEOUT;
+const WSA_INFINITE = INFINITE;
+
+struct WSABUF {
+	uint  len;
+	char* buf;
+}
+
+alias WSABUF* LPWSABUF;
+
+enum GUARANTEE {
+	BestEffortService,
+	ControlledLoadService,
+	PredictiveService,
+	GuaranteedDelayService,
+	GuaranteedService
+}
+
+/* TODO: FLOWSPEC and related definitions belong in qos.h */
+
+/*
+   Windows Sockets 2 Application Programming Interface,
+   revision 2.2.2 (1997) uses the type uint32 for SERVICETYPE
+   and the elements of _flowspec, but the type uint32 is not defined
+   or used anywhere else in the w32api. For now, just use
+   unsigned int, which is 32 bits on _WIN32 and _WIN64.
+*/
+
+alias uint SERVICETYPE;
+
+struct FLOWSPEC {
+	uint        TokenRate;
+	uint        TokenBucketSize;
+	uint        PeakBandwidth;
+	uint        Latency;
+	uint        DelayVariation;
+	SERVICETYPE ServiceType;
+	uint        MaxSduSize;
+	uint        MinimumPolicedSize;
+}
+
+alias FLOWSPEC* PFLOWSPEC, LPFLOWSPEC;
+
+struct QOS
+{
+	FLOWSPEC SendingFlowspec;
+	FLOWSPEC ReceivingFlowspec;
+	WSABUF   ProviderSpecific;
+}
+
+alias QOS* LPQOS;
+
+enum {
+	CF_ACCEPT,
+	CF_REJECT,
+	CF_DEFER
+}
+
+// REM: Already defined above
+/*enum {
+	SD_RECEIVE,
+	SD_SEND,
+	SD_BOTH
+}*/
+
+alias uint GROUP;
+
+enum {
+	SG_UNCONSTRAINED_GROUP = 0x01,
+	SG_CONSTRAINED_GROUP
+}
+
+struct WSANETWORKEVENTS {
+	int lNetworkEvents;
+	int[FD_MAX_EVENTS] iErrorCode;
+}
+
+alias WSANETWORKEVENTS* LPWSANETWORKEVENTS;
+
+const MAX_PROTOCOL_CHAIN = 7;
+
+const BASE_PROTOCOL    = 1;
+const LAYERED_PROTOCOL = 0;
+
+enum WSAESETSERVICEOP
+{
+	RNRSERVICE_REGISTER = 0,
+	RNRSERVICE_DEREGISTER,
+	RNRSERVICE_DELETE
+}
+
+alias WSAESETSERVICEOP* PWSAESETSERVICEOP, LPWSAESETSERVICEOP;
+
+struct AFPROTOCOLS {
+	INT iAddressFamily;
+	INT iProtocol;
+}
+
+alias AFPROTOCOLS* PAFPROTOCOLS, LPAFPROTOCOLS;
+
+enum WSAECOMPARATOR
+{
+	COMP_EQUAL = 0,
+	COMP_NOTLESS
+}
+
+alias WSAECOMPARATOR* PWSAECOMPARATOR, LPWSAECOMPARATOR;
+
+struct WSAVERSION
+{
+	DWORD          dwVersion;
+	WSAECOMPARATOR ecHow;
+}
+
+alias WSAVERSION* PWSAVERSION, LPWSAVERSION;
+
+// Import for SOCKET_ADDRESS, CSADDR_INFO
+// import win32.nspapi;
+//#ifndef __CSADDR_T_DEFINED /* also in nspapi.h */
+//#define __CSADDR_T_DEFINED
+
+struct SOCKET_ADDRESS {
+	LPSOCKADDR lpSockaddr;
+	INT        iSockaddrLength;
+}
+
+alias SOCKET_ADDRESS* PSOCKET_ADDRESS, LPSOCKET_ADDRESS;
+
+struct CSADDR_INFO {
+	SOCKET_ADDRESS LocalAddr;
+	SOCKET_ADDRESS RemoteAddr;
+	INT            iSocketType;
+	INT            iProtocol;
+}
+
+alias CSADDR_INFO* PCSADDR_INFO, LPCSADDR_INFO;
+
+//#endif
+
+struct SOCKET_ADDRESS_LIST {
+    INT               iAddressCount;
+    SOCKET_ADDRESS[1] _Address;
+    SOCKET_ADDRESS* Address() { return _Address.ptr; }
+}
+
+alias SOCKET_ADDRESS_LIST* LPSOCKET_ADDRESS_LIST;
+
+// TODO: Import wtypes/nspapi?
+//#ifndef __BLOB_T_DEFINED /* also in wtypes.h and nspapi.h */
+//#define __BLOB_T_DEFINED
+struct BLOB {
+	ULONG cbSize;
+	BYTE* pBlobData;
+}
+
+alias BLOB* PBLOB, LPBLOB;
+//#endif
+
+struct WSAQUERYSETA
+{
+	DWORD         dwSize;
+	LPSTR         lpszServiceInstanceName;
+	LPGUID        lpServiceClassId;
+	LPWSAVERSION  lpVersion;
+	LPSTR         lpszComment;
+	DWORD         dwNameSpace;
+	LPGUID        lpNSProviderId;
+	LPSTR         lpszContext;
+	DWORD         dwNumberOfProtocols;
+	LPAFPROTOCOLS lpafpProtocols;
+	LPSTR         lpszQueryString;
+	DWORD         dwNumberOfCsAddrs;
+	LPCSADDR_INFO lpcsaBuffer;
+	DWORD         dwOutputFlags;
+	LPBLOB        lpBlob;
+}
+
+alias WSAQUERYSETA* PWSAQUERYSETA, LPWSAQUERYSETA;
+
+struct WSAQUERYSETW
+{
+	DWORD         dwSize;
+	LPWSTR        lpszServiceInstanceName;
+	LPGUID        lpServiceClassId;
+	LPWSAVERSION  lpVersion;
+	LPWSTR        lpszComment;
+	DWORD         dwNameSpace;
+	LPGUID        lpNSProviderId;
+	LPWSTR        lpszContext;
+	DWORD         dwNumberOfProtocols;
+	LPAFPROTOCOLS lpafpProtocols;
+	LPWSTR        lpszQueryString;
+	DWORD         dwNumberOfCsAddrs;
+	LPCSADDR_INFO lpcsaBuffer;
+	DWORD         dwOutputFlags;
+	LPBLOB        lpBlob;
+}
+
+
+alias WSAQUERYSETW* PWSAQUERYSETW, LPWSAQUERYSETW;
+
+version(Unicode) {
+	alias WSAQUERYSETW WSAQUERYSET;
+	alias PWSAQUERYSETW PWSAQUERYSET;
+	alias LPWSAQUERYSETW LPWSAQUERYSET;
+} else {
+	alias WSAQUERYSETA WSAQUERYSET;
+	alias PWSAQUERYSETA PWSAQUERYSET;
+	alias LPWSAQUERYSETA LPWSAQUERYSET;
+}
+
+const int
+	LUP_DEEP                = 0x0001,
+	LUP_CONTAINERS          = 0x0002,
+	LUP_NOCONTAINERS        = 0x0004,
+	LUP_NEAREST             = 0x0008,
+	LUP_RETURN_NAME         = 0x0010,
+	LUP_RETURN_TYPE         = 0x0020,
+	LUP_RETURN_VERSION      = 0x0040,
+	LUP_RETURN_COMMENT      = 0x0080,
+	LUP_RETURN_ADDR         = 0x0100,
+	LUP_RETURN_BLOB         = 0x0200,
+	LUP_RETURN_ALIASES      = 0x0400,
+	LUP_RETURN_QUERY_STRING = 0x0800,
+	LUP_RETURN_ALL          = 0x0FF0,
+	LUP_RES_SERVICE         = 0x8000,
+	LUP_FLUSHCACHE          = 0x1000,
+	LUP_FLUSHPREVIOUS       = 0x2000;
+
+struct WSANSCLASSINFOA
+{
+	LPSTR  lpszName;
+	DWORD  dwNameSpace;
+	DWORD  dwValueType;
+	DWORD  dwValueSize;
+	LPVOID lpValue;
+}
+
+alias WSANSCLASSINFOA* PWSANSCLASSINFOA, LPWSANSCLASSINFOA;
+
+struct WSANSCLASSINFOW
+{
+	LPWSTR lpszName;
+	DWORD  dwNameSpace;
+	DWORD  dwValueType;
+	DWORD  dwValueSize;
+	LPVOID lpValue;
+}
+
+alias WSANSCLASSINFOW* PWSANSCLASSINFOW, LPWSANSCLASSINFOW;
+
+version(Unicode) {
+	alias WSANSCLASSINFOW WSANSCLASSINFO;
+	alias PWSANSCLASSINFOW PWSANSCLASSINFO;
+	alias LPWSANSCLASSINFOW LPWSANSCLASSINFO;
+} else {
+	alias WSANSCLASSINFOA WSANSCLASSINFO;
+	alias PWSANSCLASSINFOA PWSANSCLASSINFO;
+	alias LPWSANSCLASSINFOA LPWSANSCLASSINFO;
+}
+
+struct WSASERVICECLASSINFOA
+{
+	LPGUID            lpServiceClassId;
+	LPSTR             lpszServiceClassName;
+	DWORD             dwCount;
+	LPWSANSCLASSINFOA lpClassInfos;
+}
+
+alias WSASERVICECLASSINFOA* PWSASERVICECLASSINFOA, LPWSASERVICECLASSINFOA;
+
+struct WSASERVICECLASSINFOW
+{
+	LPGUID            lpServiceClassId;
+	LPWSTR            lpszServiceClassName;
+	DWORD             dwCount;
+	LPWSANSCLASSINFOW lpClassInfos;
+}
+
+alias WSASERVICECLASSINFOW* PWSASERVICECLASSINFOW, LPWSASERVICECLASSINFOW;
+
+version(Unicode) {
+	alias WSASERVICECLASSINFOW WSASERVICECLASSINFO;
+	alias PWSASERVICECLASSINFOW PWSASERVICECLASSINFO;
+	alias LPWSASERVICECLASSINFOW LPWSASERVICECLASSINFO;
+} else {
+	alias WSASERVICECLASSINFOA WSASERVICECLASSINFO;
+	alias PWSASERVICECLASSINFOA PWSASERVICECLASSINFO;
+	alias LPWSASERVICECLASSINFOA LPWSASERVICECLASSINFO;
+}
+
+struct WSANAMESPACE_INFOA {
+	GUID  NSProviderId;
+	DWORD dwNameSpace;
+	BOOL  fActive;
+	DWORD dwVersion;
+	LPSTR lpszIdentifier;
+}
+
+alias WSANAMESPACE_INFOA* PWSANAMESPACE_INFOA, LPWSANAMESPACE_INFOA;
+
+struct WSANAMESPACE_INFOW {
+	GUID   NSProviderId;
+	DWORD  dwNameSpace;
+	BOOL   fActive;
+	DWORD  dwVersion;
+	LPWSTR lpszIdentifier;
+}
+
+alias WSANAMESPACE_INFOW* PWSANAMESPACE_INFOW, LPWSANAMESPACE_INFOW;
+
+version(Unicode) {
+	alias WSANAMESPACE_INFOW WSANAMESPACE_INFO;
+	alias PWSANAMESPACE_INFOW PWSANAMESPACE_INFO;
+	alias LPWSANAMESPACE_INFOW LPWSANAMESPACE_INFO;
+} else {
+	alias WSANAMESPACE_INFOA WSANAMESPACE_INFO;
+	alias PWSANAMESPACE_INFOA PWSANAMESPACE_INFO;
+	alias LPWSANAMESPACE_INFOA LPWSANAMESPACE_INFO;
+}
+
+struct WSAPROTOCOLCHAIN {
+	int                       ChainLen;
+	DWORD[MAX_PROTOCOL_CHAIN] ChainEntries;
+}
+
+alias WSAPROTOCOLCHAIN* LPWSAPROTOCOLCHAIN;
+
+const WSAPROTOCOL_LEN = 255;
+
+struct WSAPROTOCOL_INFOA {
+	DWORD dwServiceFlags1;
+	DWORD dwServiceFlags2;
+	DWORD dwServiceFlags3;
+	DWORD dwServiceFlags4;
+	DWORD dwProviderFlags;
+	GUID ProviderId;
+	DWORD dwCatalogEntryId;
+	WSAPROTOCOLCHAIN ProtocolChain;
+	int iVersion;
+	int iAddressFamily;
+	int iMaxSockAddr;
+	int iMinSockAddr;
+	int iSocketType;
+	int iProtocol;
+	int iProtocolMaxOffset;
+	int iNetworkByteOrder;
+	int iSecurityScheme;
+	DWORD dwMessageSize;
+	DWORD dwProviderReserved;
+	CHAR[WSAPROTOCOL_LEN+1] szProtocol;
+}
+
+alias WSAPROTOCOL_INFOA* LPWSAPROTOCOL_INFOA;
+
+struct WSAPROTOCOL_INFOW {
+	DWORD dwServiceFlags1;
+	DWORD dwServiceFlags2;
+	DWORD dwServiceFlags3;
+	DWORD dwServiceFlags4;
+	DWORD dwProviderFlags;
+	GUID ProviderId;
+	DWORD dwCatalogEntryId;
+	WSAPROTOCOLCHAIN ProtocolChain;
+	int iVersion;
+	int iAddressFamily;
+	int iMaxSockAddr;
+	int iMinSockAddr;
+	int iSocketType;
+	int iProtocol;
+	int iProtocolMaxOffset;
+	int iNetworkByteOrder;
+	int iSecurityScheme;
+	DWORD dwMessageSize;
+	DWORD dwProviderReserved;
+	WCHAR[WSAPROTOCOL_LEN+1] szProtocol;
+}
+
+alias WSAPROTOCOL_INFOW* LPWSAPROTOCOL_INFOW;
+
+// TODO: Below fptr was defined as "CALLBACK" for linkage; is this right?
+extern(C) {
+	alias int function(LPWSABUF, LPWSABUF, LPQOS, LPQOS, LPWSABUF, LPWSABUF, GROUP *, DWORD) LPCONDITIONPROC;
+}
+
+extern(Windows) {
+	alias void function(DWORD, DWORD, LPWSAOVERLAPPED, DWORD) LPWSAOVERLAPPED_COMPLETION_ROUTINE;
+}
+
+version(Unicode) {
+	alias WSAPROTOCOL_INFOW WSAPROTOCOL_INFO;
+	alias LPWSAPROTOCOL_INFOW LPWSAPROTOCOL_INFO;
+} else {
+	alias WSAPROTOCOL_INFOA WSAPROTOCOL_INFO;
+	alias LPWSAPROTOCOL_INFOA LPWSAPROTOCOL_INFO;
+}
+
+/* Needed for XP & .NET Server function WSANSPIoctl.  */
+enum WSACOMPLETIONTYPE {
+    NSP_NOTIFY_IMMEDIATELY = 0,
+    NSP_NOTIFY_HWND,
+    NSP_NOTIFY_EVENT,
+    NSP_NOTIFY_PORT,
+    NSP_NOTIFY_APC
+}
+
+alias WSACOMPLETIONTYPE* PWSACOMPLETIONTYPE, LPWSACOMPLETIONTYPE;
+
+struct WSACOMPLETION {
+    WSACOMPLETIONTYPE Type;
+    union WSACOMPLETION_PARAMETERS {
+        struct WSACOMPLETION_WINDOWMESSAGE {
+            HWND hWnd;
+            UINT uMsg;
+            WPARAM context;
+        }
+		WSACOMPLETION_WINDOWMESSAGE WindowMessage;
+        struct WSACOMPLETION_EVENT {
+            LPWSAOVERLAPPED lpOverlapped;
+        }
+		WSACOMPLETION_EVENT Event;
+        struct WSACOMPLETION_APC {
+            LPWSAOVERLAPPED lpOverlapped;
+            LPWSAOVERLAPPED_COMPLETION_ROUTINE lpfnCompletionProc;
+        }
+		WSACOMPLETION_APC Apc;
+        struct WSACOMPLETION_PORT {
+            LPWSAOVERLAPPED lpOverlapped;
+            HANDLE hPort;
+            ULONG_PTR Key;
+        }
+		WSACOMPLETION_PORT Port;
+    }
+	WSACOMPLETION_PARAMETERS Parameters;
+}
+
+alias WSACOMPLETION* PWSACOMPLETION, LPWSACOMPLETION;
+
+const int
+	PFL_MULTIPLE_PROTO_ENTRIES  = 0x00000001,
+	PFL_RECOMMENDED_PROTO_ENTRY = 0x00000002,
+	PFL_HIDDEN                  = 0x00000004,
+	PFL_MATCHES_PROTOCOL_ZERO   = 0x00000008;
+
+const int
+	XP1_CONNECTIONLESS           = 0x00000001,
+	XP1_GUARANTEED_DELIVERY      = 0x00000002,
+	XP1_GUARANTEED_ORDER         = 0x00000004,
+	XP1_MESSAGE_ORIENTED         = 0x00000008,
+	XP1_PSEUDO_STREAM            = 0x00000010,
+	XP1_GRACEFUL_CLOSE           = 0x00000020,
+	XP1_EXPEDITED_DATA           = 0x00000040,
+	XP1_CONNECT_DATA             = 0x00000080,
+	XP1_DISCONNECT_DATA          = 0x00000100,
+	XP1_SUPPORT_BROADCAST        = 0x00000200,
+	XP1_SUPPORT_MULTIPOINT       = 0x00000400,
+	XP1_MULTIPOINT_CONTROL_PLANE = 0x00000800,
+	XP1_MULTIPOINT_DATA_PLANE    = 0x00001000,
+	XP1_QOS_SUPPORTED            = 0x00002000,
+	XP1_INTERRUPT                = 0x00004000,
+	XP1_UNI_SEND                 = 0x00008000,
+	XP1_UNI_RECV                 = 0x00010000,
+	XP1_IFS_HANDLES              = 0x00020000,
+	XP1_PARTIAL_MESSAGE          = 0x00040000;
+
+enum : int {
+	BIGENDIAN    = 0x0000,
+	LITTLEENDIAN = 0x0001
+}
+
+const SECURITY_PROTOCOL_NONE = 0x0000;
+
+const JL_SENDER_ONLY = 0x01;
+const JL_RECEIVER_ONLY = 0x02;
+const JL_BOTH = 0x04;
+
+const WSA_FLAG_OVERLAPPED = 0x01;
+const WSA_FLAG_MULTIPOINT_C_ROOT = 0x02;
+const WSA_FLAG_MULTIPOINT_C_LEAF = 0x04;
+const WSA_FLAG_MULTIPOINT_D_ROOT = 0x08;
+const WSA_FLAG_MULTIPOINT_D_LEAF = 0x10;
+
+const int IOC_UNIX = 0x00000000;
+const int IOC_WS2 = 0x08000000;
+const int IOC_PROTOCOL = 0x10000000;
+const int IOC_VENDOR = 0x18000000;
+
+template _WSAIO(int x, int y) { const int _WSAIO = IOC_VOID | x | y; }
+template _WSAIOR(int x, int y) { const int _WSAIOR = IOC_OUT | x | y; }
+template _WSAIOW(int x, int y) { const int _WSAIOW = IOC_IN | x | y; }
+template _WSAIORW(int x, int y) { const int _WSAIORW = IOC_INOUT | x | y; }
+
+const int SIO_ASSOCIATE_HANDLE               = _WSAIOW!(IOC_WS2,1);
+const int SIO_ENABLE_CIRCULAR_QUEUEING       = _WSAIO!(IOC_WS2,2);
+const int SIO_FIND_ROUTE                     = _WSAIOR!(IOC_WS2,3);
+const int SIO_FLUSH                          = _WSAIO!(IOC_WS2,4);
+const int SIO_GET_BROADCAST_ADDRESS          = _WSAIOR!(IOC_WS2,5);
+const int SIO_GET_EXTENSION_FUNCTION_POINTER = _WSAIORW!(IOC_WS2,6);
+const int SIO_GET_QOS                        = _WSAIORW!(IOC_WS2,7);
+const int SIO_GET_GROUP_QOS                  = _WSAIORW!(IOC_WS2,8);
+const int SIO_MULTIPOINT_LOOPBACK            = _WSAIOW!(IOC_WS2,9);
+const int SIO_MULTICAST_SCOPE                = _WSAIOW!(IOC_WS2,10);
+const int SIO_SET_QOS                        = _WSAIOW!(IOC_WS2,11);
+const int SIO_SET_GROUP_QOS                  = _WSAIOW!(IOC_WS2,12);
+const int SIO_TRANSLATE_HANDLE               = _WSAIORW!(IOC_WS2,13);
+const int SIO_ROUTING_INTERFACE_QUERY        = _WSAIORW!(IOC_WS2,20);
+const int SIO_ROUTING_INTERFACE_CHANGE       = _WSAIOW!(IOC_WS2,21);
+const int SIO_ADDRESS_LIST_QUERY             = _WSAIOR!(IOC_WS2,22);
+const int SIO_ADDRESS_LIST_CHANGE            = _WSAIO!(IOC_WS2,23);
+const int SIO_QUERY_TARGET_PNP_HANDLE        = _WSAIOR!(IOC_WS2,24);
+const int SIO_NSP_NOTIFY_CHANGE              = _WSAIOW!(IOC_WS2,25);
+
+const int TH_NETDEV = 1;
+const int TH_TAPI   = 2;
+
+
+extern(Windows) {
+	SOCKET WSAAccept(SOCKET, SOCKADDR*, LPINT, LPCONDITIONPROC, DWORD);
+	INT WSAAddressToStringA(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOA, LPSTR, LPDWORD);
+	INT WSAAddressToStringW(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOW, LPWSTR, LPDWORD);
+	BOOL WSACloseEvent(WSAEVENT);
+	int WSAConnect(SOCKET, SOCKADDR*, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS);
+	WSAEVENT WSACreateEvent();
+	int WSADuplicateSocketA(SOCKET, DWORD, LPWSAPROTOCOL_INFOA);
+	int WSADuplicateSocketW(SOCKET, DWORD, LPWSAPROTOCOL_INFOW);
+	INT WSAEnumNameSpaceProvidersA(LPDWORD, LPWSANAMESPACE_INFOA);
+	INT WSAEnumNameSpaceProvidersW(LPDWORD, LPWSANAMESPACE_INFOW);
+	int WSAEnumNetworkEvents(SOCKET, WSAEVENT, LPWSANETWORKEVENTS);
+	int WSAEnumProtocolsA(LPINT, LPWSAPROTOCOL_INFOA, LPDWORD);
+	int WSAEnumProtocolsW(LPINT, LPWSAPROTOCOL_INFOW, LPDWORD);
+	int WSAEventSelect(SOCKET, WSAEVENT, int);
+	BOOL WSAGetOverlappedResult(SOCKET, LPWSAOVERLAPPED, LPDWORD, BOOL, LPDWORD);
+	BOOL WSAGetQOSByName(SOCKET, LPWSABUF, LPQOS);
+	INT WSAGetServiceClassInfoA(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOA);
+	INT WSAGetServiceClassInfoW(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOW);
+	INT WSAGetServiceClassNameByClassIdA(LPGUID, LPSTR, LPDWORD);
+	INT WSAGetServiceClassNameByClassIdW(LPGUID, LPWSTR, LPDWORD);
+	int WSAHtonl(SOCKET, uint, uint*);
+	int WSAHtons(SOCKET, ushort, ushort*);
+	INT WSAInstallServiceClassA(LPWSASERVICECLASSINFOA);
+	INT WSAInstallServiceClassW(LPWSASERVICECLASSINFOW);
+	int WSAIoctl(SOCKET, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+	SOCKET WSAJoinLeaf(SOCKET, SOCKADDR*, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS, DWORD);
+	INT WSALookupServiceBeginA(LPWSAQUERYSETA, DWORD, LPHANDLE);
+	INT WSALookupServiceBeginW(LPWSAQUERYSETW lpqsRestrictions, DWORD, LPHANDLE);
+	INT WSALookupServiceNextA(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETA);
+	INT WSALookupServiceNextW(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETW);
+	INT WSALookupServiceEnd(HANDLE);
+	int WSANSPIoctl(HANDLE,DWORD,LPVOID,DWORD,LPVOID,DWORD,LPDWORD,LPWSACOMPLETION); /* XP or .NET Server */
+	int WSANtohl(SOCKET, uint, uint*);
+	int WSANtohs(SOCKET, ushort, ushort*);
+	int WSARecv(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+	int WSARecvDisconnect(SOCKET, LPWSABUF);
+	int WSARecvFrom(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, SOCKADDR*, LPINT, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+	INT WSARemoveServiceClass(LPGUID);
+	BOOL WSAResetEvent(WSAEVENT);
+	int WSASend(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+	int WSASendDisconnect(SOCKET, LPWSABUF);
+	int WSASendTo(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, SOCKADDR*, int, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+	BOOL WSASetEvent(WSAEVENT);
+	INT WSASetServiceA(LPWSAQUERYSETA, WSAESETSERVICEOP, DWORD); // NB: was declared with "WSAAPI" linkage
+	INT WSASetServiceW(LPWSAQUERYSETW, WSAESETSERVICEOP, DWORD);
+	SOCKET WSASocketA(int, int, int, LPWSAPROTOCOL_INFOA, GROUP, DWORD);
+	SOCKET WSASocketW(int, int, int, LPWSAPROTOCOL_INFOW, GROUP, DWORD);
+	INT WSAStringToAddressA(LPSTR, INT, LPWSAPROTOCOL_INFOA, LPSOCKADDR, LPINT);
+	INT WSAStringToAddressW(LPWSTR, INT, LPWSAPROTOCOL_INFOW, LPSOCKADDR, LPINT);
+	DWORD WSAWaitForMultipleEvents(DWORD, WSAEVENT*, BOOL, DWORD, BOOL);
+
+	alias typeof(&WSAAccept) LPFN_WSAACCEPT;
+	alias typeof(&WSAAddressToStringA) LPFN_WSAADDRESSTOSTRINGA;
+	alias typeof(&WSAAddressToStringW) LPFN_WSAADDRESSTOSTRINGW;
+	alias typeof(&WSACloseEvent) LPFN_WSACLOSEEVENT;
+	alias typeof(&WSAConnect) LPFN_WSACONNECT;
+	alias typeof(&WSACreateEvent) LPFN_WSACREATEEVENT;
+	alias typeof(&WSADuplicateSocketA) LPFN_WSADUPLICATESOCKETA;
+	alias typeof(&WSADuplicateSocketW) LPFN_WSADUPLICATESOCKETW;
+	alias typeof(&WSAEnumNameSpaceProvidersA) LPFN_WSAENUMNAMESPACEPROVIDERSA;
+	alias typeof(&WSAEnumNameSpaceProvidersW) LPFN_WSAENUMNAMESPACEPROVIDERSW;
+	alias typeof(&WSAEnumNetworkEvents) LPFN_WSAENUMNETWORKEVENTS;
+	alias typeof(&WSAEnumProtocolsA) LPFN_WSAENUMPROTOCOLSA;
+	alias typeof(&WSAEnumProtocolsW) LPFN_WSAENUMPROTOCOLSW;
+	alias typeof(&WSAEventSelect) LPFN_WSAEVENTSELECT;
+	alias typeof(&WSAGetOverlappedResult) LPFN_WSAGETOVERLAPPEDRESULT;
+	alias typeof(&WSAGetQOSByName) LPFN_WSAGETQOSBYNAME;
+	alias typeof(&WSAGetServiceClassInfoA) LPFN_WSAGETSERVICECLASSINFOA;
+	alias typeof(&WSAGetServiceClassInfoW) LPFN_WSAGETSERVICECLASSINFOW;
+	alias typeof(&WSAGetServiceClassNameByClassIdA) LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA;
+	alias typeof(&WSAGetServiceClassNameByClassIdW) LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW;
+	alias typeof(&WSAHtonl) LPFN_WSAHTONL;
+	alias typeof(&WSAHtons) LPFN_WSAHTONS;
+	alias typeof(&WSAInstallServiceClassA) LPFN_WSAINSTALLSERVICECLASSA;
+	alias typeof(&WSAInstallServiceClassW) LPFN_WSAINSTALLSERVICECLASSW;
+	alias typeof(&WSAIoctl) LPFN_WSAIOCTL;
+	alias typeof(&WSAJoinLeaf) LPFN_WSAJOINLEAF;
+	alias typeof(&WSALookupServiceBeginA) LPFN_WSALOOKUPSERVICEBEGINA;
+	alias typeof(&WSALookupServiceBeginW) LPFN_WSALOOKUPSERVICEBEGINW;
+	alias typeof(&WSALookupServiceNextA) LPFN_WSALOOKUPSERVICENEXTA;
+	alias typeof(&WSALookupServiceNextW) LPFN_WSALOOKUPSERVICENEXTW;
+	alias typeof(&WSALookupServiceEnd) LPFN_WSALOOKUPSERVICEEND;
+	alias typeof(&WSANSPIoctl) LPFN_WSANSPIoctl;
+	alias typeof(&WSANtohl) LPFN_WSANTOHL;
+	alias typeof(&WSANtohs) LPFN_WSANTOHS;
+	alias typeof(&WSARecv) LPFN_WSARECV;
+	alias typeof(&WSARecvDisconnect) LPFN_WSARECVDISCONNECT;
+	alias typeof(&WSARecvFrom) LPFN_WSARECVFROM;
+	alias typeof(&WSARemoveServiceClass) LPFN_WSAREMOVESERVICECLASS;
+	alias typeof(&WSAResetEvent) LPFN_WSARESETEVENT;
+	alias typeof(&WSASend) LPFN_WSASEND;
+	alias typeof(&WSASendDisconnect) LPFN_WSASENDDISCONNECT;
+	alias typeof(&WSASendTo) LPFN_WSASENDTO;
+	alias typeof(&WSASetEvent) LPFN_WSASETEVENT;
+	alias typeof(&WSASetServiceA) LPFN_WSASETSERVICEA;
+	alias typeof(&WSASetServiceW) LPFN_WSASETSERVICEW;
+	alias typeof(&WSASocketA) LPFN_WSASOCKETA;
+	alias typeof(&WSASocketW) LPFN_WSASOCKETW;
+	alias typeof(&WSAStringToAddressA) LPFN_WSASTRINGTOADDRESSA;
+	alias typeof(&WSAStringToAddressW) LPFN_WSASTRINGTOADDRESSW;
+	alias typeof(&WSAWaitForMultipleEvents) LPFN_WSAWAITFORMULTIPLEEVENTS;
+}
+
+version(Unicode) {
+	alias LPFN_WSAADDRESSTOSTRINGW LPFN_WSAADDRESSTOSTRING;
+	alias LPFN_WSADUPLICATESOCKETW LPFN_WSADUPLICATESOCKET;
+	alias LPFN_WSAENUMNAMESPACEPROVIDERSW LPFN_WSAENUMNAMESPACEPROVIDERS;
+	alias LPFN_WSAENUMPROTOCOLSW LPFN_WSAENUMPROTOCOLS;
+	alias LPFN_WSAGETSERVICECLASSINFOW LPFN_WSAGETSERVICECLASSINFO;
+	alias LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW LPFN_WSAGETSERVICECLASSNAMEBYCLASSID;
+	alias LPFN_WSAINSTALLSERVICECLASSW LPFN_WSAINSTALLSERVICECLASS;
+	alias LPFN_WSALOOKUPSERVICEBEGINW LPFN_WSALOOKUPSERVICEBEGIN;
+	alias LPFN_WSALOOKUPSERVICENEXTW LPFN_WSALOOKUPSERVICENEXT;
+	alias LPFN_WSASETSERVICEW LPFN_WSASETSERVICE;
+	alias LPFN_WSASOCKETW LPFN_WSASOCKET;
+	alias LPFN_WSASTRINGTOADDRESSW LPFN_WSASTRINGTOADDRESS;
+	alias WSAAddressToStringW WSAAddressToString;
+	alias WSADuplicateSocketW WSADuplicateSocket;
+	alias WSAEnumNameSpaceProvidersW WSAEnumNameSpaceProviders;
+	alias WSAEnumProtocolsW WSAEnumProtocols;
+	alias WSAGetServiceClassInfoW WSAGetServiceClassInfo;
+	alias WSAGetServiceClassNameByClassIdW WSAGetServiceClassNameByClassId;
+	alias WSASetServiceW WSASetService;
+	alias WSASocketW WSASocket;
+	alias WSAStringToAddressW WSAStringToAddress;
+	alias WSALookupServiceBeginW WSALookupServiceBegin;
+	alias WSALookupServiceNextW WSALookupServiceNext;
+	alias WSAInstallServiceClassW WSAInstallServiceClass;
+} else {
+	alias LPFN_WSAADDRESSTOSTRINGA LPFN_WSAADDRESSTOSTRING;
+	alias LPFN_WSADUPLICATESOCKETW LPFN_WSADUPLICATESOCKET;
+	alias LPFN_WSAENUMNAMESPACEPROVIDERSA LPFN_WSAENUMNAMESPACEPROVIDERS;
+	alias LPFN_WSAENUMPROTOCOLSA LPFN_WSAENUMPROTOCOLS;
+	alias LPFN_WSAGETSERVICECLASSINFOA LPFN_WSAGETSERVICECLASSINFO;
+	alias LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA LPFN_WSAGETSERVICECLASSNAMEBYCLASSID;
+	alias LPFN_WSAINSTALLSERVICECLASSA LPFN_WSAINSTALLSERVICECLASS;
+	alias LPFN_WSALOOKUPSERVICEBEGINA LPFN_WSALOOKUPSERVICEBEGIN;
+	alias LPFN_WSALOOKUPSERVICENEXTA LPFN_WSALOOKUPSERVICENEXT;
+	alias LPFN_WSASETSERVICEA LPFN_WSASETSERVICE;
+	alias LPFN_WSASOCKETA LPFN_WSASOCKET;
+	alias LPFN_WSASTRINGTOADDRESSA LPFN_WSASTRINGTOADDRESS;
+	alias WSAAddressToStringA WSAAddressToString;
+	alias WSADuplicateSocketA WSADuplicateSocket;
+	alias WSAEnumNameSpaceProvidersA WSAEnumNameSpaceProviders;
+	alias WSAEnumProtocolsA WSAEnumProtocols;
+	alias WSAGetServiceClassInfoA WSAGetServiceClassInfo;
+	alias WSAGetServiceClassNameByClassIdA WSAGetServiceClassNameByClassId;
+	alias WSAInstallServiceClassA WSAInstallServiceClass;
+	alias WSALookupServiceBeginA WSALookupServiceBegin;
+	alias WSALookupServiceNextA WSALookupServiceNext;
+	alias WSASocketA WSASocket;
+	alias WSAStringToAddressA WSAStringToAddress;
+	alias WSASetServiceA WSASetService;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/winspool.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,961 @@
+/***********************************************************************\
+*                              winspool.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.winspool;
+pragma(lib, "winspool.lib");
+
+private import win32.w32api, win32.windef, win32.wingdi;
+private import win32.winbase; // for SYSTEMTIME
+
+// FIXME: clean up Windows version support
+
+const DI_CHANNEL=1;
+const DI_CHANNEL_WRITE=2;
+const DI_READ_SPOOL_JOB=3;
+
+const FORM_BUILTIN=1;
+
+const JOB_CONTROL_PAUSE=1;
+const JOB_CONTROL_RESUME=2;
+const JOB_CONTROL_CANCEL=3;
+const JOB_CONTROL_RESTART=4;
+const JOB_CONTROL_DELETE=5;
+const JOB_STATUS_PAUSED=1;
+const JOB_STATUS_ERROR=2;
+const JOB_STATUS_DELETING=4;
+const JOB_STATUS_SPOOLING=8;
+const JOB_STATUS_PRINTING=16;
+const JOB_STATUS_OFFLINE=32;
+const JOB_STATUS_PAPEROUT=0x40;
+const JOB_STATUS_PRINTED=0x80;
+const JOB_STATUS_DELETED=0x100;
+const JOB_STATUS_BLOCKED_DEVQ=0x200;
+const JOB_STATUS_USER_INTERVENTION=0x400;
+
+const JOB_POSITION_UNSPECIFIED=0;
+
+const JOB_NOTIFY_TYPE=1;
+
+const JOB_NOTIFY_FIELD_PRINTER_NAME=0;
+const JOB_NOTIFY_FIELD_MACHINE_NAME=1;
+const JOB_NOTIFY_FIELD_PORT_NAME=2;
+const JOB_NOTIFY_FIELD_USER_NAME=3;
+const JOB_NOTIFY_FIELD_NOTIFY_NAME=4;
+const JOB_NOTIFY_FIELD_DATATYPE=5;
+const JOB_NOTIFY_FIELD_PRINT_PROCESSOR=6;
+const JOB_NOTIFY_FIELD_PARAMETERS=7;
+const JOB_NOTIFY_FIELD_DRIVER_NAME=8;
+const JOB_NOTIFY_FIELD_DEVMODE=9;
+const JOB_NOTIFY_FIELD_STATUS=10;
+const JOB_NOTIFY_FIELD_STATUS_STRING=11;
+const JOB_NOTIFY_FIELD_SECURITY_DESCRIPTOR=12;
+const JOB_NOTIFY_FIELD_DOCUMENT=13;
+const JOB_NOTIFY_FIELD_PRIORITY=14;
+const JOB_NOTIFY_FIELD_POSITION=15;
+const JOB_NOTIFY_FIELD_SUBMITTED=16;
+const JOB_NOTIFY_FIELD_START_TIME=17;
+const JOB_NOTIFY_FIELD_UNTIL_TIME=18;
+const JOB_NOTIFY_FIELD_TIME=19;
+const JOB_NOTIFY_FIELD_TOTAL_PAGES=20;
+const JOB_NOTIFY_FIELD_PAGES_PRINTED=21;
+const JOB_NOTIFY_FIELD_TOTAL_BYTES=22;
+const JOB_NOTIFY_FIELD_BYTES_PRINTED=23;
+
+const JOB_ACCESS_ADMINISTER = 16;
+const JOB_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | JOB_ACCESS_ADMINISTER;
+const JOB_READ       = STANDARD_RIGHTS_READ     | JOB_ACCESS_ADMINISTER;
+const JOB_WRITE      = STANDARD_RIGHTS_WRITE    | JOB_ACCESS_ADMINISTER;
+const JOB_EXECUTE    = STANDARD_RIGHTS_EXECUTE  | JOB_ACCESS_ADMINISTER;
+
+const PRINTER_NOTIFY_OPTIONS_REFRESH=1;
+const PRINTER_ACCESS_ADMINISTER=4;
+const PRINTER_ACCESS_USE=8;
+
+const PRINTER_ERROR_INFORMATION=0x80000000;
+const PRINTER_ERROR_WARNING=0x40000000;
+const PRINTER_ERROR_SEVERE=0x20000000;
+const PRINTER_ERROR_OUTOFPAPER=1;
+const PRINTER_ERROR_JAM=2;
+const PRINTER_ERROR_OUTOFTONER=4;
+
+const PRINTER_CONTROL_PAUSE=1;
+const PRINTER_CONTROL_RESUME=2;
+const PRINTER_CONTROL_PURGE=3;
+const PRINTER_CONTROL_SET_STATUS=4;
+
+const PRINTER_STATUS_PAUSED = 1;
+const PRINTER_STATUS_ERROR = 2;
+const PRINTER_STATUS_PENDING_DELETION = 4;
+const PRINTER_STATUS_PAPER_JAM = 8;
+const PRINTER_STATUS_PAPER_OUT = 0x10;
+const PRINTER_STATUS_MANUAL_FEED = 0x20;
+const PRINTER_STATUS_PAPER_PROBLEM = 0x40;
+const PRINTER_STATUS_OFFLINE = 0x80;
+const PRINTER_STATUS_IO_ACTIVE = 0x100;
+const PRINTER_STATUS_BUSY = 0x200;
+const PRINTER_STATUS_PRINTING = 0x400;
+const PRINTER_STATUS_OUTPUT_BIN_FULL = 0x800;
+const PRINTER_STATUS_NOT_AVAILABLE = 0x1000;
+const PRINTER_STATUS_WAITING = 0x2000;
+const PRINTER_STATUS_PROCESSING = 0x4000;
+const PRINTER_STATUS_INITIALIZING = 0x8000;
+const PRINTER_STATUS_WARMING_UP = 0x10000;
+const PRINTER_STATUS_TONER_LOW = 0x20000;
+const PRINTER_STATUS_NO_TONER = 0x40000;
+const PRINTER_STATUS_PAGE_PUNT = 0x80000;
+const PRINTER_STATUS_USER_INTERVENTION = 0x100000;
+const PRINTER_STATUS_OUT_OF_MEMORY = 0x200000;
+const PRINTER_STATUS_DOOR_OPEN = 0x400000;
+const PRINTER_STATUS_SERVER_UNKNOWN = 0x800000;
+const PRINTER_STATUS_POWER_SAVE = 0x1000000;
+
+const PRINTER_ATTRIBUTE_QUEUED=1;
+const PRINTER_ATTRIBUTE_DIRECT=2;
+const PRINTER_ATTRIBUTE_DEFAULT=4;
+const PRINTER_ATTRIBUTE_SHARED=8;
+const PRINTER_ATTRIBUTE_NETWORK=0x10;
+const PRINTER_ATTRIBUTE_HIDDEN=0x20;
+const PRINTER_ATTRIBUTE_LOCAL=0x40;
+const PRINTER_ATTRIBUTE_ENABLE_DEVQ=0x80;
+const PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS=0x100;
+const PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST=0x200;
+const PRINTER_ATTRIBUTE_WORK_OFFLINE=0x400;
+const PRINTER_ATTRIBUTE_ENABLE_BIDI=0x800;
+const PRINTER_ATTRIBUTE_RAW_ONLY=0x1000;
+const PRINTER_ATTRIBUTE_PUBLISHED=0x2000;
+
+const PRINTER_ENUM_DEFAULT=1;
+const PRINTER_ENUM_LOCAL=2;
+const PRINTER_ENUM_CONNECTIONS=4;
+const PRINTER_ENUM_FAVORITE=4;
+const PRINTER_ENUM_NAME=8;
+const PRINTER_ENUM_REMOTE=16;
+const PRINTER_ENUM_SHARED=32;
+const PRINTER_ENUM_NETWORK=0x40;
+const PRINTER_ENUM_EXPAND=0x4000;
+const PRINTER_ENUM_CONTAINER=0x8000;
+const PRINTER_ENUM_ICONMASK=0xff0000;
+const PRINTER_ENUM_ICON1=0x10000;
+const PRINTER_ENUM_ICON2=0x20000;
+const PRINTER_ENUM_ICON3=0x40000;
+const PRINTER_ENUM_ICON4=0x80000;
+const PRINTER_ENUM_ICON5=0x100000;
+const PRINTER_ENUM_ICON6=0x200000;
+const PRINTER_ENUM_ICON7=0x400000;
+const PRINTER_ENUM_ICON8=0x800000;
+
+const PRINTER_NOTIFY_TYPE=0;
+
+const PRINTER_NOTIFY_FIELD_SERVER_NAME=0;
+const PRINTER_NOTIFY_FIELD_PRINTER_NAME=1;
+const PRINTER_NOTIFY_FIELD_SHARE_NAME=2;
+const PRINTER_NOTIFY_FIELD_PORT_NAME=3;
+const PRINTER_NOTIFY_FIELD_DRIVER_NAME=4;
+const PRINTER_NOTIFY_FIELD_COMMENT=5;
+const PRINTER_NOTIFY_FIELD_LOCATION=6;
+const PRINTER_NOTIFY_FIELD_DEVMODE=7;
+const PRINTER_NOTIFY_FIELD_SEPFILE=8;
+const PRINTER_NOTIFY_FIELD_PRINT_PROCESSOR=9;
+const PRINTER_NOTIFY_FIELD_PARAMETERS=10;
+const PRINTER_NOTIFY_FIELD_DATATYPE=11;
+const PRINTER_NOTIFY_FIELD_SECURITY_DESCRIPTOR=12;
+const PRINTER_NOTIFY_FIELD_ATTRIBUTES=13;
+const PRINTER_NOTIFY_FIELD_PRIORITY=14;
+const PRINTER_NOTIFY_FIELD_DEFAULT_PRIORITY=15;
+const PRINTER_NOTIFY_FIELD_START_TIME=16;
+const PRINTER_NOTIFY_FIELD_UNTIL_TIME=17;
+const PRINTER_NOTIFY_FIELD_STATUS=18;
+const PRINTER_NOTIFY_FIELD_STATUS_STRING=19;
+const PRINTER_NOTIFY_FIELD_CJOBS=20;
+const PRINTER_NOTIFY_FIELD_AVERAGE_PPM=21;
+const PRINTER_NOTIFY_FIELD_TOTAL_PAGES=22;
+const PRINTER_NOTIFY_FIELD_PAGES_PRINTED=23;
+const PRINTER_NOTIFY_FIELD_TOTAL_BYTES=24;
+const PRINTER_NOTIFY_FIELD_BYTES_PRINTED=25;
+
+const PRINTER_CHANGE_ADD_PRINTER=1;
+const PRINTER_CHANGE_SET_PRINTER=2;
+const PRINTER_CHANGE_DELETE_PRINTER=4;
+const PRINTER_CHANGE_FAILED_CONNECTION_PRINTER=8;
+const PRINTER_CHANGE_PRINTER=0xFF;
+const PRINTER_CHANGE_ADD_JOB=0x100;
+const PRINTER_CHANGE_SET_JOB=0x200;
+const PRINTER_CHANGE_DELETE_JOB=0x400;
+const PRINTER_CHANGE_WRITE_JOB=0x800;
+const PRINTER_CHANGE_JOB=0xFF00;
+const PRINTER_CHANGE_ADD_FORM=0x10000;
+const PRINTER_CHANGE_SET_FORM=0x20000;
+const PRINTER_CHANGE_DELETE_FORM=0x40000;
+const PRINTER_CHANGE_FORM=0x70000;
+const PRINTER_CHANGE_ADD_PORT=0x100000;
+const PRINTER_CHANGE_CONFIGURE_PORT=0x200000;
+const PRINTER_CHANGE_DELETE_PORT=0x400000;
+const PRINTER_CHANGE_PORT=0x700000;
+const PRINTER_CHANGE_ADD_PRINT_PROCESSOR=0x1000000;
+const PRINTER_CHANGE_DELETE_PRINT_PROCESSOR=0x4000000;
+const PRINTER_CHANGE_PRINT_PROCESSOR=0x7000000;
+const PRINTER_CHANGE_ADD_PRINTER_DRIVER=0x10000000;
+const PRINTER_CHANGE_SET_PRINTER_DRIVER=0x20000000;
+const PRINTER_CHANGE_DELETE_PRINTER_DRIVER=0x40000000;
+const PRINTER_CHANGE_PRINTER_DRIVER=0x70000000;
+const PRINTER_CHANGE_TIMEOUT=0x80000000;
+const PRINTER_CHANGE_ALL=0x7777FFFF;
+
+const PRINTER_NOTIFY_INFO_DISCARDED=1;
+const PRINTER_ALL_ACCESS=(STANDARD_RIGHTS_REQUIRED|PRINTER_ACCESS_ADMINISTER|PRINTER_ACCESS_USE);
+const PRINTER_READ=(STANDARD_RIGHTS_READ|PRINTER_ACCESS_USE);
+const PRINTER_WRITE=(STANDARD_RIGHTS_WRITE|PRINTER_ACCESS_USE);
+const PRINTER_EXECUTE=(STANDARD_RIGHTS_EXECUTE|PRINTER_ACCESS_USE);
+const NO_PRIORITY=0;
+const MAX_PRIORITY=99;
+const MIN_PRIORITY=1;
+const DEF_PRIORITY=1;
+const PORT_TYPE_WRITE=1;
+const PORT_TYPE_READ=2;
+const PORT_TYPE_REDIRECTED=4;
+const PORT_TYPE_NET_ATTACHED=8;
+const SERVER_ACCESS_ADMINISTER=1;
+const SERVER_ACCESS_ENUMERATE=2;
+
+const SERVER_ALL_ACCESS=(STANDARD_RIGHTS_REQUIRED|SERVER_ACCESS_ADMINISTER|SERVER_ACCESS_ENUMERATE);
+const SERVER_READ=(STANDARD_RIGHTS_READ|SERVER_ACCESS_ENUMERATE);
+const SERVER_WRITE=(STANDARD_RIGHTS_WRITE|SERVER_ACCESS_ADMINISTER|SERVER_ACCESS_ENUMERATE);
+const SERVER_EXECUTE=(STANDARD_RIGHTS_EXECUTE|SERVER_ACCESS_ENUMERATE);
+
+const PORT_STATUS_TYPE_ERROR=1;
+const PORT_STATUS_TYPE_WARNING=2;
+const PORT_STATUS_TYPE_INFO=3;
+
+const PORT_STATUS_OFFLINE=1;
+const PORT_STATUS_PAPER_JAM=2;
+const PORT_STATUS_PAPER_OUT=3;
+const PORT_STATUS_OUTPUT_BIN_FULL=4;
+const PORT_STATUS_PAPER_PROBLEM=5;
+const PORT_STATUS_NO_TONER=6;
+const PORT_STATUS_DOOR_OPEN=7;
+const PORT_STATUS_USER_INTERVENTION=8;
+const PORT_STATUS_OUT_OF_MEMORY=9;
+const PORT_STATUS_TONER_LOW=10;
+const PORT_STATUS_WARMING_UP=11;
+const PORT_STATUS_POWER_SAVE=12;
+
+struct ADDJOB_INFO_1A {
+	LPSTR Path;
+	DWORD JobId;
+}
+alias ADDJOB_INFO_1A* PADDJOB_INFO_1A, LPADDJOB_INFO_1A;
+
+struct ADDJOB_INFO_1W {
+	LPWSTR Path;
+	DWORD JobId;
+}
+alias ADDJOB_INFO_1W* PADDJOB_INFO_1W, LPADDJOB_INFO_1W;
+
+struct DATATYPES_INFO_1A {
+	LPSTR pName;
+}
+alias DATATYPES_INFO_1A* PDATATYPES_INFO_1A, LPDATATYPES_INFO_1A;
+
+struct DATATYPES_INFO_1W {
+	LPWSTR pName;
+}
+alias DATATYPES_INFO_1W* PDATATYPES_INFO_1W, LPDATATYPES_INFO_1W;
+
+struct JOB_INFO_1A {
+	DWORD JobId;
+	LPSTR pPrinterName;
+	LPSTR pMachineName;
+	LPSTR pUserName;
+	LPSTR pDocument;
+	LPSTR pDatatype;
+	LPSTR pStatus;
+	DWORD Status;
+	DWORD Priority;
+	DWORD Position;
+	DWORD TotalPages;
+	DWORD PagesPrinted;
+	SYSTEMTIME Submitted;
+}
+alias JOB_INFO_1A* PJOB_INFO_1A, LPJOB_INFO_1A;
+
+struct JOB_INFO_1W {
+	DWORD JobId;
+	LPWSTR pPrinterName;
+	LPWSTR pMachineName;
+	LPWSTR pUserName;
+	LPWSTR pDocument;
+	LPWSTR pDatatype;
+	LPWSTR pStatus;
+	DWORD Status;
+	DWORD Priority;
+	DWORD Position;
+	DWORD TotalPages;
+	DWORD PagesPrinted;
+	SYSTEMTIME Submitted;
+}
+alias JOB_INFO_1W* PJOB_INFO_1W, LPJOB_INFO_1W;
+
+struct JOB_INFO_2A {
+	DWORD JobId;
+	LPSTR pPrinterName;
+	LPSTR pMachineName;
+	LPSTR pUserName;
+	LPSTR pDocument;
+	LPSTR pNotifyName;
+	LPSTR pDatatype;
+	LPSTR pPrintProcessor;
+	LPSTR pParameters;
+	LPSTR pDriverName;
+	LPDEVMODEA pDevMode;
+	LPSTR pStatus;
+	PSECURITY_DESCRIPTOR pSecurityDescriptor;
+	DWORD Status;
+	DWORD Priority;
+	DWORD Position;
+	DWORD StartTime;
+	DWORD UntilTime;
+	DWORD TotalPages;
+	DWORD Size;
+	SYSTEMTIME Submitted;
+	DWORD Time;
+	DWORD PagesPrinted;
+}
+alias JOB_INFO_2A* PJOB_INFO_2A, LPJOB_INFO_2A;
+
+struct JOB_INFO_2W {
+	DWORD JobId;
+	LPWSTR pPrinterName;
+	LPWSTR pMachineName;
+	LPWSTR pUserName;
+	LPWSTR pDocument;
+	LPWSTR pNotifyName;
+	LPWSTR pDatatype;
+	LPWSTR pPrintProcessor;
+	LPWSTR pParameters;
+	LPWSTR pDriverName;
+	LPDEVMODEW pDevMode;
+	LPWSTR pStatus;
+	PSECURITY_DESCRIPTOR pSecurityDescriptor;
+	DWORD Status;
+	DWORD Priority;
+	DWORD Position;
+	DWORD StartTime;
+	DWORD UntilTime;
+	DWORD TotalPages;
+	DWORD Size;
+	SYSTEMTIME Submitted;
+	DWORD Time;
+	DWORD PagesPrinted;
+}
+alias JOB_INFO_2W* PJOB_INFO_2W, LPJOB_INFO_2W;
+
+struct DOC_INFO_1A {
+	LPSTR pDocName;
+	LPSTR pOutputFile;
+	LPSTR pDatatype;
+}
+alias DOC_INFO_1A* PDOC_INFO_1A, LPDOC_INFO_1A;
+
+struct DOC_INFO_1W {
+	LPWSTR pDocName;
+	LPWSTR pOutputFile;
+	LPWSTR pDatatype;
+}
+alias DOC_INFO_1W* PDOC_INFO_1W, LPDOC_INFO_1W;
+
+struct DOC_INFO_2A {
+	LPSTR pDocName;
+	LPSTR pOutputFile;
+	LPSTR pDatatype;
+	DWORD dwMode;
+	DWORD JobId;
+}
+alias DOC_INFO_2A* PDOC_INFO_2A, LPDOC_INFO_2A;
+
+struct DOC_INFO_2W {
+	LPWSTR pDocName;
+	LPWSTR pOutputFile;
+	LPWSTR pDatatype;
+	DWORD  dwMode;
+	DWORD  JobId;
+}
+alias DOC_INFO_2W* PDOC_INFO_2W, LPDOC_INFO_2W;
+
+struct DRIVER_INFO_1A {
+	LPSTR pName;
+}
+alias DRIVER_INFO_1A* PDRIVER_INFO_1A, LPDRIVER_INFO_1A;
+
+struct DRIVER_INFO_1W {
+	LPWSTR pName;
+}
+alias DRIVER_INFO_1W* PDRIVER_INFO_1W, LPDRIVER_INFO_1W;
+
+struct DRIVER_INFO_2A {
+	DWORD cVersion;
+	LPSTR pName;
+	LPSTR pEnvironment;
+	LPSTR pDriverPath;
+	LPSTR pDataFile;
+	LPSTR pConfigFile;
+}
+alias DRIVER_INFO_2A* PDRIVER_INFO_2A, LPDRIVER_INFO_2A;
+
+struct DRIVER_INFO_2W {
+	DWORD  cVersion;
+	LPWSTR pName;
+	LPWSTR pEnvironment;
+	LPWSTR pDriverPath;
+	LPWSTR pDataFile;
+	LPWSTR pConfigFile;
+}
+alias DRIVER_INFO_2W* PDRIVER_INFO_2W, LPDRIVER_INFO_2W;
+
+struct DRIVER_INFO_3A {
+	DWORD cVersion;
+	LPSTR pName;
+	LPSTR pEnvironment;
+	LPSTR pDriverPath;
+	LPSTR pDataFile;
+	LPSTR pConfigFile;
+	LPSTR pHelpFile;
+	LPSTR pDependentFiles;
+	LPSTR pMonitorName;
+	LPSTR pDefaultDataType;
+}
+alias DRIVER_INFO_3A* PDRIVER_INFO_3A, LPDRIVER_INFO_3A;
+
+struct DRIVER_INFO_3W {
+	DWORD  cVersion;
+	LPWSTR pName;
+	LPWSTR pEnvironment;
+	LPWSTR pDriverPath;
+	LPWSTR pDataFile;
+	LPWSTR pConfigFile;
+	LPWSTR pHelpFile;
+	LPWSTR pDependentFiles;
+	LPWSTR pMonitorName;
+	LPWSTR pDefaultDataType;
+}
+alias DRIVER_INFO_3W* PDRIVER_INFO_3W, LPDRIVER_INFO_3W;
+
+struct MONITOR_INFO_1A {
+	LPSTR pName;
+}
+alias MONITOR_INFO_1A* PMONITOR_INFO_1A, LPMONITOR_INFO_1A;
+
+struct MONITOR_INFO_1W {
+	LPWSTR pName;
+}
+alias MONITOR_INFO_1W* PMONITOR_INFO_1W, LPMONITOR_INFO_1W;
+
+struct PORT_INFO_1A {
+	LPSTR pName;
+}
+alias PORT_INFO_1A* PPORT_INFO_1A, LPPORT_INFO_1A;
+
+struct PORT_INFO_1W {
+	LPWSTR pName;
+}
+alias PORT_INFO_1W* PPORT_INFO_1W, LPPORT_INFO_1W;
+
+struct MONITOR_INFO_2A {
+	LPSTR pName;
+	LPSTR pEnvironment;
+	LPSTR pDLLName;
+}
+alias MONITOR_INFO_2A* PMONITOR_INFO_2A, LPMONITOR_INFO_2A;
+
+struct MONITOR_INFO_2W {
+	LPWSTR pName;
+	LPWSTR pEnvironment;
+	LPWSTR pDLLName;
+}
+alias MONITOR_INFO_2W* PMONITOR_INFO_2W, LPMONITOR_INFO_2W;
+
+struct PORT_INFO_2A {
+	LPSTR pPortName;
+	LPSTR pMonitorName;
+	LPSTR pDescription;
+	DWORD fPortType;
+	DWORD Reserved;
+}
+alias PORT_INFO_2A* PPORT_INFO_2A, LPPORT_INFO_2A;
+
+struct PORT_INFO_2W {
+	LPWSTR pPortName;
+	LPWSTR pMonitorName;
+	LPWSTR pDescription;
+	DWORD fPortType;
+	DWORD Reserved;
+}
+alias PORT_INFO_2W* PPORT_INFO_2W, LPPORT_INFO_2W;
+
+struct PORT_INFO_3A {
+	DWORD dwStatus;
+	LPSTR pszStatus;
+	DWORD dwSeverity;
+}
+alias PORT_INFO_3A* PPORT_INFO_3A, LPPORT_INFO_3A;
+
+struct PORT_INFO_3W {
+	DWORD dwStatus;
+	LPWSTR pszStatus;
+	DWORD dwSeverity;
+}
+alias PORT_INFO_3W* PPORT_INFO_3W, LPPORT_INFO_3W;
+
+struct PRINTER_INFO_1A {
+	DWORD Flags;
+	LPSTR pDescription;
+	LPSTR pName;
+	LPSTR pComment;
+}
+alias PRINTER_INFO_1A* PPRINTER_INFO_1A, LPPRINTER_INFO_1A;
+
+struct PRINTER_INFO_1W {
+	DWORD  Flags;
+	LPWSTR pDescription;
+	LPWSTR pName;
+	LPWSTR pComment;
+}
+alias PRINTER_INFO_1W* PPRINTER_INFO_1W, LPPRINTER_INFO_1W;
+
+struct PRINTER_INFO_2A {
+	LPSTR pServerName;
+	LPSTR pPrinterName;
+	LPSTR pShareName;
+	LPSTR pPortName;
+	LPSTR pDriverName;
+	LPSTR pComment;
+	LPSTR pLocation;
+	LPDEVMODEA pDevMode;
+	LPSTR pSepFile;
+	LPSTR pPrintProcessor;
+	LPSTR pDatatype;
+	LPSTR pParameters;
+	PSECURITY_DESCRIPTOR pSecurityDescriptor;
+	DWORD Attributes;
+	DWORD Priority;
+	DWORD DefaultPriority;
+	DWORD StartTime;
+	DWORD UntilTime;
+	DWORD Status;
+	DWORD cJobs;
+	DWORD AveragePPM;
+}
+alias PRINTER_INFO_2A* PPRINTER_INFO_2A, LPPRINTER_INFO_2A;
+
+struct PRINTER_INFO_2W {
+	LPWSTR pServerName;
+	LPWSTR pPrinterName;
+	LPWSTR pShareName;
+	LPWSTR pPortName;
+	LPWSTR pDriverName;
+	LPWSTR pComment;
+	LPWSTR pLocation;
+	LPDEVMODEW pDevMode;
+	LPWSTR pSepFile;
+	LPWSTR pPrintProcessor;
+	LPWSTR pDatatype;
+	LPWSTR pParameters;
+	PSECURITY_DESCRIPTOR pSecurityDescriptor;
+	DWORD Attributes;
+	DWORD Priority;
+	DWORD DefaultPriority;
+	DWORD StartTime;
+	DWORD UntilTime;
+	DWORD Status;
+	DWORD cJobs;
+	DWORD AveragePPM;
+}
+alias PRINTER_INFO_2W* PPRINTER_INFO_2W, LPPRINTER_INFO_2W;
+
+struct PRINTER_INFO_3 {
+	PSECURITY_DESCRIPTOR pSecurityDescriptor;
+}
+alias PRINTER_INFO_3* PPRINTER_INFO_3, LPPRINTER_INFO_3;
+
+struct PRINTER_INFO_4A {
+	LPSTR pPrinterName;
+	LPSTR pServerName;
+	DWORD Attributes;
+}
+alias PRINTER_INFO_4A* PPRINTER_INFO_4A, LPPRINTER_INFO_4A;
+
+struct PRINTER_INFO_4W {
+	LPWSTR pPrinterName;
+	LPWSTR pServerName;
+	DWORD Attributes;
+}
+alias PRINTER_INFO_4W* PPRINTER_INFO_4W, LPPRINTER_INFO_4W;
+
+struct PRINTER_INFO_5A {
+	LPSTR pPrinterName;
+	LPSTR pPortName;
+	DWORD Attributes;
+	DWORD DeviceNotSelectedTimeout;
+	DWORD TransmissionRetryTimeout;
+}
+alias PRINTER_INFO_5A* PPRINTER_INFO_5A, LPPRINTER_INFO_5A;
+
+struct PRINTER_INFO_5W {
+	LPWSTR pPrinterName;
+	LPWSTR pPortName;
+	DWORD Attributes;
+	DWORD DeviceNotSelectedTimeout;
+	DWORD TransmissionRetryTimeout;
+}
+alias PRINTER_INFO_5W* PPRINTER_INFO_5W, LPPRINTER_INFO_5W;
+
+struct PRINTER_INFO_6 {
+	DWORD dwStatus;
+}
+alias PRINTER_INFO_6* PPRINTER_INFO_6, LPPRINTER_INFO_6;
+
+struct PRINTPROCESSOR_INFO_1A {
+	LPSTR pName;
+}
+alias PRINTPROCESSOR_INFO_1A* PPRINTPROCESSOR_INFO_1A, LPPRINTPROCESSOR_INFO_1A;
+
+struct PRINTPROCESSOR_INFO_1W {
+	LPWSTR pName;
+}
+alias PRINTPROCESSOR_INFO_1W* PPRINTPROCESSOR_INFO_1W, LPPRINTPROCESSOR_INFO_1W;
+
+struct PRINTER_NOTIFY_INFO_DATA {
+	WORD  Type;
+	WORD  Field;
+	DWORD Reserved;
+	DWORD Id;
+	union _NotifyData {
+		DWORD adwData[2];
+		struct Data {
+			DWORD cbBuf;
+			PVOID pBuf;
+		}
+	}
+	_NotifyData NotifyData;	
+}
+alias PRINTER_NOTIFY_INFO_DATA* PPRINTER_NOTIFY_INFO_DATA, LPPRINTER_NOTIFY_INFO_DATA;
+
+struct PRINTER_NOTIFY_INFO {
+	DWORD Version;
+	DWORD Flags;
+	DWORD Count;
+	PRINTER_NOTIFY_INFO_DATA aData[1];
+}
+alias PRINTER_NOTIFY_INFO* PPRINTER_NOTIFY_INFO, LPPRINTER_NOTIFY_INFO;
+
+struct FORM_INFO_1A {
+	DWORD Flags;
+	LPSTR pName;
+	SIZEL Size;
+	RECTL ImageableArea;
+}
+alias FORM_INFO_1A* PFORM_INFO_1A, LPFORM_INFO_1A;
+
+struct FORM_INFO_1W {
+	DWORD  Flags;
+	LPWSTR pName;
+	SIZEL  Size;
+	RECTL  ImageableArea;
+}
+alias FORM_INFO_1W* PFORM_INFO_1W, LPFORM_INFO_1W;
+
+struct PRINTER_DEFAULTSA {
+	LPSTR       pDatatype;
+	LPDEVMODE   pDevMode;
+	ACCESS_MASK DesiredAccess;
+}
+alias PRINTER_DEFAULTSA* PPRINTER_DEFAULTSA, LPPRINTER_DEFAULTSA;
+
+struct PRINTER_DEFAULTSW {
+	LPWSTR pDatatype;
+	LPDEVMODE pDevMode;
+	ACCESS_MASK DesiredAccess;
+}
+alias PRINTER_DEFAULTSW* PPRINTER_DEFAULTSW, LPPRINTER_DEFAULTSW;
+
+extern (Windows):
+BOOL AbortPrinter(HANDLE);
+BOOL AddFormA(HANDLE, DWORD, PBYTE);
+BOOL AddFormW(HANDLE, DWORD, PBYTE);
+BOOL AddJobA(HANDLE, DWORD, PBYTE, DWORD, PDWORD);
+BOOL AddJobW(HANDLE, DWORD, PBYTE, DWORD, PDWORD);
+BOOL AddMonitorA(LPSTR, DWORD, PBYTE);
+BOOL AddMonitorW(LPWSTR, DWORD, PBYTE);
+BOOL AddPortA(LPSTR, HWND, LPSTR);
+BOOL AddPortW(LPWSTR, HWND, LPWSTR);
+HANDLE AddPrinterA(LPSTR, DWORD, PBYTE);
+HANDLE AddPrinterW(LPWSTR, DWORD, PBYTE);
+BOOL AddPrinterConnectionA(LPSTR);
+BOOL AddPrinterConnectionW(LPWSTR);
+BOOL AddPrinterDriverA(LPSTR, DWORD, PBYTE);
+BOOL AddPrinterDriverW(LPWSTR, DWORD, PBYTE);
+BOOL AddPrintProcessorA(LPSTR, LPSTR, LPSTR, LPSTR);
+BOOL AddPrintProcessorW(LPWSTR, LPWSTR, LPWSTR, LPWSTR);
+BOOL AddPrintProvidorA(LPSTR, DWORD, PBYTE);
+BOOL AddPrintProvidorW(LPWSTR, DWORD, PBYTE);
+LONG AdvancedDocumentPropertiesA(HWND, HANDLE, LPSTR, PDEVMODE, PDEVMODEA);
+LONG AdvancedDocumentPropertiesW(HWND, HANDLE, LPWSTR, PDEVMODE, PDEVMODEW);
+BOOL ClosePrinter(HANDLE);
+BOOL ConfigurePortA(LPSTR, HWND, LPSTR);
+BOOL ConfigurePortW(LPWSTR, HWND, LPWSTR);
+HANDLE ConnectToPrinterDlg(HWND, DWORD);
+BOOL DeleteFormA(HANDLE, LPSTR);
+BOOL DeleteFormW(HANDLE, LPWSTR);
+BOOL DeleteMonitorA(LPSTR, LPSTR, LPSTR);
+BOOL DeleteMonitorW(LPWSTR, LPWSTR, LPWSTR);
+BOOL DeletePortA(LPSTR, HWND, LPSTR);
+BOOL DeletePortW(LPWSTR, HWND, LPWSTR);
+BOOL DeletePrinter(HANDLE);
+BOOL DeletePrinterConnectionA(LPSTR);
+BOOL DeletePrinterConnectionW(LPWSTR);
+DWORD DeletePrinterDataA(HANDLE, LPSTR);
+DWORD DeletePrinterDataW(HANDLE, LPWSTR);
+BOOL DeletePrinterDriverA(LPSTR, LPSTR, LPSTR);
+BOOL DeletePrinterDriverW(LPWSTR, LPWSTR, LPWSTR);
+BOOL DeletePrintProcessorA(LPSTR, LPSTR, LPSTR);
+BOOL DeletePrintProcessorW(LPWSTR, LPWSTR, LPWSTR);
+BOOL DeletePrintProvidorA(LPSTR, LPSTR, LPSTR);
+BOOL DeletePrintProvidorW(LPWSTR, LPWSTR, LPWSTR);
+LONG DocumentPropertiesA(HWND, HANDLE, LPSTR, PDEVMODEA, PDEVMODEA, DWORD);
+LONG DocumentPropertiesW(HWND, HANDLE, LPWSTR, PDEVMODEW, PDEVMODEW, DWORD);
+BOOL EndDocPrinter(HANDLE);
+BOOL EndPagePrinter(HANDLE);
+BOOL EnumFormsA(HANDLE, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
+BOOL EnumFormsW(HANDLE, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
+BOOL EnumJobsA(HANDLE, DWORD, DWORD, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
+BOOL EnumJobsW(HANDLE, DWORD, DWORD, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
+BOOL EnumMonitorsA(LPSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
+BOOL EnumMonitorsW(LPWSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
+BOOL EnumPortsA(LPSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
+BOOL EnumPortsW(LPWSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
+DWORD EnumPrinterDataA(HANDLE, DWORD, LPSTR, DWORD, PDWORD, PDWORD, PBYTE, DWORD, PDWORD);
+DWORD EnumPrinterDataW(HANDLE, DWORD, LPWSTR, DWORD, PDWORD, PDWORD, PBYTE, DWORD, PDWORD);
+BOOL EnumPrinterDriversA(LPSTR, LPSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
+BOOL EnumPrinterDriversW(LPWSTR, LPWSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
+BOOL EnumPrintersA(DWORD, LPSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
+BOOL EnumPrintersW(DWORD, LPWSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
+BOOL EnumPrintProcessorDatatypesA(LPSTR, LPSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
+BOOL EnumPrintProcessorDatatypesW(LPWSTR, LPWSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
+BOOL EnumPrintProcessorsA(LPSTR, LPSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
+BOOL EnumPrintProcessorsW(LPWSTR, LPWSTR, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
+BOOL FindClosePrinterChangeNotification(HANDLE);
+HANDLE FindFirstPrinterChangeNotification(HANDLE, DWORD, DWORD, PVOID);
+HANDLE FindNextPrinterChangeNotification(HANDLE, PDWORD, PVOID, PVOID*);
+BOOL FreePrinterNotifyInfo(PPRINTER_NOTIFY_INFO);
+
+static if (_WIN32_WINNT >= 0x0500) {
+BOOL GetDefaultPrinterA(LPSTR, LPDWORD);
+BOOL GetDefaultPrinterW(LPWSTR, LPDWORD);
+}
+
+BOOL GetFormA(HANDLE, LPSTR, DWORD, PBYTE, DWORD, PDWORD);
+BOOL GetFormW(HANDLE, LPWSTR, DWORD, PBYTE, DWORD, PDWORD);
+BOOL GetJobA(HANDLE, DWORD, DWORD, PBYTE, DWORD, PDWORD);
+BOOL GetJobW(HANDLE, DWORD, DWORD, PBYTE, DWORD, PDWORD);
+BOOL GetPrinterA(HANDLE, DWORD, PBYTE, DWORD, PDWORD);
+BOOL GetPrinterW(HANDLE, DWORD, PBYTE, DWORD, PDWORD);
+DWORD GetPrinterDataA(HANDLE, LPSTR, PDWORD, PBYTE, DWORD, PDWORD);
+DWORD GetPrinterDataW(HANDLE, LPWSTR, PDWORD, PBYTE, DWORD, PDWORD);
+DWORD GetPrinterDriverA(HANDLE, LPSTR, DWORD, PBYTE, DWORD, PDWORD);
+DWORD GetPrinterDriverW(HANDLE, LPWSTR, DWORD, PBYTE, DWORD, PDWORD);
+DWORD GetPrinterDriverDirectoryA(LPSTR, LPSTR, DWORD, PBYTE, DWORD, PDWORD);
+DWORD GetPrinterDriverDirectoryW(LPWSTR, LPWSTR, DWORD, PBYTE, DWORD, PDWORD);
+DWORD GetPrintProcessorDirectoryA(LPSTR, LPSTR, DWORD, PBYTE, DWORD, PDWORD);
+DWORD GetPrintProcessorDirectoryW(LPWSTR, LPWSTR, DWORD, PBYTE, DWORD, PDWORD);
+BOOL OpenPrinterA(LPSTR, PHANDLE, LPPRINTER_DEFAULTSA);
+BOOL OpenPrinterW(LPWSTR, PHANDLE, LPPRINTER_DEFAULTSW);
+DWORD PrinterMessageBoxA(HANDLE, DWORD, HWND, LPSTR, LPSTR, DWORD);
+DWORD PrinterMessageBoxW(HANDLE, DWORD, HWND, LPWSTR, LPWSTR, DWORD);
+BOOL PrinterProperties(HWND, HANDLE);
+BOOL ReadPrinter(HANDLE, PVOID, DWORD, PDWORD);
+BOOL ResetPrinterA(HANDLE, LPPRINTER_DEFAULTSA);
+BOOL ResetPrinterW(HANDLE, LPPRINTER_DEFAULTSW);
+BOOL ScheduleJob(HANDLE, DWORD);
+BOOL SetFormA(HANDLE, LPSTR, DWORD, PBYTE);
+BOOL SetFormW(HANDLE, LPWSTR, DWORD, PBYTE);
+BOOL SetJobA(HANDLE, DWORD, DWORD, PBYTE, DWORD);
+BOOL SetJobW(HANDLE, DWORD, DWORD, PBYTE, DWORD);
+BOOL SetPrinterA(HANDLE, DWORD, PBYTE, DWORD);
+BOOL SetPrinterW(HANDLE, DWORD, PBYTE, DWORD);
+BOOL SetPrinterDataA(HANDLE, LPSTR, DWORD, PBYTE, DWORD);
+BOOL SetPrinterDataW(HANDLE, LPWSTR, DWORD, PBYTE, DWORD);
+DWORD StartDocPrinterA(HANDLE, DWORD, PBYTE);
+DWORD StartDocPrinterW(HANDLE, DWORD, PBYTE);
+BOOL StartPagePrinter(HANDLE);
+DWORD WaitForPrinterChange(HANDLE, DWORD);
+BOOL WritePrinter(HANDLE, PVOID, DWORD, PDWORD);
+
+version(Unicode) {
+
+alias JOB_INFO_1W JOB_INFO_1;
+alias JOB_INFO_2W JOB_INFO_2;
+alias ADDJOB_INFO_1W ADDJOB_INFO_1;
+alias DATATYPES_INFO_1W DATATYPES_INFO_1;
+alias MONITOR_INFO_1W MONITOR_INFO_1;
+alias MONITOR_INFO_2W MONITOR_INFO_2;
+alias DOC_INFO_1W DOC_INFO_1;
+alias DOC_INFO_2W DOC_INFO_2;
+alias PORT_INFO_1W PORT_INFO_1;
+alias PORT_INFO_2W PORT_INFO_2;
+alias PORT_INFO_3W PORT_INFO_3;
+alias DRIVER_INFO_2W DRIVER_INFO_2;
+alias PRINTER_INFO_1W PRINTER_INFO_1;
+alias PRINTER_INFO_2W PRINTER_INFO_2;
+alias PRINTER_INFO_4W PRINTER_INFO_4;
+alias PRINTER_INFO_5W PRINTER_INFO_5;
+alias PRINTPROCESSOR_INFO_1W PRINTPROCESSOR_INFO_1;
+alias FORM_INFO_1W FORM_INFO_1;
+alias PRINTER_DEFAULTSW PRINTER_DEFAULTS;
+
+alias AddFormW AddForm;
+alias AddJobW AddJob;
+alias AddMonitorW AddMonitor;
+alias AddPortW AddPort;
+alias AddPrinterW AddPrinter;
+alias AddPrinterConnectionW AddPrinterConnection;
+alias AddPrinterDriverW AddPrinterDriver;
+alias AddPrintProcessorW AddPrintProcessor;
+alias AddPrintProvidorW AddPrintProvidor;
+alias AdvancedDocumentPropertiesW AdvancedDocumentProperties;
+alias ConfigurePortW ConfigurePort;
+alias DeleteFormW DeleteForm;
+alias DeleteMonitorW DeleteMonitor;
+alias DeletePortW DeletePort;
+alias DeletePrinterConnectionW DeletePrinterConnection;
+alias DeletePrinterDataW DeletePrinterData;
+alias DeletePrinterDriverW DeletePrinterDriver;
+alias DeletePrintProcessorW DeletePrintProcessor;
+alias DeletePrintProvidorW DeletePrintProvidor;
+alias DocumentPropertiesW DocumentProperties;
+alias EnumFormsW EnumForms;
+alias EnumJobsW EnumJobs;
+alias EnumMonitorsW EnumMonitors;
+alias EnumPortsW EnumPorts;
+alias EnumPrinterDataW EnumPrinterData;
+alias EnumPrinterDriversW EnumPrinterDrivers;
+alias EnumPrintersW EnumPrinters;
+alias EnumPrintProcessorDatatypesW EnumPrintProcessorDatatypes;
+alias EnumPrintProcessorsW EnumPrintProcessors;
+
+static if (_WIN32_WINNT >= 0x0500) {
+alias GetDefaultPrinterW GetDefaultPrinter;
+}
+
+alias GetFormW GetForm;
+alias GetJobW GetJob;
+alias GetPrinterW GetPrinter;
+alias GetPrinterDataW GetPrinterData;
+alias GetPrinterDriverW GetPrinterDriver;
+alias GetPrinterDriverDirectoryW GetPrinterDriverDirectory;
+alias GetPrintProcessorDirectoryW GetPrintProcessorDirectory;
+alias OpenPrinterW OpenPrinter;
+alias PrinterMessageBoxW PrinterMessageBox;
+alias ResetPrinterW ResetPrinter;
+alias SetFormW SetForm;
+alias SetJobW SetJob;
+alias SetPrinterW SetPrinter;
+alias SetPrinterDataW SetPrinterData;
+alias StartDocPrinterW StartDocPrinter;
+
+} else {
+
+alias JOB_INFO_1A JOB_INFO_1;
+alias JOB_INFO_2A JOB_INFO_2;
+alias ADDJOB_INFO_1A ADDJOB_INFO_1;
+alias DATATYPES_INFO_1A DATATYPES_INFO_1;
+alias MONITOR_INFO_1A MONITOR_INFO_1;
+alias MONITOR_INFO_2A MONITOR_INFO_2;
+alias DOC_INFO_1A DOC_INFO_1;
+alias DOC_INFO_2A DOC_INFO_2;
+alias PORT_INFO_1A PORT_INFO_1;
+alias PORT_INFO_2A PORT_INFO_2;
+alias PORT_INFO_3A PORT_INFO_3;
+alias DRIVER_INFO_2A DRIVER_INFO_2;
+alias PRINTER_INFO_1A PRINTER_INFO_1;
+alias PRINTER_INFO_2A PRINTER_INFO_2;
+alias PRINTER_INFO_4A PRINTER_INFO_4;
+alias PRINTER_INFO_5A PRINTER_INFO_5;
+alias PRINTPROCESSOR_INFO_1A PRINTPROCESSOR_INFO_1;
+alias FORM_INFO_1A FORM_INFO_1;
+alias PRINTER_DEFAULTSA PRINTER_DEFAULTS;
+
+alias AddFormA AddForm;
+alias AddJobA AddJob;
+alias AddMonitorA AddMonitor;
+alias AddPortA AddPort;
+alias AddPrinterA AddPrinter;
+alias AddPrinterConnectionA AddPrinterConnection;
+alias AddPrinterDriverA AddPrinterDriver;
+alias AddPrintProcessorA AddPrintProcessor;
+alias AddPrintProvidorA AddPrintProvidor;
+alias AdvancedDocumentPropertiesA AdvancedDocumentProperties;
+alias ConfigurePortA ConfigurePort;
+alias DeleteFormA DeleteForm;
+alias DeleteMonitorA DeleteMonitor;
+alias DeletePortA DeletePort;
+alias DeletePrinterConnectionA DeletePrinterConnection;
+alias DeletePrinterDataA DeletePrinterData;
+alias DeletePrinterDriverA DeletePrinterDriver;
+alias DeletePrintProcessorA DeletePrintProcessor;
+alias DeletePrintProvidorA DeletePrintProvidor;
+alias DocumentPropertiesA DocumentProperties;
+alias EnumFormsA EnumForms;
+alias EnumJobsA EnumJobs;
+alias EnumMonitorsA EnumMonitors;
+alias EnumPortsA EnumPorts;
+alias EnumPrinterDataA EnumPrinterData;
+alias EnumPrinterDriversA EnumPrinterDrivers;
+alias EnumPrintersA EnumPrinters;
+alias EnumPrintProcessorDatatypesA EnumPrintProcessorDatatypes;
+alias EnumPrintProcessorsA EnumPrintProcessors;
+
+static if (_WIN32_WINNT >= 0x0500) {
+alias GetDefaultPrinterA GetDefaultPrinter;
+}
+
+alias GetFormA GetForm;
+alias GetJobA GetJob;
+alias GetPrinterA GetPrinter;
+alias GetPrinterDataA GetPrinterData;
+alias GetPrinterDriverA GetPrinterDriver;
+alias GetPrinterDriverDirectoryA GetPrinterDriverDirectory;
+alias GetPrintProcessorDirectoryA GetPrintProcessorDirectory;
+alias OpenPrinterA OpenPrinter;
+alias PrinterMessageBoxA PrinterMessageBox;
+alias ResetPrinterA ResetPrinter;
+alias SetFormA SetForm;
+alias SetJobA SetJob;
+alias SetPrinterA SetPrinter;
+alias SetPrinterDataA SetPrinterData;
+alias StartDocPrinterA StartDocPrinter;
+}
+
+alias JOB_INFO_1* PJOB_INFO_1, LPJOB_INFO_1;
+alias JOB_INFO_2* PJOB_INFO_2, LPJOB_INFO_2;
+alias ADDJOB_INFO_1* PADDJOB_INFO_1, LPADDJOB_INFO_1;
+alias DATATYPES_INFO_1* PDATATYPES_INFO_1, LPDATATYPES_INFO_1;
+alias MONITOR_INFO_1* PMONITOR_INFO_1, LPMONITOR_INFO_1;
+alias MONITOR_INFO_2* PMONITOR_INFO_2, LPMONITOR_INFO_2;
+alias DOC_INFO_1* PDOC_INFO_1, LPDOC_INFO_1;
+alias DOC_INFO_2* PDOC_INFO_2, LPDOC_INFO_2;
+alias PORT_INFO_1* PPORT_INFO_1, LPPORT_INFO_1;
+alias PORT_INFO_2* PPORT_INFO_2, LPPORT_INFO_2;
+alias PORT_INFO_3* PPORT_INFO_3, LPPORT_INFO_3;
+alias DRIVER_INFO_2* PDRIVER_INFO_2, LPDRIVER_INFO_2;
+alias PRINTER_INFO_1* PPRINTER_INFO_1, LPPRINTER_INFO_1;
+alias PRINTER_INFO_2* PPRINTER_INFO_2, LPPRINTER_INFO_2;
+alias PRINTER_INFO_4* PPRINTER_INFO_4, LPPRINTER_INFO_4;
+alias PRINTER_INFO_5* PPRINTER_INFO_5, LPPRINTER_INFO_5;
+alias PRINTPROCESSOR_INFO_1* PPRINTPROCESSOR_INFO_1, LPPRINTPROCESSOR_INFO_1;
+alias FORM_INFO_1* PFORM_INFO_1, LPFORM_INFO_1;
+alias PRINTER_DEFAULTS* PPRINTER_DEFAULTS, LPPRINTER_DEFAULTS;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/winsvc.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,430 @@
+/***********************************************************************\
+*                                winsvc.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.winsvc;
+pragma(lib, "advapi32.lib");
+
+private import win32.w32api, win32.windef;
+
+static assert (_WIN32_WINNT_ONLY,
+	"win32.winsvc is available only if version WindowsNTonly, WindowsXP, "
+	"Windows2003 or WindowsVista is set");
+
+
+// FIXME: check Windows version support
+
+const TCHAR[]
+	SERVICES_ACTIVE_DATABASE = "ServicesActive",
+	SERVICES_FAILED_DATABASE = "ServicesFailed";
+
+const TCHAR SC_GROUP_IDENTIFIER = '+';
+
+const DWORD
+	SC_MANAGER_ALL_ACCESS         = 0xf003f,
+	SC_MANAGER_CONNECT            =  1,
+	SC_MANAGER_CREATE_SERVICE     =  2,
+	SC_MANAGER_ENUMERATE_SERVICE  =  4,
+	SC_MANAGER_LOCK               =  8,
+	SC_MANAGER_QUERY_LOCK_STATUS  = 16,
+	SC_MANAGER_MODIFY_BOOT_CONFIG = 32;
+
+const DWORD SERVICE_NO_CHANGE = 0xffffffff;
+
+enum : DWORD {
+	SERVICE_STOPPED = 1,
+	SERVICE_START_PENDING,
+	SERVICE_STOP_PENDING,
+	SERVICE_RUNNING,
+	SERVICE_CONTINUE_PENDING,
+	SERVICE_PAUSE_PENDING,
+	SERVICE_PAUSED // = 7
+}
+
+const DWORD
+	SERVICE_ACCEPT_STOP                  =   1,
+	SERVICE_ACCEPT_PAUSE_CONTINUE        =   2,
+	SERVICE_ACCEPT_SHUTDOWN              =   4,
+	SERVICE_ACCEPT_PARAMCHANGE           =   8,
+	SERVICE_ACCEPT_NETBINDCHANGE         =  16,
+	SERVICE_ACCEPT_HARDWAREPROFILECHANGE =  32,
+	SERVICE_ACCEPT_POWEREVENT            =  64,
+	SERVICE_ACCEPT_SESSIONCHANGE         = 128;
+
+enum : DWORD {
+	SERVICE_CONTROL_STOP = 1,
+	SERVICE_CONTROL_PAUSE,
+	SERVICE_CONTROL_CONTINUE,
+	SERVICE_CONTROL_INTERROGATE,
+	SERVICE_CONTROL_SHUTDOWN,
+	SERVICE_CONTROL_PARAMCHANGE,
+	SERVICE_CONTROL_NETBINDADD,
+	SERVICE_CONTROL_NETBINDREMOVE,
+	SERVICE_CONTROL_NETBINDENABLE,
+	SERVICE_CONTROL_NETBINDDISABLE,
+	SERVICE_CONTROL_DEVICEEVENT,
+	SERVICE_CONTROL_HARDWAREPROFILECHANGE,
+	SERVICE_CONTROL_POWEREVENT,
+	SERVICE_CONTROL_SESSIONCHANGE, // = 14
+}
+
+enum : DWORD {
+	SERVICE_ACTIVE = 1,
+	SERVICE_INACTIVE,
+	SERVICE_STATE_ALL
+}
+
+const DWORD
+	SERVICE_QUERY_CONFIG         = 0x0001,
+	SERVICE_CHANGE_CONFIG        = 0x0002,
+	SERVICE_QUERY_STATUS         = 0x0004,
+	SERVICE_ENUMERATE_DEPENDENTS = 0x0008,
+	SERVICE_START                = 0x0010,
+	SERVICE_STOP                 = 0x0020,
+	SERVICE_PAUSE_CONTINUE       = 0x0040,
+	SERVICE_INTERROGATE          = 0x0080,
+	SERVICE_USER_DEFINED_CONTROL = 0x0100,
+	SERVICE_ALL_ACCESS           = 0x01FF | STANDARD_RIGHTS_REQUIRED;
+
+// This is not documented on the MSDN site
+const SERVICE_RUNS_IN_SYSTEM_PROCESS = 1;
+
+enum : DWORD {
+	SERVICE_CONFIG_DESCRIPTION         = 1,
+	SERVICE_CONFIG_FAILURE_ACTIONS,
+	SERVICE_CONFIG_DELAYED_AUTO_START_INFO,
+	SERVICE_CONFIG_FAILURE_ACTIONS_FLAG,
+	SERVICE_CONFIG_SERVICE_SID_INFO,
+	SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO,
+	SERVICE_CONFIG_PRESHUTDOWN_INFO // = 7
+}
+
+struct SERVICE_STATUS {
+	DWORD dwServiceType;
+	DWORD dwCurrentState;
+	DWORD dwControlsAccepted;
+	DWORD dwWin32ExitCode;
+	DWORD dwServiceSpecificExitCode;
+	DWORD dwCheckPoint;
+	DWORD dwWaitHint;
+}
+alias SERVICE_STATUS* LPSERVICE_STATUS;
+
+struct ENUM_SERVICE_STATUSA {
+	LPSTR          lpServiceName;
+	LPSTR          lpDisplayName;
+	SERVICE_STATUS ServiceStatus;
+}
+alias ENUM_SERVICE_STATUSA* LPENUM_SERVICE_STATUSA;
+
+struct ENUM_SERVICE_STATUSW {
+	LPWSTR         lpServiceName;
+	LPWSTR         lpDisplayName;
+	SERVICE_STATUS ServiceStatus;
+}
+alias ENUM_SERVICE_STATUSW* LPENUM_SERVICE_STATUSW;
+
+struct QUERY_SERVICE_CONFIGA {
+	DWORD dwServiceType;
+	DWORD dwStartType;
+	DWORD dwErrorControl;
+	LPSTR lpBinaryPathName;
+	LPSTR lpLoadOrderGroup;
+	DWORD dwTagId;
+	LPSTR lpDependencies;
+	LPSTR lpServiceStartName;
+	LPSTR lpDisplayName;
+}
+alias QUERY_SERVICE_CONFIGA* LPQUERY_SERVICE_CONFIGA;
+
+struct QUERY_SERVICE_CONFIGW {
+	DWORD  dwServiceType;
+	DWORD  dwStartType;
+	DWORD  dwErrorControl;
+	LPWSTR lpBinaryPathName;
+	LPWSTR lpLoadOrderGroup;
+	DWORD  dwTagId;
+	LPWSTR lpDependencies;
+	LPWSTR lpServiceStartName;
+	LPWSTR lpDisplayName;
+}
+alias QUERY_SERVICE_CONFIGW* LPQUERY_SERVICE_CONFIGW;
+
+struct QUERY_SERVICE_LOCK_STATUSA {
+	DWORD fIsLocked;
+	LPSTR lpLockOwner;
+	DWORD dwLockDuration;
+}
+alias QUERY_SERVICE_LOCK_STATUSA* LPQUERY_SERVICE_LOCK_STATUSA;
+
+struct QUERY_SERVICE_LOCK_STATUSW {
+	DWORD  fIsLocked;
+	LPWSTR lpLockOwner;
+	DWORD  dwLockDuration;
+}
+alias QUERY_SERVICE_LOCK_STATUSW* LPQUERY_SERVICE_LOCK_STATUSW;
+
+extern (Windows) {
+	alias void function(DWORD, LPSTR*)  LPSERVICE_MAIN_FUNCTIONA;
+	alias void function(DWORD, LPWSTR*) LPSERVICE_MAIN_FUNCTIONW;
+}
+
+struct SERVICE_TABLE_ENTRYA {
+	LPSTR                    lpServiceName;
+	LPSERVICE_MAIN_FUNCTIONA lpServiceProc;
+}
+alias SERVICE_TABLE_ENTRYA* LPSERVICE_TABLE_ENTRYA;
+
+struct SERVICE_TABLE_ENTRYW {
+	LPWSTR                   lpServiceName;
+	LPSERVICE_MAIN_FUNCTIONW lpServiceProc;
+}
+alias SERVICE_TABLE_ENTRYW* LPSERVICE_TABLE_ENTRYW;
+
+alias HANDLE SC_HANDLE;
+alias HANDLE* LPSC_HANDLE;
+alias void* SC_LOCK;
+alias DWORD SERVICE_STATUS_HANDLE;
+
+extern (Windows) {
+	alias void function(DWORD) LPHANDLER_FUNCTION;
+	alias DWORD function(DWORD, DWORD, LPVOID, LPVOID) LPHANDLER_FUNCTION_EX;
+}
+
+static if (_WIN32_WINNT >= 0x500) {
+	struct SERVICE_STATUS_PROCESS {
+		DWORD dwServiceType;
+		DWORD dwCurrentState;
+		DWORD dwControlsAccepted;
+		DWORD dwWin32ExitCode;
+		DWORD dwServiceSpecificExitCode;
+		DWORD dwCheckPoint;
+		DWORD dwWaitHint;
+		DWORD dwProcessId;
+		DWORD dwServiceFlags;
+	}
+	alias SERVICE_STATUS_PROCESS* LPSERVICE_STATUS_PROCESS;
+
+	enum SC_STATUS_TYPE {
+		SC_STATUS_PROCESS_INFO = 0
+	}
+
+	enum SC_ENUM_TYPE {
+		SC_ENUM_PROCESS_INFO = 0
+	}
+
+	struct ENUM_SERVICE_STATUS_PROCESSA {
+		LPSTR                  lpServiceName;
+		LPSTR                  lpDisplayName;
+		SERVICE_STATUS_PROCESS ServiceStatusProcess;
+	}
+	alias ENUM_SERVICE_STATUS_PROCESSA* LPENUM_SERVICE_STATUS_PROCESSA;
+
+	struct ENUM_SERVICE_STATUS_PROCESSW {
+		LPWSTR                 lpServiceName;
+		LPWSTR                 lpDisplayName;
+		SERVICE_STATUS_PROCESS ServiceStatusProcess;
+	}
+	alias ENUM_SERVICE_STATUS_PROCESSW* LPENUM_SERVICE_STATUS_PROCESSW;
+
+	struct SERVICE_DESCRIPTIONA {
+		LPSTR lpDescription;
+	}
+	alias SERVICE_DESCRIPTIONA* LPSERVICE_DESCRIPTIONA;
+
+	struct SERVICE_DESCRIPTIONW {
+		LPWSTR lpDescription;
+	}
+	alias SERVICE_DESCRIPTIONW* LPSERVICE_DESCRIPTIONW;
+
+	enum SC_ACTION_TYPE {
+		SC_ACTION_NONE,
+		SC_ACTION_RESTART,
+		SC_ACTION_REBOOT,
+		SC_ACTION_RUN_COMMAND
+	}
+
+	struct SC_ACTION {
+		SC_ACTION_TYPE Type;
+		DWORD          Delay;
+	}
+	alias SC_ACTION* LPSC_ACTION;
+
+	struct SERVICE_FAILURE_ACTIONSA {
+		DWORD      dwResetPeriod;
+		LPSTR      lpRebootMsg;
+		LPSTR      lpCommand;
+		DWORD      cActions;
+		SC_ACTION* lpsaActions;
+	}
+	alias SERVICE_FAILURE_ACTIONSA* LPSERVICE_FAILURE_ACTIONSA;
+
+	struct SERVICE_FAILURE_ACTIONSW {
+		DWORD      dwResetPeriod;
+		LPWSTR     lpRebootMsg;
+		LPWSTR     lpCommand;
+		DWORD      cActions;
+		SC_ACTION* lpsaActions;
+	}
+	alias SERVICE_FAILURE_ACTIONSW* LPSERVICE_FAILURE_ACTIONSW;
+}
+
+extern (Windows) {
+	BOOL ChangeServiceConfigA(SC_HANDLE, DWORD, DWORD, DWORD, LPCSTR,
+	  LPCSTR, LPDWORD, LPCSTR, LPCSTR, LPCSTR, LPCSTR);
+	BOOL ChangeServiceConfigW(SC_HANDLE, DWORD, DWORD, DWORD, LPCWSTR,
+	  LPCWSTR, LPDWORD, LPCWSTR, LPCWSTR, LPCWSTR, LPCWSTR);
+	BOOL CloseServiceHandle(SC_HANDLE);
+	BOOL ControlService(SC_HANDLE, DWORD, LPSERVICE_STATUS);
+	SC_HANDLE CreateServiceA(SC_HANDLE, LPCSTR, LPCSTR, DWORD, DWORD,
+	  DWORD, DWORD, LPCSTR, LPCSTR, PDWORD, LPCSTR, LPCSTR, LPCSTR);
+	SC_HANDLE CreateServiceW(SC_HANDLE, LPCWSTR, LPCWSTR, DWORD, DWORD,
+	  DWORD, DWORD, LPCWSTR, LPCWSTR, PDWORD, LPCWSTR, LPCWSTR, LPCWSTR);
+	BOOL DeleteService(SC_HANDLE);
+	BOOL EnumDependentServicesA(SC_HANDLE, DWORD, LPENUM_SERVICE_STATUSA,
+	  DWORD, PDWORD, PDWORD);
+	BOOL EnumDependentServicesW(SC_HANDLE, DWORD, LPENUM_SERVICE_STATUSW,
+	  DWORD, PDWORD, PDWORD);
+	BOOL EnumServicesStatusA(SC_HANDLE, DWORD, DWORD, LPENUM_SERVICE_STATUSA,
+	  DWORD, PDWORD, PDWORD, PDWORD);
+	BOOL EnumServicesStatusW(SC_HANDLE, DWORD, DWORD, LPENUM_SERVICE_STATUSW,
+	  DWORD, PDWORD, PDWORD, PDWORD);
+	BOOL GetServiceDisplayNameA(SC_HANDLE, LPCSTR, LPSTR, PDWORD);
+	BOOL GetServiceDisplayNameW(SC_HANDLE, LPCWSTR, LPWSTR, PDWORD);
+	BOOL GetServiceKeyNameA(SC_HANDLE, LPCSTR, LPSTR, PDWORD);
+	BOOL GetServiceKeyNameW(SC_HANDLE, LPCWSTR, LPWSTR, PDWORD);
+	SC_LOCK LockServiceDatabase(SC_HANDLE);
+	BOOL NotifyBootConfigStatus(BOOL);
+	SC_HANDLE OpenSCManagerA(LPCSTR, LPCSTR, DWORD);
+	SC_HANDLE OpenSCManagerW(LPCWSTR, LPCWSTR, DWORD);
+	SC_HANDLE OpenServiceA(SC_HANDLE, LPCSTR, DWORD);
+	SC_HANDLE OpenServiceW(SC_HANDLE, LPCWSTR, DWORD);
+	BOOL QueryServiceConfigA(SC_HANDLE, LPQUERY_SERVICE_CONFIGA, DWORD,
+	  PDWORD);
+	BOOL QueryServiceConfigW(SC_HANDLE, LPQUERY_SERVICE_CONFIGW, DWORD,
+	  PDWORD);
+	BOOL QueryServiceLockStatusA(SC_HANDLE, LPQUERY_SERVICE_LOCK_STATUSA,
+	  DWORD, PDWORD);
+	BOOL QueryServiceLockStatusW(SC_HANDLE, LPQUERY_SERVICE_LOCK_STATUSW,
+	  DWORD, PDWORD);
+	BOOL QueryServiceObjectSecurity(SC_HANDLE, SECURITY_INFORMATION,
+	  PSECURITY_DESCRIPTOR, DWORD, LPDWORD);
+	BOOL QueryServiceStatus(SC_HANDLE, LPSERVICE_STATUS);
+	SERVICE_STATUS_HANDLE RegisterServiceCtrlHandlerA(LPCSTR,
+	  LPHANDLER_FUNCTION);
+	SERVICE_STATUS_HANDLE RegisterServiceCtrlHandlerW(LPCWSTR,
+	  LPHANDLER_FUNCTION);
+	BOOL SetServiceObjectSecurity(SC_HANDLE, SECURITY_INFORMATION,
+	  PSECURITY_DESCRIPTOR);
+	BOOL SetServiceStatus(SERVICE_STATUS_HANDLE, LPSERVICE_STATUS);
+	BOOL StartServiceA(SC_HANDLE, DWORD, LPCSTR*);
+	BOOL StartServiceW(SC_HANDLE, DWORD, LPCWSTR*);
+	BOOL StartServiceCtrlDispatcherA(LPSERVICE_TABLE_ENTRYA);
+	BOOL StartServiceCtrlDispatcherW(LPSERVICE_TABLE_ENTRYW);
+	BOOL UnlockServiceDatabase(SC_LOCK);
+
+	static if (_WIN32_WINNT >= 0x500) {
+		BOOL EnumServicesStatusExA(SC_HANDLE, SC_ENUM_TYPE, DWORD, DWORD, LPBYTE,
+		  DWORD, LPDWORD, LPDWORD, LPDWORD, LPCSTR);
+		BOOL EnumServicesStatusExW(SC_HANDLE, SC_ENUM_TYPE, DWORD, DWORD, LPBYTE,
+		  DWORD, LPDWORD, LPDWORD, LPDWORD, LPCWSTR);
+		BOOL QueryServiceConfig2A(SC_HANDLE, DWORD, LPBYTE, DWORD, LPDWORD);
+		BOOL QueryServiceConfig2W(SC_HANDLE, DWORD, LPBYTE, DWORD, LPDWORD);
+		BOOL QueryServiceStatusEx(SC_HANDLE, SC_STATUS_TYPE, LPBYTE, DWORD,
+		  LPDWORD);
+		SERVICE_STATUS_HANDLE RegisterServiceCtrlHandlerExA(LPCSTR,
+		  LPHANDLER_FUNCTION_EX, LPVOID);
+		SERVICE_STATUS_HANDLE RegisterServiceCtrlHandlerExW(LPCWSTR,
+		  LPHANDLER_FUNCTION_EX, LPVOID);
+	}
+
+	static if (_WIN32_WINNT >= 0x501) {
+		BOOL ChangeServiceConfig2A(SC_HANDLE, DWORD, LPVOID);
+		BOOL ChangeServiceConfig2W(SC_HANDLE, DWORD, LPVOID);
+	}
+}
+
+version (Unicode) {
+	alias ENUM_SERVICE_STATUSW ENUM_SERVICE_STATUS;
+	alias QUERY_SERVICE_CONFIGW QUERY_SERVICE_CONFIG;
+	alias QUERY_SERVICE_LOCK_STATUSW QUERY_SERVICE_LOCK_STATUS;
+	alias LPSERVICE_MAIN_FUNCTIONW LPSERVICE_MAIN_FUNCTION;
+	alias SERVICE_TABLE_ENTRYW SERVICE_TABLE_ENTRY;
+	alias ChangeServiceConfigW ChangeServiceConfig;
+	alias CreateServiceW CreateService;
+	alias EnumDependentServicesW EnumDependentServices;
+	alias EnumServicesStatusW EnumServicesStatus;
+	alias GetServiceDisplayNameW GetServiceDisplayName;
+	alias GetServiceKeyNameW GetServiceKeyName;
+	alias OpenSCManagerW OpenSCManager;
+	alias OpenServiceW OpenService;
+	alias QueryServiceConfigW QueryServiceConfig;
+	alias QueryServiceLockStatusW QueryServiceLockStatus;
+	alias RegisterServiceCtrlHandlerW RegisterServiceCtrlHandler;
+	alias StartServiceW StartService;
+	alias StartServiceCtrlDispatcherW StartServiceCtrlDispatcher;
+
+	static if (_WIN32_WINNT >= 0x500) {
+		alias ENUM_SERVICE_STATUS_PROCESSW ENUM_SERVICE_STATUS_PROCESS;
+		alias SERVICE_DESCRIPTIONW SERVICE_DESCRIPTION;
+		alias SERVICE_FAILURE_ACTIONSW SERVICE_FAILURE_ACTIONS;
+		alias EnumServicesStatusExW EnumServicesStatusEx;
+		alias QueryServiceConfig2W QueryServiceConfig2;
+		alias RegisterServiceCtrlHandlerExW RegisterServiceCtrlHandlerEx;
+	}
+
+	static if (_WIN32_WINNT >= 0x501) {
+		alias ChangeServiceConfig2W ChangeServiceConfig2;
+	}
+
+} else {
+	alias ENUM_SERVICE_STATUSA ENUM_SERVICE_STATUS;
+	alias QUERY_SERVICE_CONFIGA QUERY_SERVICE_CONFIG;
+	alias QUERY_SERVICE_LOCK_STATUSA QUERY_SERVICE_LOCK_STATUS;
+	alias LPSERVICE_MAIN_FUNCTIONA LPSERVICE_MAIN_FUNCTION;
+	alias SERVICE_TABLE_ENTRYA SERVICE_TABLE_ENTRY;
+	alias ChangeServiceConfigA ChangeServiceConfig;
+	alias CreateServiceA CreateService;
+	alias EnumDependentServicesA EnumDependentServices;
+	alias EnumServicesStatusA EnumServicesStatus;
+	alias GetServiceDisplayNameA GetServiceDisplayName;
+	alias GetServiceKeyNameA GetServiceKeyName;
+	alias OpenSCManagerA OpenSCManager;
+	alias OpenServiceA OpenService;
+	alias QueryServiceConfigA QueryServiceConfig;
+	alias QueryServiceLockStatusA QueryServiceLockStatus;
+	alias RegisterServiceCtrlHandlerA RegisterServiceCtrlHandler;
+	alias StartServiceA StartService;
+	alias StartServiceCtrlDispatcherA StartServiceCtrlDispatcher;
+
+	static if (_WIN32_WINNT >= 0x500) {
+		alias ENUM_SERVICE_STATUS_PROCESSA ENUM_SERVICE_STATUS_PROCESS;
+		alias SERVICE_DESCRIPTIONA SERVICE_DESCRIPTION;
+		alias SERVICE_FAILURE_ACTIONSA SERVICE_FAILURE_ACTIONS;
+		alias EnumServicesStatusExA EnumServicesStatusEx;
+		alias QueryServiceConfig2A QueryServiceConfig2;
+		alias RegisterServiceCtrlHandlerExA RegisterServiceCtrlHandlerEx;
+	}
+
+	static if (_WIN32_WINNT >= 0x501) {
+		alias ChangeServiceConfig2A ChangeServiceConfig2;
+	}
+
+}
+
+alias ENUM_SERVICE_STATUS* LPENUM_SERVICE_STATUS;
+alias QUERY_SERVICE_CONFIG* LPQUERY_SERVICE_CONFIG;
+alias QUERY_SERVICE_LOCK_STATUS* LPQUERY_SERVICE_LOCK_STATUS;
+alias SERVICE_TABLE_ENTRY* LPSERVICE_TABLE_ENTRY;
+
+static if (_WIN32_WINNT >= 0x500) {
+	alias ENUM_SERVICE_STATUS_PROCESS* LPENUM_SERVICE_STATUS_PROCESS;
+	alias SERVICE_DESCRIPTION* LPSERVICE_DESCRIPTION;
+	alias SERVICE_FAILURE_ACTIONS* LPSERVICE_FAILURE_ACTIONS;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/winuser.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,4766 @@
+/***********************************************************************\
+*                               winuser.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.winuser;
+pragma(lib, "user32.lib");
+
+// Conversion Notes:
+// The following macros were for win16 only, and are not included in this file:
+//#define EnumTaskWindows(h, f, p) EnumThreadWindows((DWORD)h, f, p)
+//#define PostAppMessageA(t, m, w, l) PostThreadMessageA((DWORD)t, m, w, l)
+//#define PostAppMessageW(t, m, w, l) PostThreadMessageW((DWORD)t, m, w, l)
+//#define GetSysModalWindow() (NULL)
+//#define SetSysModalWindow(h) (NULL)
+//#define GetWindowTask(hWnd) ((HANDLE)GetWindowThreadProcessId(hWnd, NULL))
+//#define DefHookProc(c, p, lp, h) CallNextHookEx((HHOOK)*h, c, p, lp)
+
+private import win32.w32api, win32.winbase, win32.wingdi;
+private import win32.windef; // for HMONITOR
+
+// FIXME: clean up Windows version support
+
+template MAKEINTATOM_T(int i) {
+	const LPTSTR MAKEINTATOM_T = cast(LPTSTR) i;
+}
+
+const WC_DIALOG = MAKEINTATOM_T!(0x8002);
+
+const FVIRTKEY  = 1;
+const FNOINVERT = 2;
+const FSHIFT    = 4;
+const FCONTROL  = 8;
+const FALT      = 16;
+
+const ATF_TIMEOUTON     = 1;
+const ATF_ONOFFFEEDBACK = 2;
+const ATF_AVAILABLE     = 4; // May be obsolete. Not in recent MS docs.
+
+const WH_MIN             = -1;
+const WH_MSGFILTER       =  -1;
+const WH_JOURNALRECORD   = 0;
+const WH_JOURNALPLAYBACK = 1;
+const WH_KEYBOARD        = 2;
+const WH_GETMESSAGE      = 3;
+const WH_CALLWNDPROC     = 4;
+const WH_CBT             = 5;
+const WH_SYSMSGFILTER    = 6;
+const WH_MOUSE           = 7;
+const WH_HARDWARE        = 8;
+const WH_DEBUG           = 9;
+const WH_SHELL           = 10;
+const WH_FOREGROUNDIDLE  = 11;
+const WH_CALLWNDPROCRET  = 12;
+const WH_KEYBOARD_LL     = 13;
+const WH_MOUSE_LL        = 14;
+const WH_MAX             = 14;
+const WH_MINHOOK         = WH_MIN;
+const WH_MAXHOOK         = WH_MAX;
+
+enum {
+	HC_ACTION = 0,
+	HC_GETNEXT,
+	HC_SKIP,
+	HC_NOREMOVE, // = 3
+	HC_NOREM = HC_NOREMOVE,
+	HC_SYSMODALON,
+	HC_SYSMODALOFF
+}
+
+enum {
+	HCBT_MOVESIZE = 0,
+	HCBT_MINMAX,
+	HCBT_QS,
+	HCBT_CREATEWND,
+	HCBT_DESTROYWND,
+	HCBT_ACTIVATE,
+	HCBT_CLICKSKIPPED,
+	HCBT_KEYSKIPPED,
+	HCBT_SYSCOMMAND,
+	HCBT_SETFOCUS // = 9
+}
+
+enum {
+	CF_TEXT = 1,
+	CF_BITMAP,
+	CF_METAFILEPICT,
+	CF_SYLK,
+	CF_DIF,
+	CF_TIFF,
+	CF_OEMTEXT,
+	CF_DIB,
+	CF_PALETTE,
+	CF_PENDATA,
+	CF_RIFF,
+	CF_WAVE,
+	CF_UNICODETEXT,
+	CF_ENHMETAFILE,
+	CF_HDROP,
+	CF_LOCALE,
+	CF_MAX, // = 17
+	CF_OWNERDISPLAY   = 128,
+	CF_DSPTEXT,
+	CF_DSPBITMAP,
+	CF_DSPMETAFILEPICT, // = 131
+	CF_DSPENHMETAFILE = 142,
+	CF_PRIVATEFIRST   = 512,
+	CF_PRIVATELAST    = 767,
+	CF_GDIOBJFIRST    = 768,
+	CF_GDIOBJLAST     = 1023
+}
+
+const HKL_PREV = 0;
+const HKL_NEXT = 1;
+
+const KLF_ACTIVATE       = 1;
+const KLF_SUBSTITUTE_OK  = 2;
+const KLF_UNLOADPREVIOUS = 4;
+const KLF_REORDER        = 8;
+const KLF_REPLACELANG    = 16;
+const KLF_NOTELLSHELL    = 128;
+const KLF_SETFORPROCESS  = 256;
+const KL_NAMELENGTH      = 9;
+
+const MF_ENABLED = 0;
+const MF_GRAYED = 1;
+const MF_DISABLED = 2;
+const MF_BITMAP = 4;
+const MF_CHECKED = 8;
+const MF_MENUBARBREAK = 32;
+const MF_MENUBREAK = 64;
+const MF_OWNERDRAW = 256;
+const MF_POPUP = 16;
+const MF_SEPARATOR = 0x800;
+const MF_STRING = 0;
+const MF_UNCHECKED = 0;
+const MF_DEFAULT = 4096;
+const MF_SYSMENU = 0x2000;
+const MF_HELP = 0x4000;
+const MF_END = 128;
+const MF_RIGHTJUSTIFY = 0x4000;
+const MF_MOUSESELECT = 0x8000;
+const MF_INSERT = 0;
+const MF_CHANGE = 128;
+const MF_APPEND = 256;
+const MF_DELETE = 512;
+const MF_REMOVE = 4096;
+const MF_USECHECKBITMAPS = 512;
+const MF_UNHILITE = 0;
+const MF_HILITE = 128;
+
+// Also defined in dbt.h
+const BSM_ALLCOMPONENTS      = 0;
+const BSM_VXDS               = 1;
+const BSM_NETDRIVER          = 2;
+const BSM_INSTALLABLEDRIVERS = 4;
+const BSM_APPLICATIONS       = 8;
+const BSM_ALLDESKTOPS        = 16;
+
+const BSF_QUERY              = 0x00000001;
+const BSF_IGNORECURRENTTASK  = 0x00000002;
+const BSF_FLUSHDISK          = 0x00000004;
+const BSF_NOHANG             = 0x00000008;
+const BSF_POSTMESSAGE        = 0x00000010;
+const BSF_FORCEIFHUNG        = 0x00000020;
+const BSF_NOTIMEOUTIFNOTHUNG = 0x00000040;
+
+static if (_WIN32_WINNT >= 0x500) {
+	const BSF_ALLOWSFW          = 0x00000080;
+	const BSF_SENDNOTIFYMESSAGE = 0x00000100;
+}
+static if (_WIN32_WINNT >= 0x501) {
+	const BSF_RETURNHDESK       = 0x00000200;
+	const BSF_LUID              = 0x00000400;
+}
+
+const BROADCAST_QUERY_DENY = 1112363332;
+const DWORD ENUM_CURRENT_SETTINGS  = -1;
+const DWORD ENUM_REGISTRY_SETTINGS = -2;
+
+const CDS_UPDATEREGISTRY = 1;
+const CDS_TEST           = 2;
+const CDS_FULLSCREEN     = 4;
+const CDS_GLOBAL         = 8;
+const CDS_SET_PRIMARY    = 16;
+const CDS_NORESET        = 0x10000000;
+const CDS_SETRECT        = 0x20000000;
+const CDS_RESET          = 0x40000000;
+
+const DISP_CHANGE_RESTART    = 1;
+const DISP_CHANGE_SUCCESSFUL = 0;
+const DISP_CHANGE_FAILED     = -1;
+const DISP_CHANGE_BADMODE    = -2;
+const DISP_CHANGE_NOTUPDATED = -3;
+const DISP_CHANGE_BADFLAGS   = -4;
+const DISP_CHANGE_BADPARAM   = -5;
+
+const BST_UNCHECKED     = 0;
+const BST_CHECKED       = 1;
+const BST_INDETERMINATE = 2;
+const BST_PUSHED        = 4;
+const BST_FOCUS         = 8;
+
+const MF_BYCOMMAND  = 0;
+const MF_BYPOSITION = 1024;
+// [Redefined] MF_UNCHECKED=0
+// [Redefined] MF_HILITE=128
+// [Redefined] MF_UNHILITE=0
+
+const CWP_ALL             = 0;
+const CWP_SKIPINVISIBLE   = 1;
+const CWP_SKIPDISABLED    = 2;
+const CWP_SKIPTRANSPARENT = 4;
+
+const IMAGE_BITMAP=0;
+const IMAGE_ICON=1;
+const IMAGE_CURSOR=2;
+const IMAGE_ENHMETAFILE=3;
+
+const DF_ALLOWOTHERACCOUNTHOOK = 1;
+
+const DESKTOP_READOBJECTS     = 1;
+const DESKTOP_CREATEWINDOW    = 2;
+const DESKTOP_CREATEMENU      = 4;
+const DESKTOP_HOOKCONTROL     = 8;
+const DESKTOP_JOURNALRECORD   = 16;
+const DESKTOP_JOURNALPLAYBACK = 32;
+const DESKTOP_ENUMERATE       = 64;
+const DESKTOP_WRITEOBJECTS    = 128;
+const DESKTOP_SWITCHDESKTOP   = 256;
+
+const CW_USEDEFAULT       = 0x80000000;
+
+enum {
+	WS_OVERLAPPED       = 0,
+	WS_TILED            = WS_OVERLAPPED,
+	WS_MAXIMIZEBOX      = 0x00010000,
+	WS_MINIMIZEBOX      = 0x00020000,
+	WS_TABSTOP          = 0x00010000,
+	WS_GROUP            = 0x00020000,
+	WS_THICKFRAME       = 0x00040000,
+	WS_SIZEBOX          = WS_THICKFRAME,
+	WS_SYSMENU          = 0x00080000,
+	WS_HSCROLL          = 0x00100000,
+	WS_VSCROLL          = 0x00200000,
+	WS_DLGFRAME         = 0x00400000,
+	WS_BORDER           = 0x00800000,
+	WS_CAPTION          = 0x00c00000,
+	WS_OVERLAPPEDWINDOW = WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX,
+	WS_TILEDWINDOW      = WS_OVERLAPPEDWINDOW,
+	WS_MAXIMIZE         = 0x01000000,
+	WS_CLIPCHILDREN     = 0x02000000,
+	WS_CLIPSIBLINGS     = 0x04000000,
+	WS_DISABLED         = 0x08000000,
+	WS_VISIBLE          = 0x10000000,
+	WS_MINIMIZE         = 0x20000000,
+	WS_ICONIC           = WS_MINIMIZE,
+	WS_CHILD            = 0x40000000,
+	WS_CHILDWINDOW      = 0x40000000,
+	WS_POPUP            = 0x80000000,
+	WS_POPUPWINDOW      = WS_POPUP|WS_BORDER|WS_SYSMENU,
+}
+
+const MDIS_ALLCHILDSTYLES = 1;
+
+const BS_3STATE = 5;
+const BS_AUTO3STATE = 6;
+const BS_AUTOCHECKBOX = 3;
+const BS_AUTORADIOBUTTON = 9;
+const BS_BITMAP = 128;
+const BS_BOTTOM = 0x800;
+const BS_CENTER = 0x300;
+const BS_CHECKBOX = 2;
+const BS_DEFPUSHBUTTON = 1;
+const BS_GROUPBOX = 7;
+const BS_ICON = 64;
+const BS_LEFT = 256;
+const BS_LEFTTEXT = 32;
+const BS_MULTILINE = 0x2000;
+const BS_NOTIFY = 0x4000;
+const BS_OWNERDRAW = 0xb;
+const BS_PUSHBUTTON = 0;
+const BS_PUSHLIKE = 4096;
+const BS_RADIOBUTTON = 4;
+const BS_RIGHT = 512;
+const BS_RIGHTBUTTON = 32;
+const BS_TEXT = 0;
+const BS_TOP = 0x400;
+const BS_USERBUTTON = 8;
+const BS_VCENTER = 0xc00;
+const BS_FLAT = 0x8000;
+
+const CBS_AUTOHSCROLL = 64;
+const CBS_DISABLENOSCROLL = 0x800;
+const CBS_DROPDOWN = 2;
+const CBS_DROPDOWNLIST = 3;
+const CBS_HASSTRINGS = 512;
+const CBS_LOWERCASE = 0x4000;
+const CBS_NOINTEGRALHEIGHT = 0x400;
+const CBS_OEMCONVERT = 128;
+const CBS_OWNERDRAWFIXED = 16;
+const CBS_OWNERDRAWVARIABLE = 32;
+const CBS_SIMPLE = 1;
+const CBS_SORT = 256;
+const CBS_UPPERCASE = 0x2000;
+
+const ES_AUTOHSCROLL = 128;
+const ES_AUTOVSCROLL = 64;
+const ES_CENTER = 1;
+const ES_LEFT = 0;
+const ES_LOWERCASE = 16;
+const ES_MULTILINE = 4;
+const ES_NOHIDESEL = 256;
+const ES_NUMBER = 0x2000;
+const ES_OEMCONVERT = 0x400;
+const ES_PASSWORD = 32;
+const ES_READONLY = 0x800;
+const ES_RIGHT = 2;
+const ES_UPPERCASE = 8;
+const ES_WANTRETURN = 4096;
+
+const LBS_DISABLENOSCROLL = 4096;
+const LBS_EXTENDEDSEL = 0x800;
+const LBS_HASSTRINGS = 64;
+const LBS_MULTICOLUMN = 512;
+const LBS_MULTIPLESEL = 8;
+const LBS_NODATA = 0x2000;
+const LBS_NOINTEGRALHEIGHT = 256;
+const LBS_NOREDRAW = 4;
+const LBS_NOSEL = 0x4000;
+const LBS_NOTIFY = 1;
+const LBS_OWNERDRAWFIXED = 16;
+const LBS_OWNERDRAWVARIABLE = 32;
+const LBS_SORT = 2;
+const LBS_STANDARD = 0xa00003;
+const LBS_USETABSTOPS = 128;
+const LBS_WANTKEYBOARDINPUT = 0x400;
+
+const SBS_BOTTOMALIGN = 4;
+const SBS_HORZ = 0;
+const SBS_LEFTALIGN = 2;
+const SBS_RIGHTALIGN = 4;
+const SBS_SIZEBOX = 8;
+const SBS_SIZEBOXBOTTOMRIGHTALIGN = 4;
+const SBS_SIZEBOXTOPLEFTALIGN = 2;
+const SBS_SIZEGRIP = 16;
+const SBS_TOPALIGN = 2;
+const SBS_VERT = 1;
+
+const SS_BITMAP = 14;
+const SS_BLACKFRAME = 7;
+const SS_BLACKRECT = 4;
+const SS_CENTER = 1;
+const SS_CENTERIMAGE = 512;
+const SS_ENHMETAFILE = 15;
+const SS_ETCHEDFRAME = 18;
+const SS_ETCHEDHORZ = 16;
+const SS_ETCHEDVERT = 17;
+const SS_GRAYFRAME = 8;
+const SS_GRAYRECT = 5;
+const SS_ICON = 3;
+const SS_LEFT = 0;
+const SS_LEFTNOWORDWRAP = 0xc;
+const SS_NOPREFIX = 128;
+const SS_NOTIFY = 256;
+const SS_OWNERDRAW = 0xd;
+const SS_REALSIZEIMAGE = 0x800;
+const SS_RIGHT = 2;
+const SS_RIGHTJUST = 0x400;
+const SS_SIMPLE = 11;
+const SS_SUNKEN = 4096;
+const SS_WHITEFRAME = 9;
+const SS_WHITERECT = 6;
+const SS_USERITEM = 10;
+const SS_TYPEMASK = 0x0000001FL;
+const SS_ENDELLIPSIS = 0x00004000L;
+const SS_PATHELLIPSIS = 0x00008000L;
+const SS_WORDELLIPSIS = 0x0000C000L;
+const SS_ELLIPSISMASK = 0x0000C000L;
+
+const DS_ABSALIGN      = 0x0001;
+const DS_3DLOOK        = 0x0004;
+const DS_SYSMODAL      = 0x0002;
+const DS_FIXEDSYS      = 0x0008;
+const DS_NOFAILCREATE  = 0x0010;
+const DS_LOCALEDIT     = 0x0020;
+const DS_SETFONT       = 0x0040;
+const DS_MODALFRAME    = 0x0080;
+const DS_NOIDLEMSG     = 0x0100;
+const DS_SETFOREGROUND = 0x0200;
+const DS_CONTROL       = 0x0400;
+const DS_CENTER        = 0x0800;
+const DS_CENTERMOUSE   = 0x1000;
+const DS_CONTEXTHELP   = 0x2000;
+const DS_SHELLFONT     = DS_SETFONT | DS_FIXEDSYS;
+
+const WS_EX_ACCEPTFILES = 16;
+const WS_EX_APPWINDOW = 0x40000;
+const WS_EX_CLIENTEDGE = 512;
+const WS_EX_COMPOSITED = 0x2000000;  // XP
+const WS_EX_CONTEXTHELP = 0x400;
+const WS_EX_CONTROLPARENT = 0x10000;
+const WS_EX_DLGMODALFRAME = 1;
+const WS_EX_LAYERED = 0x80000;  // w2k
+const WS_EX_LAYOUTRTL = 0x400000;  // w98, w2k
+const WS_EX_LEFT = 0;
+const WS_EX_LEFTSCROLLBAR = 0x4000;
+const WS_EX_LTRREADING = 0;
+const WS_EX_MDICHILD = 64;
+const WS_EX_NOACTIVATE = 0x8000000;  // w2k
+const WS_EX_NOINHERITLAYOUT = 0x100000;  // w2k
+const WS_EX_NOPARENTNOTIFY = 4;
+const WS_EX_OVERLAPPEDWINDOW = 0x300;
+const WS_EX_PALETTEWINDOW = 0x188;
+const WS_EX_RIGHT = 0x1000;
+const WS_EX_RIGHTSCROLLBAR = 0;
+const WS_EX_RTLREADING = 0x2000;
+const WS_EX_STATICEDGE = 0x20000;
+const WS_EX_TOOLWINDOW = 128;
+const WS_EX_TOPMOST = 8;
+const WS_EX_TRANSPARENT = 32;
+const WS_EX_WINDOWEDGE = 256;
+
+const WINSTA_ENUMDESKTOPS      = 1;
+const WINSTA_READATTRIBUTES    = 2;
+const WINSTA_ACCESSCLIPBOARD   = 4;
+const WINSTA_CREATEDESKTOP     = 8;
+const WINSTA_WRITEATTRIBUTES   = 16;
+const WINSTA_ACCESSGLOBALATOMS = 32;
+const WINSTA_EXITWINDOWS       = 64;
+const WINSTA_ENUMERATE         = 256;
+const WINSTA_READSCREEN        = 512;
+
+const DDL_READWRITE = 0;
+const DDL_READONLY  = 1;
+const DDL_HIDDEN    = 2;
+const DDL_SYSTEM    = 4;
+const DDL_DIRECTORY = 16;
+const DDL_ARCHIVE   = 32;
+const DDL_POSTMSGS  = 8192;
+const DDL_DRIVES    = 16384;
+const DDL_EXCLUSIVE = 32768;
+
+const DC_ACTIVE   = 0x00000001;
+const DC_SMALLCAP = 0x00000002;
+const DC_ICON     = 0x00000004;
+const DC_TEXT     = 0x00000008;
+const DC_INBUTTON = 0x00000010;
+
+static if (WINVER >= 0x500) {
+const DC_GRADIENT=0x00000020;
+}
+static if (_WIN32_WINNT >= 0x501) {
+const DC_BUTTONS=0x00001000;
+}
+
+// Where are these documented?
+//const DC_CAPTION = DC_ICON|DC_TEXT|DC_BUTTONS;
+//const DC_NC      = DC_CAPTION|DC_FRAME;
+
+const BDR_RAISEDOUTER = 1;
+const BDR_SUNKENOUTER = 2;
+const BDR_RAISEDINNER = 4;
+const BDR_SUNKENINNER = 8;
+const BDR_OUTER       = 3;
+const BDR_INNER       = 0xc;
+const BDR_RAISED      = 5;
+const BDR_SUNKEN      = 10;
+
+const EDGE_RAISED = BDR_RAISEDOUTER|BDR_RAISEDINNER;
+const EDGE_SUNKEN = BDR_SUNKENOUTER|BDR_SUNKENINNER;
+const EDGE_ETCHED = BDR_SUNKENOUTER|BDR_RAISEDINNER;
+const EDGE_BUMP   = BDR_RAISEDOUTER|BDR_SUNKENINNER;
+
+const BF_LEFT                    = 1;
+const BF_TOP                     = 2;
+const BF_RIGHT                   = 4;
+const BF_BOTTOM                  = 8;
+const BF_TOPLEFT                 = BF_TOP|BF_LEFT;
+const BF_TOPRIGHT                = BF_TOP|BF_RIGHT;
+const BF_BOTTOMLEFT              = BF_BOTTOM|BF_LEFT;
+const BF_BOTTOMRIGHT             = BF_BOTTOM|BF_RIGHT;
+const BF_RECT                    = BF_LEFT|BF_TOP|BF_RIGHT|BF_BOTTOM ;
+const BF_DIAGONAL                = 16;
+const BF_DIAGONAL_ENDTOPRIGHT    = BF_DIAGONAL|BF_TOP|BF_RIGHT;
+const BF_DIAGONAL_ENDTOPLEFT     = BF_DIAGONAL|BF_TOP|BF_LEFT;
+const BF_DIAGONAL_ENDBOTTOMLEFT  = BF_DIAGONAL|BF_BOTTOM|BF_LEFT;
+const BF_DIAGONAL_ENDBOTTOMRIGHT = BF_DIAGONAL|BF_BOTTOM|BF_RIGHT;
+const BF_MIDDLE                  = 0x800;
+const BF_SOFT                    = 0x1000;
+const BF_ADJUST                  = 0x2000;
+const BF_FLAT                    = 0x4000;
+const BF_MONO                    = 0x8000;
+
+const DFC_CAPTION=1;
+const DFC_MENU=2;
+const DFC_SCROLL=3;
+const DFC_BUTTON=4;
+static if (WINVER >= 0x500) {
+const DFC_POPUPMENU=5;
+}// WINVER >= 0x500
+
+const DFCS_CAPTIONCLOSE   = 0;
+const DFCS_CAPTIONMIN     = 1;
+const DFCS_CAPTIONMAX     = 2;
+const DFCS_CAPTIONRESTORE = 3;
+const DFCS_CAPTIONHELP    = 4;
+
+const DFCS_MENUARROW      = 0;
+const DFCS_MENUCHECK      = 1;
+const DFCS_MENUBULLET     = 2;
+const DFCS_MENUARROWRIGHT = 4;
+
+const DFCS_SCROLLUP            = 0;
+const DFCS_SCROLLDOWN          = 1;
+const DFCS_SCROLLLEFT          = 2;
+const DFCS_SCROLLRIGHT         = 3;
+const DFCS_SCROLLCOMBOBOX      = 5;
+const DFCS_SCROLLSIZEGRIP      = 8;
+const DFCS_SCROLLSIZEGRIPRIGHT = 16;
+
+const DFCS_BUTTONCHECK         = 0;
+const DFCS_BUTTONRADIOIMAGE    = 1;
+const DFCS_BUTTONRADIOMASK     = 2;
+const DFCS_BUTTONRADIO         = 4;
+const DFCS_BUTTON3STATE        = 8;
+const DFCS_BUTTONPUSH          = 16;
+const DFCS_INACTIVE            = 256;
+const DFCS_PUSHED              = 512;
+const DFCS_CHECKED             = 1024;
+static if (WINVER >= 0x500) {
+const DFCS_TRANSPARENT         = 0x800;
+const DFCS_HOT                 = 0x1000;
+}
+const DFCS_ADJUSTRECT          = 0x2000;
+const DFCS_FLAT                = 0x4000;
+const DFCS_MONO                = 0x8000;
+
+enum {
+	DST_COMPLEX = 0,
+	DST_TEXT,
+	DST_PREFIXTEXT,
+	DST_ICON,
+	DST_BITMAP // = 4
+}
+
+const DSS_NORMAL = 0;
+const DSS_UNION = 16;
+const DSS_DISABLED = 32;
+const DSS_MONO = 128;
+const DSS_RIGHT = 0x8000;
+
+const DT_BOTTOM = 8;
+const DT_CALCRECT = 1024;
+const DT_CENTER = 1;
+const DT_EDITCONTROL = 8192;
+const DT_END_ELLIPSIS = 32768;
+const DT_PATH_ELLIPSIS = 16384;
+const DT_WORD_ELLIPSIS = 0x40000;
+const DT_EXPANDTABS = 64;
+const DT_EXTERNALLEADING = 512;
+const DT_LEFT = 0;
+const DT_MODIFYSTRING = 65536;
+const DT_NOCLIP = 256;
+const DT_NOPREFIX = 2048;
+const DT_RIGHT = 2;
+const DT_RTLREADING = 131072;
+const DT_SINGLELINE = 32;
+const DT_TABSTOP = 128;
+const DT_TOP = 0;
+const DT_VCENTER = 4;
+const DT_WORDBREAK = 16;
+const DT_INTERNAL = 4096;
+
+const WB_ISDELIMITER = 2;
+const WB_LEFT = 0;
+const WB_RIGHT = 1;
+
+const SB_HORZ = 0;
+const SB_VERT = 1;
+const SB_CTL = 2;
+const SB_BOTH = 3;
+
+const ESB_DISABLE_BOTH = 3;
+const ESB_DISABLE_DOWN = 2;
+const ESB_DISABLE_LEFT = 1;
+const ESB_DISABLE_LTUP = 1;
+const ESB_DISABLE_RIGHT = 2;
+const ESB_DISABLE_RTDN = 2;
+const ESB_DISABLE_UP = 1;
+const ESB_ENABLE_BOTH = 0;
+
+const SB_LINEUP = 0;
+const SB_LINEDOWN = 1;
+const SB_LINELEFT = 0;
+const SB_LINERIGHT = 1;
+const SB_PAGEUP = 2;
+const SB_PAGEDOWN = 3;
+const SB_PAGELEFT = 2;
+const SB_PAGERIGHT = 3;
+const SB_THUMBPOSITION = 4;
+const SB_THUMBTRACK = 5;
+const SB_ENDSCROLL = 8;
+const SB_LEFT = 6;
+const SB_RIGHT = 7;
+const SB_BOTTOM = 7;
+const SB_TOP = 6;
+
+//MACRO #define IS_INTRESOURCE(i) (((ULONG_PTR)(i) >> 16) == 0)
+
+template MAKEINTRESOURCE_T (WORD i)
+{
+	const LPTSTR MAKEINTRESOURCE_T = cast(LPTSTR)(i);
+}
+
+LPSTR MAKEINTRESOURCEA(WORD i)
+{
+	return cast(LPSTR)(i);
+}
+
+LPWSTR MAKEINTRESOURCEW(WORD i)
+{
+	return cast(LPWSTR)(i);
+}
+
+const RT_CURSOR       = MAKEINTRESOURCE_T!(1);
+const RT_BITMAP       = MAKEINTRESOURCE_T!(2);
+const RT_ICON         = MAKEINTRESOURCE_T!(3);
+const RT_MENU         = MAKEINTRESOURCE_T!(4);
+const RT_DIALOG       = MAKEINTRESOURCE_T!(5);
+const RT_STRING       = MAKEINTRESOURCE_T!(6);
+const RT_FONTDIR      = MAKEINTRESOURCE_T!(7);
+const RT_FONT         = MAKEINTRESOURCE_T!(8);
+const RT_ACCELERATOR  = MAKEINTRESOURCE_T!(9);
+const RT_RCDATA       = MAKEINTRESOURCE_T!(10);
+const RT_MESSAGETABLE = MAKEINTRESOURCE_T!(11);
+
+const RT_GROUP_CURSOR = MAKEINTRESOURCE_T!(12);
+const RT_GROUP_ICON   = MAKEINTRESOURCE_T!(14);
+const RT_VERSION      = MAKEINTRESOURCE_T!(16);
+const RT_DLGINCLUDE   = MAKEINTRESOURCE_T!(17);
+const RT_PLUGPLAY     = MAKEINTRESOURCE_T!(19);
+const RT_VXD          = MAKEINTRESOURCE_T!(20);
+const RT_ANICURSOR    = MAKEINTRESOURCE_T!(21);
+const RT_ANIICON      = MAKEINTRESOURCE_T!(22);
+const RT_HTML         = MAKEINTRESOURCE_T!(23);
+const RT_MANIFEST     = MAKEINTRESOURCE_T!(24);
+
+const CREATEPROCESS_MANIFEST_RESOURCE_ID                 = MAKEINTRESOURCE_T!(1);
+const ISOLATIONAWARE_MANIFEST_RESOURCE_ID                = MAKEINTRESOURCE_T!(2);
+const ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID = MAKEINTRESOURCE_T!(3);
+
+const EWX_LOGOFF   = 0;
+const EWX_SHUTDOWN = 1;
+const EWX_REBOOT   = 2;
+const EWX_FORCE    = 4;
+const EWX_POWEROFF = 8;
+static if (_WIN32_WINNT >= 0x500) {
+const EWX_FORCEIFHUNG = 16;
+}
+
+const CS_BYTEALIGNCLIENT = 4096;
+const CS_BYTEALIGNWINDOW = 8192;
+const CS_KEYCVTWINDOW = 4;
+const CS_NOKEYCVT = 256;
+const CS_CLASSDC = 64;
+const CS_DBLCLKS = 8;
+const CS_GLOBALCLASS = 16384;
+const CS_HREDRAW = 2;
+const CS_NOCLOSE = 512;
+const CS_OWNDC = 32;
+const CS_PARENTDC = 128;
+const CS_SAVEBITS = 2048;
+const CS_VREDRAW = 1;
+const CS_IME = 0x10000;
+
+const GCW_ATOM = -32;
+const GCL_CBCLSEXTRA = -20;
+const GCL_CBWNDEXTRA = -18;
+const GCL_HBRBACKGROUND = -10;
+const GCL_HCURSOR = -12;
+const GCL_HICON = -14;
+const GCL_HICONSM = -34;
+const GCL_HMODULE = -16;
+const GCL_MENUNAME = -8;
+const GCL_STYLE = -26;
+const GCL_WNDPROC = -24;
+
+alias GCL_HICONSM GCLP_HICONSM;
+alias GCL_HICON GCLP_HICON;
+alias GCL_HCURSOR GCLP_HCURSOR;
+alias GCL_HBRBACKGROUND GCLP_HBRBACKGROUND;
+alias GCL_HMODULE  GCLP_HMODULE;
+alias GCL_MENUNAME GCLP_MENUNAME;
+alias GCL_WNDPROC  GCLP_WNDPROC;
+
+const IDC_ARROW       = MAKEINTRESOURCE_T!(32512);
+const IDC_IBEAM       = MAKEINTRESOURCE_T!(32513);
+const IDC_WAIT        = MAKEINTRESOURCE_T!(32514);
+const IDC_CROSS       = MAKEINTRESOURCE_T!(32515);
+const IDC_UPARROW     = MAKEINTRESOURCE_T!(32516);
+const IDC_SIZENWSE    = MAKEINTRESOURCE_T!(32642);
+const IDC_SIZENESW    = MAKEINTRESOURCE_T!(32643);
+const IDC_SIZEWE      = MAKEINTRESOURCE_T!(32644);
+const IDC_SIZENS      = MAKEINTRESOURCE_T!(32645);
+const IDC_SIZEALL     = MAKEINTRESOURCE_T!(32646);
+const IDC_NO          = MAKEINTRESOURCE_T!(32648);
+const IDC_HAND        = MAKEINTRESOURCE_T!(32649);
+const IDC_APPSTARTING = MAKEINTRESOURCE_T!(32650);
+const IDC_HELP        = MAKEINTRESOURCE_T!(32651);
+const IDC_ICON        = MAKEINTRESOURCE_T!(32641);
+const IDC_SIZE        = MAKEINTRESOURCE_T!(32640);
+const IDI_APPLICATION = MAKEINTRESOURCE_T!(32512);
+const IDI_HAND        = MAKEINTRESOURCE_T!(32513);
+const IDI_QUESTION    = MAKEINTRESOURCE_T!(32514);
+const IDI_EXCLAMATION = MAKEINTRESOURCE_T!(32515);
+const IDI_ASTERISK    = MAKEINTRESOURCE_T!(32516);
+const IDI_WINLOGO     = MAKEINTRESOURCE_T!(32517);
+const IDI_WARNING     = IDI_EXCLAMATION;
+const IDI_ERROR       = IDI_HAND;
+const IDI_INFORMATION = IDI_ASTERISK;
+
+const MIIM_STATE = 1;
+const MIIM_ID = 2;
+const MIIM_SUBMENU = 4;
+const MIIM_CHECKMARKS = 8;
+const MIIM_TYPE = 16;
+const MIIM_DATA = 32;
+const MIIM_STRING = 64;
+const MIIM_BITMAP = 128;
+const MIIM_FTYPE = 256;
+
+static if (WINVER >= 0x500) {
+
+const MIM_MAXHEIGHT = 1;
+const MIM_BACKGROUND = 2;
+const MIM_HELPID = 4;
+const MIM_MENUDATA = 8;
+const MIM_STYLE = 16;
+const MIM_APPLYTOSUBMENUS = 0x80000000L;
+
+const MNS_NOCHECK = 0x80000000;
+const MNS_MODELESS = 0x40000000;
+const MNS_DRAGDROP = 0x20000000;
+const MNS_AUTODISMISS = 0x10000000;
+const MNS_NOTIFYBYPOS = 0x08000000;
+const MNS_CHECKORBMP = 0x04000000;
+
+}
+
+const MFT_BITMAP = 4;
+const MFT_MENUBARBREAK = 32;
+const MFT_MENUBREAK = 64;
+const MFT_OWNERDRAW = 256;
+const MFT_RADIOCHECK = 512;
+const MFT_RIGHTJUSTIFY = 0x4000;
+const MFT_SEPARATOR = 0x800;
+const MFT_RIGHTORDER = 0x2000L;
+const MFT_STRING = 0;
+
+const MFS_CHECKED = 8;
+const MFS_DEFAULT = 4096;
+const MFS_DISABLED = 3;
+const MFS_ENABLED = 0;
+const MFS_GRAYED = 3;
+const MFS_HILITE = 128;
+const MFS_UNCHECKED = 0;
+const MFS_UNHILITE = 0;
+
+const GW_HWNDNEXT = 2;
+const GW_HWNDPREV = 3;
+const GW_CHILD = 5;
+const GW_HWNDFIRST = 0;
+const GW_HWNDLAST = 1;
+const GW_OWNER = 4;
+
+const SW_HIDE = 0;
+const SW_NORMAL = 1;
+const SW_SHOWNORMAL = 1;
+const SW_SHOWMINIMIZED = 2;
+const SW_MAXIMIZE = 3;
+const SW_SHOWMAXIMIZED = 3;
+const SW_SHOWNOACTIVATE = 4;
+const SW_SHOW = 5;
+const SW_MINIMIZE = 6;
+const SW_SHOWMINNOACTIVE = 7;
+const SW_SHOWNA = 8;
+const SW_RESTORE = 9;
+const SW_SHOWDEFAULT = 10;
+const SW_FORCEMINIMIZE = 11;
+const SW_MAX = 11;
+
+const MB_USERICON = 128;
+const MB_ICONASTERISK = 64;
+const MB_ICONEXCLAMATION = 0x30;
+const MB_ICONWARNING = 0x30;
+const MB_ICONERROR = 16;
+const MB_ICONHAND = 16;
+const MB_ICONQUESTION = 32;
+const MB_OK = 0;
+const MB_ABORTRETRYIGNORE = 2;
+const MB_APPLMODAL = 0;
+const MB_DEFAULT_DESKTOP_ONLY = 0x20000;
+const MB_HELP = 0x4000;
+const MB_RIGHT = 0x80000;
+const MB_RTLREADING = 0x100000;
+const MB_TOPMOST = 0x40000;
+const MB_DEFBUTTON1 = 0;
+const MB_DEFBUTTON2 = 256;
+const MB_DEFBUTTON3 = 512;
+const MB_DEFBUTTON4 = 0x300;
+const MB_ICONINFORMATION = 64;
+const MB_ICONSTOP = 16;
+const MB_OKCANCEL = 1;
+const MB_RETRYCANCEL = 5;
+
+static if (_WIN32_WINNT_ONLY) {
+	static if (_WIN32_WINNT >= 0x400) {
+		const MB_SERVICE_NOTIFICATION = 0x00200000;
+	} else {
+		const MB_SERVICE_NOTIFICATION = 0x00040000;
+	}
+	const MB_SERVICE_NOTIFICATION_NT3X = 0x00040000;
+}
+
+const MB_SETFOREGROUND = 0x10000;
+const MB_SYSTEMMODAL = 4096;
+const MB_TASKMODAL = 0x2000;
+const MB_YESNO = 4;
+const MB_YESNOCANCEL = 3;
+const MB_ICONMASK = 240;
+const MB_DEFMASK = 3840;
+const MB_MODEMASK = 0x00003000;
+const MB_MISCMASK = 0x0000C000;
+const MB_NOFOCUS = 0x00008000;
+const MB_TYPEMASK = 15;
+// [Redefined] MB_TOPMOST=0x40000
+static if (WINVER >= 0x500) {
+	const MB_CANCELTRYCONTINUE=6;
+}
+
+const IDOK       = 1;
+const IDCANCEL   = 2;
+const IDABORT    = 3;
+const IDRETRY    = 4;
+const IDIGNORE   = 5;
+const IDYES      = 6;
+const IDNO       = 7;
+static if (WINVER >= 0x400) {
+const IDCLOSE    = 8;
+const IDHELP     = 9;
+}
+static if (WINVER >= 0x500) {
+const IDTRYAGAIN = 10;
+const IDCONTINUE = 11;
+}
+
+const GWL_EXSTYLE = -20;
+const GWL_STYLE = -16;
+const GWL_WNDPROC = -4;
+const GWLP_WNDPROC = -4;
+const GWL_HINSTANCE = -6;
+const GWLP_HINSTANCE = -6;
+const GWL_HWNDPARENT = -8;
+const GWLP_HWNDPARENT = -8;
+const GWL_ID = -12;
+const GWLP_ID = -12;
+const GWL_USERDATA = -21;
+const GWLP_USERDATA = -21;
+
+const DWL_DLGPROC = 4;
+const DWLP_DLGPROC = 4;
+const DWL_MSGRESULT = 0;
+const DWLP_MSGRESULT = 0;
+const DWL_USER = 8;
+const DWLP_USER = 8;
+
+const QS_KEY            = 1;
+const QS_MOUSEMOVE      = 2;
+const QS_MOUSEBUTTON    = 4;
+const QS_MOUSE          = 6;
+const QS_POSTMESSAGE    = 8;
+const QS_TIMER          = 16;
+const QS_PAINT          = 32;
+const QS_SENDMESSAGE    = 64;
+const QS_HOTKEY         = 128;
+const QS_ALLPOSTMESSAGE = 256;
+static if (_WIN32_WINNT >= 0x501) {
+const QS_RAWINPUT       = 1024;
+const QS_INPUT          = 1031;
+const QS_ALLEVENTS      = 1215;
+const QS_ALLINPUT       = 1279;
+} else {
+const QS_INPUT          = 7;
+const QS_ALLEVENTS      = 191;
+const QS_ALLINPUT       = 255;
+}
+
+const MWMO_WAITALL        = 1;
+const MWMO_ALERTABLE      = 2;
+const MWMO_INPUTAVAILABLE = 4;
+
+const COLOR_3DDKSHADOW=21;
+const COLOR_3DFACE=15;
+const COLOR_3DHILIGHT=20;
+const COLOR_3DHIGHLIGHT=20;
+const COLOR_3DLIGHT=22;
+const COLOR_BTNHILIGHT=20;
+const COLOR_3DSHADOW=16;
+const COLOR_ACTIVEBORDER=10;
+const COLOR_ACTIVECAPTION=2;
+const COLOR_APPWORKSPACE=12;
+const COLOR_BACKGROUND=1;
+const COLOR_DESKTOP=1;
+const COLOR_BTNFACE=15;
+const COLOR_BTNHIGHLIGHT=20;
+const COLOR_BTNSHADOW=16;
+const COLOR_BTNTEXT=18;
+const COLOR_CAPTIONTEXT=9;
+const COLOR_GRAYTEXT=17;
+const COLOR_HIGHLIGHT=13;
+const COLOR_HIGHLIGHTTEXT=14;
+const COLOR_INACTIVEBORDER=11;
+const COLOR_INACTIVECAPTION=3;
+const COLOR_INACTIVECAPTIONTEXT=19;
+const COLOR_INFOBK=24;
+const COLOR_INFOTEXT=23;
+const COLOR_MENU=4;
+const COLOR_MENUTEXT=7;
+const COLOR_SCROLLBAR=0;
+const COLOR_WINDOW=5;
+const COLOR_WINDOWFRAME=6;
+const COLOR_WINDOWTEXT=8;
+const COLOR_HOTLIGHT=26;
+const COLOR_GRADIENTACTIVECAPTION=27;
+const COLOR_GRADIENTINACTIVECAPTION=28;
+
+const CTLCOLOR_MSGBOX=0;
+const CTLCOLOR_EDIT=1;
+const CTLCOLOR_LISTBOX=2;
+const CTLCOLOR_BTN=3;
+const CTLCOLOR_DLG=4;
+const CTLCOLOR_SCROLLBAR=5;
+const CTLCOLOR_STATIC=6;
+const CTLCOLOR_MAX=7;
+
+// For GetSystemMetrics()
+enum : int {
+	SM_CXSCREEN = 0,
+	SM_CYSCREEN,
+	SM_CXVSCROLL,
+	SM_CYHSCROLL,
+	SM_CYCAPTION,
+	SM_CXBORDER,
+	SM_CYBORDER,
+	SM_CXDLGFRAME, // = 7,
+	SM_CXFIXEDFRAME = SM_CXDLGFRAME,
+	SM_CYDLGFRAME, // =8,
+	SM_CYFIXEDFRAME = SM_CYDLGFRAME,
+	SM_CYVTHUMB = 9,
+	SM_CXHTHUMB,
+	SM_CXICON,
+	SM_CYICON,
+	SM_CXCURSOR,
+	SM_CYCURSOR,
+	SM_CYMENU,
+	SM_CXFULLSCREEN,
+	SM_CYFULLSCREEN,
+	SM_CYKANJIWINDOW,
+	SM_MOUSEPRESENT,
+	SM_CYVSCROLL,
+	SM_CXHSCROLL,
+	SM_DEBUG,
+	SM_SWAPBUTTON,
+	SM_RESERVED1,
+	SM_RESERVED2,
+	SM_RESERVED3,
+	SM_RESERVED4,
+	SM_CXMIN,
+	SM_CYMIN,
+	SM_CXSIZE,
+	SM_CYSIZE,
+	SM_CXSIZEFRAME, // = 32,
+	SM_CXFRAME = SM_CXSIZEFRAME,
+	SM_CYSIZEFRAME, // = 33
+	SM_CYFRAME = SM_CYSIZEFRAME,
+	SM_CXMINTRACK,
+	SM_CYMINTRACK,
+	SM_CXDOUBLECLK,
+	SM_CYDOUBLECLK,
+	SM_CXICONSPACING,
+	SM_CYICONSPACING,
+	SM_MENUDROPALIGNMENT,
+	SM_PENWINDOWS,
+	SM_DBCSENABLED,
+	SM_CMOUSEBUTTONS,
+	SM_SECURE,
+	SM_CXEDGE,
+	SM_CYEDGE,
+	SM_CXMINSPACING,
+	SM_CYMINSPACING,
+	SM_CXSMICON,
+	SM_CYSMICON,
+	SM_CYSMCAPTION,
+	SM_CXSMSIZE,
+	SM_CYSMSIZE,
+	SM_CXMENUSIZE,
+	SM_CYMENUSIZE,
+	SM_ARRANGE,
+	SM_CXMINIMIZED,
+	SM_CYMINIMIZED,
+	SM_CXMAXTRACK,
+	SM_CYMAXTRACK,
+	SM_CXMAXIMIZED,
+	SM_CYMAXIMIZED,
+	SM_NETWORK, // = 63
+	SM_CLEANBOOT = 67,
+	SM_CXDRAG,
+	SM_CYDRAG,
+	SM_SHOWSOUNDS,
+	SM_CXMENUCHECK,
+	SM_CYMENUCHECK,
+	SM_SLOWMACHINE,
+	SM_MIDEASTENABLED,
+	// The next values aren't supported in Win95.
+	SM_MOUSEWHEELPRESENT,
+	SM_XVIRTUALSCREEN,
+	SM_YVIRTUALSCREEN,
+	SM_CXVIRTUALSCREEN,
+	SM_CYVIRTUALSCREEN,
+	SM_CMONITORS,
+	SM_SAMEDISPLAYFORMAT,
+	SM_IMMENABLED,
+	SM_CXFOCUSBORDER,
+	SM_CYFOCUSBORDER, // = 84
+	SM_TABLETPC = 86,
+	SM_MEDIACENTER = 87,
+	SM_REMOTESESSION = 0x1000,
+	// These are only for WinXP and later
+	SM_SHUTTINGDOWN = 0x2000,
+	SM_REMOTECONTROL = 0x2001
+}
+
+const ARW_BOTTOMLEFT=0;
+const ARW_BOTTOMRIGHT=1;
+const ARW_HIDE=8;
+const ARW_TOPLEFT=2;
+const ARW_TOPRIGHT=3;
+const ARW_DOWN=4;
+const ARW_LEFT=0;
+const ARW_RIGHT=0;
+const ARW_UP=4;
+
+const UOI_FLAGS=1;
+const UOI_NAME=2;
+const UOI_TYPE=3;
+const UOI_USER_SID=4;
+
+// For the fuLoad parameter of LoadImage()
+enum : UINT {
+	LR_DEFAULTCOLOR     = 0,
+	LR_MONOCHROME       = 1,
+	LR_COLOR            = 2,
+	LR_COPYRETURNORG    = 4,
+	LR_COPYDELETEORG    = 8,
+	LR_LOADFROMFILE     = 16,
+	LR_LOADTRANSPARENT  = 32,
+	LR_DEFAULTSIZE      = 64,
+	LR_LOADREALSIZE     = 128,
+	LR_LOADMAP3DCOLORS  = 4096,
+	LR_CREATEDIBSECTION = 8192,
+	LR_COPYFROMRESOURCE = 16384,
+	LR_SHARED           = 32768
+}
+
+const KEYEVENTF_EXTENDEDKEY = 0x00000001;
+const KEYEVENTF_KEYUP       = 00000002;
+static if (_WIN32_WINNT >= 0x500) {
+const KEYEVENTF_UNICODE     = 0x00000004;
+const KEYEVENTF_SCANCODE    = 0x00000008;
+}
+
+const OBM_BTNCORNERS = 32758;
+const OBM_BTSIZE = 32761;
+const OBM_CHECK = 32760;
+const OBM_CHECKBOXES = 32759;
+const OBM_CLOSE = 32754;
+const OBM_COMBO = 32738;
+const OBM_DNARROW = 32752;
+const OBM_DNARROWD = 32742;
+const OBM_DNARROWI = 32736;
+const OBM_LFARROW = 32750;
+const OBM_LFARROWI = 32734;
+const OBM_LFARROWD = 32740;
+const OBM_MNARROW = 32739;
+const OBM_OLD_CLOSE = 32767;
+const OBM_OLD_DNARROW = 32764;
+const OBM_OLD_LFARROW = 32762;
+const OBM_OLD_REDUCE = 32757;
+const OBM_OLD_RESTORE = 32755;
+const OBM_OLD_RGARROW = 32763;
+const OBM_OLD_UPARROW = 32765;
+const OBM_OLD_ZOOM = 32756;
+const OBM_REDUCE = 32749;
+const OBM_REDUCED = 32746;
+const OBM_RESTORE = 32747;
+const OBM_RESTORED = 32744;
+const OBM_RGARROW = 32751;
+const OBM_RGARROWD = 32741;
+const OBM_RGARROWI = 32735;
+const OBM_SIZE = 32766;
+const OBM_UPARROW = 32753;
+const OBM_UPARROWD = 32743;
+const OBM_UPARROWI = 32737;
+const OBM_ZOOM = 32748;
+const OBM_ZOOMD = 32745;
+
+const OCR_NORMAL = 32512;
+const OCR_IBEAM = 32513;
+const OCR_WAIT = 32514;
+const OCR_CROSS = 32515;
+const OCR_UP = 32516;
+const OCR_SIZE = 32640;
+const OCR_ICON = 32641;
+const OCR_SIZENWSE = 32642;
+const OCR_SIZENESW = 32643;
+const OCR_SIZEWE = 32644;
+const OCR_SIZENS = 32645;
+const OCR_SIZEALL = 32646;
+const OCR_NO = 32648;
+const OCR_APPSTARTING = 32650;
+
+const OIC_SAMPLE = 32512;
+const OIC_HAND = 32513;
+const OIC_QUES = 32514;
+const OIC_BANG = 32515;
+const OIC_NOTE = 32516;
+const OIC_WINLOGO = 32517;
+const OIC_WARNING = OIC_BANG;
+const OIC_ERROR = OIC_HAND;
+const OIC_INFORMATION = OIC_NOTE;
+
+const HELPINFO_MENUITEM = 2;
+const HELPINFO_WINDOW = 1;
+
+const MSGF_DIALOGBOX = 0;
+const MSGF_MESSAGEBOX = 1;
+const MSGF_MENU = 2;
+const MSGF_MOVE = 3;
+const MSGF_SIZE = 4;
+const MSGF_SCROLLBAR = 5;
+const MSGF_NEXTWINDOW = 6;
+const MSGF_MAINLOOP = 8;
+const MSGF_USER = 4096;
+
+const MOUSEEVENTF_MOVE = 1;
+const MOUSEEVENTF_LEFTDOWN = 2;
+const MOUSEEVENTF_LEFTUP = 4;
+const MOUSEEVENTF_RIGHTDOWN = 8;
+const MOUSEEVENTF_RIGHTUP = 16;
+const MOUSEEVENTF_MIDDLEDOWN = 32;
+const MOUSEEVENTF_MIDDLEUP = 64;
+const MOUSEEVENTF_WHEEL = 0x0800;
+const MOUSEEVENTF_ABSOLUTE = 32768;
+
+const PM_NOREMOVE = 0;
+const PM_REMOVE = 1;
+const PM_NOYIELD = 2;
+
+static if (WINVER >= 0x500) {
+const PM_QS_INPUT = (QS_INPUT << 16);
+const PM_QS_POSTMESSAGE = ((QS_POSTMESSAGE|QS_HOTKEY|QS_TIMER) << 16);
+const PM_QS_PAINT = (QS_PAINT << 16);
+const PM_QS_SENDMESSAGE = (QS_SENDMESSAGE << 16);
+}
+const HWND
+	HWND_BROADCAST = cast(HWND)0xffff,
+	HWND_BOTTOM    = cast(HWND)1,
+	HWND_NOTOPMOST = cast(HWND)(-2),
+	HWND_TOP       = cast(HWND)0,
+	HWND_TOPMOST   = cast(HWND)(-1),
+	HWND_DESKTOP   = cast(HWND)0,
+	HWND_MESSAGE   = cast(HWND)(-3);// w2k
+
+const RDW_INVALIDATE      = 1;
+const RDW_INTERNALPAINT   = 2;
+const RDW_ERASE           = 4;
+const RDW_VALIDATE        = 8;
+const RDW_NOINTERNALPAINT = 16;
+const RDW_NOERASE         = 32;
+const RDW_NOCHILDREN      = 64;
+const RDW_ALLCHILDREN     = 128;
+const RDW_UPDATENOW       = 256;
+const RDW_ERASENOW        = 512;
+const RDW_FRAME           = 1024;
+const RDW_NOFRAME         = 2048;
+
+const SMTO_NORMAL      = 0;
+const SMTO_BLOCK       = 1;
+const SMTO_ABORTIFHUNG = 2;
+
+const SIF_ALL = 23;
+const SIF_PAGE = 2;
+const SIF_POS = 4;
+const SIF_RANGE = 1;
+const SIF_DISABLENOSCROLL = 8;
+const SIF_TRACKPOS = 16;
+
+const SWP_DRAWFRAME = 32;
+const SWP_FRAMECHANGED = 32;
+const SWP_HIDEWINDOW = 128;
+const SWP_NOACTIVATE = 16;
+const SWP_NOCOPYBITS = 256;
+const SWP_NOMOVE = 2;
+const SWP_NOSIZE = 1;
+const SWP_NOREDRAW = 8;
+const SWP_NOZORDER = 4;
+const SWP_SHOWWINDOW = 64;
+const SWP_NOOWNERZORDER = 512;
+const SWP_NOREPOSITION = 512;
+const SWP_NOSENDCHANGING = 1024;
+const SWP_DEFERERASE = 8192;
+const SWP_ASYNCWINDOWPOS = 16384;
+
+const HSHELL_ACTIVATESHELLWINDOW = 3;
+const HSHELL_GETMINRECT = 5;
+const HSHELL_LANGUAGE = 8;
+const HSHELL_REDRAW = 6;
+const HSHELL_TASKMAN = 7;
+const HSHELL_WINDOWACTIVATED = 4;
+const HSHELL_WINDOWCREATED = 1;
+const HSHELL_WINDOWDESTROYED = 2;
+const HSHELL_FLASH = 32774;
+
+static if (WINVER >= 0x500) {
+const SPI_SETFOREGROUNDLOCKTIMEOUT=0x2001;
+const SPI_GETFOREGROUNDLOCKTIMEOUT=0x2000;
+}
+
+const SPI_GETACCESSTIMEOUT=60;
+const SPI_GETACTIVEWNDTRKTIMEOUT=8194;
+const SPI_GETANIMATION=72;
+const SPI_GETBEEP=1;
+const SPI_GETBORDER=5;
+const SPI_GETDEFAULTINPUTLANG=89;
+const SPI_GETDRAGFULLWINDOWS=38;
+const SPI_GETFASTTASKSWITCH=35;
+const SPI_GETFILTERKEYS=50;
+const SPI_GETFONTSMOOTHING=74;
+const SPI_GETGRIDGRANULARITY=18;
+const SPI_GETHIGHCONTRAST=66;
+const SPI_GETICONMETRICS=45;
+const SPI_GETICONTITLELOGFONT=31;
+const SPI_GETICONTITLEWRAP=25;
+const SPI_GETKEYBOARDDELAY=22;
+const SPI_GETKEYBOARDPREF=68;
+const SPI_GETKEYBOARDSPEED=10;
+const SPI_GETLOWPOWERACTIVE=83;
+const SPI_GETLOWPOWERTIMEOUT=79;
+const SPI_GETMENUDROPALIGNMENT=27;
+const SPI_GETMINIMIZEDMETRICS=43;
+const SPI_GETMOUSE=3;
+const SPI_GETMOUSEKEYS=54;
+const SPI_GETMOUSETRAILS=94;
+const SPI_GETNONCLIENTMETRICS=41;
+const SPI_GETPOWEROFFACTIVE=84;
+const SPI_GETPOWEROFFTIMEOUT=80;
+const SPI_GETSCREENREADER=70;
+const SPI_GETSCREENSAVEACTIVE=16;
+const SPI_GETSCREENSAVETIMEOUT=14;
+const SPI_GETSERIALKEYS=62;
+const SPI_GETSHOWSOUNDS=56;
+const SPI_GETSOUNDSENTRY=64;
+const SPI_GETSTICKYKEYS=58;
+const SPI_GETTOGGLEKEYS=52;
+const SPI_GETWHEELSCROLLLINES=104;
+const SPI_GETWINDOWSEXTENSION=92;
+const SPI_GETWORKAREA=48;
+const SPI_ICONHORIZONTALSPACING=13;
+const SPI_ICONVERTICALSPACING=24;
+const SPI_LANGDRIVER=12;
+const SPI_SCREENSAVERRUNNING=97;
+const SPI_SETACCESSTIMEOUT=61;
+const SPI_SETACTIVEWNDTRKTIMEOUT=8195;
+const SPI_SETANIMATION=73;
+const SPI_SETBEEP=2;
+const SPI_SETBORDER=6;
+const SPI_SETDEFAULTINPUTLANG=90;
+const SPI_SETDESKPATTERN=21;
+const SPI_SETDESKWALLPAPER=20;
+const SPI_SETDOUBLECLICKTIME=32;
+const SPI_SETDOUBLECLKHEIGHT=30;
+const SPI_SETDOUBLECLKWIDTH=29;
+const SPI_SETDRAGFULLWINDOWS=37;
+const SPI_SETDRAGHEIGHT=77;
+const SPI_SETDRAGWIDTH=76;
+const SPI_SETFASTTASKSWITCH=36;
+const SPI_SETFILTERKEYS=51;
+const SPI_SETFONTSMOOTHING=75;
+const SPI_SETGRIDGRANULARITY=19;
+const SPI_SETHANDHELD=78;
+const SPI_SETHIGHCONTRAST=67;
+const SPI_SETICONMETRICS=46;
+const SPI_SETICONTITLELOGFONT=34;
+const SPI_SETICONTITLEWRAP=26;
+const SPI_SETKEYBOARDDELAY=23;
+const SPI_SETKEYBOARDPREF=69;
+const SPI_SETKEYBOARDSPEED=11;
+const SPI_SETLANGTOGGLE=91;
+const SPI_SETLOWPOWERACTIVE=85;
+const SPI_SETLOWPOWERTIMEOUT=81;
+const SPI_SETMENUDROPALIGNMENT=28;
+const SPI_SETMINIMIZEDMETRICS=44;
+const SPI_SETMOUSE=4;
+const SPI_SETMOUSEBUTTONSWAP=33;
+const SPI_SETMOUSEKEYS=55;
+const SPI_SETMOUSETRAILS=93;
+const SPI_SETNONCLIENTMETRICS=42;
+const SPI_SETPENWINDOWS=49;
+const SPI_SETPOWEROFFACTIVE=86;
+const SPI_SETPOWEROFFTIMEOUT=82;
+const SPI_SETSCREENREADER=71;
+const SPI_SETSCREENSAVEACTIVE=17;
+const SPI_SETSCREENSAVERRUNNING=97;
+const SPI_SETSCREENSAVETIMEOUT=15;
+const SPI_SETSERIALKEYS=63;
+const SPI_SETSHOWSOUNDS=57;
+const SPI_SETSOUNDSENTRY=65;
+const SPI_SETSTICKYKEYS=59;
+const SPI_SETTOGGLEKEYS=53;
+const SPI_SETWHEELSCROLLLINES=105;
+const SPI_SETWORKAREA=47;
+
+static if (WINVER >= 0x500) {
+const SPI_GETDESKWALLPAPER=115;
+const SPI_GETMOUSESPEED=112;
+const SPI_GETSCREENSAVERRUNNING=114;
+const SPI_GETACTIVEWINDOWTRACKING=0x1000;
+const SPI_GETACTIVEWNDTRKZORDER=0x100C;
+const SPI_GETCOMBOBOXANIMATION=0x1004;
+const SPI_GETCURSORSHADOW=0x101A;
+const SPI_GETGRADIENTCAPTIONS=0x1008;
+const SPI_GETHOTTRACKING=0x100E;
+const SPI_GETKEYBOARDCUES=0x100A;
+const SPI_GETLISTBOXSMOOTHSCROLLING=0x1006;
+const SPI_GETMENUANIMATION=0x1002;
+const SPI_GETMENUFADE=0x1012;
+const SPI_GETMENUUNDERLINES=0x100A;
+const SPI_GETSELECTIONFADE=0x1014;
+const SPI_GETTOOLTIPANIMATION=0x1016;
+const SPI_GETTOOLTIPFADE=0x1018;
+const SPI_SETACTIVEWINDOWTRACKING=0x1001;
+const SPI_SETACTIVEWNDTRKZORDER=0x100D;
+const SPI_SETCOMBOBOXANIMATION=0x1005;
+const SPI_SETCURSORSHADOW=0x101B;
+const SPI_SETGRADIENTCAPTIONS=0x1009;
+const SPI_SETHOTTRACKING=0x100F;
+const SPI_SETKEYBOARDCUES=0x100B;
+const SPI_SETLISTBOXSMOOTHSCROLLING=0x1007;
+const SPI_SETMENUANIMATION=0x1003;
+const SPI_SETMENUFADE=0x1013;
+const SPI_SETMENUUNDERLINES=0x100B;
+const SPI_SETMOUSESPEED=113;
+const SPI_SETSELECTIONFADE=0x1015;
+const SPI_SETTOOLTIPANIMATION=0x1017;
+const SPI_SETTOOLTIPFADE=0x1019;
+}
+
+const SPIF_UPDATEINIFILE=1;
+const SPIF_SENDWININICHANGE=2;
+const SPIF_SENDCHANGE=2;
+// [Redefined] ATF_ONOFFFEEDBACK=2
+// [Redefined] ATF_TIMEOUTON=1
+const WM_APP=32768;
+const WM_ACTIVATE=6;
+const WM_ACTIVATEAPP=28;
+// FIXME/CHECK: Are WM_AFX {FIRST, LAST} valid for WINVER < 0x400?
+const WM_AFXFIRST=864;
+const WM_AFXLAST=895;
+const WM_ASKCBFORMATNAME=780;
+const WM_CANCELJOURNAL=75;
+const WM_CANCELMODE=31;
+const WM_CAPTURECHANGED=533;
+const WM_CHANGECBCHAIN=781;
+const WM_CHAR=258;
+const WM_CHARTOITEM=47;
+const WM_CHILDACTIVATE=34;
+const WM_CLEAR=771;
+const WM_CLOSE=16;
+const WM_COMMAND=273;
+const WM_COMMNOTIFY=68; // obsolete
+const WM_COMPACTING=65;
+const WM_COMPAREITEM=57;
+const WM_CONTEXTMENU=123;
+const WM_COPY=769;
+const WM_COPYDATA=74;
+const WM_CREATE=1;
+const WM_CTLCOLORBTN=309;
+const WM_CTLCOLORDLG=310;
+const WM_CTLCOLOREDIT=307;
+const WM_CTLCOLORLISTBOX=308;
+const WM_CTLCOLORMSGBOX=306;
+const WM_CTLCOLORSCROLLBAR=311;
+const WM_CTLCOLORSTATIC=312;
+const WM_CUT=768;
+const WM_DEADCHAR=259;
+const WM_DELETEITEM=45;
+const WM_DESTROY=2;
+const WM_DESTROYCLIPBOARD=775;
+const WM_DEVICECHANGE=537;
+const WM_DEVMODECHANGE=27;
+const WM_DISPLAYCHANGE=126;
+const WM_DRAWCLIPBOARD=776;
+const WM_DRAWITEM=43;
+const WM_DROPFILES=563;
+const WM_ENABLE=10;
+const WM_ENDSESSION=22;
+const WM_ENTERIDLE=289;
+const WM_ENTERMENULOOP=529;
+const WM_ENTERSIZEMOVE=561;
+const WM_ERASEBKGND=20;
+const WM_EXITMENULOOP=530;
+const WM_EXITSIZEMOVE=562;
+const WM_FONTCHANGE=29;
+const WM_GETDLGCODE=135;
+const WM_GETFONT=49;
+const WM_GETHOTKEY=51;
+const WM_GETICON=127;
+const WM_GETMINMAXINFO=36;
+const WM_GETTEXT=13;
+const WM_GETTEXTLENGTH=14;
+const WM_HANDHELDFIRST=856;
+const WM_HANDHELDLAST=863;
+const WM_HELP=83;
+const WM_HOTKEY=786;
+const WM_HSCROLL=276;
+const WM_HSCROLLCLIPBOARD=782;
+const WM_ICONERASEBKGND=39;
+const WM_INITDIALOG=272;
+const WM_INITMENU=278;
+const WM_INITMENUPOPUP=279;
+const WM_INPUTLANGCHANGE=81;
+const WM_INPUTLANGCHANGEREQUEST=80;
+const WM_KEYDOWN=256;
+const WM_KEYUP=257;
+const WM_KILLFOCUS=8;
+const WM_MDIACTIVATE=546;
+const WM_MDICASCADE=551;
+const WM_MDICREATE=544;
+const WM_MDIDESTROY=545;
+const WM_MDIGETACTIVE=553;
+const WM_MDIICONARRANGE=552;
+const WM_MDIMAXIMIZE=549;
+const WM_MDINEXT=548;
+const WM_MDIREFRESHMENU=564;
+const WM_MDIRESTORE=547;
+const WM_MDISETMENU=560;
+const WM_MDITILE=550;
+const WM_MEASUREITEM=44;
+static if (WINVER >= 0x500) {
+const WM_UNINITMENUPOPUP=0x0125;
+const WM_MENURBUTTONUP=290;
+const WM_MENUCOMMAND=0x0126;
+const WM_MENUGETOBJECT=0x0124;
+const WM_MENUDRAG=0x0123;
+}
+
+static if (_WIN32_WINNT >= 0x500) {
+
+	enum {
+		WM_CHANGEUISTATE	=	0x0127,
+		WM_UPDATEUISTATE	=	0x0128,
+		WM_QUERYUISTATE		=	0x0129
+	}
+
+	// LOWORD(wParam) values in WM_*UISTATE*
+	enum {
+		UIS_SET			=	1,
+		UIS_CLEAR		=	2,
+		UIS_INITIALIZE	=	3
+	}
+
+	// HIWORD(wParam) values in WM_*UISTATE*
+	enum {
+		UISF_HIDEFOCUS	=	0x1,
+		UISF_HIDEACCEL	=	0x2
+	}
+
+}
+
+static if (_WIN32_WINNT >= 0x501) {
+
+	// HIWORD(wParam) values in WM_*UISTATE*
+	enum {
+		UISF_ACTIVE		=	0x4
+	}
+
+}
+
+const WM_MENUCHAR=288;
+const WM_MENUSELECT=287;
+const WM_MOVE=3;
+const WM_MOVING=534;
+const WM_NCACTIVATE=134;
+const WM_NCCALCSIZE=131;
+const WM_NCCREATE=129;
+const WM_NCDESTROY=130;
+const WM_NCHITTEST=132;
+const WM_NCLBUTTONDBLCLK=163;
+const WM_NCLBUTTONDOWN=161;
+const WM_NCLBUTTONUP=162;
+const WM_NCMBUTTONDBLCLK=169;
+const WM_NCMBUTTONDOWN=167;
+const WM_NCMBUTTONUP=168;
+static if (_WIN32_WINNT >= 0x500) {
+const WM_NCXBUTTONDOWN=171;
+const WM_NCXBUTTONUP=172;
+const WM_NCXBUTTONDBLCLK=173;
+const WM_NCMOUSEHOVER=0x02A0;
+const WM_NCMOUSELEAVE=0x02A2;
+}
+const WM_NCMOUSEMOVE=160;
+const WM_NCPAINT=133;
+const WM_NCRBUTTONDBLCLK=166;
+const WM_NCRBUTTONDOWN=164;
+const WM_NCRBUTTONUP=165;
+const WM_NEXTDLGCTL=40;
+const WM_NEXTMENU=531;
+const WM_NOTIFY=78;
+const WM_NOTIFYFORMAT=85;
+const WM_NULL=0;
+const WM_PAINT=15;
+const WM_PAINTCLIPBOARD=777;
+const WM_PAINTICON=38;
+const WM_PALETTECHANGED=785;
+const WM_PALETTEISCHANGING=784;
+const WM_PARENTNOTIFY=528;
+const WM_PASTE=770;
+const WM_PENWINFIRST=896;
+const WM_PENWINLAST=911;
+const WM_POWER=72;
+const WM_POWERBROADCAST=536;
+const WM_PRINT=791;
+const WM_PRINTCLIENT=792;
+const WM_APPCOMMAND = 0x0319;
+const WM_QUERYDRAGICON=55;
+const WM_QUERYENDSESSION=17;
+const WM_QUERYNEWPALETTE=783;
+const WM_QUERYOPEN=19;
+const WM_QUEUESYNC=35;
+const WM_QUIT=18;
+const WM_RENDERALLFORMATS=774;
+const WM_RENDERFORMAT=773;
+const WM_SETCURSOR=32;
+const WM_SETFOCUS=7;
+const WM_SETFONT=48;
+const WM_SETHOTKEY=50;
+const WM_SETICON=128;
+const WM_SETREDRAW=11;
+const WM_SETTEXT=12;
+const WM_SETTINGCHANGE=26;
+const WM_SHOWWINDOW=24;
+const WM_SIZE=5;
+const WM_SIZECLIPBOARD=779;
+const WM_SIZING=532;
+const WM_SPOOLERSTATUS=42;
+const WM_STYLECHANGED=125;
+const WM_STYLECHANGING=124;
+const WM_SYSCHAR=262;
+const WM_SYSCOLORCHANGE=21;
+const WM_SYSCOMMAND=274;
+const WM_SYSDEADCHAR=263;
+const WM_SYSKEYDOWN=260;
+const WM_SYSKEYUP=261;
+const WM_TCARD=82;
+const WM_THEMECHANGED=794;
+const WM_TIMECHANGE=30;
+const WM_TIMER=275;
+const WM_UNDO=772;
+const WM_USER=1024;
+const WM_USERCHANGED=84;
+const WM_VKEYTOITEM=46;
+const WM_VSCROLL=277;
+const WM_VSCROLLCLIPBOARD=778;
+const WM_WINDOWPOSCHANGED=71;
+const WM_WINDOWPOSCHANGING=70;
+const WM_WININICHANGE=26;
+const WM_INPUT=255;
+const WM_KEYFIRST=256;
+const WM_KEYLAST=264;
+const WM_SYNCPAINT=136;
+const WM_MOUSEACTIVATE=33;
+const WM_MOUSEMOVE=512;
+const WM_LBUTTONDOWN=513;
+const WM_LBUTTONUP=514;
+const WM_LBUTTONDBLCLK=515;
+const WM_RBUTTONDOWN=516;
+const WM_RBUTTONUP=517;
+const WM_RBUTTONDBLCLK=518;
+const WM_MBUTTONDOWN=519;
+const WM_MBUTTONUP=520;
+const WM_MBUTTONDBLCLK=521;
+const WM_MOUSEWHEEL=522;
+const WM_MOUSEFIRST=512;
+static if (_WIN32_WINNT >= 0x500) {
+const WM_XBUTTONDOWN=523;
+const WM_XBUTTONUP=524;
+const WM_XBUTTONDBLCLK=525;
+const WM_MOUSELAST=525;
+} else {
+const WM_MOUSELAST=522;
+}
+const WM_MOUSEHOVER=0x2A1;
+const WM_MOUSELEAVE=0x2A3;
+static if (_WIN32_WINNT >= 0x400) {
+const WHEEL_DELTA=120;
+
+SHORT GET_WHEEL_DELTA_WPARAM(WPARAM wparam)
+{
+return cast(SHORT) HIWORD(wparam);
+}
+
+const WHEEL_PAGESCROLL = uint.max;
+}
+const BM_CLICK=245;
+const BM_GETCHECK=240;
+const BM_GETIMAGE=246;
+const BM_GETSTATE=242;
+const BM_SETCHECK=241;
+const BM_SETIMAGE=247;
+const BM_SETSTATE=243;
+const BM_SETSTYLE=244;
+const BN_CLICKED=0;
+const BN_DBLCLK=5;
+const BN_DISABLE=4;
+const BN_DOUBLECLICKED=5;
+const BN_HILITE=2;
+const BN_KILLFOCUS=7;
+const BN_PAINT=1;
+const BN_PUSHED=2;
+const BN_SETFOCUS=6;
+const BN_UNHILITE=3;
+const BN_UNPUSHED=3;
+const CB_ADDSTRING=323;
+const CB_DELETESTRING=324;
+const CB_DIR=325;
+const CB_FINDSTRING=332;
+const CB_FINDSTRINGEXACT=344;
+const CB_GETCOUNT=326;
+const CB_GETCURSEL=327;
+const CB_GETDROPPEDCONTROLRECT=338;
+const CB_GETDROPPEDSTATE=343;
+const CB_GETDROPPEDWIDTH=351;
+const CB_GETEDITSEL=320;
+const CB_GETEXTENDEDUI=342;
+const CB_GETHORIZONTALEXTENT=349;
+const CB_GETITEMDATA=336;
+const CB_GETITEMHEIGHT=340;
+const CB_GETLBTEXT=328;
+const CB_GETLBTEXTLEN=329;
+const CB_GETLOCALE=346;
+const CB_GETTOPINDEX=347;
+const CB_INITSTORAGE=353;
+const CB_INSERTSTRING=330;
+const CB_LIMITTEXT=321;
+const CB_RESETCONTENT=331;
+const CB_SELECTSTRING=333;
+const CB_SETCURSEL=334;
+const CB_SETDROPPEDWIDTH=352;
+const CB_SETEDITSEL=322;
+const CB_SETEXTENDEDUI=341;
+const CB_SETHORIZONTALEXTENT=350;
+const CB_SETITEMDATA=337;
+const CB_SETITEMHEIGHT=339;
+const CB_SETLOCALE=345;
+const CB_SETTOPINDEX=348;
+const CB_SHOWDROPDOWN=335;
+
+const CBN_CLOSEUP=8;
+const CBN_DBLCLK=2;
+const CBN_DROPDOWN=7;
+const CBN_EDITCHANGE=5;
+const CBN_EDITUPDATE=6;
+const CBN_ERRSPACE=(-1);
+const CBN_KILLFOCUS=4;
+const CBN_SELCHANGE=1;
+const CBN_SELENDCANCEL=10;
+const CBN_SELENDOK=9;
+const CBN_SETFOCUS=3;
+
+const EM_CANUNDO=198;
+const EM_CHARFROMPOS=215;
+const EM_EMPTYUNDOBUFFER=205;
+const EM_FMTLINES=200;
+const EM_GETFIRSTVISIBLELINE=206;
+const EM_GETHANDLE=189;
+const EM_GETLIMITTEXT=213;
+const EM_GETLINE=196;
+const EM_GETLINECOUNT=186;
+const EM_GETMARGINS=212;
+const EM_GETMODIFY=184;
+const EM_GETPASSWORDCHAR=210;
+const EM_GETRECT=178;
+const EM_GETSEL=176;
+const EM_GETTHUMB=190;
+const EM_GETWORDBREAKPROC=209;
+const EM_LIMITTEXT=197;
+const EM_LINEFROMCHAR=201;
+const EM_LINEINDEX=187;
+const EM_LINELENGTH=193;
+const EM_LINESCROLL=182;
+const EM_POSFROMCHAR=214;
+const EM_REPLACESEL=194;
+const EM_SCROLL=181;
+const EM_SCROLLCARET=183;
+const EM_SETHANDLE=188;
+const EM_SETLIMITTEXT=197;
+const EM_SETMARGINS=211;
+const EM_SETMODIFY=185;
+const EM_SETPASSWORDCHAR=204;
+const EM_SETREADONLY=207;
+const EM_SETRECT=179;
+const EM_SETRECTNP=180;
+const EM_SETSEL=177;
+const EM_SETTABSTOPS=203;
+const EM_SETWORDBREAKPROC=208;
+const EM_UNDO=199;
+
+const EN_CHANGE=768;
+const EN_ERRSPACE=1280;
+const EN_HSCROLL=1537;
+const EN_KILLFOCUS=512;
+const EN_MAXTEXT=1281;
+const EN_SETFOCUS=256;
+const EN_UPDATE=1024;
+const EN_VSCROLL=1538;
+
+const LB_ADDFILE=406;
+const LB_ADDSTRING=384;
+const LB_DELETESTRING=386;
+const LB_DIR=397;
+const LB_FINDSTRING=399;
+const LB_FINDSTRINGEXACT=418;
+const LB_GETANCHORINDEX=413;
+const LB_GETCARETINDEX=415;
+const LB_GETCOUNT=395;
+const LB_GETCURSEL=392;
+const LB_GETHORIZONTALEXTENT=403;
+const LB_GETITEMDATA=409;
+const LB_GETITEMHEIGHT=417;
+const LB_GETITEMRECT=408;
+const LB_GETLOCALE=422;
+const LB_GETSEL=391;
+const LB_GETSELCOUNT=400;
+const LB_GETSELITEMS=401;
+const LB_GETTEXT=393;
+const LB_GETTEXTLEN=394;
+const LB_GETTOPINDEX=398;
+const LB_INITSTORAGE=424;
+const LB_INSERTSTRING=385;
+const LB_ITEMFROMPOINT=425;
+const LB_RESETCONTENT=388;
+const LB_SELECTSTRING=396;
+const LB_SELITEMRANGE=411;
+const LB_SELITEMRANGEEX=387;
+const LB_SETANCHORINDEX=412;
+const LB_SETCARETINDEX=414;
+const LB_SETCOLUMNWIDTH=405;
+const LB_SETCOUNT=423;
+const LB_SETCURSEL=390;
+const LB_SETHORIZONTALEXTENT=404;
+const LB_SETITEMDATA=410;
+const LB_SETITEMHEIGHT=416;
+const LB_SETLOCALE=421;
+const LB_SETSEL=389;
+const LB_SETTABSTOPS=402;
+const LB_SETTOPINDEX=407;
+
+const LBN_DBLCLK=2;
+const LBN_ERRSPACE=-2;
+const LBN_KILLFOCUS=5;
+const LBN_SELCANCEL=3;
+const LBN_SELCHANGE=1;
+const LBN_SETFOCUS=4;
+
+const SBM_ENABLE_ARROWS=228;
+const SBM_GETPOS=225;
+const SBM_GETRANGE=227;
+const SBM_GETSCROLLINFO=234;
+const SBM_SETPOS=224;
+const SBM_SETRANGE=226;
+const SBM_SETRANGEREDRAW=230;
+const SBM_SETSCROLLINFO=233;
+const STM_GETICON=369;
+const STM_GETIMAGE=371;
+const STM_SETICON=368;
+const STM_SETIMAGE=370;
+const STN_CLICKED=0;
+const STN_DBLCLK=1;
+const STN_DISABLE=3;
+const STN_ENABLE=2;
+
+const DM_GETDEFID   = WM_USER;
+const DM_SETDEFID   = WM_USER+1;
+const DM_REPOSITION = WM_USER+2;
+
+const PSM_PAGEINFO  = WM_USER+100;
+const PSM_SHEETINFO = WM_USER+101;
+
+const PSI_SETACTIVE=1;
+const PSI_KILLACTIVE=2;
+const PSI_APPLY=3;
+const PSI_RESET=4;
+const PSI_HASHELP=5;
+const PSI_HELP=6;
+const PSI_CHANGED=1;
+const PSI_GUISTART=2;
+const PSI_REBOOT=3;
+const PSI_GETSIBLINGS=4;
+
+const DCX_WINDOW=1;
+const DCX_CACHE=2;
+const DCX_PARENTCLIP=32;
+const DCX_CLIPSIBLINGS=16;
+const DCX_CLIPCHILDREN=8;
+const DCX_NORESETATTRS=4;
+const DCX_INTERSECTUPDATE=0x200;
+const DCX_LOCKWINDOWUPDATE=0x400;
+const DCX_EXCLUDERGN=64;
+const DCX_INTERSECTRGN=128;
+const DCX_VALIDATE=0x200000;
+
+const GMDI_GOINTOPOPUPS=2;
+const GMDI_USEDISABLED=1;
+const FKF_AVAILABLE=2;
+const FKF_CLICKON=64;
+const FKF_FILTERKEYSON=1;
+const FKF_HOTKEYACTIVE=4;
+const FKF_HOTKEYSOUND=16;
+const FKF_CONFIRMHOTKEY=8;
+const FKF_INDICATOR=32;
+const HCF_HIGHCONTRASTON=1;
+const HCF_AVAILABLE=2;
+const HCF_HOTKEYACTIVE=4;
+const HCF_CONFIRMHOTKEY=8;
+const HCF_HOTKEYSOUND=16;
+const HCF_INDICATOR=32;
+const HCF_HOTKEYAVAILABLE=64;
+const MKF_AVAILABLE=2;
+const MKF_CONFIRMHOTKEY=8;
+const MKF_HOTKEYACTIVE=4;
+const MKF_HOTKEYSOUND=16;
+const MKF_INDICATOR=32;
+const MKF_MOUSEKEYSON=1;
+const MKF_MODIFIERS=64;
+const MKF_REPLACENUMBERS=128;
+const SERKF_ACTIVE=8;  // May be obsolete. Not in recent MS docs.
+const SERKF_AVAILABLE=2;
+const SERKF_INDICATOR=4;
+const SERKF_SERIALKEYSON=1;
+const SSF_AVAILABLE=2;
+const SSF_SOUNDSENTRYON=1;
+const SSTF_BORDER=2;
+const SSTF_CHARS=1;
+const SSTF_DISPLAY=3;
+const SSTF_NONE=0;
+const SSGF_DISPLAY=3;
+const SSGF_NONE=0;
+const SSWF_CUSTOM=4;
+const SSWF_DISPLAY=3;
+const SSWF_NONE=0;
+const SSWF_TITLE=1;
+const SSWF_WINDOW=2;
+const SKF_AUDIBLEFEEDBACK=64;
+const SKF_AVAILABLE=2;
+const SKF_CONFIRMHOTKEY=8;
+const SKF_HOTKEYACTIVE=4;
+const SKF_HOTKEYSOUND=16;
+const SKF_INDICATOR=32;
+const SKF_STICKYKEYSON=1;
+const SKF_TRISTATE=128;
+const SKF_TWOKEYSOFF=256;
+const TKF_AVAILABLE=2;
+const TKF_CONFIRMHOTKEY=8;
+const TKF_HOTKEYACTIVE=4;
+const TKF_HOTKEYSOUND=16;
+const TKF_TOGGLEKEYSON=1;
+const MDITILE_SKIPDISABLED=2;
+const MDITILE_HORIZONTAL=1;
+const MDITILE_VERTICAL=0;
+
+enum {
+	VK_LBUTTON = 0x01,
+	VK_RBUTTON = 0x02,
+	VK_CANCEL = 0x03,
+	VK_MBUTTON = 0x04,
+	//static if (_WIN32_WINNT > =  0x500) {
+	VK_XBUTTON1 = 0x05,
+	VK_XBUTTON2 = 0x06,
+	//}
+	VK_BACK = 0x08,
+	VK_TAB = 0x09,
+	VK_CLEAR = 0x0C,
+	VK_RETURN = 0x0D,
+	VK_SHIFT = 0x10,
+	VK_CONTROL = 0x11,
+	VK_MENU = 0x12,
+	VK_PAUSE = 0x13,
+	VK_CAPITAL = 0x14,
+	VK_KANA = 0x15,
+	VK_HANGEUL = 0x15,
+	VK_HANGUL = 0x15,
+	VK_JUNJA = 0x17,
+	VK_FINAL = 0x18,
+	VK_HANJA = 0x19,
+	VK_KANJI = 0x19,
+	VK_ESCAPE = 0x1B,
+	VK_CONVERT = 0x1C,
+	VK_NONCONVERT = 0x1D,
+	VK_ACCEPT = 0x1E,
+	VK_MODECHANGE = 0x1F,
+	VK_SPACE = 0x20,
+	VK_PRIOR = 0x21,
+	VK_NEXT = 0x22,
+	VK_END = 0x23,
+	VK_HOME = 0x24,
+	VK_LEFT = 0x25,
+	VK_UP = 0x26,
+	VK_RIGHT = 0x27,
+	VK_DOWN = 0x28,
+	VK_SELECT = 0x29,
+	VK_PRINT = 0x2A,
+	VK_EXECUTE = 0x2B,
+	VK_SNAPSHOT = 0x2C,
+	VK_INSERT = 0x2D,
+	VK_DELETE = 0x2E,
+	VK_HELP = 0x2F,
+	VK_LWIN = 0x5B,
+	VK_RWIN = 0x5C,
+	VK_APPS = 0x5D,
+	VK_SLEEP = 0x5F,
+	VK_NUMPAD0 = 0x60,
+	VK_NUMPAD1 = 0x61,
+	VK_NUMPAD2 = 0x62,
+	VK_NUMPAD3 = 0x63,
+	VK_NUMPAD4 = 0x64,
+	VK_NUMPAD5 = 0x65,
+	VK_NUMPAD6 = 0x66,
+	VK_NUMPAD7 = 0x67,
+	VK_NUMPAD8 = 0x68,
+	VK_NUMPAD9 = 0x69,
+	VK_MULTIPLY = 0x6A,
+	VK_ADD = 0x6B,
+	VK_SEPARATOR = 0x6C,
+	VK_SUBTRACT = 0x6D,
+	VK_DECIMAL = 0x6E,
+	VK_DIVIDE = 0x6F,
+	VK_F1 = 0x70,
+	VK_F2 = 0x71,
+	VK_F3 = 0x72,
+	VK_F4 = 0x73,
+	VK_F5 = 0x74,
+	VK_F6 = 0x75,
+	VK_F7 = 0x76,
+	VK_F8 = 0x77,
+	VK_F9 = 0x78,
+	VK_F10 = 0x79,
+	VK_F11 = 0x7A,
+	VK_F12 = 0x7B,
+	VK_F13 = 0x7C,
+	VK_F14 = 0x7D,
+	VK_F15 = 0x7E,
+	VK_F16 = 0x7F,
+	VK_F17 = 0x80,
+	VK_F18 = 0x81,
+	VK_F19 = 0x82,
+	VK_F20 = 0x83,
+	VK_F21 = 0x84,
+	VK_F22 = 0x85,
+	VK_F23 = 0x86,
+	VK_F24 = 0x87,
+	VK_NUMLOCK = 0x90,
+	VK_SCROLL = 0x91,
+	VK_LSHIFT = 0xA0,
+	VK_RSHIFT = 0xA1,
+	VK_LCONTROL = 0xA2,
+	VK_RCONTROL = 0xA3,
+	VK_LMENU = 0xA4,
+	VK_RMENU = 0xA5,
+	//static if (_WIN32_WINNT > =  0x500) {
+	VK_BROWSER_BACK = 0xA6,
+	VK_BROWSER_FORWARD = 0xA7,
+	VK_BROWSER_REFRESH = 0xA8,
+	VK_BROWSER_STOP = 0xA9,
+	VK_BROWSER_SEARCH = 0xAA,
+	VK_BROWSER_FAVORITES = 0xAB,
+	VK_BROWSER_HOME = 0xAC,
+	VK_VOLUME_MUTE = 0xAD,
+	VK_VOLUME_DOWN = 0xAE,
+	VK_VOLUME_UP = 0xAF,
+	VK_MEDIA_NEXT_TRACK = 0xB0,
+	VK_MEDIA_PREV_TRACK = 0xB1,
+	VK_MEDIA_STOP = 0xB2,
+	VK_MEDIA_PLAY_PAUSE = 0xB3,
+	VK_LAUNCH_MAIL = 0xB4,
+	VK_LAUNCH_MEDIA_SELECT = 0xB5,
+	VK_LAUNCH_APP1 = 0xB6,
+	VK_LAUNCH_APP2 = 0xB7,
+	//}
+	VK_OEM_1 = 0xBA,
+	//static if (_WIN32_WINNT > =  0x500) {
+	VK_OEM_PLUS = 0xBB,
+	VK_OEM_COMMA = 0xBC,
+	VK_OEM_MINUS = 0xBD,
+	VK_OEM_PERIOD = 0xBE,
+	//}
+	VK_OEM_2 = 0xBF,
+	VK_OEM_3 = 0xC0,
+	VK_OEM_4 = 0xDB,
+	VK_OEM_5 = 0xDC,
+	VK_OEM_6 = 0xDD,
+	VK_OEM_7 = 0xDE,
+	VK_OEM_8 = 0xDF,
+	//static if (_WIN32_WINNT > =  0x500) {
+	VK_OEM_102 = 0xE2,
+	//}
+	VK_PROCESSKEY = 0xE5,
+	//static if (_WIN32_WINNT > =  0x500) {
+	VK_PACKET = 0xE7,
+	//}
+	VK_ATTN = 0xF6,
+	VK_CRSEL = 0xF7,
+	VK_EXSEL = 0xF8,
+	VK_EREOF = 0xF9,
+	VK_PLAY = 0xFA,
+	VK_ZOOM = 0xFB,
+	VK_NONAME = 0xFC,
+	VK_PA1 = 0xFD,
+	VK_OEM_CLEAR = 0xFE,
+}
+
+const TME_HOVER=1;
+const TME_LEAVE=2;
+const TME_QUERY=0x40000000;
+const TME_CANCEL=0x80000000;
+
+const HOVER_DEFAULT=0xFFFFFFFF;
+
+const MK_LBUTTON=1;
+const MK_RBUTTON=2;
+const MK_SHIFT=4;
+const MK_CONTROL=8;
+const MK_MBUTTON=16;
+static if (_WIN32_WINNT >= 0x500) {
+const MK_XBUTTON1=32;
+const MK_XBUTTON2=64;
+}
+const TPM_CENTERALIGN=4;
+const TPM_LEFTALIGN=0;
+const TPM_RIGHTALIGN=8;
+const TPM_LEFTBUTTON=0;
+const TPM_RIGHTBUTTON=2;
+const TPM_HORIZONTAL=0;
+const TPM_VERTICAL=64;
+const TPM_TOPALIGN=0;
+const TPM_VCENTERALIGN=16;
+const TPM_BOTTOMALIGN=32;
+const TPM_NONOTIFY=128;
+const TPM_RETURNCMD=256;
+static if ((_WIN32_WINNT >= 0x500) || (_WIN32_WINDOWS >= 0x410)) {
+const TPM_RECURSE=1;
+}
+
+const HELP_COMMAND=0x102;
+const HELP_CONTENTS=3;
+const HELP_CONTEXT=1;
+const HELP_CONTEXTPOPUP=8;
+const HELP_FORCEFILE=9;
+const HELP_HELPONHELP=4;
+const HELP_INDEX=3;
+const HELP_KEY=0x101;
+const HELP_MULTIKEY=0x201;
+const HELP_PARTIALKEY=0x105;
+const HELP_QUIT=2;
+const HELP_SETCONTENTS=5;
+const HELP_SETINDEX=5;
+const HELP_SETWINPOS=0x203;
+const HELP_CONTEXTMENU=0xa;
+const HELP_FINDER=0xb;
+const HELP_WM_HELP=0xc;
+const HELP_TCARD=0x8000;
+const HELP_TCARD_DATA=16;
+const HELP_TCARD_OTHER_CALLER=0x11;
+
+const IDH_NO_HELP=28440;
+const IDH_MISSING_CONTEXT=28441;
+const IDH_GENERIC_HELP_BUTTON=28442;
+const IDH_OK=28443;
+const IDH_CANCEL=28444;
+const IDH_HELP=28445;
+
+const LB_CTLCODE=0;
+const LB_OKAY=0;
+const LB_ERR=-1;
+const LB_ERRSPACE=-2;
+
+const CB_OKAY=0;
+const CB_ERR=-1;
+const CB_ERRSPACE=-2;
+
+const HIDE_WINDOW=0;
+
+const SHOW_OPENWINDOW=1;
+const SHOW_ICONWINDOW=2;
+const SHOW_FULLSCREEN=3;
+const SHOW_OPENNOACTIVATE=4;
+
+const SW_PARENTCLOSING=1;
+const SW_OTHERZOOM=2;
+const SW_PARENTOPENING=3;
+const SW_OTHERUNZOOM=4;
+
+const KF_EXTENDED=256;
+const KF_DLGMODE=2048;
+const KF_MENUMODE=4096;
+const KF_ALTDOWN=8192;
+const KF_REPEAT=16384;
+const KF_UP=32768;
+
+const WSF_VISIBLE=1;
+
+const PWR_OK=1;
+const PWR_FAIL=-1;
+const PWR_SUSPENDREQUEST=1;
+const PWR_SUSPENDRESUME=2;
+const PWR_CRITICALRESUME=3;
+
+const NFR_ANSI=1;
+const NFR_UNICODE=2;
+const NF_QUERY=3;
+const NF_REQUERY=4;
+
+const MENULOOP_WINDOW=0;
+const MENULOOP_POPUP=1;
+
+const WMSZ_LEFT=1;
+const WMSZ_RIGHT=2;
+const WMSZ_TOP=3;
+const WMSZ_TOPLEFT=4;
+const WMSZ_TOPRIGHT=5;
+const WMSZ_BOTTOM=6;
+const WMSZ_BOTTOMLEFT=7;
+const WMSZ_BOTTOMRIGHT=8;
+
+const HTERROR=-2;
+const HTTRANSPARENT=-1;
+const HTNOWHERE=0;
+const HTCLIENT=1;
+const HTCAPTION=2;
+const HTSYSMENU=3;
+const HTGROWBOX=4;
+const HTSIZE=4;
+const HTMENU=5;
+const HTHSCROLL=6;
+const HTVSCROLL=7;
+const HTMINBUTTON=8;
+const HTMAXBUTTON=9;
+const HTREDUCE=8;
+const HTZOOM=9;
+const HTLEFT=10;
+const HTSIZEFIRST=10;
+const HTRIGHT=11;
+const HTTOP=12;
+const HTTOPLEFT=13;
+const HTTOPRIGHT=14;
+const HTBOTTOM=15;
+const HTBOTTOMLEFT=16;
+const HTBOTTOMRIGHT=17;
+const HTSIZELAST=17;
+const HTBORDER=18;
+const HTOBJECT=19;
+const HTCLOSE=20;
+const HTHELP=21;
+
+const MA_ACTIVATE=1;
+const MA_ACTIVATEANDEAT=2;
+const MA_NOACTIVATE=3;
+const MA_NOACTIVATEANDEAT=4;
+
+const SIZE_RESTORED=0;
+const SIZE_MINIMIZED=1;
+const SIZE_MAXIMIZED=2;
+const SIZE_MAXSHOW=3;
+const SIZE_MAXHIDE=4;
+
+const SIZENORMAL=0;
+const SIZEICONIC=1;
+const SIZEFULLSCREEN=2;
+const SIZEZOOMSHOW=3;
+const SIZEZOOMHIDE=4;
+
+const WVR_ALIGNTOP=16;
+const WVR_ALIGNLEFT=32;
+const WVR_ALIGNBOTTOM=64;
+const WVR_ALIGNRIGHT=128;
+const WVR_HREDRAW=256;
+const WVR_VREDRAW=512;
+const WVR_REDRAW=(WVR_HREDRAW|WVR_VREDRAW);
+const WVR_VALIDRECTS=1024;
+
+const PRF_CHECKVISIBLE=1;
+const PRF_NONCLIENT=2;
+const PRF_CLIENT=4;
+const PRF_ERASEBKGND=8;
+const PRF_CHILDREN=16;
+const PRF_OWNED=32;
+
+const IDANI_OPEN=1;
+const IDANI_CLOSE=2;
+const IDANI_CAPTION=3;
+
+const WPF_RESTORETOMAXIMIZED=2;
+const WPF_SETMINPOSITION=1;
+
+const ODT_MENU=1;
+const ODT_LISTBOX=2;
+const ODT_COMBOBOX=3;
+const ODT_BUTTON=4;
+const ODT_STATIC=5;
+const ODA_DRAWENTIRE=1;
+const ODA_SELECT=2;
+const ODA_FOCUS=4;
+const ODS_SELECTED=1;
+const ODS_GRAYED=2;
+const ODS_DISABLED=4;
+const ODS_CHECKED=8;
+const ODS_FOCUS=16;
+const ODS_DEFAULT=32;
+const ODS_COMBOBOXEDIT=4096;
+
+const IDHOT_SNAPWINDOW=-1;
+const IDHOT_SNAPDESKTOP=-2;
+
+const DBWF_LPARAMPOINTER=0x8000;
+const DLGWINDOWEXTRA=30;
+const MNC_IGNORE=0;
+const MNC_CLOSE=1;
+const MNC_EXECUTE=2;
+const MNC_SELECT=3;
+const DOF_EXECUTABLE=0x8001;
+const DOF_DOCUMENT=0x8002;
+const DOF_DIRECTORY=0x8003;
+const DOF_MULTIPLE=0x8004;
+const DOF_PROGMAN=1;
+const DOF_SHELLDATA=2;
+const DO_DROPFILE=0x454C4946;
+const DO_PRINTFILE=0x544E5250;
+
+const SW_SCROLLCHILDREN=1;
+const SW_INVALIDATE=2;
+const SW_ERASE=4;
+
+const SC_SIZE=0xF000;
+const SC_MOVE=0xF010;
+const SC_MINIMIZE=0xF020;
+const SC_ICON=0xf020;
+const SC_MAXIMIZE=0xF030;
+const SC_ZOOM=0xF030;
+const SC_NEXTWINDOW=0xF040;
+const SC_PREVWINDOW=0xF050;
+const SC_CLOSE=0xF060;
+const SC_VSCROLL=0xF070;
+const SC_HSCROLL=0xF080;
+const SC_MOUSEMENU=0xF090;
+const SC_KEYMENU=0xF100;
+const SC_ARRANGE=0xF110;
+const SC_RESTORE=0xF120;
+const SC_TASKLIST=0xF130;
+const SC_SCREENSAVE=0xF140;
+const SC_HOTKEY=0xF150;
+const SC_DEFAULT=0xF160;
+const SC_MONITORPOWER=0xF170;
+const SC_CONTEXTHELP=0xF180;
+const SC_SEPARATOR=0xF00F;
+
+const EC_LEFTMARGIN=1;
+const EC_RIGHTMARGIN=2;
+const EC_USEFONTINFO=0xffff;
+
+const DC_HASDEFID=0x534B;
+
+const DLGC_WANTARROWS=1;
+const DLGC_WANTTAB=2;
+const DLGC_WANTALLKEYS=4;
+const DLGC_WANTMESSAGE=4;
+const DLGC_HASSETSEL=8;
+const DLGC_DEFPUSHBUTTON=16;
+const DLGC_UNDEFPUSHBUTTON=32;
+const DLGC_RADIOBUTTON=64;
+const DLGC_WANTCHARS=128;
+const DLGC_STATIC=256;
+const DLGC_BUTTON=0x2000;
+
+const WA_INACTIVE=0;
+const WA_ACTIVE=1;
+const WA_CLICKACTIVE=2;
+
+const ICON_SMALL=0;
+const ICON_BIG=1;
+static if (_WIN32_WINNT >= 0x501) {
+const ICON_SMALL2=2;
+}
+
+const HBITMAP
+	HBMMENU_CALLBACK = cast(HBITMAP)-1,
+	HBMMENU_SYSTEM = cast(HBITMAP)1,
+	HBMMENU_MBAR_RESTORE = cast(HBITMAP)2,
+	HBMMENU_MBAR_MINIMIZE = cast(HBITMAP)3,
+	HBMMENU_MBAR_CLOSE = cast(HBITMAP)5,
+	HBMMENU_MBAR_CLOSE_D = cast(HBITMAP)6,
+	HBMMENU_MBAR_MINIMIZE_D = cast(HBITMAP)7,
+	HBMMENU_POPUP_CLOSE = cast(HBITMAP)8,
+	HBMMENU_POPUP_RESTORE = cast(HBITMAP)9,
+	HBMMENU_POPUP_MAXIMIZE = cast(HBITMAP)10,
+	HBMMENU_POPUP_MINIMIZE = cast(HBITMAP)11;
+
+const MOD_ALT=1;
+const MOD_CONTROL=2;
+const MOD_SHIFT=4;
+const MOD_WIN=8;
+const MOD_IGNORE_ALL_MODIFIER=1024;
+const MOD_ON_KEYUP=2048;
+const MOD_RIGHT=16384;
+const MOD_LEFT=32768;
+
+const LLKHF_EXTENDED=(KF_EXTENDED >> 8);
+const LLKHF_INJECTED=0x00000010;
+const LLKHF_ALTDOWN=(KF_ALTDOWN >> 8);
+const LLKHF_UP=(KF_UP >> 8);
+
+static if (WINVER >= 0x500) {
+const FLASHW_STOP=0;
+const FLASHW_CAPTION=1;
+const FLASHW_TRAY=2;
+const FLASHW_ALL=(FLASHW_CAPTION|FLASHW_TRAY);
+const FLASHW_TIMER=4;
+const FLASHW_TIMERNOFG=12;
+}
+
+const CURSOR_SHOWING=0x00000001;
+const WS_ACTIVECAPTION=0x00000001;
+static if (_WIN32_WINNT >= 0x403) {
+const INPUT_MOUSE=0x00000000;
+const INPUT_KEYBOARD=0x00000001;
+const INPUT_HARDWARE=0x00000002;
+}
+static if (WINVER >= 0x400) {
+const ENDSESSION_LOGOFF = 0x80000000;
+}
+
+static if (WINVER >= 0x500) {
+const CHILDID_SELF   = 0;
+const OBJID_WINDOW   = 0x00000000;
+const OBJID_SYSMENU  = 0xFFFFFFFF;
+const OBJID_TITLEBAR = 0xFFFFFFFE;
+const OBJID_MENU     = 0xFFFFFFFD;
+const OBJID_CLIENT   = 0xFFFFFFFC;
+const OBJID_VSCROLL  = 0xFFFFFFFB;
+const OBJID_HSCROLL  = 0xFFFFFFFA;
+const OBJID_SIZEGRIP = 0xFFFFFFF9;
+const OBJID_CARET    = 0xFFFFFFF8;
+const OBJID_CURSOR   = 0xFFFFFFF7;
+const OBJID_ALERT    = 0xFFFFFFF6;
+const OBJID_SOUND    = 0xFFFFFFF5;
+
+const GUI_CARETBLINKING  = 0x00000001;
+const GUI_INMOVESIZE     = 0x00000002;
+const GUI_INMENUMODE     = 0x00000004;
+const GUI_SYSTEMMENUMODE = 0x00000008;
+const GUI_POPUPMENUMODE  = 0x00000010;
+
+static if (_WIN32_WINNT >= 0x501) {
+const GUI_16BITTASK      = 0x00000020;
+}
+const WINEVENT_OUTOFCONTEXT=0x0000;
+const WINEVENT_SKIPOWNTHREAD=0x0001;
+const WINEVENT_SKIPOWNPROCESS=0x0002;
+const WINEVENT_INCONTEXT=0x0004;
+const AW_HOR_POSITIVE=0x00000001;
+const AW_HOR_NEGATIVE=0x00000002;
+const AW_VER_POSITIVE=0x00000004;
+const AW_VER_NEGATIVE=0x00000008;
+const AW_CENTER=0x00000010;
+const AW_HIDE=0x00010000;
+const AW_ACTIVATE=0x00020000;
+const AW_SLIDE=0x00040000;
+const AW_BLEND=0x00080000;
+const DEVICE_NOTIFY_WINDOW_HANDLE=0x00000000;
+const DEVICE_NOTIFY_SERVICE_HANDLE=0x00000001;
+
+static if (_WIN32_WINNT >= 0x501) {
+const DEVICE_NOTIFY_ALL_INTERFACE_CLASSES=0x00000004;
+}
+
+const EVENT_MIN = 0x00000001;
+const EVENT_SYSTEM_SOUND = 0x00000001;
+const EVENT_SYSTEM_ALERT = 0x00000002;
+const EVENT_SYSTEM_FOREGROUND = 0x00000003;
+const EVENT_SYSTEM_MENUSTART = 0x00000004;
+const EVENT_SYSTEM_MENUEND = 0x00000005;
+const EVENT_SYSTEM_MENUPOPUPSTART = 0x00000006;
+const EVENT_SYSTEM_MENUPOPUPEND = 0x00000007;
+const EVENT_SYSTEM_CAPTURESTART = 0x00000008;
+const EVENT_SYSTEM_CAPTUREEND = 0x00000009;
+const EVENT_SYSTEM_MOVESIZESTART = 0x0000000a;
+const EVENT_SYSTEM_MOVESIZEEND = 0x0000000b;
+const EVENT_SYSTEM_CONTEXTHELPSTART = 0x0000000c;
+const EVENT_SYSTEM_CONTEXTHELPEND = 0x0000000d;
+const EVENT_SYSTEM_DRAGDROPSTART = 0x0000000e;
+const EVENT_SYSTEM_DRAGDROPEND = 0x0000000f;
+const EVENT_SYSTEM_DIALOGSTART = 0x00000010;
+const EVENT_SYSTEM_DIALOGEND = 0x00000011;
+const EVENT_SYSTEM_SCROLLINGSTART = 0x00000012;
+const EVENT_SYSTEM_SCROLLINGEND = 0x00000013;
+const EVENT_SYSTEM_SWITCHSTART = 0x00000014;
+const EVENT_SYSTEM_SWITCHEND = 0x00000015;
+const EVENT_SYSTEM_MINIMIZESTART = 0x00000016;
+const EVENT_SYSTEM_MINIMIZEEND = 0x00000017;
+
+const EVENT_OBJECT_CREATE = 0x00008000;
+const EVENT_OBJECT_DESTROY = 0x00008001;
+const EVENT_OBJECT_SHOW = 0x00008002;
+const EVENT_OBJECT_HIDE = 0x00008003;
+const EVENT_OBJECT_REORDER = 0x00008004;
+const EVENT_OBJECT_FOCUS = 0x00008005;
+const EVENT_OBJECT_SELECTION = 0x00008006;
+const EVENT_OBJECT_SELECTIONADD = 0x00008007;
+const EVENT_OBJECT_SELECTIONREMOVE = 0x00008008;
+const EVENT_OBJECT_SELECTIONWITHIN = 0x00008009;
+const EVENT_OBJECT_STATECHANGE = 0x0000800a;
+const EVENT_OBJECT_LOCATIONCHANGE = 0x0000800b;
+const EVENT_OBJECT_NAMECHANGE = 0x0000800c;
+const EVENT_OBJECT_DESCRIPTIONCHANGE = 0x0000800d;
+const EVENT_OBJECT_VALUECHANGE = 0x0000800e;
+const EVENT_OBJECT_PARENTCHANGE = 0x0000800f;
+const EVENT_OBJECT_HELPCHANGE = 0x00008010;
+const EVENT_OBJECT_DEFACTIONCHANGE = 0x00008011;
+const EVENT_OBJECT_ACCELERATORCHANGE = 0x00008012;
+
+static if (_WIN32_WINNT >= 0x501) {
+const EVENT_CONSOLE_CARET             = 0x00004001;
+const EVENT_CONSOLE_UPDATE_REGION     = 0x00004002;
+const EVENT_CONSOLE_UPDATE_SIMPLE     = 0x00004003;
+const EVENT_CONSOLE_UPDATE_SCROLL     = 0x00004004;
+const EVENT_CONSOLE_LAYOUT            = 0x00004005;
+const EVENT_CONSOLE_START_APPLICATION = 0x00004006;
+const EVENT_CONSOLE_END_APPLICATION   = 0x00004007;
+
+const CONSOLE_CARET_SELECTION   = 0x00000001;
+const CONSOLE_CARET_VISIBLE     = 0x00000002;
+
+const CONSOLE_APPLICATION_16BIT = 0x00000001;
+
+}
+const EVENT_MAX=0x7fffffff;
+
+}//(WINVER >= 0x500)
+
+static if ((_WIN32_WINNT >= 0x500) || (_WIN32_WINDOWS >= 0x490)) {
+const DWORD ASFW_ANY = -1;
+const LSFW_LOCK   = 1;
+const LSFW_UNLOCK = 2;
+}
+
+static if (_WIN32_WINNT >= 0x500) {
+const LWA_COLORKEY=0x01;
+const LWA_ALPHA=0x02;
+const ULW_COLORKEY=0x01;
+const ULW_ALPHA=0x02;
+const ULW_OPAQUE=0x04;
+}
+
+const GA_PARENT    = 1;
+const GA_ROOT      = 2;
+const GA_ROOTOWNER = 3;
+
+static if ((_WIN32_WINNT >= 0x500) || (_WIN32_WINDOWS >= 0x410)) {
+
+const MONITOR_DEFAULTTONULL    = 0;
+const MONITOR_DEFAULTTOPRIMARY = 1;
+const MONITOR_DEFAULTTONEAREST = 2;
+const MONITORINFOF_PRIMARY     = 1;
+
+const EDS_RAWMODE = 0x00000002;
+
+const ISMEX_NOSEND   = 0x00000000;
+const ISMEX_SEND     = 0x00000001;
+const ISMEX_NOTIFY   = 0x00000002;
+const ISMEX_CALLBACK = 0x00000004;
+const ISMEX_REPLIED  = 0x00000008;
+}
+
+static if (_WIN32_WINNT >= 0x500) {
+const GR_GDIOBJECTS  = 0;
+const GR_USEROBJECTS = 1;
+}
+
+static if ((_WIN32_WINNT >= 0x500) || (_WIN32_WINDOWS >= 0x490)) {
+const GMMP_USE_DISPLAY_POINTS         = 1;
+const GMMP_USE_HIGH_RESOLUTION_POINTS = 2;
+}
+
+static if (_WIN32_WINNT >= 0x501) {
+const PW_CLIENTONLY               = 0x00000001;
+const RIM_INPUT                   = 0x00000000;
+const RIM_INPUTSINK               = 0x00000001;
+const RIM_TYPEMOUSE               = 0x00000000;
+const RIM_TYPEKEYBOARD            = 0x00000001;
+const RIM_TYPEHID                 = 0x00000002;
+const MOUSE_MOVE_RELATIVE         = 0x00000000;
+const MOUSE_MOVE_ABSOLUTE         = 0x00000001;
+const MOUSE_VIRTUAL_DESKTOP       = 0x00000002;
+const MOUSE_ATTRIBUTES_CHANGED    = 0x00000004;
+const RI_MOUSE_LEFT_BUTTON_DOWN   = 0x0001;
+const RI_MOUSE_LEFT_BUTTON_UP     = 0x0002;
+const RI_MOUSE_RIGHT_BUTTON_DOWN  = 0x0004;
+const RI_MOUSE_RIGHT_BUTTON_UP    = 0x0008;
+const RI_MOUSE_MIDDLE_BUTTON_DOWN = 0x0010;
+const RI_MOUSE_MIDDLE_BUTTON_UP   = 0x0020;
+const RI_MOUSE_BUTTON_1_DOWN = RI_MOUSE_LEFT_BUTTON_DOWN;
+const RI_MOUSE_BUTTON_1_UP   = RI_MOUSE_LEFT_BUTTON_UP;
+const RI_MOUSE_BUTTON_2_DOWN = RI_MOUSE_RIGHT_BUTTON_DOWN;
+const RI_MOUSE_BUTTON_2_UP   = RI_MOUSE_RIGHT_BUTTON_UP;
+const RI_MOUSE_BUTTON_3_DOWN = RI_MOUSE_MIDDLE_BUTTON_DOWN;
+const RI_MOUSE_BUTTON_3_UP   = RI_MOUSE_MIDDLE_BUTTON_UP;
+const RI_MOUSE_BUTTON_4_DOWN = 0x0040;
+const RI_MOUSE_BUTTON_4_UP   = 0x0080;
+const RI_MOUSE_BUTTON_5_DOWN = 0x0100;
+const RI_MOUSE_BUTTON_5_UP   = 0x0200;
+const RI_MOUSE_WHEEL         = 0x0400;
+const KEYBOARD_OVERRUN_MAKE_CODE = 0x00ff;
+const RI_KEY_MAKE            = 0x0000;
+const RI_KEY_BREAK           = 0x0001;
+const RI_KEY_E0              = 0x0002;
+const RI_KEY_E1              = 0x0004;
+const RI_KEY_TERMSRV_SET_LED = 0x0008;
+const RI_KEY_TERMSRV_SHADOW  = 0x0010;
+
+const RID_INPUT          = 0x10000003;
+const RID_HEADER         = 0x10000005;
+
+const RIDI_PREPARSEDDATA = 0x20000005;
+const RIDI_DEVICENAME    = 0x20000007;
+const RIDI_DEVICEINFO    = 0x2000000b;
+
+const RIDEV_REMOVE       = 0x00000001;
+const RIDEV_EXCLUDE      = 0x00000010;
+const RIDEV_PAGEONLY     = 0x00000020;
+const RIDEV_NOLEGACY     = 0x00000030;
+const RIDEV_INPUTSINK    = 0x00000100;
+const RIDEV_CAPTUREMOUSE = 0x00000200;
+const RIDEV_NOHOTKEYS    = 0x00000200;
+const RIDEV_APPKEYS      = 0x00000400;
+}
+
+// Callbacks
+// ---------
+extern (Windows) {
+	alias BOOL function (HWND, UINT, WPARAM, LPARAM)    DLGPROC;
+	alias void function (HWND, UINT, UINT, DWORD)       TIMERPROC;
+	alias BOOL function (HDC, LPARAM, int)              GRAYSTRINGPROC;
+	alias LRESULT function (int, WPARAM, LPARAM)        HOOKPROC;
+	alias BOOL function (HWND, LPCSTR, HANDLE)          PROPENUMPROCA;
+	alias BOOL function (HWND, LPCWSTR, HANDLE)         PROPENUMPROCW;
+	alias BOOL function (HWND, LPSTR, HANDLE, DWORD)    PROPENUMPROCEXA;
+	alias BOOL function (HWND, LPWSTR, HANDLE, DWORD)   PROPENUMPROCEXW;
+	alias int function (LPSTR, int, int, int)           EDITWORDBREAKPROCA;
+	alias int function (LPWSTR, int, int, int)          EDITWORDBREAKPROCW;
+	alias LRESULT function (HWND, UINT, WPARAM, LPARAM) WNDPROC;
+	alias BOOL function (HDC, LPARAM, WPARAM, int, int) DRAWSTATEPROC;
+	alias BOOL function (HWND, LPARAM)                  WNDENUMPROC;
+	alias BOOL function (HWND, LPARAM)                  ENUMWINDOWSPROC;
+	alias void function (LPHELPINFO)                    MSGBOXCALLBACK;
+
+	static if (WINVER >= 0x410) {
+		alias BOOL function (HMONITOR, HDC, LPRECT, LPARAM) MONITORENUMPROC;
+	}
+	alias BOOL function (LPSTR, LPARAM)                 NAMEENUMPROCA;
+	alias BOOL function (LPWSTR, LPARAM)                NAMEENUMPROCW;
+	alias void function (HWND, UINT, DWORD, LRESULT)    SENDASYNCPROC;
+
+	alias NAMEENUMPROCA DESKTOPENUMPROCA;
+	alias NAMEENUMPROCW DESKTOPENUMPROCW;
+	alias NAMEENUMPROCA WINSTAENUMPROCA;
+	alias NAMEENUMPROCW WINSTAENUMPROCW;
+}
+
+typedef HANDLE HHOOK;
+typedef HANDLE HDWP;
+typedef HANDLE HDEVNOTIFY;
+
+struct ACCEL {
+	BYTE fVirt;
+	WORD key;
+	WORD cmd;
+}
+alias ACCEL* LPACCEL;
+
+struct ACCESSTIMEOUT {
+	UINT  cbSize = ACCESSTIMEOUT.sizeof;
+	DWORD dwFlags;
+	DWORD iTimeOutMSec;
+}
+alias ACCESSTIMEOUT* LPACCESSTIMEOUT;
+
+struct ANIMATIONINFO {
+	UINT cbSize = ANIMATIONINFO.sizeof;
+	int  iMinAnimate;
+}
+alias ANIMATIONINFO* LPANIMATIONINFO;
+
+struct CREATESTRUCTA {
+	LPVOID    lpCreateParams;
+	HINSTANCE hInstance;
+	HMENU     hMenu;
+	HWND      hwndParent;
+	int       cy;
+	int       cx;
+	int       y;
+	int       x;
+	LONG      style;
+	LPCSTR    lpszName;
+	LPCSTR    lpszClass;
+	DWORD     dwExStyle;
+}
+alias CREATESTRUCTA* LPCREATESTRUCTA;
+
+struct CREATESTRUCTW {
+	LPVOID    lpCreateParams;
+	HINSTANCE hInstance;
+	HMENU     hMenu;
+	HWND      hwndParent;
+	int       cy;
+	int       cx;
+	int       y;
+	int       x;
+	LONG      style;
+	LPCWSTR   lpszName;
+	LPCWSTR   lpszClass;
+	DWORD     dwExStyle;
+}
+alias CREATESTRUCTW* LPCREATESTRUCTW;
+
+struct CBT_CREATEWNDA {
+	LPCREATESTRUCTA lpcs;
+	HWND            hwndInsertAfter;
+}
+alias CBT_CREATEWNDA* LPCBT_CREATEWNDA;
+
+struct CBT_CREATEWNDW {
+	LPCREATESTRUCTW lpcs;
+	HWND            hwndInsertAfter;
+}
+alias CBT_CREATEWNDW* LPCBT_CREATEWNDW;
+
+struct CBTACTIVATESTRUCT {
+	BOOL fMouse;
+	HWND hWndActive;
+}
+alias CBTACTIVATESTRUCT* LPCBTACTIVATESTRUCT;
+
+struct CLIENTCREATESTRUCT {
+	HANDLE hWindowMenu;
+	UINT   idFirstChild;
+}
+alias CLIENTCREATESTRUCT* LPCLIENTCREATESTRUCT;
+
+struct COMPAREITEMSTRUCT {
+	UINT  CtlType;
+	UINT  CtlID;
+	HWND  hwndItem;
+	UINT  itemID1;
+	DWORD itemData1;
+	UINT  itemID2;
+	DWORD itemData2;
+	DWORD dwLocaleId;
+}
+alias COMPAREITEMSTRUCT* LPCOMPAREITEMSTRUCT;
+
+struct COPYDATASTRUCT {
+	DWORD dwData;
+	DWORD cbData;
+	PVOID lpData;
+}
+alias COPYDATASTRUCT* PCOPYDATASTRUCT;
+
+struct CURSORSHAPE {
+	int xHotSpot;
+	int yHotSpot;
+	int cx;
+	int cy;
+	int cbWidth;
+	BYTE Planes;
+	BYTE BitsPixel;
+}
+alias CURSORSHAPE* LPCURSORSHAPE;
+
+struct CWPRETSTRUCT {
+	LRESULT lResult;
+	LPARAM lParam;
+	WPARAM wParam;
+	DWORD message;
+	HWND hwnd;
+}
+
+struct CWPSTRUCT {
+	LPARAM lParam;
+	WPARAM wParam;
+	UINT message;
+	HWND hwnd;
+}
+alias CWPSTRUCT* PCWPSTRUCT;
+
+struct DEBUGHOOKINFO {
+	DWORD idThread;
+	DWORD idThreadInstaller;
+	LPARAM lParam;
+	WPARAM wParam;
+	int code;
+}
+alias DEBUGHOOKINFO* PDEBUGHOOKINFO, LPDEBUGHOOKINFO;
+
+struct DELETEITEMSTRUCT {
+	UINT CtlType;
+	UINT CtlID;
+	UINT itemID;
+	HWND hwndItem;
+	UINT itemData;
+}
+alias DELETEITEMSTRUCT* PDELETEITEMSTRUCT, LPDELETEITEMSTRUCT;
+
+align(2):
+struct DLGITEMTEMPLATE {
+	DWORD style;
+	DWORD dwExtendedStyle;
+	short x;
+	short y;
+	short cx;
+	short cy;
+	WORD id;
+}
+alias DLGITEMTEMPLATE* LPDLGITEMTEMPLATE;
+
+struct DLGTEMPLATE {
+	DWORD style;
+	DWORD dwExtendedStyle;
+	WORD  cdit;
+	short x;
+	short y;
+	short cx;
+	short cy;
+}
+alias DLGTEMPLATE* LPDLGTEMPLATE, LPDLGTEMPLATEA, LPDLGTEMPLATEW;
+alias DLGTEMPLATE* LPCDLGTEMPLATE;
+
+align:
+
+struct DRAWITEMSTRUCT {
+	UINT  CtlType;
+	UINT  CtlID;
+	UINT  itemID;
+	UINT  itemAction;
+	UINT  itemState;
+	HWND  hwndItem;
+	HDC   hDC;
+	RECT  rcItem;
+	DWORD itemData;
+}
+alias DRAWITEMSTRUCT* LPDRAWITEMSTRUCT, PDRAWITEMSTRUCT;
+
+struct DRAWTEXTPARAMS {
+	UINT cbSize = DRAWTEXTPARAMS.sizeof;
+	int  iTabLength;
+	int  iLeftMargin;
+	int  iRightMargin;
+	UINT uiLengthDrawn;
+}
+alias DRAWTEXTPARAMS* LPDRAWTEXTPARAMS;
+
+struct PAINTSTRUCT {
+	HDC      hdc;
+	BOOL     fErase;
+	RECT     rcPaint;
+	BOOL     fRestore;
+	BOOL     fIncUpdate;
+	BYTE[32] rgbReserved;
+}
+alias PAINTSTRUCT* LPPAINTSTRUCT;
+
+struct MSG {
+	HWND   hwnd;
+	UINT   message;
+	WPARAM wParam;
+	LPARAM lParam;
+	DWORD  time;
+	POINT  pt;
+}
+alias MSG* LPMSG, PMSG;
+
+struct ICONINFO {
+	BOOL    fIcon;
+	DWORD   xHotspot;
+	DWORD   yHotspot;
+	HBITMAP hbmMask;
+	HBITMAP hbmColor;
+}
+alias ICONINFO* PICONINFO;
+
+struct NMHDR {
+	HWND hwndFrom;
+	UINT idFrom;
+	UINT code;
+}
+alias NMHDR* LPNMHDR;
+
+struct WNDCLASSA {
+	UINT      style;
+	WNDPROC   lpfnWndProc;
+	int       cbClsExtra;
+	int       cbWndExtra;
+	HINSTANCE hInstance;
+	HICON     hIcon;
+	HCURSOR   hCursor;
+	HBRUSH    hbrBackground;
+	LPCSTR    lpszMenuName;
+	LPCSTR    lpszClassName;
+}
+alias WNDCLASSA* LPWNDCLASSA, PWNDCLASSA;
+
+struct WNDCLASSW {
+	UINT      style;
+	WNDPROC   lpfnWndProc;
+	int       cbClsExtra;
+	int       cbWndExtra;
+	HINSTANCE hInstance;
+	HICON     hIcon;
+	HCURSOR   hCursor;
+	HBRUSH    hbrBackground;
+	LPCWSTR   lpszMenuName;
+	LPCWSTR   lpszClassName;
+}
+alias WNDCLASSW* LPWNDCLASSW, PWNDCLASSW;
+
+struct WNDCLASSEXA {
+	UINT      cbSize = WNDCLASSEXA.sizeof;
+	UINT      style;
+	WNDPROC   lpfnWndProc;
+	int       cbClsExtra;
+	int       cbWndExtra;
+	HINSTANCE hInstance;
+	HICON     hIcon;
+	HCURSOR   hCursor;
+	HBRUSH    hbrBackground;
+	LPCSTR    lpszMenuName;
+	LPCSTR    lpszClassName;
+	HICON     hIconSm;
+}
+alias WNDCLASSEXA* LPWNDCLASSEXA, PWNDCLASSEXA;
+
+struct WNDCLASSEXW {
+	UINT      cbSize = WNDCLASSEXW.sizeof;
+	UINT      style;
+	WNDPROC   lpfnWndProc;
+	int       cbClsExtra;
+	int       cbWndExtra;
+	HINSTANCE hInstance;
+	HICON     hIcon;
+	HCURSOR   hCursor;
+	HBRUSH    hbrBackground;
+	LPCWSTR   lpszMenuName;
+	LPCWSTR   lpszClassName;
+	HICON     hIconSm;
+}
+alias WNDCLASSEXW* LPWNDCLASSEXW, PWNDCLASSEXW;
+
+struct MENUITEMINFOA {
+	UINT    cbSize = MENUITEMINFOA.sizeof;
+	UINT    fMask;
+	UINT    fType;
+	UINT    fState;
+	UINT    wID;
+	HMENU   hSubMenu;
+	HBITMAP hbmpChecked;
+	HBITMAP hbmpUnchecked;
+	DWORD   dwItemData;
+	LPSTR   dwTypeData;
+	UINT    cch;
+	static if (_WIN32_WINNT >= 0x500) {
+		HBITMAP hbmpItem;
+	}
+}
+alias MENUITEMINFOA* LPMENUITEMINFOA;
+alias MENUITEMINFOA* LPCMENUITEMINFOA;
+
+struct MENUITEMINFOW {
+	UINT    cbSize = MENUITEMINFOW.sizeof;
+	UINT    fMask;
+	UINT    fType;
+	UINT    fState;
+	UINT    wID;
+	HMENU   hSubMenu;
+	HBITMAP hbmpChecked;
+	HBITMAP hbmpUnchecked;
+	DWORD   dwItemData;
+	LPWSTR  dwTypeData;
+	UINT    cch;
+	static if (_WIN32_WINNT >= 0x500) {
+		HBITMAP hbmpItem;
+	}
+}
+alias MENUITEMINFOW* LPMENUITEMINFOW;
+alias  MENUITEMINFOW* LPCMENUITEMINFOW;
+
+struct SCROLLINFO {
+	UINT cbSize = this.sizeof;
+	UINT fMask;
+	int nMin;
+	int nMax;
+	UINT nPage;
+	int nPos;
+	int nTrackPos;
+}
+alias SCROLLINFO* LPSCROLLINFO;
+alias SCROLLINFO* LPCSCROLLINFO;
+
+struct WINDOWPLACEMENT {
+	UINT length;
+	UINT flags;
+	UINT showCmd;
+	POINT ptMinPosition;
+	POINT ptMaxPosition;
+	RECT rcNormalPosition;
+}
+alias WINDOWPLACEMENT* LPWINDOWPLACEMENT, PWINDOWPLACEMENT;
+
+struct MENUITEMTEMPLATEHEADER {
+	WORD versionNumber;
+	WORD offset;
+}
+
+struct MENUITEMTEMPLATE {
+	WORD mtOption;
+	WORD mtID;
+	WCHAR mtString[1];
+}
+
+alias void MENUTEMPLATE, MENUTEMPLATEA, MENUTEMPLATEW;
+
+alias MENUTEMPLATE* LPMENUTEMPLATEA, LPMENUTEMPLATEW, LPMENUTEMPLATE;
+
+struct HELPINFO {
+	UINT cbSize = this.sizeof;
+	int iContextType;
+	int iCtrlId;
+	HANDLE hItemHandle;
+	DWORD dwContextId;
+	POINT MousePos;
+}
+alias HELPINFO* LPHELPINFO;
+
+struct MSGBOXPARAMSA {
+	UINT cbSize = this.sizeof;
+	HWND hwndOwner;
+	HINSTANCE hInstance;
+	LPCSTR lpszText;
+	LPCSTR lpszCaption;
+	DWORD dwStyle;
+	LPCSTR lpszIcon;
+	DWORD dwContextHelpId;
+	MSGBOXCALLBACK lpfnMsgBoxCallback;
+	DWORD dwLanguageId;
+}
+alias MSGBOXPARAMSA* PMSGBOXPARAMSA, LPMSGBOXPARAMSA;
+
+struct MSGBOXPARAMSW {
+	UINT cbSize = this.sizeof;
+	HWND hwndOwner;
+	HINSTANCE hInstance;
+	LPCWSTR lpszText;
+	LPCWSTR lpszCaption;
+	DWORD dwStyle;
+	LPCWSTR lpszIcon;
+	DWORD dwContextHelpId;
+	MSGBOXCALLBACK lpfnMsgBoxCallback;
+	DWORD dwLanguageId;
+}
+alias MSGBOXPARAMSW* PMSGBOXPARAMSW, LPMSGBOXPARAMSW;
+
+struct USEROBJECTFLAGS {
+	BOOL fInherit;
+	BOOL fReserved;
+	DWORD dwFlags;
+}
+
+struct FILTERKEYS {
+	UINT cbSize = this.sizeof;
+	DWORD dwFlags;
+	DWORD iWaitMSec;
+	DWORD iDelayMSec;
+	DWORD iRepeatMSec;
+	DWORD iBounceMSec;
+}
+
+struct HIGHCONTRASTA {
+	UINT cbSize = this.sizeof;
+	DWORD dwFlags;
+	LPSTR lpszDefaultScheme;
+}
+alias HIGHCONTRASTA* LPHIGHCONTRASTA;
+
+struct HIGHCONTRASTW {
+	UINT cbSize = this.sizeof;
+	DWORD dwFlags;
+	LPWSTR lpszDefaultScheme;
+}
+alias HIGHCONTRASTW* LPHIGHCONTRASTW;
+
+struct ICONMETRICSA {
+	UINT cbSize = this.sizeof;
+	int iHorzSpacing;
+	int iVertSpacing;
+	int iTitleWrap;
+	LOGFONTA lfFont;
+}
+alias ICONMETRICSA* LPICONMETRICSA;
+
+struct ICONMETRICSW {
+	UINT cbSize = this.sizeof;
+	int iHorzSpacing;
+	int iVertSpacing;
+	int iTitleWrap;
+	LOGFONTW lfFont;
+}
+alias ICONMETRICSW* LPICONMETRICSW;
+
+struct MINIMIZEDMETRICS {
+	UINT cbSize = this.sizeof;
+	int iWidth;
+	int iHorzGap;
+	int iVertGap;
+	int iArrange;
+}
+alias MINIMIZEDMETRICS* LPMINIMIZEDMETRICS;
+
+struct MOUSEKEYS {
+	UINT cbSize = this.sizeof;
+	DWORD dwFlags;
+	DWORD iMaxSpeed;
+	DWORD iTimeToMaxSpeed;
+	DWORD iCtrlSpeed;
+	DWORD dwReserved1;
+	DWORD dwReserved2;
+}
+alias MOUSEKEYS* LPMOUSEKEYS;
+
+struct NONCLIENTMETRICSA {
+	UINT cbSize = this.sizeof;
+	int iBorderWidth;
+	int iScrollWidth;
+	int iScrollHeight;
+	int iCaptionWidth;
+	int iCaptionHeight;
+	LOGFONTA lfCaptionFont;
+	int iSmCaptionWidth;
+	int iSmCaptionHeight;
+	LOGFONTA lfSmCaptionFont;
+	int iMenuWidth;
+	int iMenuHeight;
+	LOGFONTA lfMenuFont;
+	LOGFONTA lfStatusFont;
+	LOGFONTA lfMessageFont;
+}
+alias NONCLIENTMETRICSA* LPNONCLIENTMETRICSA;
+
+struct NONCLIENTMETRICSW {
+	UINT cbSize = this.sizeof;
+	int iBorderWidth;
+	int iScrollWidth;
+	int iScrollHeight;
+	int iCaptionWidth;
+	int iCaptionHeight;
+	LOGFONTW lfCaptionFont;
+	int iSmCaptionWidth;
+	int iSmCaptionHeight;
+	LOGFONTW lfSmCaptionFont;
+	int iMenuWidth;
+	int iMenuHeight;
+	LOGFONTW lfMenuFont;
+	LOGFONTW lfStatusFont;
+	LOGFONTW lfMessageFont;
+}
+alias NONCLIENTMETRICSW* LPNONCLIENTMETRICSW;
+
+struct SERIALKEYSA {
+	UINT cbSize = this.sizeof;
+	DWORD dwFlags;
+	LPSTR lpszActivePort;
+	LPSTR lpszPort;
+	UINT iBaudRate;
+	UINT iPortState;
+	UINT iActive;
+}
+alias SERIALKEYSA* LPSERIALKEYSA;
+
+struct SERIALKEYSW {
+	UINT cbSize = this.sizeof;
+	DWORD dwFlags;
+	LPWSTR lpszActivePort;
+	LPWSTR lpszPort;
+	UINT iBaudRate;
+	UINT iPortState;
+	UINT iActive;
+}
+alias SERIALKEYSW* LPSERIALKEYSW;
+
+struct SOUNDSENTRYA {
+	UINT cbSize = this.sizeof;
+	DWORD dwFlags;
+	DWORD iFSTextEffect;
+	DWORD iFSTextEffectMSec;
+	DWORD iFSTextEffectColorBits;
+	DWORD iFSGrafEffect;
+	DWORD iFSGrafEffectMSec;
+	DWORD iFSGrafEffectColor;
+	DWORD iWindowsEffect;
+	DWORD iWindowsEffectMSec;
+	LPSTR lpszWindowsEffectDLL;
+	DWORD iWindowsEffectOrdinal;
+}
+alias SOUNDSENTRYA* LPSOUNDSENTRYA;
+
+struct SOUNDSENTRYW {
+	UINT cbSize = this.sizeof;
+	DWORD dwFlags;
+	DWORD iFSTextEffect;
+	DWORD iFSTextEffectMSec;
+	DWORD iFSTextEffectColorBits;
+	DWORD iFSGrafEffect;
+	DWORD iFSGrafEffectMSec;
+	DWORD iFSGrafEffectColor;
+	DWORD iWindowsEffect;
+	DWORD iWindowsEffectMSec;
+	LPWSTR lpszWindowsEffectDLL;
+	DWORD iWindowsEffectOrdinal;
+}
+alias SOUNDSENTRYW* LPSOUNDSENTRYW;
+
+struct STICKYKEYS {
+	DWORD cbSize = this.sizeof;
+	DWORD dwFlags;
+}
+alias STICKYKEYS* LPSTICKYKEYS;
+
+struct TOGGLEKEYS {
+	DWORD cbSize = this.sizeof;
+	DWORD dwFlags;
+}
+
+struct MOUSEHOOKSTRUCT {
+	POINT pt;
+	HWND hwnd;
+	UINT wHitTestCode;
+	DWORD dwExtraInfo;
+}
+alias MOUSEHOOKSTRUCT* LPMOUSEHOOKSTRUCT, PMOUSEHOOKSTRUCT;
+
+struct TRACKMOUSEEVENT {
+	DWORD cbSize = this.sizeof;
+	DWORD dwFlags;
+	HWND  hwndTrack;
+	DWORD dwHoverTime;
+}
+alias TRACKMOUSEEVENT* LPTRACKMOUSEEVENT;
+
+struct TPMPARAMS {
+	UINT cbSize = this.sizeof;
+	RECT rcExclude;
+}
+alias TPMPARAMS* LPTPMPARAMS;
+
+struct EVENTMSG {
+	UINT message;
+	UINT paramL;
+	UINT paramH;
+	DWORD time;
+	HWND hwnd;
+}
+alias EVENTMSG* PEVENTMSGMSG, LPEVENTMSGMSG, PEVENTMSG, LPEVENTMSG;
+
+struct WINDOWPOS {
+	HWND hwnd;
+	HWND hwndInsertAfter;
+	int x;
+	int y;
+	int cx;
+	int cy;
+	UINT flags;
+}
+alias WINDOWPOS* PWINDOWPOS, LPWINDOWPOS;
+
+struct NCCALCSIZE_PARAMS {
+	RECT rgrc[3];
+	PWINDOWPOS lppos;
+}
+alias NCCALCSIZE_PARAMS* LPNCCALCSIZE_PARAMS;
+
+struct MDICREATESTRUCTA {
+	LPCSTR szClass;
+	LPCSTR szTitle;
+	HANDLE hOwner;
+	int x;
+	int y;
+	int cx;
+	int cy;
+	DWORD style;
+	LPARAM lParam;
+}
+alias MDICREATESTRUCTA* LPMDICREATESTRUCTA;
+
+struct MDICREATESTRUCTW {
+	LPCWSTR szClass;
+	LPCWSTR szTitle;
+	HANDLE hOwner;
+	int x;
+	int y;
+	int cx;
+	int cy;
+	DWORD style;
+	LPARAM lParam;
+}
+alias MDICREATESTRUCTW* LPMDICREATESTRUCTW;
+
+struct MINMAXINFO {
+	POINT ptReserved;
+	POINT ptMaxSize;
+	POINT ptMaxPosition;
+	POINT ptMinTrackSize;
+	POINT ptMaxTrackSize;
+}
+alias MINMAXINFO* PMINMAXINFO, LPMINMAXINFO;
+
+struct MDINEXTMENU {
+	HMENU hmenuIn;
+	HMENU hmenuNext;
+	HWND hwndNext;
+}
+alias MDINEXTMENU* PMDINEXTMENU, LPMDINEXTMENU;
+
+struct MEASUREITEMSTRUCT {
+	UINT CtlType;
+	UINT CtlID;
+	UINT itemID;
+	UINT itemWidth;
+	UINT itemHeight;
+	DWORD itemData;
+}
+alias MEASUREITEMSTRUCT* PMEASUREITEMSTRUCT, LPMEASUREITEMSTRUCT;
+
+struct DROPSTRUCT {
+	HWND hwndSource;
+	HWND hwndSink;
+	DWORD wFmt;
+	DWORD dwData;
+	POINT ptDrop;
+	DWORD dwControlData;
+}
+alias DROPSTRUCT* PDROPSTRUCT, LPDROPSTRUCT;
+
+alias DWORD HELPPOLY;
+
+struct MULTIKEYHELPA {
+	DWORD mkSize;
+	CHAR mkKeylist;
+	CHAR szKeyphrase[1];
+}
+alias MULTIKEYHELPA* PMULTIKEYHELPA, LPMULTIKEYHELPA;
+
+struct MULTIKEYHELPW {
+	DWORD mkSize;
+	WCHAR mkKeylist;
+	WCHAR szKeyphrase[1];
+}
+alias MULTIKEYHELPW* PMULTIKEYHELPW, LPMULTIKEYHELPW;
+
+struct HELPWININFOA {
+	int wStructSize;
+	int x;
+	int y;
+	int dx;
+	int dy;
+	int wMax;
+	CHAR rgchMember[2];
+}
+alias HELPWININFOA* PHELPWININFOA, LPHELPWININFOA;
+
+struct HELPWININFOW {
+	int wStructSize;
+	int x;
+	int y;
+	int dx;
+	int dy;
+	int wMax;
+	WCHAR rgchMember[2];
+}
+alias HELPWININFOW* PHELPWININFOW, LPHELPWININFOW;
+
+struct STYLESTRUCT {
+	DWORD styleOld;
+	DWORD styleNew;
+}
+alias STYLESTRUCT* LPSTYLESTRUCT;
+
+struct ALTTABINFO {
+	DWORD cbSize = this.sizeof;
+	int   cItems;
+	int   cColumns;
+	int   cRows;
+	int   iColFocus;
+	int   iRowFocus;
+	int   cxItem;
+	int   cyItem;
+	POINT ptStart;
+}
+alias ALTTABINFO* PALTTABINFO, LPALTTABINFO;
+
+struct COMBOBOXINFO {
+	DWORD cbSize = this.sizeof;
+	RECT rcItem;
+	RECT rcButton;
+	DWORD stateButton;
+	HWND hwndCombo;
+	HWND hwndItem;
+	HWND hwndList;
+}
+alias COMBOBOXINFO* PCOMBOBOXINFO, LPCOMBOBOXINFO;
+
+struct CURSORINFO {
+	DWORD cbSize = this.sizeof;
+	DWORD flags;
+	HCURSOR hCursor;
+	POINT ptScreenPos;
+}
+alias CURSORINFO* PCURSORINFO, LPCURSORINFO;
+
+struct MENUBARINFO {
+	DWORD cbSize = this.sizeof;
+	RECT  rcBar;
+	HMENU hMenu;
+	HWND  hwndMenu;
+	byte bf_; // Simulated bitfield
+//	BOOL  fBarFocused:1;
+//	BOOL  fFocused:1;
+	bool fBarFocused() { return (bf_ & 1) == 1; }
+	bool fFocused() { return (bf_ & 2) == 2; }
+	void fBarFocused(bool b) { bf_ = cast(byte)((bf_ & 0xFE) | b); }
+	void fFocused(bool b) { bf_ = cast(byte)(b ? (bf_ | 2) : bf_ & 0xFD); }
+}
+alias MENUBARINFO* PMENUBARINFO;
+
+struct MENUINFO {
+	DWORD cbSize = this.sizeof;
+	DWORD fMask;
+	DWORD dwStyle;
+	UINT cyMax;
+	HBRUSH  hbrBack;
+	DWORD   dwContextHelpID;
+	ULONG_PTR dwMenuData;
+}
+alias MENUINFO* LPMENUINFO, LPCMENUINFO;
+
+
+const CCHILDREN_SCROLLBAR=5;
+
+struct SCROLLBARINFO {
+	DWORD cbSize = this.sizeof;
+	RECT  rcScrollBar;
+	int   dxyLineButton;
+	int   xyThumbTop;
+	int   xyThumbBottom;
+	int   reserved;
+	DWORD rgstate[CCHILDREN_SCROLLBAR+1];
+}
+alias SCROLLBARINFO* PSCROLLBARINFO, LPSCROLLBARINFO;
+
+const CCHILDREN_TITLEBAR=5;
+
+struct TITLEBARINFO {
+	DWORD cbSize = TITLEBARINFO.sizeof;
+	RECT  rcTitleBar;
+	DWORD[CCHILDREN_TITLEBAR+1] rgstate;
+}
+alias TITLEBARINFO* PTITLEBARINFO, LPTITLEBARINFO;
+
+struct WINDOWINFO {
+	DWORD cbSize = WINDOWINFO.sizeof;
+	RECT  rcWindow;
+	RECT  rcClient;
+	DWORD dwStyle;
+	DWORD dwExStyle;
+	DWORD dwWindowStatus;
+	UINT  cxWindowBorders;
+	UINT  cyWindowBorders;
+	ATOM  atomWindowType;
+	WORD  wCreatorVersion;
+}
+alias WINDOWINFO* PWINDOWINFO, LPWINDOWINFO;
+
+struct LASTINPUTINFO {
+	UINT cbSize = this.sizeof;
+	DWORD dwTime;
+}
+alias LASTINPUTINFO* PLASTINPUTINFO;
+
+struct MONITORINFO {
+	DWORD cbSize = this.sizeof;
+	RECT rcMonitor;
+	RECT rcWork;
+	DWORD dwFlags;
+}
+alias MONITORINFO* LPMONITORINFO;
+
+const CCHDEVICENAME=32;
+
+struct MONITORINFOEXA {
+	DWORD cbSize = MONITORINFOEXA.sizeof;
+	RECT  rcMonitor;
+	RECT  rcWork;
+	DWORD dwFlags;
+	CHAR[CCHDEVICENAME] szDevice;
+}
+alias MONITORINFOEXA* LPMONITORINFOEXA;
+
+struct MONITORINFOEXW {
+	DWORD cbSize = MONITORINFOEXW.sizeof;
+	RECT  rcMonitor;
+	RECT  rcWork;
+	DWORD dwFlags;
+	WCHAR[CCHDEVICENAME] szDevice;
+}
+alias MONITORINFOEXW* LPMONITORINFOEXW;
+
+struct KBDLLHOOKSTRUCT {
+	DWORD vkCode;
+	DWORD scanCode;
+	DWORD flags;
+	DWORD time;
+	DWORD dwExtraInfo;
+}
+alias KBDLLHOOKSTRUCT* LPKBDLLHOOKSTRUCT, PKBDLLHOOKSTRUCT;
+
+static if ((_WIN32_WINNT >= 0x500) || (_WIN32_WINDOWS >= 0x410)) {
+
+struct FLASHWINFO {
+	UINT  cbSize = this.sizeof;
+	HWND  hwnd;
+	DWORD dwFlags;
+	UINT  uCount;
+	DWORD dwTimeout;
+}
+alias FLASHWINFO* PFLASHWINFO;
+
+}
+
+static if ((_WIN32_WINNT >= 0x500) || (_WIN32_WINDOWS >= 0x490)) {
+
+struct MOUSEMOVEPOINT {
+	int x;
+	int y;
+	DWORD time;
+	ULONG_PTR dwExtraInfo;
+}
+alias MOUSEMOVEPOINT* PMOUSEMOVEPOINT, LPMOUSEMOVEPOINT;
+}
+
+static if (_WIN32_WINNT >= 0x403) {
+struct MOUSEINPUT {
+	LONG dx;
+	LONG dy;
+	DWORD mouseData;
+	DWORD dwFlags;
+	DWORD time;
+	ULONG_PTR dwExtraInfo;
+}
+alias MOUSEINPUT* PMOUSEINPUT;
+
+struct KEYBDINPUT {
+	WORD wVk;
+	WORD wScan;
+	DWORD dwFlags;
+	DWORD time;
+	ULONG_PTR dwExtraInfo;
+}
+alias KEYBDINPUT* PKEYBDINPUT;
+
+struct HARDWAREINPUT {
+	DWORD uMsg;
+	WORD wParamL;
+	WORD wParamH;
+}
+alias HARDWAREINPUT* PHARDWAREINPUT;
+
+struct INPUT {
+	DWORD type;
+	union {
+		MOUSEINPUT mi;
+		KEYBDINPUT ki;
+		HARDWAREINPUT hi;
+	}
+}
+alias INPUT* PINPUT, LPINPUT;
+}// (_WIN32_WINNT >= 0x403)
+
+static if (WINVER >= 0x500) {
+struct GUITHREADINFO {
+	DWORD cbSize = this.sizeof;
+	DWORD flags;
+	HWND hwndActive;
+	HWND hwndFocus;
+	HWND hwndCapture;
+	HWND hwndMenuOwner;
+	HWND hwndMoveSize;
+	HWND hwndCaret;
+	RECT rcCaret;
+}
+alias GUITHREADINFO* PGUITHREADINFO, LPGUITHREADINFO;
+extern (Windows) {
+alias void function (HWINEVENTHOOK, DWORD, HWND, LONG, LONG, DWORD, DWORD) WINEVENTPROC;
+}
+
+}// (WINVER >= 0x500)
+
+static if (_WIN32_WINNT >= 0x501) {
+struct BSMINFO {
+	UINT  cbSize = this.sizeof;
+	HDESK hdesk;
+	HWND  hwnd;
+	LUID  luid;
+}
+alias BSMINFO* PBSMINFO;
+
+typedef HANDLE HRAWINPUT;
+
+struct RAWINPUTHEADER {
+	DWORD dwType;
+	DWORD dwSize;
+	HANDLE hDevice;
+	WPARAM wParam;
+}
+alias RAWINPUTHEADER* PRAWINPUTHEADER;
+
+struct RAWMOUSE {
+	USHORT usFlags;
+	union {
+		ULONG ulButtons;
+		struct {
+			USHORT usButtonFlags;
+			USHORT usButtonData;
+		}
+	}
+	ULONG ulRawButtons;
+	LONG lLastX;
+	LONG lLastY;
+	ULONG ulExtraInformation;
+}
+alias RAWMOUSE* PRAWMOUSE, LPRAWMOUSE;
+
+struct RAWKEYBOARD {
+	USHORT MakeCode;
+	USHORT Flags;
+	USHORT Reserved;
+	USHORT VKey;
+	UINT Message;
+	ULONG ExtraInformation;
+}
+alias RAWKEYBOARD* PRAWKEYBOARD, LPRAWKEYBOARD;
+
+struct RAWHID {
+	DWORD dwSizeHid;
+	DWORD dwCount;
+	BYTE bRawData;
+}
+alias RAWHID* PRAWHID, LPRAWHID;
+
+struct RAWINPUT {
+	RAWINPUTHEADER header;
+	union _data {
+		RAWMOUSE    mouse;
+		RAWKEYBOARD keyboard;
+		RAWHID      hid;
+	}
+	_data data;
+}
+alias RAWINPUT* PRAWINPUT, LPRAWINPUT;
+
+struct RAWINPUTDEVICE {
+	USHORT usUsagePage;
+	USHORT usUsage;
+	DWORD dwFlags;
+	HWND hwndTarget;
+}
+alias RAWINPUTDEVICE* PRAWINPUTDEVICE, LPRAWINPUTDEVICE;
+alias RAWINPUTDEVICE* PCRAWINPUTDEVICE;
+
+struct RAWINPUTDEVICELIST {
+	HANDLE hDevice;
+	DWORD dwType;
+}
+alias RAWINPUTDEVICELIST* PRAWINPUTDEVICELIST;
+
+struct RID_DEVICE_INFO_MOUSE {
+	DWORD dwId;
+	DWORD dwNumberOfButtons;
+	DWORD dwSampleRate;
+	BOOL  fHasHorizontalWheel;
+}
+
+struct RID_DEVICE_INFO_KEYBOARD {
+	DWORD dwType;
+	DWORD dwSubType;
+	DWORD dwKeyboardMode;
+	DWORD dwNumberOfFunctionKeys;
+	DWORD dwNumberOfIndicators;
+	DWORD dwNumberOfKeysTotal;
+}
+
+struct RID_DEVICE_INFO_HID {
+	DWORD dwVendorId;
+	DWORD dwProductId;
+	DWORD dwVersionNumber;
+	USHORT usUsagePage;
+	USHORT usUsage;
+}
+
+struct RID_DEVICE_INFO {
+	DWORD cbSize = this.sizeof;
+	DWORD dwType;
+	union {
+		RID_DEVICE_INFO_MOUSE mouse;
+		RID_DEVICE_INFO_KEYBOARD keyboard;
+		RID_DEVICE_INFO_HID hid;
+	}
+}
+}// (_WIN32_WINNT >= 0x501)
+
+struct MSLLHOOKSTRUCT {
+	POINT pt;
+	DWORD mouseData;
+	DWORD flags;
+	DWORD time;
+	ULONG_PTR dwExtraInfo;
+}
+alias MSLLHOOKSTRUCT* PMSLLHOOKSTRUCT;
+
+alias CharToOemA AnsiToOem;
+alias OemToCharA OemToAnsi;
+alias CharToOemBuffA AnsiToOemBuff;
+alias OemToCharBuffA OemToAnsiBuff;
+alias CharUpperA AnsiUpper;
+alias CharUpperBuffA AnsiUpperBuff;
+alias CharLowerA AnsiLower;
+alias CharLowerBuffA AnsiLowerBuff;
+alias CharNextA AnsiNext;
+alias CharPrevA AnsiPrev;
+
+alias MAKELONG MAKEWPARAM;
+alias MAKELONG MAKELPARAM;
+alias MAKELONG MAKELRESULT;
+
+//MACRO #define POINTSTOPOINT(p, ps) { (p).x=LOWORD(*(DWORD* )&ps); (p).y=HIWORD(*(DWORD* )&ps); }
+//MACRO #define POINTTOPOINTS(p) ((POINTS)MAKELONG((p).x, (p).y))
+
+extern (Windows) {
+
+HKL ActivateKeyboardLayout(HKL, UINT);
+BOOL AdjustWindowRect(LPRECT, DWORD, BOOL);
+BOOL AdjustWindowRectEx(LPRECT, DWORD, BOOL, DWORD);
+BOOL AnyPopup();
+BOOL AppendMenuA(HMENU, UINT, UINT_PTR, LPCSTR);
+BOOL AppendMenuW(HMENU, UINT, UINT_PTR, LPCWSTR);
+UINT ArrangeIconicWindows(HWND);
+BOOL AttachThreadInput(DWORD, DWORD, BOOL);
+HDWP BeginDeferWindowPos(int);
+HDC BeginPaint(HWND, LPPAINTSTRUCT);
+BOOL BringWindowToTop(HWND);
+BOOL CallMsgFilterA(LPMSG, INT);
+BOOL CallMsgFilterW(LPMSG, INT);
+LRESULT CallNextHookEx(HHOOK, int, WPARAM, LPARAM);
+LRESULT CallWindowProcA(WNDPROC, HWND, UINT, WPARAM, LPARAM);
+LRESULT CallWindowProcW(WNDPROC, HWND, UINT, WPARAM, LPARAM);
+WORD CascadeWindows(HWND, UINT, LPCRECT, UINT, HWND*);
+BOOL ChangeClipboardChain(HWND, HWND);
+
+LONG ChangeDisplaySettingsA(PDEVMODEA, DWORD);
+LONG ChangeDisplaySettingsW(PDEVMODEW, DWORD);
+LONG ChangeDisplaySettingsExA(LPCSTR, LPDEVMODEA, HWND, DWORD, LPVOID);
+LONG ChangeDisplaySettingsExW(LPCWSTR, LPDEVMODEW, HWND, DWORD, LPVOID);
+
+BOOL ChangeMenuA(HMENU, UINT, LPCSTR, UINT, UINT);
+BOOL ChangeMenuW(HMENU, UINT, LPCWSTR, UINT, UINT);
+LPSTR CharLowerA(LPSTR);
+LPWSTR CharLowerW(LPWSTR);
+DWORD CharLowerBuffA(LPSTR, DWORD);
+DWORD CharLowerBuffW(LPWSTR, DWORD);
+LPSTR CharNextA(LPCSTR);
+LPWSTR CharNextW(LPCWSTR);
+LPSTR CharNextExA(WORD, LPCSTR, DWORD);
+LPWSTR CharNextExW(WORD, LPCWSTR, DWORD);
+LPSTR CharPrevA(LPCSTR, LPCSTR);
+LPWSTR CharPrevW(LPCWSTR, LPCWSTR);
+LPSTR CharPrevExA(WORD, LPCSTR, LPCSTR, DWORD);
+LPWSTR CharPrevExW(WORD, LPCWSTR, LPCWSTR, DWORD);
+BOOL CharToOemA(LPCSTR, LPSTR);
+BOOL CharToOemW(LPCWSTR, LPSTR);
+BOOL CharToOemBuffA(LPCSTR, LPSTR, DWORD);
+BOOL CharToOemBuffW(LPCWSTR, LPSTR, DWORD);
+LPSTR CharUpperA(LPSTR);
+LPWSTR CharUpperW(LPWSTR);
+DWORD CharUpperBuffA(LPSTR, DWORD);
+DWORD CharUpperBuffW(LPWSTR, DWORD);
+BOOL CheckDlgButton(HWND, int, UINT);
+DWORD CheckMenuItem(HMENU, UINT, UINT);
+BOOL CheckMenuRadioItem(HMENU, UINT, UINT, UINT, UINT);
+BOOL CheckRadioButton(HWND, int, int, int);
+HWND ChildWindowFromPoint(HWND, POINT);
+HWND ChildWindowFromPointEx(HWND, POINT, UINT);
+BOOL ClientToScreen(HWND, LPPOINT);
+BOOL ClipCursor(LPCRECT);
+BOOL CloseClipboard();
+BOOL CloseDesktop(HDESK);
+BOOL CloseWindow(HWND);
+BOOL CloseWindowStation(HWINSTA);
+int CopyAcceleratorTableA(HACCEL, LPACCEL, int);
+int CopyAcceleratorTableW(HACCEL, LPACCEL, int);
+
+HICON CopyIcon(HICON);
+HANDLE CopyImage(HANDLE, UINT, int, int, UINT);
+BOOL CopyRect(LPRECT, LPCRECT);
+int CountClipboardFormats();
+HACCEL CreateAcceleratorTableA(LPACCEL, int);
+HACCEL CreateAcceleratorTableW(LPACCEL, int);
+BOOL CreateCaret(HWND, HBITMAP, int, int);
+HCURSOR CreateCursor(HINSTANCE, int, int, int, int, PCVOID, PCVOID);
+
+HDESK CreateDesktopA(LPCSTR, LPCSTR, LPDEVMODEA, DWORD, ACCESS_MASK, LPSECURITY_ATTRIBUTES);
+HDESK CreateDesktopW(LPCWSTR, LPCWSTR, LPDEVMODEW, DWORD, ACCESS_MASK, LPSECURITY_ATTRIBUTES);
+
+HWND CreateDialogParamA(HINSTANCE, LPCSTR, HWND, DLGPROC, LPARAM);
+HWND CreateDialogParamW(HINSTANCE, LPCWSTR, HWND, DLGPROC, LPARAM);
+HWND CreateDialogIndirectParamA(HINSTANCE, LPCDLGTEMPLATE, HWND, DLGPROC, LPARAM);
+HWND CreateDialogIndirectParamW(HINSTANCE, LPCDLGTEMPLATE, HWND, DLGPROC, LPARAM);
+
+HICON CreateIcon(HINSTANCE, int, int, BYTE, BYTE, BYTE*, BYTE*);
+HICON CreateIconFromResource(PBYTE, DWORD, BOOL, DWORD);
+HICON CreateIconFromResourceEx(PBYTE, DWORD, BOOL, DWORD, int, int, UINT);
+HICON CreateIconIndirect(PICONINFO);
+HWND CreateMDIWindowA(LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HINSTANCE, LPARAM);
+HWND CreateMDIWindowW(LPCWSTR, LPCWSTR, DWORD, int, int, int, int, HWND, HINSTANCE, LPARAM);
+HMENU CreateMenu();
+HMENU CreatePopupMenu();
+
+HWND CreateWindowExA(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID);
+HWND CreateWindowExW(DWORD, LPCWSTR, LPCWSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID);
+
+HWINSTA CreateWindowStationA(LPSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES);
+HWINSTA CreateWindowStationW(LPWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES);
+LRESULT DefDlgProcA(HWND, UINT, WPARAM, LPARAM);
+LRESULT DefDlgProcW(HWND, UINT, WPARAM, LPARAM);
+HDWP DeferWindowPos(HDWP, HWND, HWND, int, int, int, int, UINT);
+LRESULT DefFrameProcA(HWND, HWND, UINT, WPARAM, LPARAM);
+LRESULT DefFrameProcW(HWND, HWND, UINT, WPARAM, LPARAM);
+
+LRESULT DefMDIChildProcA(HWND, UINT, WPARAM, LPARAM);
+LRESULT DefMDIChildProcW(HWND, UINT, WPARAM, LPARAM);
+LRESULT DefWindowProcA(HWND, UINT, WPARAM, LPARAM);
+LRESULT DefWindowProcW(HWND, UINT, WPARAM, LPARAM);
+BOOL DeleteMenu(HMENU, UINT, UINT);
+BOOL DeregisterShellHookWindow(HWND);
+BOOL DestroyAcceleratorTable(HACCEL);
+BOOL DestroyCaret();
+BOOL DestroyCursor(HCURSOR);
+BOOL DestroyIcon(HICON);
+BOOL DestroyMenu(HMENU);
+BOOL DestroyWindow(HWND);
+
+int DialogBoxParamA(HINSTANCE, LPCSTR, HWND, DLGPROC, LPARAM);
+int DialogBoxParamW(HINSTANCE, LPCWSTR, HWND, DLGPROC, LPARAM);
+int DialogBoxIndirectParamA(HINSTANCE, LPCDLGTEMPLATE, HWND, DLGPROC, LPARAM);
+int DialogBoxIndirectParamW(HINSTANCE, LPCDLGTEMPLATE, HWND, DLGPROC, LPARAM);
+
+} // extern (Windows)
+
+HCURSOR CopyCursor(HCURSOR c)
+{
+	return cast(HCURSOR)CopyIcon(cast(HICON)c);
+}
+
+HWND CreateDialogA(HINSTANCE h, LPCSTR n, HWND w, DLGPROC f)
+{
+	return CreateDialogParamA(h, n, w, f, 0);
+}
+
+HWND CreateDialogW(HINSTANCE h, LPCWSTR n, HWND w, DLGPROC f)
+{
+	return CreateDialogParamW(h, n, w, f, 0);
+}
+
+HWND CreateDialogIndirectA(HINSTANCE h, LPCDLGTEMPLATE t, HWND w , DLGPROC f)
+{
+	return CreateDialogIndirectParamA(h, t, w, f, 0);
+}
+
+HWND CreateDialogIndirectW(HINSTANCE h, LPCDLGTEMPLATE t, HWND w , DLGPROC f)
+{
+	return CreateDialogIndirectParamW(h, t, w, f, 0);
+}
+
+
+HWND CreateWindowA(LPCSTR a, LPCSTR b, DWORD c, int d, int e, int f, int g, HWND h, HMENU i, HINSTANCE j, LPVOID k)
+{
+	return CreateWindowExA(0, a, b, c, d, e, f, g, h, i, j, k);
+}
+
+HWND CreateWindowW(LPCWSTR a, LPCWSTR b, DWORD c, int d, int e, int f, int g, HWND h, HMENU i, HINSTANCE j, LPVOID k)
+{
+	return CreateWindowExW(0, a, b, c, d, e, f, g, h, i, j, k);
+}
+
+int DialogBoxA(HINSTANCE i, LPCSTR t, HWND p, DLGPROC f)
+{
+	return DialogBoxParamA(i, t, p, f, 0);
+}
+
+int DialogBoxW(HINSTANCE i, LPCWSTR t, HWND p, DLGPROC f)
+{
+	return DialogBoxParamW(i, t, p, f, 0);
+}
+
+int DialogBoxIndirectA(HINSTANCE i, LPCDLGTEMPLATE t, HWND p, DLGPROC f)
+{
+	return DialogBoxIndirectParamA(i, t, p, f, 0);
+}
+
+int DialogBoxIndirectW(HINSTANCE i, LPCDLGTEMPLATE t, HWND p, DLGPROC f)
+{
+	return DialogBoxIndirectParamW(i, t, p, f, 0);
+}
+
+BOOL ExitWindows(UINT r, DWORD c)
+{
+	return ExitWindowsEx(EWX_LOGOFF, 0);
+}
+alias GetWindow GetNextWindow;
+
+extern (Windows):
+LONG DispatchMessageA( MSG*);
+LONG DispatchMessageW( MSG*);
+int DlgDirListA(HWND, LPSTR, int, int, UINT);
+int DlgDirListW(HWND, LPWSTR, int, int, UINT);
+int DlgDirListComboBoxA(HWND, LPSTR, int, int, UINT);
+int DlgDirListComboBoxW(HWND, LPWSTR, int, int, UINT);
+BOOL DlgDirSelectComboBoxExA(HWND, LPSTR, int, int);
+BOOL DlgDirSelectComboBoxExW(HWND, LPWSTR, int, int);
+BOOL DlgDirSelectExA(HWND, LPSTR, int, int);
+BOOL DlgDirSelectExW(HWND, LPWSTR, int, int);
+BOOL DragDetect(HWND, POINT);
+DWORD DragObject(HWND, HWND, UINT, DWORD, HCURSOR);
+BOOL DrawAnimatedRects(HWND, int, LPCRECT, LPCRECT);
+BOOL DrawCaption(HWND, HDC, LPCRECT, UINT);
+BOOL DrawEdge(HDC, LPRECT, UINT, UINT);
+BOOL DrawFocusRect(HDC, LPCRECT);
+BOOL DrawFrameControl(HDC, LPRECT, UINT, UINT);
+BOOL DrawIcon(HDC, int, int, HICON);
+BOOL DrawIconEx(HDC, int, int, HICON, int, int, UINT, HBRUSH, UINT);
+BOOL DrawMenuBar(HWND);
+BOOL DrawStateA(HDC, HBRUSH, DRAWSTATEPROC, LPARAM, WPARAM, int, int, int, int, UINT);
+BOOL DrawStateW(HDC, HBRUSH, DRAWSTATEPROC, LPARAM, WPARAM, int, int, int, int, UINT);
+int DrawTextA(HDC, LPCSTR, int, LPRECT, UINT);
+int DrawTextW(HDC, LPCWSTR, int, LPRECT, UINT);
+int DrawTextExA(HDC, LPSTR, int, LPRECT, UINT, LPDRAWTEXTPARAMS);
+int DrawTextExW(HDC, LPWSTR, int, LPRECT, UINT, LPDRAWTEXTPARAMS);
+BOOL EmptyClipboard();
+BOOL EnableMenuItem(HMENU, UINT, UINT);
+BOOL EnableScrollBar(HWND, UINT, UINT);
+BOOL EnableWindow(HWND, BOOL);
+BOOL EndDeferWindowPos(HDWP);
+BOOL EndDialog(HWND, int);
+BOOL EndMenu();
+BOOL EndPaint(HWND, PAINTSTRUCT*);
+BOOL EnumChildWindows(HWND, ENUMWINDOWSPROC, LPARAM);
+UINT EnumClipboardFormats(UINT);
+BOOL EnumDesktopsA(HWINSTA, DESKTOPENUMPROCA, LPARAM);
+BOOL EnumDesktopsW(HWINSTA, DESKTOPENUMPROCW, LPARAM);
+BOOL EnumDesktopWindows(HDESK, ENUMWINDOWSPROC, LPARAM);
+BOOL EnumDisplaySettingsA(LPCSTR, DWORD, PDEVMODEA);
+BOOL EnumDisplaySettingsW(LPCWSTR, DWORD, PDEVMODEW);
+
+BOOL EnumDisplayDevicesA(LPCSTR, DWORD, PDISPLAY_DEVICEA, DWORD);
+BOOL EnumDisplayDevicesW(LPCWSTR, DWORD, PDISPLAY_DEVICEW, DWORD);
+
+int EnumPropsA(HWND, PROPENUMPROCA);
+int EnumPropsW(HWND, PROPENUMPROCW);
+int EnumPropsExA(HWND, PROPENUMPROCEXA, LPARAM);
+int EnumPropsExW(HWND, PROPENUMPROCEXW, LPARAM);
+
+BOOL EnumThreadWindows(DWORD, WNDENUMPROC, LPARAM);
+BOOL EnumWindows(WNDENUMPROC, LPARAM);
+BOOL EnumWindowStationsA(WINSTAENUMPROCA, LPARAM);
+BOOL EnumWindowStationsW(WINSTAENUMPROCW, LPARAM);
+BOOL EqualRect(LPCRECT, LPCRECT);
+
+BOOL ExitWindowsEx(UINT, DWORD);
+HWND FindWindowA(LPCSTR, LPCSTR);
+HWND FindWindowExA(HWND, HWND, LPCSTR, LPCSTR);
+HWND FindWindowExW(HWND, HWND, LPCWSTR, LPCWSTR);
+HWND FindWindowW(LPCWSTR, LPCWSTR);
+BOOL FlashWindow(HWND, BOOL);
+
+int FrameRect(HDC, LPCRECT, HBRUSH);
+BOOL FrameRgn(HDC, HRGN, HBRUSH, int, int);
+HWND GetActiveWindow();
+HWND GetAncestor(HWND, UINT);
+SHORT GetAsyncKeyState(int);
+HWND GetCapture();
+UINT GetCaretBlinkTime();
+BOOL GetCaretPos(LPPOINT);
+BOOL GetClassInfoA(HINSTANCE, LPCSTR, LPWNDCLASSA);
+BOOL GetClassInfoExA(HINSTANCE, LPCSTR, LPWNDCLASSEXA);
+BOOL GetClassInfoW(HINSTANCE, LPCWSTR, LPWNDCLASSW);
+BOOL GetClassInfoExW(HINSTANCE, LPCWSTR, LPWNDCLASSEXW);
+DWORD GetClassLongA(HWND, int);
+DWORD GetClassLongW(HWND, int);
+int GetClassNameA(HWND, LPSTR, int);
+int GetClassNameW(HWND, LPWSTR, int);
+WORD GetClassWord(HWND, int);
+BOOL GetClientRect(HWND, LPRECT);
+HANDLE GetClipboardData(UINT);
+int GetClipboardFormatNameA(UINT, LPSTR, int);
+int GetClipboardFormatNameW(UINT, LPWSTR, int);
+HWND GetClipboardOwner();
+HWND GetClipboardViewer();
+BOOL GetClipCursor(LPRECT);
+BOOL GetCursorPos(LPPOINT);
+HDC GetDC(HWND);
+HDC GetDCEx(HWND, HRGN, DWORD);
+HWND GetDesktopWindow();
+int GetDialogBaseUnits();
+int GetDlgCtrlID(HWND);
+HWND GetDlgItem(HWND, int);
+UINT GetDlgItemInt(HWND, int, PBOOL, BOOL);
+UINT GetDlgItemTextA(HWND, int, LPSTR, int);
+UINT GetDlgItemTextW(HWND, int, LPWSTR, int);
+UINT GetDoubleClickTime();
+HWND GetFocus();
+HWND GetForegroundWindow();
+
+BOOL GetIconInfo(HICON, PICONINFO);
+BOOL GetInputState();
+UINT GetKBCodePage();
+HKL GetKeyboardLayout(DWORD);
+UINT GetKeyboardLayoutList(int, HKL*);
+BOOL GetKeyboardLayoutNameA(LPSTR);
+BOOL GetKeyboardLayoutNameW(LPWSTR);
+BOOL GetKeyboardState(PBYTE);
+int GetKeyboardType(int);
+int GetKeyNameTextA(LONG, LPSTR, int);
+int GetKeyNameTextW(LONG, LPWSTR, int);
+SHORT GetKeyState(int);
+HWND GetLastActivePopup(HWND);
+HMENU GetMenu(HWND);
+LONG GetMenuCheckMarkDimensions();
+DWORD GetMenuContextHelpId(HMENU);
+UINT GetMenuDefaultItem(HMENU, UINT, UINT);
+int GetMenuItemCount(HMENU);
+UINT GetMenuItemID(HMENU, int);
+BOOL GetMenuItemInfoA(HMENU, UINT, BOOL, LPMENUITEMINFOA);
+BOOL GetMenuItemInfoW(HMENU, UINT, BOOL, LPMENUITEMINFOW);
+BOOL GetMenuItemRect(HWND, HMENU, UINT, LPRECT);
+UINT GetMenuState(HMENU, UINT, UINT);
+int GetMenuStringA(HMENU, UINT, LPSTR, int, UINT);
+int GetMenuStringW(HMENU, UINT, LPWSTR, int, UINT);
+BOOL GetMessageA(LPMSG, HWND, UINT, UINT);
+BOOL GetMessageW(LPMSG, HWND, UINT, UINT);
+LONG GetMessageExtraInfo();
+DWORD GetMessagePos();
+LONG GetMessageTime();
+
+HWND GetNextDlgGroupItem(HWND, HWND, BOOL);
+HWND GetNextDlgTabItem(HWND, HWND, BOOL);
+
+HWND GetOpenClipboardWindow();
+HWND GetParent(HWND);
+int GetPriorityClipboardFormat(UINT*, int);
+HANDLE GetPropA(HWND, LPCSTR);
+HANDLE GetPropW(HWND, LPCWSTR);
+
+DWORD GetQueueStatus(UINT);
+BOOL GetScrollInfo(HWND, int, LPSCROLLINFO);
+int GetScrollPos(HWND, int);
+BOOL GetScrollRange(HWND, int, LPINT, LPINT);
+
+HMENU GetSubMenu(HMENU, int);
+DWORD GetSysColor(int);
+HBRUSH GetSysColorBrush(int);
+
+HMENU GetSystemMenu(HWND, BOOL);
+int GetSystemMetrics(int);
+DWORD GetTabbedTextExtentA(HDC, LPCSTR, int, int, LPINT);
+DWORD GetTabbedTextExtentW(HDC, LPCWSTR, int, int, LPINT);
+LONG GetWindowLongA(HWND, int);
+LONG GetWindowLongW(HWND, int);
+
+HDESK GetThreadDesktop(DWORD);
+HWND GetTopWindow(HWND);
+BOOL GetUpdateRect(HWND, LPRECT, BOOL);
+int GetUpdateRgn(HWND, HRGN, BOOL);
+BOOL GetUserObjectInformationA(HANDLE, int, PVOID, DWORD, PDWORD);
+BOOL GetUserObjectInformationW(HANDLE, int, PVOID, DWORD, PDWORD);
+BOOL GetUserObjectSecurity(HANDLE, PSECURITY_INFORMATION, PSECURITY_DESCRIPTOR, DWORD, PDWORD);
+HWND GetWindow(HWND, UINT);
+DWORD GetWindowContextHelpId(HWND);
+HDC GetWindowDC(HWND);
+BOOL GetWindowPlacement(HWND, WINDOWPLACEMENT*);
+BOOL GetWindowRect(HWND, LPRECT);
+int GetWindowRgn(HWND, HRGN);
+int GetWindowTextA(HWND, LPSTR, int);
+int GetWindowTextLengthA(HWND);
+int GetWindowTextLengthW(HWND);
+int GetWindowTextW(HWND, LPWSTR, int);
+WORD GetWindowWord(HWND, int);
+BOOL GetAltTabInfoA(HWND, int, PALTTABINFO, LPSTR, UINT);
+BOOL GetAltTabInfoW(HWND, int, PALTTABINFO, LPWSTR, UINT);
+BOOL GetComboBoxInfo(HWND, PCOMBOBOXINFO);
+BOOL GetCursorInfo(PCURSORINFO);
+BOOL GetLastInputInfo(PLASTINPUTINFO);
+DWORD GetListBoxInfo(HWND);
+BOOL GetMenuBarInfo(HWND, LONG, LONG, PMENUBARINFO);
+BOOL GetMenuInfo(HMENU, LPMENUINFO);
+BOOL GetScrollBarInfo(HWND, LONG, PSCROLLBARINFO);
+BOOL GetTitleBarInfo(HWND, PTITLEBARINFO);
+BOOL GetWindowInfo(HWND, PWINDOWINFO);
+UINT GetWindowModuleFileNameA(HWND, LPSTR, UINT);
+UINT GetWindowModuleFileNameW(HWND, LPWSTR, UINT);
+BOOL GrayStringA(HDC, HBRUSH, GRAYSTRINGPROC, LPARAM, int, int, int, int, int);
+BOOL GrayStringW(HDC, HBRUSH, GRAYSTRINGPROC, LPARAM, int, int, int, int, int);
+BOOL HideCaret(HWND);
+BOOL HiliteMenuItem(HWND, HMENU, UINT, UINT);
+BOOL InflateRect(LPRECT, int, int);
+BOOL InSendMessage();
+BOOL InsertMenuA(HMENU, UINT, UINT, UINT, LPCSTR);
+BOOL InsertMenuW(HMENU, UINT, UINT, UINT, LPCWSTR);
+BOOL InsertMenuItemA(HMENU, UINT, BOOL, LPCMENUITEMINFOA);
+BOOL InsertMenuItemW(HMENU, UINT, BOOL, LPCMENUITEMINFOW);
+INT InternalGetWindowText(HWND, LPWSTR, INT);
+BOOL IntersectRect(LPRECT, LPCRECT, LPCRECT);
+BOOL InvalidateRect(HWND, LPCRECT, BOOL);
+BOOL InvalidateRgn(HWND, HRGN, BOOL);
+BOOL InvertRect(HDC, LPCRECT);
+BOOL IsCharAlphaA(CHAR ch);
+BOOL IsCharAlphaNumericA(CHAR);
+BOOL IsCharAlphaNumericW(WCHAR);
+BOOL IsCharAlphaW(WCHAR);
+BOOL IsCharLowerA(CHAR);
+BOOL IsCharLowerW(WCHAR);
+BOOL IsCharUpperA(CHAR);
+BOOL IsCharUpperW(WCHAR);
+BOOL IsChild(HWND, HWND);
+BOOL IsClipboardFormatAvailable(UINT);
+BOOL IsDialogMessageA(HWND, LPMSG);
+BOOL IsDialogMessageW(HWND, LPMSG);
+UINT IsDlgButtonChecked(HWND, int);
+BOOL IsIconic(HWND);
+BOOL IsMenu(HMENU);
+BOOL IsRectEmpty(LPCRECT);
+BOOL IsWindow(HWND);
+BOOL IsWindowEnabled(HWND);
+BOOL IsWindowUnicode(HWND);
+BOOL IsWindowVisible(HWND);
+BOOL IsZoomed(HWND);
+void keybd_event(BYTE, BYTE, DWORD, DWORD);
+BOOL KillTimer(HWND, UINT);
+HACCEL LoadAcceleratorsA(HINSTANCE, LPCSTR);
+HACCEL LoadAcceleratorsW(HINSTANCE, LPCWSTR);
+HBITMAP LoadBitmapA(HINSTANCE, LPCSTR);
+HBITMAP LoadBitmapW(HINSTANCE, LPCWSTR);
+HCURSOR LoadCursorA(HINSTANCE, LPCSTR);
+HCURSOR LoadCursorFromFileA(LPCSTR);
+HCURSOR LoadCursorFromFileW(LPCWSTR);
+HCURSOR LoadCursorW(HINSTANCE, LPCWSTR);
+HICON LoadIconA(HINSTANCE, LPCSTR);
+HICON LoadIconW(HINSTANCE, LPCWSTR);
+HANDLE LoadImageA(HINSTANCE, LPCSTR, UINT, int, int, UINT);
+HANDLE LoadImageW(HINSTANCE, LPCWSTR, UINT, int, int, UINT);
+HKL LoadKeyboardLayoutA(LPCSTR, UINT);
+HKL LoadKeyboardLayoutW(LPCWSTR, UINT);
+HMENU LoadMenuA(HINSTANCE, LPCSTR);
+HMENU LoadMenuIndirectA( MENUTEMPLATE*);
+HMENU LoadMenuIndirectW( MENUTEMPLATE*);
+HMENU LoadMenuW(HINSTANCE, LPCWSTR);
+int LoadStringA(HINSTANCE, UINT, LPSTR, int);
+int LoadStringW(HINSTANCE, UINT, LPWSTR, int);
+BOOL LockWindowUpdate(HWND);
+int LookupIconIdFromDirectory(PBYTE, BOOL);
+int LookupIconIdFromDirectoryEx(PBYTE, BOOL, int, int, UINT);
+BOOL MapDialogRect(HWND, LPRECT);
+UINT MapVirtualKeyA(UINT, UINT);
+UINT MapVirtualKeyExA(UINT, UINT, HKL);
+UINT MapVirtualKeyExW(UINT, UINT, HKL);
+UINT MapVirtualKeyW(UINT, UINT);
+int MapWindowPoints(HWND, HWND, LPPOINT, UINT);
+int MenuItemFromPoint(HWND, HMENU, POINT);
+BOOL MessageBeep(UINT);
+int MessageBoxA(HWND, LPCSTR, LPCSTR, UINT);
+int MessageBoxW(HWND, LPCWSTR, LPCWSTR, UINT);
+int MessageBoxExA(HWND, LPCSTR, LPCSTR, UINT, WORD);
+int MessageBoxExW(HWND, LPCWSTR, LPCWSTR, UINT, WORD);
+int MessageBoxIndirectA(MSGBOXPARAMSA*);
+int MessageBoxIndirectW(MSGBOXPARAMSW*);
+BOOL ModifyMenuA(HMENU, UINT, UINT, UINT, LPCSTR);
+BOOL ModifyMenuW(HMENU, UINT, UINT, UINT, LPCWSTR);
+void mouse_event(DWORD, DWORD, DWORD, DWORD, ULONG_PTR);
+BOOL MoveWindow(HWND, int, int, int, int, BOOL);
+DWORD MsgWaitForMultipleObjects(DWORD, HANDLE*, BOOL, DWORD, DWORD);
+DWORD MsgWaitForMultipleObjectsEx(DWORD, HANDLE*, DWORD, DWORD, DWORD);
+DWORD OemKeyScan(WORD);
+BOOL OemToCharA(LPCSTR, LPSTR);
+BOOL OemToCharBuffA(LPCSTR, LPSTR, DWORD);
+BOOL OemToCharBuffW(LPCSTR, LPWSTR, DWORD);
+BOOL OemToCharW(LPCSTR, LPWSTR);
+BOOL OffsetRect(LPRECT, int, int);
+BOOL OpenClipboard(HWND);
+HDESK OpenDesktopA(LPSTR, DWORD, BOOL, DWORD);
+HDESK OpenDesktopW(LPWSTR, DWORD, BOOL, DWORD);
+BOOL OpenIcon(HWND);
+HDESK OpenInputDesktop(DWORD, BOOL, DWORD);
+HWINSTA OpenWindowStationA(LPSTR, BOOL, DWORD);
+HWINSTA OpenWindowStationW(LPWSTR, BOOL, DWORD);
+BOOL PaintDesktop(HDC);
+BOOL PeekMessageA(LPMSG, HWND, UINT, UINT, UINT);
+BOOL PeekMessageW(LPMSG, HWND, UINT, UINT, UINT);
+BOOL PostMessageA(HWND, UINT, WPARAM, LPARAM);
+BOOL PostMessageW(HWND, UINT, WPARAM, LPARAM);
+void PostQuitMessage(int);
+BOOL PostThreadMessageA(DWORD, UINT, WPARAM, LPARAM);
+BOOL PostThreadMessageW(DWORD, UINT, WPARAM, LPARAM);
+BOOL PtInRect(LPCRECT, POINT);
+HWND RealChildWindowFromPoint(HWND, POINT);
+UINT RealGetWindowClassA(HWND, LPSTR, UINT);
+UINT RealGetWindowClassW(HWND, LPWSTR, UINT);
+BOOL RedrawWindow(HWND, LPCRECT, HRGN, UINT);
+ATOM RegisterClassA(WNDCLASSA*);
+ATOM RegisterClassW(WNDCLASSW*);
+ATOM RegisterClassExA(WNDCLASSEXA*);
+ATOM RegisterClassExW(WNDCLASSEXW*);
+UINT RegisterClipboardFormatA(LPCSTR);
+UINT RegisterClipboardFormatW(LPCWSTR);
+BOOL RegisterHotKey(HWND, int, UINT, UINT);
+UINT RegisterWindowMessageA(LPCSTR);
+UINT RegisterWindowMessageW(LPCWSTR);
+BOOL ReleaseCapture();
+int ReleaseDC(HWND, HDC);
+BOOL RemoveMenu(HMENU, UINT, UINT);
+HANDLE RemovePropA(HWND, LPCSTR);
+HANDLE RemovePropW(HWND, LPCWSTR);
+BOOL ReplyMessage(LRESULT);
+BOOL ScreenToClient(HWND, LPPOINT);
+BOOL ScrollDC(HDC, int, int, LPCRECT, LPCRECT, HRGN, LPRECT);
+BOOL ScrollWindow(HWND, int, int, LPCRECT, LPCRECT);
+int ScrollWindowEx(HWND, int, int, LPCRECT, LPCRECT, HRGN, LPRECT, UINT);
+LONG SendDlgItemMessageA(HWND, int, UINT, WPARAM, LPARAM);
+LONG SendDlgItemMessageW(HWND, int, UINT, WPARAM, LPARAM);
+LRESULT SendMessageA(HWND, UINT, WPARAM, LPARAM);
+BOOL SendMessageCallbackA(HWND, UINT, WPARAM, LPARAM, SENDASYNCPROC, DWORD);
+BOOL SendMessageCallbackW(HWND, UINT, WPARAM, LPARAM, SENDASYNCPROC, DWORD);
+LRESULT SendMessageTimeoutA(HWND, UINT, WPARAM, LPARAM, UINT, UINT, PDWORD);
+LRESULT SendMessageTimeoutW(HWND, UINT, WPARAM, LPARAM, UINT, UINT, PDWORD);
+LRESULT SendMessageW(HWND, UINT, WPARAM, LPARAM);
+BOOL SendNotifyMessageA(HWND, UINT, WPARAM, LPARAM);
+BOOL SendNotifyMessageW(HWND, UINT, WPARAM, LPARAM);
+HWND SetActiveWindow(HWND);
+HWND SetCapture(HWND hWnd);
+BOOL SetCaretBlinkTime(UINT);
+BOOL SetCaretPos(int, int);
+DWORD SetClassLongA(HWND, int, LONG);
+DWORD SetClassLongW(HWND, int, LONG);
+WORD SetClassWord(HWND, int, WORD);
+HANDLE SetClipboardData(UINT, HANDLE);
+HWND SetClipboardViewer(HWND);
+HCURSOR SetCursor(HCURSOR);
+BOOL SetCursorPos(int, int);
+void SetDebugErrorLevel(DWORD);
+BOOL SetDlgItemInt(HWND, int, UINT, BOOL);
+BOOL SetDlgItemTextA(HWND, int, LPCSTR);
+BOOL SetDlgItemTextW(HWND, int, LPCWSTR);
+BOOL SetDoubleClickTime(UINT);
+HWND SetFocus(HWND);
+BOOL SetForegroundWindow(HWND);
+BOOL SetKeyboardState(PBYTE);
+BOOL SetMenu(HWND, HMENU);
+BOOL SetMenuContextHelpId(HMENU, DWORD);
+BOOL SetMenuDefaultItem(HMENU, UINT, UINT);
+BOOL SetMenuInfo(HMENU, LPCMENUINFO);
+BOOL SetMenuItemBitmaps(HMENU, UINT, UINT, HBITMAP, HBITMAP);
+BOOL SetMenuItemInfoA(HMENU, UINT, BOOL, LPCMENUITEMINFOA);
+BOOL SetMenuItemInfoW( HMENU, UINT, BOOL, LPCMENUITEMINFOW);
+LPARAM SetMessageExtraInfo(LPARAM);
+BOOL SetMessageQueue(int);
+HWND SetParent(HWND, HWND);
+BOOL SetProcessWindowStation(HWINSTA);
+BOOL SetPropA(HWND, LPCSTR, HANDLE);
+BOOL SetPropW(HWND, LPCWSTR, HANDLE);
+BOOL SetRect(LPRECT, int, int, int, int);
+BOOL SetRectEmpty(LPRECT);
+int SetScrollInfo(HWND, int, LPCSCROLLINFO, BOOL);
+int SetScrollPos(HWND, int, int, BOOL);
+BOOL SetScrollRange(HWND, int, int, int, BOOL);
+BOOL SetSysColors(int, INT* , COLORREF* );
+BOOL SetSystemCursor(HCURSOR, DWORD);
+BOOL SetThreadDesktop(HDESK);
+UINT SetTimer(HWND, UINT, UINT, TIMERPROC);
+BOOL SetUserObjectInformationA(HANDLE, int, PVOID, DWORD);
+BOOL SetUserObjectInformationW(HANDLE, int, PVOID, DWORD);
+BOOL SetUserObjectSecurity(HANDLE, PSECURITY_INFORMATION, PSECURITY_DESCRIPTOR);
+BOOL SetWindowContextHelpId(HWND, DWORD);
+LONG SetWindowLongA(HWND, int, LONG);
+LONG SetWindowLongW(HWND, int, LONG);
+BOOL SetWindowPlacement(HWND hWnd, WINDOWPLACEMENT*);
+BOOL SetWindowPos(HWND, HWND, int, int, int, int, UINT);
+int SetWindowRgn(HWND, HRGN, BOOL);
+HHOOK SetWindowsHookA(int, HOOKPROC);
+HHOOK SetWindowsHookW(int, HOOKPROC);
+HHOOK SetWindowsHookExA(int, HOOKPROC, HINSTANCE, DWORD);
+HHOOK SetWindowsHookExW(int, HOOKPROC, HINSTANCE, DWORD);
+BOOL SetWindowTextA(HWND, LPCSTR);
+BOOL SetWindowTextW(HWND, LPCWSTR);
+WORD SetWindowWord(HWND, int, WORD);
+BOOL ShowCaret(HWND);
+int ShowCursor(BOOL);
+BOOL ShowOwnedPopups(HWND, BOOL);
+BOOL ShowScrollBar(HWND, int, BOOL);
+BOOL ShowWindow(HWND, int);
+BOOL ShowWindowAsync(HWND, int);
+BOOL SubtractRect(LPRECT, LPCRECT, LPCRECT);
+BOOL SwapMouseButton(BOOL);
+BOOL SwitchDesktop(HDESK);
+BOOL SystemParametersInfoA(UINT, UINT, PVOID, UINT);
+BOOL SystemParametersInfoW(UINT, UINT, PVOID, UINT);
+LONG TabbedTextOutA(HDC, int, int, LPCSTR, int, int, LPINT, int);
+LONG TabbedTextOutW(HDC, int, int, LPCWSTR, int, int, LPINT, int);
+WORD TileWindows(HWND, UINT, LPCRECT, UINT, HWND* );
+int ToAscii(UINT, UINT, PBYTE, LPWORD, UINT);
+int ToAsciiEx(UINT, UINT, PBYTE, LPWORD, UINT, HKL);
+int ToUnicode(UINT, UINT, PBYTE, LPWSTR, int, UINT);
+int ToUnicodeEx(UINT, UINT, PBYTE, LPWSTR, int, UINT, HKL);
+BOOL TrackMouseEvent(LPTRACKMOUSEEVENT);
+BOOL TrackPopupMenu(HMENU, UINT, int, int, int, HWND, LPCRECT);
+BOOL TrackPopupMenuEx(HMENU, UINT, int, int, HWND, LPTPMPARAMS);
+int TranslateAcceleratorA(HWND, HACCEL, LPMSG);
+int TranslateAcceleratorW(HWND, HACCEL, LPMSG);
+BOOL TranslateMDISysAccel(HWND, LPMSG);
+BOOL TranslateMessage( MSG*);
+BOOL UnhookWindowsHook(int, HOOKPROC);
+BOOL UnhookWindowsHookEx(HHOOK);
+BOOL UnionRect(LPRECT, LPCRECT, LPCRECT);
+BOOL UnloadKeyboardLayout(HKL);
+BOOL UnregisterClassA(LPCSTR, HINSTANCE);
+BOOL UnregisterClassW(LPCWSTR, HINSTANCE);
+BOOL UnregisterHotKey(HWND, int);
+BOOL UpdateWindow(HWND);
+BOOL ValidateRect(HWND, LPCRECT);
+BOOL ValidateRgn(HWND, HRGN);
+SHORT VkKeyScanA(CHAR);
+SHORT VkKeyScanExA(CHAR, HKL);
+SHORT VkKeyScanExW(WCHAR, HKL);
+SHORT VkKeyScanW(WCHAR);
+DWORD WaitForInputIdle(HANDLE, DWORD);
+BOOL WaitMessage();
+HWND WindowFromDC(HDC hDC);
+HWND WindowFromPoint(POINT);
+UINT WinExec(LPCSTR, UINT);
+BOOL WinHelpA(HWND, LPCSTR, UINT, DWORD);
+BOOL WinHelpW(HWND, LPCWSTR, UINT, DWORD);
+
+extern (C) {
+	int wsprintfA(LPSTR, LPCSTR, ...);
+	int wsprintfW(LPWSTR, LPCWSTR, ...);
+}
+
+
+// These shouldn't be necessary for D.
+typedef char* va_list_;
+int wvsprintfA(LPSTR, LPCSTR, va_list_ arglist);
+int wvsprintfW(LPWSTR, LPCWSTR, va_list_ arglist);
+
+
+static if (_WIN32_WINDOWS == 0x400) {
+// On Win95, there's only one version.
+int BroadcastSystemMessage(DWORD, LPDWORD, UINT, WPARAM, LPARAM);
+}
+static if (_WIN32_WINNT >= 0x400) {
+int BroadcastSystemMessageA(DWORD, LPDWORD, UINT, WPARAM, LPARAM);
+int BroadcastSystemMessageW(DWORD, LPDWORD, UINT, WPARAM, LPARAM);
+}
+static if (_WIN32_WINNT >= 0x501) {
+int BroadcastSystemMessageExA(DWORD, LPDWORD, UINT, WPARAM, LPARAM, PBSMINFO);
+int BroadcastSystemMessageExW(DWORD, LPDWORD, UINT, WPARAM, LPARAM, PBSMINFO);
+}
+
+static if (_WIN32_WINNT >= 0x403) {
+UINT SendInput(UINT, LPINPUT, int);
+}
+static if (_WIN32_WINNT >= 0x500) {
+BOOL AnimateWindow(HWND, DWORD, DWORD);
+BOOL EndTask(HWND, BOOL, BOOL);
+DWORD GetGuiResources(HANDLE, DWORD);
+HWND GetShellWindow();
+BOOL GetProcessDefaultLayout(DWORD*);
+BOOL IsHungAppWindow(HWND);
+BOOL LockWorkStation();
+HDEVNOTIFY RegisterDeviceNotificationA(HANDLE, LPVOID, DWORD);
+HDEVNOTIFY RegisterDeviceNotificationW(HANDLE, LPVOID, DWORD);
+BOOL SetProcessDefaultLayout(DWORD);
+void SwitchToThisWindow(HWND, BOOL);
+BOOL SetLayeredWindowAttributes(HWND, COLORREF, BYTE, DWORD);
+BOOL UpdateLayeredWindow(HWND, HDC, POINT*, SIZE*, HDC, POINT*, COLORREF, BLENDFUNCTION*, DWORD);
+BOOL UserHandleGrantAccess(HANDLE, HANDLE, BOOL);
+}
+static if (_WIN32_WINNT >= 0x501) {
+UINT GetRawInputBuffer(PRAWINPUT, PUINT, UINT);
+UINT GetRawInputData(HRAWINPUT, UINT, LPVOID, PUINT, UINT);
+UINT GetRawInputDeviceInfoA(HANDLE, UINT, LPVOID, PUINT);
+UINT GetRawInputDeviceInfoW(HANDLE, UINT, LPVOID, PUINT);
+UINT GetRawInputDeviceList(PRAWINPUTDEVICELIST, PUINT, UINT);
+UINT GetRegisteredRawInputDevices(PRAWINPUTDEVICE, PUINT, UINT);
+LRESULT DefRawInputProc(PRAWINPUT*, INT, UINT);
+BOOL RegisterRawInputDevices(PCRAWINPUTDEVICE, UINT, UINT);
+
+BOOL IsGUIThread(BOOL);
+BOOL IsWinEventHookInstalled(DWORD);
+BOOL PrintWindow(HWND, HDC, UINT);
+BOOL GetLayeredWindowAttributes(HWND, COLORREF*, BYTE*, DWORD*);
+}
+static if (WINVER >= 0x410) {
+	BOOL EnumDisplayMonitors(HDC, LPCRECT, MONITORENUMPROC, LPARAM);
+	BOOL GetMonitorInfoA(HMONITOR, LPMONITORINFO);
+	BOOL GetMonitorInfoA(HMONITOR, LPMONITORINFOEXA);
+	BOOL GetMonitorInfoW(HMONITOR, LPMONITORINFO);
+	BOOL GetMonitorInfoW(HMONITOR, LPMONITORINFOEXW);
+	HMONITOR MonitorFromPoint(POINT, DWORD);
+	HMONITOR MonitorFromRect(LPCRECT, DWORD);
+	HMONITOR MonitorFromWindow(HWND, DWORD);
+}
+static if (WINVER >= 0x500) {
+BOOL GetGUIThreadInfo(DWORD, LPGUITHREADINFO);
+void NotifyWinEvent(DWORD, HWND, LONG, LONG);
+HWINEVENTHOOK SetWinEventHook(UINT, UINT, HMODULE, WINEVENTPROC, DWORD, DWORD, UINT);
+BOOL UnhookWinEvent(HWINEVENTHOOK);
+BOOL UnregisterDeviceNotification(HANDLE);
+}
+static if ((_WIN32_WINNT >= 0x500) || (_WIN32_WINDOWS >= 0x410)) {
+BOOL EnumDisplaySettingsExA(LPCSTR, DWORD, LPDEVMODEA, DWORD);
+BOOL EnumDisplaySettingsExW(LPCWSTR, DWORD, LPDEVMODEW, DWORD);
+BOOL FlashWindowEx(PFLASHWINFO);
+DWORD GetClipboardSequenceNumber();
+DWORD InSendMessageEx(LPVOID);
+}
+static if ((_WIN32_WINNT >= 0x500) || (_WIN32_WINDOWS >= 0x490)) {
+BOOL AllowSetForegroundWindow(DWORD);
+BOOL LockSetForegroundWindow(UINT);
+int GetMouseMovePointsEx(UINT, LPMOUSEMOVEPOINT, LPMOUSEMOVEPOINT, int, DWORD);
+}
+
+version (Win64) {
+LONG_PTR GetWindowLongPtrA(HWND, int);
+LONG_PTR GetWindowLongPtrW(HWND, int);
+LONG_PTR SetWindowLongPtrA(HWND, int, LONG_PTR);
+LONG_PTR SetWindowLongPtrW(HWND, int, LONG_PTR);
+} else {
+alias GetWindowLongA GetWindowLongPtrA;
+alias GetWindowLongW GetWindowLongPtrW;
+alias SetWindowLongA SetWindowLongPtrA;
+alias SetWindowLongW SetWindowLongPtrW;
+}
+
+
+// -----
+// Aliases for Unicode or Ansi
+version(Unicode) {
+
+alias EDITWORDBREAKPROCW EDITWORDBREAKPROC;
+alias PROPENUMPROCW PROPENUMPROC;
+alias PROPENUMPROCEXW PROPENUMPROCEX;
+alias DESKTOPENUMPROCW DESKTOPENUMPROC;
+alias WINSTAENUMPROCW WINSTAENUMPROC;
+alias MAKEINTRESOURCEW MAKEINTRESOURCE;
+
+alias WNDCLASSW WNDCLASS;
+alias WNDCLASSEXW WNDCLASSEX;
+alias MENUITEMINFOW MENUITEMINFO;
+alias LPCMENUITEMINFOW LPCMENUITEMINFO;
+alias MSGBOXPARAMSW MSGBOXPARAMS;
+alias HIGHCONTRASTW HIGHCONTRAST;
+alias SERIALKEYSW SERIALKEYS;
+alias SOUNDSENTRYW SOUNDSENTRY;
+alias CREATESTRUCTW CREATESTRUCT;
+alias CBT_CREATEWNDW CBT_CREATEWND;
+alias MDICREATESTRUCTW MDICREATESTRUCT;
+alias MULTIKEYHELPW MULTIKEYHELP;
+alias MONITORINFOEXW MONITORINFOEX;
+alias ICONMETRICSW ICONMETRICS;
+alias NONCLIENTMETRICSW NONCLIENTMETRICS;
+
+alias AppendMenuW AppendMenu;
+alias BroadcastSystemMessageW BroadcastSystemMessage;
+static if (_WIN32_WINNT >= 0x501) {
+alias BroadcastSystemMessageExW BroadcastSystemMessageEx;
+}
+alias CallMsgFilterW CallMsgFilter;
+alias CallWindowProcW CallWindowProc;
+alias ChangeMenuW ChangeMenu;
+alias CharLowerW CharLower;
+alias CharLowerBuffW CharLowerBuff;
+alias CharNextW CharNext;
+alias CharNextExW CharNextEx;
+alias CharPrevW CharPrev;
+alias CharPrevExW CharPrevEx;
+alias CharToOemW CharToOem;
+alias CharToOemBuffW CharToOemBuff;
+alias CharUpperW CharUpper;
+alias CharUpperBuffW CharUpperBuff;
+alias CopyAcceleratorTableW CopyAcceleratorTable;
+alias CreateAcceleratorTableW CreateAcceleratorTable;
+alias CreateDialogW CreateDialog;
+alias CreateDialogIndirectW CreateDialogIndirect;
+alias CreateDialogIndirectParamW CreateDialogIndirectParam;
+alias CreateDialogParamW CreateDialogParam;
+alias CreateMDIWindowW CreateMDIWindow;
+alias CreateWindowW CreateWindow;
+alias CreateWindowExW CreateWindowEx;
+alias CreateWindowStationW CreateWindowStation;
+alias DefDlgProcW DefDlgProc;
+alias DefFrameProcW DefFrameProc;
+alias DefMDIChildProcW DefMDIChildProc;
+alias DefWindowProcW DefWindowProc;
+alias DialogBoxW DialogBox;
+alias DialogBoxIndirectW DialogBoxIndirect;
+alias DialogBoxIndirectParamW DialogBoxIndirectParam;
+alias DialogBoxParamW DialogBoxParam;
+alias DispatchMessageW DispatchMessage;
+alias DlgDirListW DlgDirList;
+alias DlgDirListComboBoxW DlgDirListComboBox;
+alias DlgDirSelectComboBoxExW DlgDirSelectComboBoxEx;
+alias DlgDirSelectExW DlgDirSelectEx;
+alias DrawStateW DrawState;
+alias DrawTextW DrawText;
+alias DrawTextExW DrawTextEx;
+alias EnumDesktopsW EnumDesktops;
+alias EnumPropsW EnumProps;
+alias EnumPropsExW EnumPropsEx;
+alias EnumWindowStationsW EnumWindowStations;
+alias FindWindowW FindWindow;
+alias FindWindowExW FindWindowEx;
+alias GetClassInfoW GetClassInfo;
+alias GetClassInfoExW GetClassInfoEx;
+alias GetClassLongW GetClassLong;
+alias GetClassNameW GetClassName;
+alias GetClipboardFormatNameW GetClipboardFormatName;
+alias GetDlgItemTextW GetDlgItemText;
+alias GetKeyboardLayoutNameW GetKeyboardLayoutName;
+alias GetKeyNameTextW GetKeyNameText;
+alias GetMenuItemInfoW GetMenuItemInfo;
+alias GetMenuStringW GetMenuString;
+alias GetMessageW GetMessage;
+static if (WINVER >=0x410) {
+alias GetMonitorInfoW GetMonitorInfo;
+}
+alias GetPropW GetProp;
+static if (_WIN32_WINNT >= 0x501) {
+alias GetRawInputDeviceInfoW GetRawInputDeviceInfo;
+}
+alias GetTabbedTextExtentW GetTabbedTextExtent;
+alias GetUserObjectInformationW GetUserObjectInformation;
+alias GetWindowLongW GetWindowLong;
+alias GetWindowLongPtrW GetWindowLongPtr;
+alias GetWindowTextW GetWindowText;
+alias GetWindowTextLengthW GetWindowTextLength;
+alias GetAltTabInfoW GetAltTabInfo;
+alias GetWindowModuleFileNameW GetWindowModuleFileName;
+alias GrayStringW GrayString;
+alias InsertMenuW InsertMenu;
+alias InsertMenuItemW InsertMenuItem;
+alias IsCharAlphaW IsCharAlpha;
+alias IsCharAlphaNumericW IsCharAlphaNumeric;
+alias IsCharLowerW IsCharLower;
+alias IsCharUpperW IsCharUpper;
+alias IsDialogMessageW IsDialogMessage;
+alias LoadAcceleratorsW LoadAccelerators;
+alias LoadBitmapW LoadBitmap;
+alias LoadCursorW LoadCursor;
+alias LoadCursorFromFileW LoadCursorFromFile;
+alias LoadIconW LoadIcon;
+alias LoadImageW LoadImage;
+alias LoadKeyboardLayoutW LoadKeyboardLayout;
+alias LoadMenuW LoadMenu;
+alias LoadMenuIndirectW LoadMenuIndirect;
+alias LoadStringW LoadString;
+alias MapVirtualKeyW MapVirtualKey;
+alias MapVirtualKeyExW MapVirtualKeyEx;
+alias MessageBoxW MessageBox;
+alias MessageBoxExW MessageBoxEx;
+alias MessageBoxIndirectW MessageBoxIndirect;
+alias ModifyMenuW ModifyMenu;
+alias OemToCharW OemToChar;
+alias OemToCharBuffW OemToCharBuff;
+alias OpenDesktopW OpenDesktop;
+alias OpenWindowStationW OpenWindowStation;
+alias PeekMessageW PeekMessage;
+alias PostMessageW PostMessage;
+alias PostThreadMessageW PostThreadMessage;
+alias RealGetWindowClassW RealGetWindowClass;
+alias RegisterClassW RegisterClass;
+alias RegisterClassExW RegisterClassEx;
+alias RegisterClipboardFormatW RegisterClipboardFormat;
+static if (WINVER >= 0x500) {
+alias RegisterDeviceNotificationW RegisterDeviceNotification;
+}
+alias RegisterWindowMessageW RegisterWindowMessage;
+alias RemovePropW RemoveProp;
+alias SendDlgItemMessageW SendDlgItemMessage;
+alias SendMessageW SendMessage;
+alias SendMessageCallbackW SendMessageCallback;
+alias SendMessageTimeoutW SendMessageTimeout;
+alias SendNotifyMessageW SendNotifyMessage;
+alias SetClassLongW SetClassLong;
+alias SetDlgItemTextW SetDlgItemText;
+alias SetMenuItemInfoW SetMenuItemInfo;
+alias SetPropW SetProp;
+alias SetUserObjectInformationW SetUserObjectInformation;
+alias SetWindowLongW SetWindowLong;
+alias SetWindowLongPtrW SetWindowLongPtr;
+alias SetWindowsHookW SetWindowsHook;
+alias SetWindowsHookExW SetWindowsHookEx;
+alias SetWindowTextW SetWindowText;
+alias SystemParametersInfoW SystemParametersInfo;
+alias TabbedTextOutW TabbedTextOut;
+alias TranslateAcceleratorW TranslateAccelerator;
+alias UnregisterClassW UnregisterClass;
+alias VkKeyScanW VkKeyScan;
+alias VkKeyScanExW VkKeyScanEx;
+alias WinHelpW WinHelp;
+alias wsprintfW wsprintf;
+alias wvsprintfW wvsprintf;
+
+alias ChangeDisplaySettingsW ChangeDisplaySettings;
+alias ChangeDisplaySettingsExW ChangeDisplaySettingsEx;
+alias CreateDesktopW CreateDesktop;
+alias EnumDisplaySettingsW EnumDisplaySettings;
+static if ((_WIN32_WINNT >= 0x500) || (_WIN32_WINDOWS >= 0x410)) {
+alias EnumDisplaySettingsExW EnumDisplaySettingsEx;
+}
+alias EnumDisplayDevicesW EnumDisplayDevices;
+
+} else { // ANSI
+
+alias EDITWORDBREAKPROCA EDITWORDBREAKPROC;
+alias PROPENUMPROCA PROPENUMPROC;
+alias PROPENUMPROCEXA PROPENUMPROCEX;
+alias DESKTOPENUMPROCA DESKTOPENUMPROC;
+alias WINSTAENUMPROCA WINSTAENUMPROC;
+alias MAKEINTRESOURCEA MAKEINTRESOURCE;
+
+alias WNDCLASSA WNDCLASS;
+alias WNDCLASSEXA WNDCLASSEX;
+alias MENUITEMINFOA MENUITEMINFO;
+alias LPCMENUITEMINFOA LPCMENUITEMINFO;
+alias MSGBOXPARAMSA MSGBOXPARAMS;
+alias HIGHCONTRASTA HIGHCONTRAST;
+alias SERIALKEYSA SERIALKEYS;
+alias SOUNDSENTRYA SOUNDSENTRY;
+alias CREATESTRUCTA CREATESTRUCT;
+alias CBT_CREATEWNDA CBT_CREATEWND;
+alias MDICREATESTRUCTA MDICREATESTRUCT;
+alias MULTIKEYHELPA MULTIKEYHELP;
+alias MONITORINFOEXA MONITORINFOEX;
+alias ICONMETRICSA ICONMETRICS;
+alias NONCLIENTMETRICSA NONCLIENTMETRICS;
+
+alias AppendMenuA AppendMenu;
+alias BroadcastSystemMessageA BroadcastSystemMessage;
+static if (_WIN32_WINNT >= 0x501) {
+alias BroadcastSystemMessageExA BroadcastSystemMessageEx;
+}
+alias CallMsgFilterA CallMsgFilter;
+alias CallWindowProcA CallWindowProc;
+alias ChangeMenuA ChangeMenu;
+alias CharLowerA CharLower;
+alias CharLowerBuffA CharLowerBuff;
+alias CharNextA CharNext;
+alias CharNextExA CharNextEx;
+alias CharPrevA CharPrev;
+alias CharPrevExA CharPrevEx;
+alias CharToOemA CharToOem;
+alias CharToOemBuffA CharToOemBuff;
+alias CharUpperA CharUpper;
+alias CharUpperBuffA CharUpperBuff;
+alias CopyAcceleratorTableA CopyAcceleratorTable;
+alias CreateAcceleratorTableA CreateAcceleratorTable;
+alias CreateDialogA CreateDialog;
+alias CreateDialogIndirectA CreateDialogIndirect;
+alias CreateDialogIndirectParamA CreateDialogIndirectParam;
+alias CreateDialogParamA CreateDialogParam;
+alias CreateMDIWindowA CreateMDIWindow;
+alias CreateWindowA CreateWindow;
+alias CreateWindowExA CreateWindowEx;
+alias CreateWindowStationA CreateWindowStation;
+alias DefDlgProcA DefDlgProc;
+alias DefFrameProcA DefFrameProc;
+alias DefMDIChildProcA DefMDIChildProc;
+alias DefWindowProcA DefWindowProc;
+alias DialogBoxA DialogBox;
+alias DialogBoxIndirectA DialogBoxIndirect;
+alias DialogBoxIndirectParamA DialogBoxIndirectParam;
+alias DialogBoxParamA DialogBoxParam;
+alias DispatchMessageA DispatchMessage;
+alias DlgDirListA DlgDirList;
+alias DlgDirListComboBoxA DlgDirListComboBox;
+alias DlgDirSelectComboBoxExA DlgDirSelectComboBoxEx;
+alias DlgDirSelectExA DlgDirSelectEx;
+alias DrawStateA DrawState;
+alias DrawTextA DrawText;
+alias DrawTextExA DrawTextEx;
+alias EnumDesktopsA EnumDesktops;
+alias EnumPropsA EnumProps;
+alias EnumPropsExA EnumPropsEx;
+alias EnumWindowStationsA EnumWindowStations;
+alias FindWindowA FindWindow;
+alias FindWindowExA FindWindowEx;
+alias GetClassInfoA GetClassInfo;
+alias GetClassInfoExA GetClassInfoEx;
+alias GetClassLongA GetClassLong;
+alias GetClassNameA GetClassName;
+alias GetClipboardFormatNameA GetClipboardFormatName;
+alias GetDlgItemTextA GetDlgItemText;
+alias GetKeyboardLayoutNameA GetKeyboardLayoutName;
+alias GetKeyNameTextA GetKeyNameText;
+alias GetMenuItemInfoA GetMenuItemInfo;
+alias GetMenuStringA GetMenuString;
+alias GetMessageA GetMessage;
+static if (WINVER >=0x410) {
+alias GetMonitorInfoA GetMonitorInfo;
+}
+alias GetPropA GetProp;
+static if (_WIN32_WINNT >= 0x501) {
+alias GetRawInputDeviceInfoA GetRawInputDeviceInfo;
+}
+alias GetTabbedTextExtentA GetTabbedTextExtent;
+alias GetUserObjectInformationA GetUserObjectInformation;
+alias GetWindowLongA GetWindowLong;
+alias GetWindowLongPtrA GetWindowLongPtr;
+alias GetWindowTextA GetWindowText;
+alias GetWindowTextLengthA GetWindowTextLength;
+alias GetAltTabInfoA GetAltTabInfo;
+alias GetWindowModuleFileNameA GetWindowModuleFileName;
+alias GrayStringA GrayString;
+alias InsertMenuA InsertMenu;
+alias InsertMenuItemA InsertMenuItem;
+alias IsCharAlphaA IsCharAlpha;
+alias IsCharAlphaNumericA IsCharAlphaNumeric;
+alias IsCharLowerA IsCharLower;
+alias IsCharUpperA IsCharUpper;
+alias IsDialogMessageA IsDialogMessage;
+alias LoadAcceleratorsA LoadAccelerators;
+alias LoadBitmapA LoadBitmap;
+alias LoadCursorA LoadCursor;
+alias LoadIconA LoadIcon;
+alias LoadCursorFromFileA LoadCursorFromFile;
+alias LoadImageA LoadImage;
+alias LoadKeyboardLayoutA LoadKeyboardLayout;
+alias LoadMenuA LoadMenu;
+alias LoadMenuIndirectA LoadMenuIndirect;
+alias LoadStringA LoadString;
+alias MapVirtualKeyA MapVirtualKey;
+alias MapVirtualKeyExA MapVirtualKeyEx;
+alias MessageBoxA MessageBox;
+alias MessageBoxExA MessageBoxEx;
+alias MessageBoxIndirectA MessageBoxIndirect;
+alias ModifyMenuA ModifyMenu;
+alias OemToCharA OemToChar;
+alias OemToCharBuffA OemToCharBuff;
+alias OpenDesktopA OpenDesktop;
+alias OpenWindowStationA OpenWindowStation;
+alias PeekMessageA PeekMessage;
+alias PostMessageA PostMessage;
+alias PostThreadMessageA PostThreadMessage;
+alias RealGetWindowClassA RealGetWindowClass;
+alias RegisterClassA RegisterClass;
+alias RegisterClassExA RegisterClassEx;
+alias RegisterClipboardFormatA RegisterClipboardFormat;
+static if (WINVER >= 0x500) {
+alias RegisterDeviceNotificationA RegisterDeviceNotification;
+}
+alias RegisterWindowMessageA RegisterWindowMessage;
+alias RemovePropA RemoveProp;
+alias SendDlgItemMessageA SendDlgItemMessage;
+alias SendMessageA SendMessage;
+alias SendMessageCallbackA SendMessageCallback;
+alias SendMessageTimeoutA SendMessageTimeout;
+alias SendNotifyMessageA SendNotifyMessage;
+alias SetClassLongA SetClassLong;
+alias SetDlgItemTextA SetDlgItemText;
+alias SetMenuItemInfoA SetMenuItemInfo;
+alias SetPropA SetProp;
+alias SetUserObjectInformationA SetUserObjectInformation;
+alias SetWindowLongA SetWindowLong;
+alias SetWindowLongPtrA SetWindowLongPtr;
+alias SetWindowsHookA SetWindowsHook;
+alias SetWindowsHookExA SetWindowsHookEx;
+alias SetWindowTextA SetWindowText;
+alias SystemParametersInfoA SystemParametersInfo;
+alias TabbedTextOutA TabbedTextOut;
+alias TranslateAcceleratorA TranslateAccelerator;
+alias UnregisterClassA UnregisterClass;
+alias VkKeyScanA VkKeyScan;
+alias VkKeyScanExA VkKeyScanEx;
+alias WinHelpA WinHelp;
+alias wsprintfA wsprintf;
+alias wvsprintfA wvsprintf;
+
+alias ChangeDisplaySettingsA ChangeDisplaySettings;
+alias ChangeDisplaySettingsExA ChangeDisplaySettingsEx;
+alias CreateDesktopA CreateDesktop;
+alias EnumDisplaySettingsA EnumDisplaySettings;
+static if ((_WIN32_WINNT >= 0x500) || (_WIN32_WINDOWS >= 0x410)) {
+	alias EnumDisplaySettingsExA EnumDisplaySettingsEx;
+}
+	alias EnumDisplayDevicesA EnumDisplayDevices;
+}
+
+
+alias WNDCLASS* LPWNDCLASS, PWNDCLASS;
+alias WNDCLASSEX* LPWNDCLASSEX, PWNDCLASSEX;
+alias MENUITEMINFO* LPMENUITEMINFO;
+alias MSGBOXPARAMS* PMSGBOXPARAMS, LPMSGBOXPARAMS;
+alias HIGHCONTRAST* LPHIGHCONTRAST;
+alias SERIALKEYS* LPSERIALKEYS;
+alias SOUNDSENTRY* LPSOUNDSENTRY;
+alias CREATESTRUCT* LPCREATESTRUCT;
+alias CBT_CREATEWND* LPCBT_CREATEWND;
+alias MDICREATESTRUCT* LPMDICREATESTRUCT;
+alias MULTIKEYHELP* PMULTIKEYHELP, LPMULTIKEYHELP;
+alias MONITORINFOEX* LPMONITORINFOEX;
+alias ICONMETRICS* LPICONMETRICS;
+alias NONCLIENTMETRICS* LPNONCLIENTMETRICS;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/winver.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,171 @@
+/***********************************************************************\
+*                                winver.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.winver;
+
+private import win32.windef;
+
+// FIXME: type weirdness
+enum {
+	VS_FILE_INFO    =  16,
+	VS_VERSION_INFO =   1,
+	VS_USER_DEFINED = 100
+}
+
+enum {
+	VS_FFI_SIGNATURE     = 0xFEEF04BD,
+	VS_FFI_STRUCVERSION  =    0x10000,
+	VS_FFI_FILEFLAGSMASK =       0x3F
+}
+
+enum {
+	VS_FF_DEBUG        =  1,
+	VS_FF_PRERELEASE   =  2,
+	VS_FF_PATCHED      =  4,
+	VS_FF_PRIVATEBUILD =  8,
+	VS_FF_INFOINFERRED = 16,
+	VS_FF_SPECIALBUILD = 32
+}
+
+enum {
+	VOS_UNKNOWN       =       0,
+	VOS_DOS           = 0x10000,
+	VOS_OS216         = 0x20000,
+	VOS_OS232         = 0x30000,
+	VOS_NT            = 0x40000,
+	VOS__BASE         =       0,
+	VOS__WINDOWS16    =       1,
+	VOS__PM16         =       2,
+	VOS__PM32         =       3,
+	VOS__WINDOWS32    =       4,
+	VOS_DOS_WINDOWS16 = 0x10001,
+	VOS_DOS_WINDOWS32 = 0x10004,
+	VOS_OS216_PM16    = 0x20002,
+	VOS_OS232_PM32    = 0x30003,
+	VOS_NT_WINDOWS32  = 0x40004
+}
+
+enum {
+	VFT_UNKNOWN    = 0,
+	VFT_APP        = 1,
+	VFT_DLL        = 2,
+	VFT_DRV        = 3,
+	VFT_FONT       = 4,
+	VFT_VXD        = 5,
+	VFT_STATIC_LIB = 7
+}
+
+enum {
+	VFT2_UNKNOWN         =  0,
+	VFT2_DRV_PRINTER     =  1,
+	VFT2_DRV_KEYBOARD    =  2,
+	VFT2_DRV_LANGUAGE    =  3,
+	VFT2_DRV_DISPLAY     =  4,
+	VFT2_DRV_MOUSE       =  5,
+	VFT2_DRV_NETWORK     =  6,
+	VFT2_DRV_SYSTEM      =  7,
+	VFT2_DRV_INSTALLABLE =  8,
+	VFT2_DRV_SOUND       =  9,
+	VFT2_DRV_COMM        = 10,
+	VFT2_DRV_INPUTMETHOD = 11,
+	VFT2_FONT_RASTER     =  1,
+	VFT2_FONT_VECTOR     =  2,
+	VFT2_FONT_TRUETYPE   =  3
+}
+
+enum : DWORD {
+	VFFF_ISSHAREDFILE = 1
+}
+
+enum : DWORD {
+	VFF_CURNEDEST    = 1,
+	VFF_FILEINUSE    = 2,
+	VFF_BUFFTOOSMALL = 4
+}
+
+enum : DWORD {
+	VIFF_FORCEINSTALL  = 1,
+	VIFF_DONTDELETEOLD
+}
+
+enum {
+	VIF_TEMPFILE         = 0x00001,
+	VIF_MISMATCH         = 0x00002,
+	VIF_SRCOLD           = 0x00004,
+	VIF_DIFFLANG         = 0x00008,
+	VIF_DIFFCODEPG       = 0x00010,
+	VIF_DIFFTYPE         = 0x00020,
+	VIF_WRITEPROT        = 0x00040,
+	VIF_FILEINUSE        = 0x00080,
+	VIF_OUTOFSPACE       = 0x00100,
+	VIF_ACCESSVIOLATION  = 0x00200,
+	VIF_SHARINGVIOLATION = 0x00400,
+	VIF_CANNOTCREATE     = 0x00800,
+	VIF_CANNOTDELETE     = 0x01000,
+	VIF_CANNOTRENAME     = 0x02000,
+	VIF_CANNOTDELETECUR  = 0x04000,
+	VIF_OUTOFMEMORY      = 0x08000,
+	VIF_CANNOTREADSRC    = 0x10000,
+	VIF_CANNOTREADDST    = 0x20000,
+	VIF_BUFFTOOSMALL     = 0x40000
+}
+
+struct VS_FIXEDFILEINFO {
+	DWORD dwSignature;
+	DWORD dwStrucVersion;
+	DWORD dwFileVersionMS;
+	DWORD dwFileVersionLS;
+	DWORD dwProductVersionMS;
+	DWORD dwProductVersionLS;
+	DWORD dwFileFlagsMask;
+	DWORD dwFileFlags;
+	DWORD dwFileOS;
+	DWORD dwFileType;
+	DWORD dwFileSubtype;
+	DWORD dwFileDateMS;
+	DWORD dwFileDateLS;
+}
+
+extern (Windows) {
+	DWORD VerFindFileA(DWORD, LPSTR, LPSTR, LPSTR, LPSTR, PUINT, LPSTR,
+	  PUINT);
+	DWORD VerFindFileW(DWORD, LPWSTR, LPWSTR, LPWSTR, LPWSTR, PUINT, LPWSTR,
+	  PUINT);
+	DWORD VerInstallFileA(DWORD, LPSTR, LPSTR, LPSTR, LPSTR, LPSTR, LPSTR,
+	  PUINT);
+	DWORD VerInstallFileW(DWORD, LPWSTR, LPWSTR, LPWSTR, LPWSTR, LPWSTR,
+	  LPWSTR, PUINT);
+	DWORD GetFileVersionInfoSizeA(LPSTR, PDWORD);
+	DWORD GetFileVersionInfoSizeW(LPWSTR, PDWORD);
+	BOOL GetFileVersionInfoA(LPSTR, DWORD, DWORD, PVOID);
+	BOOL GetFileVersionInfoW(LPWSTR, DWORD, DWORD, PVOID);
+	DWORD VerLanguageNameA(DWORD, LPSTR, DWORD);
+	DWORD VerLanguageNameW(DWORD, LPWSTR, DWORD);
+	BOOL VerQueryValueA(LPVOID, LPSTR, LPVOID*, PUINT);
+	BOOL VerQueryValueW(LPVOID, LPWSTR, LPVOID*, PUINT);
+}
+
+version (Unicode) {
+	alias VerFindFileW VerFindFile;
+	alias VerQueryValueW VerQueryValue;
+	alias VerInstallFileW VerInstallFile;
+	alias GetFileVersionInfoSizeW GetFileVersionInfoSize;
+	alias GetFileVersionInfoW GetFileVersionInfo;
+	alias VerLanguageNameW VerLanguageName;
+	alias VerQueryValueW VerQueryValue;
+} else {
+	alias VerQueryValueA VerQueryValue;
+	alias VerFindFileA VerFindFile;
+	alias VerInstallFileA VerInstallFile;
+	alias GetFileVersionInfoSizeA GetFileVersionInfoSize;
+	alias GetFileVersionInfoA GetFileVersionInfo;
+	alias VerLanguageNameA VerLanguageName;
+	alias VerQueryValueA VerQueryValue;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/ws2tcpip.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,281 @@
+/***********************************************************************\
+*                              ws2tcpip.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+
+module win32.ws2tcpip;
+
+import win32.w32api;
+//import win32.winbase;
+import win32.windef;
+//import win32.basetyps;
+import win32.winsock2;
+
+enum {
+	IP_OPTIONS					= 1,
+
+	IP_HDRINCL					= 2,
+	IP_TOS						= 3,
+	IP_TTL						= 4,
+	IP_MULTICAST_IF				= 9,
+	IP_MULTICAST_TTL			= 10,
+	IP_MULTICAST_LOOP			= 11,
+	IP_ADD_MEMBERSHIP			= 12,
+	IP_DROP_MEMBERSHIP			= 13,
+	IP_DONTFRAGMENT				= 14,
+	IP_ADD_SOURCE_MEMBERSHIP	= 15,
+	IP_DROP_SOURCE_MEMBERSHIP	= 16,
+	IP_BLOCK_SOURCE				= 17,
+	IP_UNBLOCK_SOURCE			= 18,
+	IP_PKTINFO					= 19
+}	
+
+enum {
+	IPV6_UNICAST_HOPS		= 4,
+	IPV6_MULTICAST_IF		= 9,
+	IPV6_MULTICAST_HOPS		= 10,
+	IPV6_MULTICAST_LOOP		= 11,
+	IPV6_ADD_MEMBERSHIP		= 12,
+	IPV6_DROP_MEMBERSHIP	= 13,
+	IPV6_JOIN_GROUP			= IPV6_ADD_MEMBERSHIP,
+	IPV6_LEAVE_GROUP		= IPV6_DROP_MEMBERSHIP,
+	IPV6_PKTINFO			= 19
+}
+
+const IP_DEFAULT_MULTICAST_TTL = 1;
+const IP_DEFAULT_MULTICAST_LOOP = 1;
+const IP_MAX_MEMBERSHIPS = 20;
+
+const TCP_EXPEDITED_1122 = 2;
+
+const UDP_NOCHECKSUM = 1;
+
+enum {
+	IFF_UP				= 1,
+	IFF_BROADCAST		= 2,
+	IFF_LOOPBACK		= 4,
+	IFF_POINTTOPOINT	= 8,
+	IFF_MULTICAST		= 16
+}
+
+const SIO_GET_INTERFACE_LIST = _IOR!('t', 127, u_long);
+
+const INET_ADDRSTRLEN	= 16;
+const INET6_ADDRSTRLEN	= 46;
+
+const NI_MAXHOST	= 1025;
+const NI_MAXSERV	= 32;
+
+const NI_NOFQDN			= 0x01;
+const NI_NUMERICHOST	= 0x02;
+const NI_NAMEREQD		= 0x04;
+const NI_NUMERICSERV	= 0x08;
+const NI_DGRAM			= 0x10;
+
+const AI_PASSIVE		= 1;
+const AI_CANONNAME		= 2;
+const AI_NUMERICHOST	= 4;
+
+const EAI_AGAIN		= WSATRY_AGAIN;
+const EAI_BADFLAGS	= WSAEINVAL;
+const EAI_FAIL		= WSANO_RECOVERY;
+const EAI_FAMILY	= WSAEAFNOSUPPORT;
+const EAI_MEMORY	= WSA_NOT_ENOUGH_MEMORY;
+const EAI_NODATA	= WSANO_DATA;
+const EAI_NONAME	= WSAHOST_NOT_FOUND;
+const EAI_SERVICE	= WSATYPE_NOT_FOUND;
+const EAI_SOCKTYPE	= WSAESOCKTNOSUPPORT;
+
+struct ip_mreq {
+	IN_ADDR imr_multiaddr;
+	IN_ADDR imr_interface;
+}
+
+struct ip_mreq_source {
+	IN_ADDR imr_multiaddr;
+	IN_ADDR imr_sourceaddr;
+	IN_ADDR imr_interface;
+}
+
+struct ip_msfilter {
+	IN_ADDR		imsf_multiaddr;
+	IN_ADDR		imsf_interface;
+	u_long		imsf_fmode;
+	u_long		imsf_numsrc;
+	IN_ADDR[1]	imsf_slist;
+}
+
+template IP_MSFILTER_SIZE(ULONG numsrc) {
+	const DWORD IP_MSFILTER_SIZE = ip_msfilter.sizeof - IN_ADDR.sizeof + numsrc * IN_ADDR.sizeof;
+}
+
+struct IN_PKTINFO {
+	IN_ADDR	ipi_addr;
+	UINT	ipi_ifindex;
+}
+
+struct IN6_ADDR {
+	union {
+		u_char[16]	_S6_u8;
+		u_short[8]	_S6_u16;
+		u_long[4]	_S6_u32;
+	}
+}
+alias IN6_ADDR* PIN6_ADDR, LPIN6_ADDR;
+
+struct SOCKADDR_IN6 {
+	short sin6_family;
+	u_short sin6_port;
+	u_long sin6_flowinfo;
+	IN6_ADDR sin6_addr;
+	u_long sin6_scope_id;
+};
+alias SOCKADDR_IN6* PSOCKADDR_IN6, LPSOCKADDR_IN6;
+
+extern IN6_ADDR in6addr_any;
+extern IN6_ADDR in6addr_loopback;
+
+/+ TODO: 
+#define IN6_ARE_ADDR_EQUAL(a, b)	\
+    (memcmp ((void*)(a), (void*)(b), sizeof (struct in6_addr)) == 0)
+
+#define IN6_IS_ADDR_UNSPECIFIED(_addr) \
+	(   (((const u_long *)(_addr))[0] == 0)	\
+	 && (((const u_long *)(_addr))[1] == 0)	\
+	 && (((const u_long *)(_addr))[2] == 0)	\
+	 && (((const u_long *)(_addr))[3] == 0))
+
+#define IN6_IS_ADDR_LOOPBACK(_addr) \
+	(   (((const u_long *)(_addr))[0] == 0)	\
+	 && (((const u_long *)(_addr))[1] == 0)	\
+	 && (((const u_long *)(_addr))[2] == 0)	\
+	 && (((const u_long *)(_addr))[3] == 0x01000000))
+
+#define IN6_IS_ADDR_MULTICAST(_addr) (((const u_char *) (_addr))[0] == 0xff)
+
+#define IN6_IS_ADDR_LINKLOCAL(_addr) \
+	(   (((const u_char *)(_addr))[0] == 0xfe)	\
+	 && ((((const u_char *)(_addr))[1] & 0xc0) == 0x80))
+
+#define IN6_IS_ADDR_SITELOCAL(_addr) \
+	(   (((const u_char *)(_addr))[0] == 0xfe)	\
+	 && ((((const u_char *)(_addr))[1] & 0xc0) == 0xc0))
+
+#define IN6_IS_ADDR_V4MAPPED(_addr) \
+	(   (((const u_long *)(_addr))[0] == 0)		\
+	 && (((const u_long *)(_addr))[1] == 0)		\
+	 && (((const u_long *)(_addr))[2] == 0xffff0000))
+
+#define IN6_IS_ADDR_V4COMPAT(_addr) \
+	(   (((const u_long *)(_addr))[0] == 0)		\
+	 && (((const u_long *)(_addr))[1] == 0)		\
+	 && (((const u_long *)(_addr))[2] == 0)		\
+	 && (((const u_long *)(_addr))[3] != 0)		\
+	 && (((const u_long *)(_addr))[3] != 0x01000000))
+
+#define IN6_IS_ADDR_MC_NODELOCAL(_addr)	\
+	(   IN6_IS_ADDR_MULTICAST(_addr)		\
+	 && ((((const u_char *)(_addr))[1] & 0xf) == 0x1)) 
+
+#define IN6_IS_ADDR_MC_LINKLOCAL(_addr)	\
+	(   IN6_IS_ADDR_MULTICAST (_addr)		\
+	 && ((((const u_char *)(_addr))[1] & 0xf) == 0x2))
+
+#define IN6_IS_ADDR_MC_SITELOCAL(_addr)	\
+	(   IN6_IS_ADDR_MULTICAST(_addr)		\
+	 && ((((const u_char *)(_addr))[1] & 0xf) == 0x5))
+
+#define IN6_IS_ADDR_MC_ORGLOCAL(_addr)	\
+	(   IN6_IS_ADDR_MULTICAST(_addr)		\
+	 && ((((const u_char *)(_addr))[1] & 0xf) == 0x8))
+
+#define IN6_IS_ADDR_MC_GLOBAL(_addr)	\
+	(   IN6_IS_ADDR_MULTICAST(_addr)	\
+	 && ((((const u_char *)(_addr))[1] & 0xf) == 0xe))
++/
+
+alias int socklen_t;
+
+struct IPV6_MREG {
+	IN6_ADDR	ipv6mr_multiaddr;
+	uint		ipv6mr_interface;
+}
+
+struct IN6_PKTINFO {
+	IN6_ADDR	ipi6_addr;
+	UINT		ipi6_ifindex;
+}
+
+struct addrinfo {
+	int			ai_flags;
+	int			ai_family;
+	int			ai_socktype;
+	int			ai_protocol;
+	size_t		ai_addrlen;
+	char*		ai_canonname;
+	SOCKADDR*	ai_addr;
+	addrinfo*	ai_next;
+}
+
+extern(Windows) {
+	static if (_WIN32_WINNT >= 0x0501) {
+		void freeaddrinfo(addrinfo*);
+		int getaddrinfo (char*, char*, addrinfo*, addrinfo**);
+		int getnameinfo(SOCKADDR*, socklen_t, char*, DWORD, char*, DWORD, int);
+	}
+}
+
+/+ TODO
+static __inline char*
+gai_strerrorA(int ecode)
+{
+	static char message[1024+1];
+	DWORD dwFlags = FORMAT_MESSAGE_FROM_SYSTEM
+	              | FORMAT_MESSAGE_IGNORE_INSERTS
+		      | FORMAT_MESSAGE_MAX_WIDTH_MASK;
+	DWORD dwLanguageId = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
+  	FormatMessageA(dwFlags, NULL, ecode, dwLanguageId, (LPSTR)message, 1024, NULL);
+	return message;
+}
+static __inline WCHAR*
+gai_strerrorW(int ecode)
+{
+	static WCHAR message[1024+1];
+	DWORD dwFlags = FORMAT_MESSAGE_FROM_SYSTEM
+	              | FORMAT_MESSAGE_IGNORE_INSERTS
+		      | FORMAT_MESSAGE_MAX_WIDTH_MASK;
+	DWORD dwLanguageId = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
+  	FormatMessageW(dwFlags, NULL, ecode, dwLanguageId, (LPWSTR)message, 1024, NULL);
+	return message;
+}
+#ifdef UNICODE
+#define gai_strerror gai_strerrorW
+#else
+#define gai_strerror gai_strerrorA
+#endif
++/
+
+extern(Windows) {
+	INT getnameinfo(SOCKADDR* pSockaddr, socklen_t SockaddrLength,
+		PCHAR pNodeBuffer, DWORD NodeBufferSize, PCHAR pServiceBuffer,
+		DWORD ServiceBufferSize, INT Flags);
+
+	static if (_WIN32_WINNT >= 0x0502) {
+		INT GetNameInfoW(SOCKADDR* pSockaddr, socklen_t SockaddrLength,
+			PWCHAR pNodeBuffer, DWORD NodeBufferSize, PWCHAR pServiceBuffer,
+			DWORD ServiceBufferSize, INT Flags);
+
+		alias getnameinfo GetNameInfoA;
+
+		version(Unicode) {
+			alias GetNameInfoW GetNameInfo;
+		} else {
+			alias GetNameInfoA GetNameInfo;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/wtypes.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,231 @@
+/***********************************************************************\
+*                               wtypes.d                                *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.wtypes;
+
+import win32.rpc, win32.rpcndr;
+private import win32.windef;
+private import win32.uuid; // for GUID_NULL
+
+alias GUID_NULL IID_NULL, CLSID_NULL;
+
+const ROTFLAGS_REGISTRATIONKEEPSALIVE = 0x01;
+const ROTFLAGS_ALLOWANYCLIENT         = 0x02;
+
+// also in winsock2.h
+struct BLOB {
+	ULONG cbSize;
+	BYTE* pBlobData;
+}
+alias BLOB* PBLOB, LPBLOB;
+
+enum DVASPECT {
+	DVASPECT_CONTENT   = 1,
+	DVASPECT_THUMBNAIL = 2,
+	DVASPECT_ICON      = 4,
+	DVASPECT_DOCPRINT  = 8
+}
+
+enum DVASPECT2 {
+	DVASPECT_OPAQUE      = 16,
+	DVASPECT_TRANSPARENT = 32
+}
+
+enum STATFLAG {
+	STATFLAG_DEFAULT = 0,
+	STATFLAG_NONAME  = 1
+}
+
+enum MEMCTX {
+	MEMCTX_LOCAL = 0,
+	MEMCTX_TASK,
+	MEMCTX_SHARED,
+	MEMCTX_MACSYSTEM,
+	MEMCTX_UNKNOWN = -1,
+	MEMCTX_SAME = -2
+}
+
+enum MSHCTX {
+	MSHCTX_LOCAL = 0,
+	MSHCTX_NOSHAREDMEM,
+	MSHCTX_DIFFERENTMACHINE,
+	MSHCTX_INPROC,
+	MSHCTX_CROSSCTX
+}
+
+enum CLSCTX {
+	CLSCTX_INPROC_SERVER   = 1,
+	CLSCTX_INPROC_HANDLER  = 2,
+	CLSCTX_LOCAL_SERVER    = 4,
+	CLSCTX_INPROC_SERVER16 = 8,
+	CLSCTX_REMOTE_SERVER   = 16
+}
+
+enum MSHLFLAGS {
+	MSHLFLAGS_NORMAL,
+	MSHLFLAGS_TABLESTRONG,
+	MSHLFLAGS_TABLEWEAK
+}
+
+struct FLAGGED_WORD_BLOB {
+	uint fFlags;
+	uint clSize;
+	ushort asData[1];
+}
+
+alias WCHAR OLECHAR;
+alias LPWSTR LPOLESTR;
+alias LPCWSTR LPCOLESTR;
+
+alias ushort VARTYPE;
+alias short VARIANT_BOOL;
+alias VARIANT_BOOL _VARIANT_BOOL;
+const VARIANT_BOOL VARIANT_TRUE = -1; // 0xffff;
+const VARIANT_BOOL VARIANT_FALSE = 0;
+
+alias OLECHAR* BSTR;
+alias FLAGGED_WORD_BLOB* wireBSTR;
+alias BSTR* LPBSTR;
+//alias LONG SCODE; // also in winerror
+alias HANDLE HCONTEXT, HMETAFILEPICT;
+
+union CY {
+	struct {
+		uint Lo;
+		int Hi;
+	}
+	LONGLONG int64;
+}
+
+alias double DATE;
+struct  BSTRBLOB {
+	ULONG cbSize;
+	PBYTE pData;
+}
+alias BSTRBLOB* LPBSTRBLOB;
+
+// Used only in the PROPVARIANT structure
+// According to the 2003 SDK, this should be in propidl.h, not here.
+struct CLIPDATA {
+	ULONG cbSize;
+	int ulClipFmt;
+	PBYTE pClipData;
+}
+
+enum STGC {
+	STGC_DEFAULT,
+	STGC_OVERWRITE,
+	STGC_ONLYIFCURRENT,
+	STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE
+}
+
+enum STGMOVE {
+	STGMOVE_MOVE,
+	STGMOVE_COPY,
+	STGMOVE_SHALLOWCOPY
+}
+
+enum VARENUM {
+	VT_EMPTY,
+	VT_NULL,
+	VT_I2,
+	VT_I4,
+	VT_R4,
+	VT_R8,
+	VT_CY,
+	VT_DATE,
+	VT_BSTR,
+	VT_DISPATCH,
+	VT_ERROR,
+	VT_BOOL,
+	VT_VARIANT,
+	VT_UNKNOWN,
+	VT_DECIMAL,
+	VT_I1 = 16,
+	VT_UI1,
+	VT_UI2,
+	VT_UI4,
+	VT_I8,
+	VT_UI8,
+	VT_INT,
+	VT_UINT,
+	VT_VOID,
+	VT_HRESULT,
+	VT_PTR,
+	VT_SAFEARRAY,
+	VT_CARRAY,
+	VT_USERDEFINED,
+	VT_LPSTR,
+	VT_LPWSTR,
+	VT_RECORD   = 36,
+	VT_INT_PTR  = 37,
+	VT_UINT_PTR = 38,
+	VT_FILETIME = 64,
+	VT_BLOB,
+	VT_STREAM,
+	VT_STORAGE,
+	VT_STREAMED_OBJECT,
+	VT_STORED_OBJECT,
+	VT_BLOB_OBJECT,
+	VT_CF,
+	VT_CLSID,
+	VT_BSTR_BLOB     = 0xfff,
+	VT_VECTOR        = 0x1000,
+	VT_ARRAY         = 0x2000,
+	VT_BYREF         = 0x4000,
+	VT_RESERVED      = 0x8000,
+	VT_ILLEGAL       = 0xffff,
+	VT_ILLEGALMASKED = 0xfff,
+	VT_TYPEMASK      = 0xfff
+};
+
+struct BYTE_SIZEDARR {
+	uint clSize;
+	byte* pData;
+}
+
+struct WORD_SIZEDARR {
+	uint clSize;
+	ushort* pData;
+}
+
+struct DWORD_SIZEDARR {
+uint clSize;
+uint* pData;
+}
+
+struct HYPER_SIZEDARR {
+	uint clSize;
+	hyper* pData;
+}
+
+alias double DOUBLE;
+
+
+struct DECIMAL {
+	USHORT wReserved;
+	union {
+		struct {
+			ubyte scale; // valid values are 0 to 28
+			ubyte sign; // 0 for positive, DECIMAL_NEG for negatives.
+			const ubyte DECIMAL_NEG = 0x80;
+		}
+		USHORT signscale;
+	}
+	ULONG Hi32;
+	union {
+		struct {
+			ULONG Lo32;
+			ULONG Mid32;
+		}
+		ULONGLONG Lo64;
+	}
+	// #define DECIMAL_SETZERO(d) {(d).Lo64=(d).Hi32=(d).signscale=0;}
+	void setZero() { Lo64 = 0; Hi32 = 0; signscale = 0; }
+}