Add contribution of 20-40.



git-svn-id: svn+ssh://svn.code.sf.net/p/mingw-w64/code/trunk@190 4407c894-4637-0410-b4f5-ada5f102cad1
diff --git a/mingw-w64-headers/include/ChangeLog b/mingw-w64-headers/include/ChangeLog
index 4f671aa..4cd0953 100755
--- a/mingw-w64-headers/include/ChangeLog
+++ b/mingw-w64-headers/include/ChangeLog
@@ -1,3 +1,34 @@
+2007-11-07  20-40  <annonymous>
+
+	* _dbdao.h: New.
+	* ieeefp.h: New.
+	* io.h: (_getcwd): Prototype added.
+	* mspab.h: New.
+	* mspaddr.h: New.
+	* mspbase.h: New.
+	* mspcall.h: New.
+	* mspcoll.h: New.
+	* mspenum.h: New.
+	* msplog.h: New.
+	* mspst.h: New.
+	* mspstrm.h: New.
+	* mspterm.h: New.
+	* mspthrd.h: New.
+	* msptrmac.h: New.
+	* msptrmar.h: New.
+	* msptrmvc.h: New.
+	* msputils.h: New.
+	* ws2tcpip.h: (ip_mreq): Disabled. Forced that winsock2.h is included infront.
+	* wmiatlprov.h: New.
+	* winsock2.h: Add AF_??? constants.
+	* wchar.h: Add protypes for swprintf and vswprintf.
+	* tchar.h: Likewise.
+	* stdio.h: Likewise.
+	* w32api.h: New.
+	* nl_types.h: New.
+	* langinfo.h: New.
+
+
 2007-10-29  Kai Tietz  <kai.tietz@onevision.com>
 
 	* assert.h:
diff --git a/mingw-w64-headers/include/_dbdao.h b/mingw-w64-headers/include/_dbdao.h
new file mode 100755
index 0000000..9512cbc
--- /dev/null
+++ b/mingw-w64-headers/include/_dbdao.h
@@ -0,0 +1,347 @@
+#ifndef __DBDAO_H_
+#define __DBDAO_H_
+
+class COleVariant;
+class CdbBookmark;
+class CdbException;
+class CdbOleObject;
+class CdbObject;
+class CdbError;
+class CdbProperty;
+class CdbDBEngine;
+class CdbWorkspace;
+class CdbDatabase;
+class CdbConnection;
+class CdbRecordset;
+class CdbGetRowsEx;
+class CdbQueryDef;
+class CdbTableDef;
+class CdbField;
+class CdbRelation;
+class CdbIndex;
+class CdbUser;
+class CdbGroup;
+class CdbDocument;
+class CdbContainer;
+class CdbParameter;
+class CdbCollection;
+class CdbErrors;
+class CdbProperties;
+class CdbWorkspaces;
+class CdbDatabases;
+class CdbConnections;
+class CdbRecordsets;
+class CdbQueryDefs;
+class CdbTableDefs;
+class CdbFields;
+class CdbRelations;
+class CdbIndexes;
+class CdbUsers;
+class CdbGroups;
+class CdbDocuments;
+class CdbContainers;
+class CdbParameters;
+class CdbBStr;
+
+const char szKEY[] = "mbmabptebkjcdlgtjmskjwtsdhjbmkmwtrak";
+
+#define DAO_MAXSEEKFIELDS 13
+
+class DLLEXPORT CdbBSTR {
+public:
+  CONSTRUCTOR CdbBSTR(BSTR=NULL);
+  DESTRUCTOR ~CdbBSTR(VOID);
+  operator BSTR *(VOID);
+  operator LPCTSTR(VOID);
+private:
+  BSTR m_bstr;
+};
+
+class CdbVariant : public COleVariant {
+public:
+  CONSTRUCTOR CdbVariant(LONG l);
+  CONSTRUCTOR CdbVariant(VOID);
+  CONSTRUCTOR CdbVariant(LPCTSTR pstr);
+  CONSTRUCTOR CdbVariant(SHORT s,WINBOOL bIsBool = FALSE);
+  CONSTRUCTOR CdbVariant(LPVARIANT pv);
+  CONSTRUCTOR CdbVariant(LPSAFEARRAY psa);
+  VOID operator =(LPVARIANT pv);
+  VOID operator =(LPCTSTR pstr);
+  VOID operator =(SHORT s);
+  VOID operator =(const int i);
+  VOID operator =(LONG l);
+};
+
+inline CONSTRUCTOR CdbVariant::CdbVariant(VOID) : COleVariant() {
+  vt = VT_ERROR;
+  scode = DISP_E_PARAMNOTFOUND;
+}
+
+inline CdbVariant::CdbVariant(LONG l) {
+  if(l==-1) {
+    vt = VT_ERROR;
+    scode = DISP_E_PARAMNOTFOUND;
+  } else {
+    vt = VT_I4;
+    lVal = l;
+  }
+}
+
+inline CONSTRUCTOR CdbVariant::CdbVariant(LPCTSTR pstr): COleVariant(pstr,VT_BSTRT) {
+  if(!pstr) {
+    VariantClear(this);
+    vt = VT_ERROR;
+    scode = DISP_E_PARAMNOTFOUND;
+  }
+}
+
+inline CONSTRUCTOR CdbVariant::CdbVariant(SHORT s,WINBOOL bIsBool) : COleVariant(s) {
+  if(bIsBool) {
+    vt = VT_BOOL;
+    boolVal = s;
+  } else if(s==-1) {
+    vt = VT_ERROR;
+    scode = DISP_E_PARAMNOTFOUND;
+  }
+}
+
+inline CONSTRUCTOR CdbVariant::CdbVariant(LPVARIANT pv) {
+  if(!pv) {
+    vt = VT_ERROR;
+    scode = DISP_E_PARAMNOTFOUND;
+  } else
+    VariantCopy(this,pv);
+}
+
+inline CONSTRUCTOR CdbVariant::CdbVariant(LPSAFEARRAY psa) {
+  if(!psa) {
+    vt = VT_ERROR;
+    scode = DISP_E_PARAMNOTFOUND;
+  } else {
+    vt = VT_ARRAY|VT_UI1;
+    parray = psa;
+  }
+}
+
+inline VOID CdbVariant::operator =(LPVARIANT pv) {
+  if(!pv) {
+    vt = VT_ERROR;
+    scode = DISP_E_PARAMNOTFOUND;
+  } else
+    VariantCopy(this,pv);
+}
+
+inline VOID CdbVariant::operator =(LPCTSTR pstr) {
+  if(!pstr) {
+    VariantClear(this);
+    vt = VT_ERROR;
+    scode = DISP_E_PARAMNOTFOUND;
+  } else {
+#ifdef UNICODE
+    bstrVal = SysAllocString(pstr);
+#else
+    bstrVal = SysAllocStringByteLen(pstr,strlen(pstr));
+#endif
+    vt = VT_BSTR;
+  }
+}
+
+inline VOID CdbVariant::operator =(SHORT s) {
+  if(s==-1) {
+    vt = VT_ERROR;
+    scode = DISP_E_PARAMNOTFOUND;
+  } else {
+    vt = VT_I2;
+    iVal = s;
+  }
+}
+
+inline VOID CdbVariant::operator =(const int i) {
+  if(i==-1) {
+    vt = VT_ERROR;
+    scode = DISP_E_PARAMNOTFOUND;
+  } else {
+    vt = VT_I2;
+    iVal =(SHORT)i;
+  }
+}
+
+inline VOID CdbVariant::operator =(LONG l) {
+  if(l==-1) {
+    vt = VT_ERROR;
+    scode = DISP_E_PARAMNOTFOUND;
+  } else {
+    vt = VT_I4;
+    lVal = l;
+  }
+}
+
+HRESULT CdbWideFromAnsi(LPSTR,unsigned int,BSTR *);
+
+class CdbWide {
+public:
+  CONSTRUCTOR CdbWide(LPSTR pstr,unsigned int cb=0) {
+    CdbWideFromAnsi(pstr,(pstr ? (cb==0 ? strlen(pstr) : cb) : 0),&m_bstr);
+  }
+  DESTRUCTOR ~CdbWide() {
+    SysFreeString(m_bstr);
+  }
+  operator LPWSTR() { return (LPWSTR)m_bstr; }
+  operator LPSTR() { return (LPSTR)m_bstr; }
+  ULONG cBytes() { return SysStringByteLen(m_bstr); }
+private:
+  BSTR m_bstr;
+};
+
+class DLLEXPORT CdbOleObject : public CObject {
+public:
+  CONSTRUCTOR CdbOleObject(VOID);
+  virtual DESTRUCTOR ~CdbOleObject(VOID);
+  WINBOOL Exists(VOID);
+  CdbOleObject &operator = (CdbOleObject &o);
+  operator LPUNKNOWN(){ return GetInterface();}
+  VOID SetInterface(LPUNKNOWN punk,WINBOOL bAddRef=FALSE);
+  VOID SetInterface(REFIID riidClass,REFIID riidInterface);
+  VOID SetInterfaceLic(REFIID riidClass,REFIID riidInterface);
+  LPUNKNOWN GetInterface(WINBOOL bAddRef=FALSE,WINBOOL bThrowException=TRUE) const;
+  virtual VOID OnInterfaceChange(VOID);
+  VOID SetRichErrorInfo(LPOLESTR pstrSource,LPOLESTR pstrDescription,LPOLESTR pstrHelpFile,ULONG ulHelpID) const;
+protected:
+  WINBOOL StartOLE(VOID);
+  LPUNKNOWN m_punkInterface;
+};
+
+class DLLEXPORT CdbCollection : public CdbOleObject {
+public:
+  virtual CdbObject ObItem(LONG i) = 0;
+  virtual CdbObject ObItem(LPCTSTR pstr) = 0;
+  virtual LONG GetCount(VOID) = 0;
+  virtual VOID ObAppend(CdbObject &obj) = 0;
+  virtual VOID Delete(LPCTSTR pstr) = 0;
+  virtual VOID Refresh(VOID) = 0;
+};
+
+class DLLEXPORT CdbStaticCollection : public CdbCollection {
+public:
+  CdbObject ObItem(LONG i);
+  CdbObject ObItem(LPCTSTR pstr);
+  LONG GetCount(VOID);
+  VOID ObAppend(CdbObject &obj);
+  VOID Delete(LPCTSTR pstr);
+  VOID Refresh(VOID);
+};
+
+class DLLEXPORT CdbDynamicCollection : public CdbCollection {
+public:
+  CdbObject ObItem(LONG i);
+  CdbObject ObItem(LPCTSTR pstr);
+  LONG GetCount(VOID);
+  VOID ObAppend(CdbObject &obj);
+  VOID Delete(LPCTSTR pstr);
+  VOID Refresh(VOID);
+};
+
+#define DAOMFC_STATIC_COLLECTION_DECL(objColl,objSingle,intSingle) class DLLEXPORT objColl : public CdbStaticCollection { public: objSingle Item(LONG i); objSingle Item(LPCTSTR pstr); objSingle operator[](LONG i); objSingle operator[](LPCTSTR pstr); }
+#define DAOMFC_DYNAMIC_COLLECTION_DECL(objColl,objSingle,intSingle) class DLLEXPORT objColl : public CdbDynamicCollection { public: objSingle Item(LONG i); objSingle Item(LPCTSTR pstr); VOID Append(objSingle &o); objSingle operator[](LONG i); objSingle operator[](LPCTSTR pstr); }
+
+DAOMFC_STATIC_COLLECTION_DECL(CdbErrors,CdbError,DAOError);
+DAOMFC_STATIC_COLLECTION_DECL(CdbDatabases,CdbDatabase,DAODatabase);
+DAOMFC_STATIC_COLLECTION_DECL(CdbRecordsets,CdbRecordset,DAORecordset);
+DAOMFC_STATIC_COLLECTION_DECL(CdbParameters,CdbParameter,DAOParameter);
+DAOMFC_STATIC_COLLECTION_DECL(CdbDocuments,CdbDocument,DAODocument);
+DAOMFC_STATIC_COLLECTION_DECL(CdbContainers,CdbContainer,DAOContainer);
+DAOMFC_DYNAMIC_COLLECTION_DECL(CdbProperties,CdbProperty,DAOProperty);
+DAOMFC_DYNAMIC_COLLECTION_DECL(CdbFields,CdbField,DAOField);
+DAOMFC_DYNAMIC_COLLECTION_DECL(CdbQueryDefs,CdbQueryDef,DAOQueryDef);
+DAOMFC_DYNAMIC_COLLECTION_DECL(CdbTableDefs,CdbTableDef,DAOTableDef);
+DAOMFC_DYNAMIC_COLLECTION_DECL(CdbIndexes,CdbIndex,DAOIndex);
+DAOMFC_DYNAMIC_COLLECTION_DECL(CdbRelations,CdbRelation,DAORelation);
+DAOMFC_DYNAMIC_COLLECTION_DECL(CdbUsers,CdbUser,DAOUser);
+DAOMFC_DYNAMIC_COLLECTION_DECL(CdbGroups,CdbGroup,DAOGroup);
+
+class DLLEXPORT CdbWorkspaces : public CdbDynamicCollection {
+  friend CdbDBEngine;
+private:
+  DAODBEngine *pDBEng;
+  WINBOOL m_bDontStart;
+public:
+  CONSTRUCTOR CdbWorkspaces(VOID){pDBEng = NULL;}
+  CdbWorkspace Item(LONG i);
+  CdbWorkspace Item(LPCTSTR pstr);
+  VOID Append(CdbWorkspace &o);
+  CdbWorkspace operator[](LONG i);
+  CdbWorkspace operator[](LPCTSTR pstr);
+  VOID SetDBEngine(DAODBEngine *peng){pDBEng = peng;}
+  VOID GetDelayedInterface();
+};
+
+class DLLEXPORT CdbConnections : public CdbStaticCollection {
+public:
+  CONSTRUCTOR CdbConnections(CdbConnections &Connections);
+  CONSTRUCTOR CdbConnections() { pwrk = NULL; }
+  CdbConnection Item(LONG i);
+  CdbConnection Item(LPCTSTR pstr);
+  CdbConnection operator[](LONG i);
+  CdbConnection operator[](LPCTSTR pstr);
+  CdbConnections &operator = (CdbConnections &o);
+  LONG GetCount(VOID);
+  VOID Refresh(VOID);
+  VOID SetWorkspace(DAOWorkspace *pParent) { pwrk = pParent; }
+private:
+  VOID CheckInterface();
+  DAOWorkspace *pwrk;
+};
+
+class DLLEXPORT CdbObject : public CdbOleObject {
+public:
+  CONSTRUCTOR CdbObject(VOID);
+  CONSTRUCTOR CdbObject(LPUNKNOWN punk,WINBOOL bAddRef=FALSE);
+  virtual CString GetName(VOID);
+  virtual VOID SetName(LPCTSTR pstr);
+  CdbProperties Properties;
+};
+
+class DLLEXPORT CdbGetRowsEx : public CdbObject {
+public:
+  CONSTRUCTOR CdbGetRowsEx(VOID);
+  CONSTRUCTOR CdbGetRowsEx(ICDAORecordset *pGetRows,WINBOOL bAddRef=FALSE);
+  CONSTRUCTOR CdbGetRowsEx(const CdbGetRowsEx &);
+  CdbGetRowsEx &operator =(const CdbGetRowsEx &);
+  VOID OnInterfaceChange(VOID);
+};
+
+#define DAOVINIT(var) do { (var).vt = VT_ERROR; (var).scode = DISP_E_PARAMNOTFOUND; } while (0)
+#define STV(pstr) CdbVariant(pstr)
+#define STB(pstr) V_BSTR(((LPVARIANT)STV(pstr)))
+#define LTV(l) CdbVariant(l)
+#define OLTV(l) CdbVariant((l))
+#define BTB(b) ((VARIANT_BOOL)(b?-1:0))
+#define BTV(b) CdbVariant(BTB(b),TRUE)
+#define SHTV(s) CdbVariant((SHORT)s)
+#define VTV(pv) CdbVariant(pv)
+#define ATV(psa,var) do { if(!psa) { var.vt = VT_ERROR; var.scode = DISP_E_PARAMNOTFOUND; } else { var.vt = VT_ARRAY|VT_UI1; SafeArrayCopy(psa,&var.parray); } } while (0)
+#define DAOMFC_CALL(hr) do { HRESULT hresult = (hr); if(FAILED(hresult)) { TRACE0("\nDBDAO Call Failed.\n\t"); TRACE2("\nIn file %s on line %d\n",_T("DBDAO.CPP"),__LINE__); TRACE1("hResult = %X\n",hresult); if(GetScode(hresult)==E_OUTOFMEMORY) AfxThrowMemoryException(); else throw CdbException(hresult); } } while (0)
+#define LPROPGET(intDAO,meth) do { intDAO *p = (intDAO *)GetInterface(); LONG l = 0; DAOMFC_CALL(p->meth(&l)); return l; } while (0)
+#define LPROPSET(intDAO,meth,l) do { intDAO *p = (intDAO *)GetInterface(); DAOMFC_CALL(p->meth(l)); } while(0)
+#define WPROPGET(intDAO,meth) do { intDAO *p = (intDAO *)GetInterface(); SHORT s = 0; DAOMFC_CALL(p->meth(&s)); return s; } while (0)
+#define WPROPSET(intDAO,meth,s) do { intDAO *p = (intDAO *)GetInterface(); DAOMFC_CALL(p->meth(s)); } while(0)
+#define SPROPGET(intDAO,meth) do { intDAO *p = (intDAO *)GetInterface(); CdbBSTR bstr; DAOMFC_CALL(p->meth(bstr)); return bstr; } while (0)
+#define SPROPSET(intDAO,meth,s) do { intDAO *p = (intDAO *)GetInterface(); DAOMFC_CALL(p->meth(STB(s))); } while(0)
+#define DPROPGET(intDAO,meth) do { intDAO *p = (intDAO *)GetInterface(); VARIANT Var; VariantInit(&Var); DAOMFC_CALL(p->meth(&Var)); return Var; } while (0)
+#define DPROPSET(intDAO,meth,pv) do { intDAO *p = (intDAO *)GetInterface(); DAOMFC_CALL(p->meth(*pv)); } while(0)
+#define BPROPGET(intDAO,meth) do { intDAO *p = (intDAO *)GetInterface(); VARIANT_BOOL vb = 0; DAOMFC_CALL(p->meth(&vb)); return(WINBOOL)vb; } while (0)
+#define BPROPSET(intDAO,meth,b) do { intDAO *p = (intDAO *)GetInterface(); DAOMFC_CALL(p->meth(BTB(b))); } while(0)
+#define VPROPGET(intDAO,meth) do { intDAO *p = (intDAO *)GetInterface(); COleVariant v; VariantInit(&v); DAOMFC_CALL(p->meth(&v)); return &v; } while (0)
+#define VPROPSET(intDAO,meth,pv) do { intDAO *p = (intDAO *)GetInterface(); DAOMFC_CALL(p->meth(*pv)); } while(0)
+#define DWPROPGET(intDAO,meth) do { intDAO *p = (intDAO *)GetInterface(); DWORD dw = 0; DAOMFC_CALL(p->meth(&dw)); return dw; } while (0)
+#define DAOMFC_STATIC_COLLECTION_IMPL(objColl,objSingle,intColl,intSingle) objSingle objColl::Item(LONG i) { return (intSingle *)(ObItem(i).GetInterface(TRUE)); } objSingle objColl::Item(LPCTSTR pstr) { return (intSingle *)(ObItem(pstr).GetInterface(TRUE)); } objSingle objColl::operator[](LONG i) { return (intSingle *)(Item(i).GetInterface(TRUE)); } objSingle objColl::operator[](LPCTSTR pstr) { return (intSingle *)(Item(pstr).GetInterface(TRUE)); }
+#define DAOMFC_DYNAMIC_COLLECTION_IMPL(objColl,objSingle,intColl,intSingle) objSingle objColl::Item(LONG i) { return (intSingle *)(ObItem(i).GetInterface(TRUE)); } objSingle objColl::Item(LPCTSTR pstr) { return (intSingle *)(ObItem(pstr).GetInterface(TRUE)); } VOID objColl::Append(objSingle &o) { ObAppend(o); } objSingle objColl::operator[](LONG i) { return (intSingle *)(Item(i).GetInterface(TRUE)); } objSingle objColl::operator[](LPCTSTR pstr) { return (intSingle *)(Item(pstr).GetInterface(TRUE)); }
+
+DECLARE_INTERFACE_(DAOMFCSCollection,_DAOCollection) {
+  STDMETHOD(get_Item) (VARIANT index,LPUNKNOWN *ppunk);
+};
+
+DECLARE_INTERFACE_(DAOMFCDCollection,_DAODynaCollection) {
+  STDMETHOD(get_Item) (VARIANT index,LPUNKNOWN *ppunk);
+};
+#endif
diff --git a/mingw-w64-headers/include/ieeefp.h b/mingw-w64-headers/include/ieeefp.h
new file mode 100755
index 0000000..831bd1d
--- /dev/null
+++ b/mingw-w64-headers/include/ieeefp.h
@@ -0,0 +1,8 @@
+#ifndef _IEEE_FP_H_
+#define _IEEE_FP_H_
+
+#include "_mingw.h"
+#include "math.h"
+#include "ansidecl.h"
+
+#endif /* _IEEE_FP_H_ */
diff --git a/mingw-w64-headers/include/io.h b/mingw-w64-headers/include/io.h
index fa86127..cb2e371 100755
--- a/mingw-w64-headers/include/io.h
+++ b/mingw-w64-headers/include/io.h
@@ -16,6 +16,7 @@
 extern "C" {
 #endif
 
+_CRTIMP char* __cdecl _getcwd (char*, int);
 #ifndef _FSIZE_T_DEFINED
   typedef unsigned long _fsize_t;
 #define _FSIZE_T_DEFINED
diff --git a/mingw-w64-headers/include/langinfo.h b/mingw-w64-headers/include/langinfo.h
new file mode 100755
index 0000000..de600ba
--- /dev/null
+++ b/mingw-w64-headers/include/langinfo.h
@@ -0,0 +1,8 @@
+#ifndef _LANGINFO_H
+#define _LANGINFO_H
+
+#include <nl_types.h>
+
+char *nl_langinfo(nl_item);
+
+#endif
diff --git a/mingw-w64-headers/include/mspab.h b/mingw-w64-headers/include/mspab.h
new file mode 100755
index 0000000..4a4a9cf
--- /dev/null
+++ b/mingw-w64-headers/include/mspab.h
@@ -0,0 +1,10 @@
+#define PAB_PROVIDER_ID { 0xB5,0x3b,0xc2,0xc0,0x2c,0x77,0x10,0x1a,0xa1,0xbc,0x08,0x00,0x2b,0x2a,0x56,0xc2 }
+
+#define PR_PAB_PATH PROP_TAG(PT_TSTRING,0x6600)
+#define PR_PAB_PATH_W PROP_TAG(PT_UNICODE,0x6600)
+#define PR_PAB_PATH_A PROP_TAG(PT_STRING8,0x6600)
+
+#define PR_PAB_DET_DIR_VIEW_BY PROP_TAG(PT_LONG,0x6601)
+
+#define PAB_DIR_VIEW_FIRST_THEN_LAST 0
+#define PAB_DIR_VIEW_LAST_THEN_FIRST 1
diff --git a/mingw-w64-headers/include/mspaddr.h b/mingw-w64-headers/include/mspaddr.h
new file mode 100755
index 0000000..7e535f2
--- /dev/null
+++ b/mingw-w64-headers/include/mspaddr.h
@@ -0,0 +1,274 @@
+#ifndef __MSPADDR_H_
+#define __MSPADDR_H_
+
+typedef struct {
+  LIST_ENTRY Link;
+  MSP_EVENT_INFO MSPEventInfo;
+} MSPEVENTITEM,*PMSPEVENTITEM;
+
+MSPEVENTITEM *AllocateEventItem(SIZE_T nExtraBytes = 0);
+WINBOOL FreeEventItem(MSPEVENTITEM *pEventItemToFree);
+
+typedef HRESULT (*PFNCREATETERM)(CComPtr<IMoniker> pMoniker,MSP_HANDLE htAddress,ITTerminal **pTerm);
+
+typedef struct {
+  DWORD dwMediaType;
+  const CLSID *clsidClassManager;
+  PFNCREATETERM pfnCreateTerm;
+} STATIC_TERMINAL_TYPE;
+
+class ATL_NO_VTABLE CPlugTerminalClassInfo : public IDispatchImpl<ITPluggableTerminalClassInfo,&IID_ITPluggableTerminalClassInfo,&LIBID_TAPI3Lib>,public CComObjectRootEx<CComMultiThreadModel>,public CMSPObjectSafetyImpl
+{
+public:
+  DECLARE_GET_CONTROLLING_UNKNOWN()
+  virtual HRESULT FinalConstruct(void);
+  BEGIN_COM_MAP(CPlugTerminalClassInfo)
+    COM_INTERFACE_ENTRY(ITPluggableTerminalClassInfo)
+    COM_INTERFACE_ENTRY(IDispatch)
+    COM_INTERFACE_ENTRY(IObjectSafety)
+    COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal,m_pFTM)
+  END_COM_MAP()
+public:
+  CPlugTerminalClassInfo() : m_bstrName(NULL),m_bstrCompany(NULL),m_bstrVersion(NULL),m_bstrCLSID(NULL),m_bstrTerminalClass(NULL),m_lMediaType(1),m_Direction(TD_CAPTURE),m_pFTM(NULL)
+  {
+  }
+  ~CPlugTerminalClassInfo() {
+    if(m_bstrName) {
+      SysFreeString(m_bstrName);
+    }
+    if(m_bstrCompany) {
+      SysFreeString(m_bstrCompany);
+    }
+    if(m_bstrVersion) {
+      SysFreeString(m_bstrVersion);
+    }
+    if(m_bstrCLSID) {
+      SysFreeString(m_bstrCLSID);
+    }
+    if(m_bstrTerminalClass) {
+      SysFreeString(m_bstrTerminalClass);
+    }
+    if(m_pFTM) {
+      m_pFTM->Release();
+    }
+  }
+public:
+  STDMETHOD(get_Name)(BSTR *pName);
+  STDMETHOD(get_Company)(BSTR *pCompany);
+  STDMETHOD(get_Version)(BSTR *pVersion);
+  STDMETHOD(get_TerminalClass)(BSTR *pTerminalClass);
+  STDMETHOD(get_CLSID)(BSTR *pCLSID);
+  STDMETHOD(get_Direction)(TERMINAL_DIRECTION *pDirection);
+  STDMETHOD(get_MediaTypes)(long *pMediaTypes);
+private:
+  CMSPCritSection m_CritSect;
+  BSTR m_bstrName;
+  BSTR m_bstrCompany;
+  BSTR m_bstrVersion;
+  BSTR m_bstrTerminalClass;
+  BSTR m_bstrCLSID;
+  long m_lMediaType;
+  TERMINAL_DIRECTION m_Direction;
+  IUnknown *m_pFTM;
+private:
+  STDMETHOD(put_Name)(BSTR bstrName);
+  STDMETHOD(put_Company)(BSTR bstrCompany);
+  STDMETHOD(put_Version)(BSTR bstrVersion);
+  STDMETHOD(put_TerminalClass)(BSTR bstrTerminalClass);
+  STDMETHOD(put_CLSID)(BSTR bstrCLSID);
+  STDMETHOD(put_Direction)(TERMINAL_DIRECTION nDirection);
+  STDMETHOD(put_MediaTypes)(long nMediaTypes);
+  friend class CMSPAddress;
+};
+
+class ATL_NO_VTABLE CPlugTerminalSuperclassInfo : public IDispatchImpl<ITPluggableTerminalSuperclassInfo,&IID_ITPluggableTerminalSuperclassInfo,&LIBID_TAPI3Lib>,public CComObjectRootEx<CComMultiThreadModel>,public CMSPObjectSafetyImpl
+{
+public:
+  DECLARE_GET_CONTROLLING_UNKNOWN()
+  virtual HRESULT FinalConstruct(void);
+  BEGIN_COM_MAP(CPlugTerminalSuperclassInfo)
+    COM_INTERFACE_ENTRY(ITPluggableTerminalSuperclassInfo)
+    COM_INTERFACE_ENTRY(IDispatch)
+    COM_INTERFACE_ENTRY(IObjectSafety)
+    COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal,m_pFTM)
+  END_COM_MAP()
+public:
+  CPlugTerminalSuperclassInfo() : m_bstrCLSID(NULL),m_bstrName(NULL),m_pFTM(NULL) {
+  }
+  ~CPlugTerminalSuperclassInfo() {
+    if(m_bstrName) {
+      SysFreeString(m_bstrName);
+    }
+    if(m_bstrCLSID) {
+      SysFreeString(m_bstrCLSID);
+    }
+    if(m_pFTM) {
+      m_pFTM->Release();
+    }
+  }
+public:
+  STDMETHOD(get_Name)(BSTR *pName);
+  STDMETHOD(get_CLSID)(BSTR *pCLSID);
+private:
+  CMSPCritSection m_CritSect;
+  BSTR m_bstrCLSID;
+  BSTR m_bstrName;
+  IUnknown *m_pFTM;
+private:
+  STDMETHOD(put_Name)(BSTR bstrName);
+  STDMETHOD(put_CLSID)(BSTR bstrCLSID);
+  friend class CMSPAddress;
+};
+
+class ATL_NO_VTABLE CMSPAddress : public CComObjectRootEx<CComMultiThreadModelNoCS>,public ITMSPAddress,public IDispatchImpl<ITTerminalSupport2,&IID_ITTerminalSupport2,&LIBID_TAPI3Lib>
+{
+public:
+  BEGIN_COM_MAP(CMSPAddress)
+    COM_INTERFACE_ENTRY(ITMSPAddress)
+    COM_INTERFACE_ENTRY(IDispatch)
+    COM_INTERFACE_ENTRY(ITTerminalSupport)
+    COM_INTERFACE_ENTRY(ITTerminalSupport2)
+  END_COM_MAP()
+  DECLARE_GET_CONTROLLING_UNKNOWN()
+  DECLARE_VQI()
+  CMSPAddress();
+  virtual ~CMSPAddress();
+  virtual ULONG MSPAddressAddRef(void) = 0;
+  virtual ULONG MSPAddressRelease(void) = 0;
+  STDMETHOD (Initialize) (MSP_HANDLE htEvent);
+  STDMETHOD (Shutdown) ();
+  STDMETHOD (CreateMSPCall) (MSP_HANDLE htCall,DWORD dwReserved,DWORD dwMediaType,IUnknown *pOuterUnknown,IUnknown **ppMSPCall) = 0;
+  STDMETHOD (ShutdownMSPCall) (IUnknown *pMSPCall) = 0;
+  STDMETHOD (ReceiveTSPData) (IUnknown *pMSPCall,LPBYTE pBuffer,DWORD dwBufferSize);
+  STDMETHOD (GetEvent) (DWORD *pdwSize,BYTE *pBuffer);
+  STDMETHOD (get_StaticTerminals) (VARIANT *pVariant);
+  STDMETHOD (EnumerateStaticTerminals) (IEnumTerminal **ppTerminalEnumerator);
+  STDMETHOD (get_DynamicTerminalClasses) (VARIANT *pVariant);
+  STDMETHOD (EnumerateDynamicTerminalClasses) (IEnumTerminalClass **ppTerminalClassEnumerator);
+  STDMETHOD (CreateTerminal) (BSTR pTerminalClass,long lMediaType,TERMINAL_DIRECTION Direction,ITTerminal **ppTerminal);
+  STDMETHOD (GetDefaultStaticTerminal) (long lMediaType,TERMINAL_DIRECTION Direction,ITTerminal **ppTerminal);
+  STDMETHOD (get_PluggableSuperclasses)(VARIANT *pVariant);
+  STDMETHOD (EnumeratePluggableSuperclasses)(IEnumPluggableSuperclassInfo **ppSuperclassEnumerator);
+  STDMETHOD (get_PluggableTerminalClasses)(BSTR bstrTerminalSuperclass,long lMediaType,VARIANT *pVariant);
+  STDMETHOD (EnumeratePluggableTerminalClasses)(CLSID iidTerminalSuperclass,long lMediaType,IEnumPluggableTerminalClassInfo **ppClassEnumerator);
+protected:
+  virtual HRESULT GetStaticTerminals (DWORD *pdwNumTerminals,ITTerminal **ppTerminals);
+  virtual HRESULT GetDynamicTerminalClasses (DWORD *pdwNumClasses,IID *pTerminalClasses);
+public:
+  virtual WINBOOL IsValidSetOfMediaTypes(DWORD dwMediaType,DWORD dwMask);
+  virtual HRESULT PostEvent(MSPEVENTITEM *EventItem);
+  virtual DWORD GetCallMediaTypes(void) = 0;
+protected:
+  virtual HRESULT IsMonikerInTerminalList(IMoniker *pMoniker);
+  virtual HRESULT UpdateTerminalListForPnp(WINBOOL bDeviceArrival);
+  virtual HRESULT UpdateTerminalList(void);
+  virtual HRESULT ReceiveTSPAddressData(PBYTE pBuffer,DWORD dwSize);
+public:
+  virtual HRESULT PnpNotifHandler(WINBOOL bDeviceArrival);
+protected:
+  HANDLE m_htEvent;
+  LIST_ENTRY m_EventList;
+  CMSPCritSection m_EventDataLock;
+  ITTerminalManager *m_pITTerminalManager;
+  CMSPArray <ITTerminal *> m_Terminals;
+  WINBOOL m_fTerminalsUpToDate;
+  CMSPCritSection m_TerminalDataLock;
+private:
+  static const STATIC_TERMINAL_TYPE m_saTerminalTypes[];
+  static const DWORD m_sdwTerminalTypesCount;
+};
+
+template <class T> HRESULT CreateMSPCallHelper(CMSPAddress *pCMSPAddress,MSP_HANDLE htCall,DWORD dwReserved,DWORD dwMediaType,IUnknown *pOuterUnknown,IUnknown **ppMSPCall,T **ppCMSPCall)
+{
+  LOG((MSP_TRACE,"CreateMSPCallHelper - enter"));
+  HRESULT hr;
+  T *pMSPCall;
+  IUnknown *pUnknown = NULL;
+  if(IsBadReadPtr(pCMSPAddress,sizeof(CMSPAddress))) {
+    LOG((MSP_ERROR,"CreateMSPCallHelper - bad address pointer - exit E_POINTER"));
+    return E_POINTER;
+  }
+  if(IsBadReadPtr(pOuterUnknown,sizeof(IUnknown))) {
+    LOG((MSP_ERROR,"CreateMSPCallHelper - bad outer unknown - we require aggregation - exit E_POINTER"));
+    return E_POINTER;
+  }
+  if(IsBadReadPtr(ppMSPCall,sizeof(IUnknown *))) {
+    LOG((MSP_ERROR,"CreateMSPCallHelper - bad iunknown return ptr - exit E_POINTER"));
+    return E_POINTER;
+  }
+  if(IsBadReadPtr(ppCMSPCall,sizeof(T *))) {
+    LOG((MSP_ERROR,"CreateMSPCallHelper - bad class return ptr - exit E_POINTER"));
+    return E_POINTER;
+  }
+  if(! pCMSPAddress->IsValidSetOfMediaTypes(dwMediaType,pCMSPAddress->GetCallMediaTypes())) {
+    LOG((MSP_ERROR,"CreateMSPCallHelper - unsupported media types - exit TAPI_E_INVALIDMEDIATYPE"));
+    return TAPI_E_INVALIDMEDIATYPE;
+  }
+  CComAggObject<T> *pCall;
+  pCall = new CComAggObject<T>(pOuterUnknown);
+  if(!pCall) {
+    LOG((MSP_ERROR,"CreateMSPCallHelper - could not create agg call instance - exit E_OUTOFMEMORY"));
+    return E_OUTOFMEMORY;
+  }
+  hr = pCall->QueryInterface(IID_IUnknown,(void **)&pUnknown);
+  if(FAILED(hr)) {
+    LOG((MSP_ERROR,"CreateMSPCallHelper - QueryInterface failed: %x",hr));
+    delete pCall;
+    return hr;
+  }
+  hr = pCall->FinalConstruct();
+  if(FAILED(hr)) {
+    LOG((MSP_ERROR,"CreateMSPCallHelper - FinalConstruct failed: %x.",hr));
+    pUnknown->Release();
+    return hr;
+  }
+  pMSPCall = dynamic_cast<T *>(&(pCall->m_contained));
+  if(!pMSPCall) {
+    LOG((MSP_ERROR,"CreateMSPCallHelper - can not cast to agg object to class pointer - exit E_UNEXPECTED"));
+    pUnknown->Release();
+    return E_UNEXPECTED;
+  }
+  hr = pMSPCall->Init(pCMSPAddress,htCall,dwReserved,dwMediaType);
+  if(FAILED(hr)) {
+    LOG((MSP_ERROR,"CreateMSPCallHelper - call init failed: %x",hr));
+    pUnknown->Release();
+    return hr;
+  }
+  *ppMSPCall = pUnknown;
+  *ppCMSPCall = pMSPCall;
+  LOG((MSP_TRACE,"CreateMSPCallHelper - exit S_OK"));
+  return hr;
+}
+
+template <class T> HRESULT ShutdownMSPCallHelper(IUnknown *pUnknown,T **ppCMSPCall)
+{
+  LOG((MSP_TRACE,"ShutdownMSPCallHelper - enter"));
+  if(IsBadReadPtr(pUnknown,sizeof(IUnknown))) {
+    LOG((MSP_ERROR,"ShutdownMSPCallHelper - bad IUnknown pointer - exit E_POINTER"));
+    return E_POINTER;
+  }
+  if(IsBadWritePtr(ppCMSPCall,sizeof(T *))) {
+    LOG((MSP_ERROR,"ShutdownMSPCallHelper - bad return pointer - exit E_POINTER"));
+    return E_POINTER;
+  }
+  T *pMSPCall;
+  CComAggObject<T> *pCall = dynamic_cast<CComAggObject<T> *> (pUnknown);
+  if(!pCall) {
+    LOG((MSP_ERROR,"ShutdownMSPCallHelper - can't cast unknown to agg object pointer - exit E_UNEXPECTED"));
+    return E_UNEXPECTED;
+  }
+  pMSPCall = dynamic_cast<T *> (&(pCall->m_contained));
+  if(!pMSPCall) {
+    LOG((MSP_ERROR,"ShutdownMSPCallHelper - can't cast contained unknown to class pointer - exit E_UNEXPECTED"));
+    return E_UNEXPECTED;
+  }
+  HRESULT hr = pMSPCall->ShutDown();
+  if(FAILED(hr)) {
+    LOG((MSP_ERROR,"ShutdownMSPCallHelper - ShutDownMSPCall failed: %x",hr));
+    return hr;
+  }
+  *ppCMSPCall = pMSPCall;
+  LOG((MSP_TRACE,"ShutdownMSPCallHelper - exit S_OK"));
+  return S_OK;
+}
+#endif
diff --git a/mingw-w64-headers/include/mspbase.h b/mingw-w64-headers/include/mspbase.h
new file mode 100755
index 0000000..4d6b9bd
--- /dev/null
+++ b/mingw-w64-headers/include/mspbase.h
@@ -0,0 +1,39 @@
+#ifndef __MSPBASE_H_
+#define __MSPBASE_H_
+
+#define _ATL_FREE_THREADED
+
+#include <atlbase.h>
+
+extern CComModule _Module;
+
+#include <atlcom.h>
+#include <tapi.h>
+
+#include <strmif.h>
+#include <control.h>
+#include <uuids.h>
+
+#include <termmgr.h>
+
+#include <msp.h>
+#include <tapi3err.h>
+#include <tapi3if.h>
+
+EXTERN_C const IID LIBID_TAPI3Lib;
+
+#include "mspenum.h"
+#include "msplog.h"
+#include "msputils.h"
+#include "mspaddr.h"
+#include "mspcall.h"
+#include "mspstrm.h"
+#include "mspthrd.h"
+#include "mspcoll.h"
+
+#include "mspterm.h"
+#include "msptrmac.h"
+#include "msptrmar.h"
+#include "msptrmvc.h"
+
+#endif
diff --git a/mingw-w64-headers/include/mspcall.h b/mingw-w64-headers/include/mspcall.h
new file mode 100755
index 0000000..145679c
--- /dev/null
+++ b/mingw-w64-headers/include/mspcall.h
@@ -0,0 +1,76 @@
+#ifndef __MSPCALL_H_
+#define __MSPCALL_H_
+
+class ATL_NO_VTABLE CMSPCallBase : public CComObjectRootEx<CComMultiThreadModelNoCS>,public IDispatchImpl<ITStreamControl,&IID_ITStreamControl,&LIBID_TAPI3Lib> {
+public:
+  DECLARE_POLY_AGGREGATABLE(CMSPCallBase)
+  BEGIN_COM_MAP(CMSPCallBase)
+    COM_INTERFACE_ENTRY(IDispatch)
+    COM_INTERFACE_ENTRY(ITStreamControl)
+  END_COM_MAP()
+  DECLARE_GET_CONTROLLING_UNKNOWN()
+  DECLARE_VQI()
+  CMSPCallBase();
+  virtual ~CMSPCallBase();
+  virtual ULONG MSPCallAddRef (void) = 0;
+  virtual ULONG MSPCallRelease (void) = 0;
+  STDMETHOD (CreateStream) (long lMediaType,TERMINAL_DIRECTION Direction,ITStream **ppStream);
+  STDMETHOD (EnumerateStreams) (IEnumStream **ppEnumStream);
+  STDMETHOD (RemoveStream) (ITStream *pStream) = 0;
+  STDMETHOD (get_Streams) (VARIANT *pStreams);
+  virtual HRESULT Init(CMSPAddress *pMSPAddress,MSP_HANDLE htCall,DWORD dwReserved,DWORD dwMediaType) = 0;
+  virtual HRESULT ShutDown() = 0;
+  virtual HRESULT ReceiveTSPCallData(PBYTE pBuffer,DWORD dwSize);
+  HRESULT HandleStreamEvent(MSPEVENTITEM *EventItem) const;
+protected:
+  virtual HRESULT InternalCreateStream(DWORD dwMediaType,TERMINAL_DIRECTION Direction,ITStream **ppStream) = 0;
+  virtual HRESULT CreateStreamObject(DWORD dwMediaType,TERMINAL_DIRECTION Direction,IMediaEvent *pGraph,ITStream **ppStream) = 0;
+protected:
+  CMSPAddress *m_pMSPAddress;
+  MSP_HANDLE m_htCall;
+  DWORD m_dwMediaType;
+  CMSPArray <ITStream *> m_Streams;
+  CMSPCritSection m_lock;
+};
+
+class ATL_NO_VTABLE CMSPCallMultiGraph : public CMSPCallBase {
+public:
+  typedef struct {
+    CMSPCallMultiGraph *pMSPCall;
+    ITStream *pITStream;
+    IMediaEvent *pIMediaEvent;
+  } MSPSTREAMCONTEXT,*PMSPSTREAMCONTEXT;
+  typedef struct _THREADPOOLWAITBLOCK {
+    HANDLE hWaitHandle;
+    MSPSTREAMCONTEXT *pContext;
+    WINBOOL operator ==(struct _THREADPOOLWAITBLOCK &t) { return ((hWaitHandle==t.hWaitHandle) && (pContext==t.pContext)); }
+  } THREADPOOLWAITBLOCK,*PTHREADPOOLWAITBLOCK;
+public:
+  CMSPCallMultiGraph();
+  virtual ~CMSPCallMultiGraph();
+  STDMETHOD (RemoveStream) (ITStream *ppStream);
+  HRESULT Init(CMSPAddress *pMSPAddress,MSP_HANDLE htCall,DWORD dwReserved,DWORD dwMediaType);
+  HRESULT ShutDown();
+  static VOID NTAPI DispatchGraphEvent(VOID *pContext,BOOLEAN bFlag);
+  virtual VOID HandleGraphEvent(MSPSTREAMCONTEXT *pContext);
+  virtual HRESULT ProcessGraphEvent(ITStream *pITStream,long lEventCode,LONG_PTR lParam1,LONG_PTR lParam2);
+protected:
+  HRESULT RegisterWaitEvent(IMediaEvent *pIMediaEvent,ITStream *pITStream);
+  HRESULT UnregisterWaitEvent(int index);
+  virtual HRESULT InternalCreateStream(DWORD dwMediaType,TERMINAL_DIRECTION Direction,ITStream **ppStream);
+protected:
+  CMSPArray <THREADPOOLWAITBLOCK> m_ThreadPoolWaitBlocks;
+};
+
+struct MULTI_GRAPH_EVENT_DATA {
+  CMSPCallMultiGraph *pCall;
+  ITStream *pITStream;
+  long lEventCode;
+  LONG_PTR lParam1;
+  LONG_PTR lParam2;
+  IMediaEvent *pIMediaEvent;
+  MULTI_GRAPH_EVENT_DATA() : pIMediaEvent(NULL),pITStream(NULL),lEventCode(0),lParam1(0),lParam2(0) { }
+};
+
+DWORD WINAPI AsyncMultiGraphEvent(LPVOID pVoid);
+#endif
diff --git a/mingw-w64-headers/include/mspcoll.h b/mingw-w64-headers/include/mspcoll.h
new file mode 100755
index 0000000..6bf186e
--- /dev/null
+++ b/mingw-w64-headers/include/mspcoll.h
@@ -0,0 +1,177 @@
+#ifndef _MSPCOLL_H_
+#define _MSPCOLL_H_
+
+template <class T> class CTapiIfCollection : public IDispatchImpl<ITCollection,&IID_ITCollection,&LIBID_TAPI3Lib>,public CComObjectRootEx<CComMultiThreadModelNoCS>
+{
+public:
+  typedef CTapiIfCollection<T> _CTapiCollectionBase;
+  BEGIN_COM_MAP(_CTapiCollectionBase)
+    COM_INTERFACE_ENTRY(IDispatch)
+    COM_INTERFACE_ENTRY(ITCollection)
+  END_COM_MAP()
+private:
+  int m_nSize;
+  CComVariant *m_Var;
+
+public:
+  CTapiIfCollection(void) : m_nSize(0),m_Var(NULL) { }
+  HRESULT WINAPI Initialize(DWORD dwSize,T *pBegin,T *pEnd) {
+    int i;
+    HRESULT hr;
+    T *iter;
+    LOG((MSP_TRACE,"CTapiCollection::Initialize - enter"));
+    m_nSize = dwSize;
+    m_Var = new CComVariant[m_nSize];
+    if(!m_Var) return E_OUTOFMEMORY;
+    i = 0;
+    for(iter = pBegin;iter!=pEnd;iter++) {
+      IDispatch *pDisp = NULL;
+      hr = (*iter)->QueryInterface(IID_IDispatch,(void**)&pDisp);
+      if(hr!=S_OK) return hr;
+      CComVariant& var = m_Var[i];
+      VariantInit(&var);
+      var.vt = VT_DISPATCH;
+      var.pdispVal = pDisp;
+      i++;
+    }
+    LOG((MSP_TRACE,"CTapiCollection::Initialize - exit"));
+    return S_OK;
+  }
+  void FinalRelease() {
+    LOG((MSP_TRACE,"CTapiCollection::FinalRelease - enter"));
+    delete [] m_Var;
+    LOG((MSP_TRACE,"CTapiCollection::FinalRelease - exit"));
+  }
+  STDMETHOD(get_Count)(long *retval) {
+    HRESULT hr = S_OK;
+    LOG((MSP_TRACE,"CTapiCollection::get_Count - enter"));
+    try {
+      *retval = m_nSize;
+    } catch(...) {
+      hr = E_INVALIDARG;
+    }
+    LOG((MSP_TRACE,"CTapiCollection::get_Count - exit"));
+    return hr;
+  }
+  STDMETHOD(get_Item)(long Index,VARIANT *retval) {
+    HRESULT hr = S_OK;
+    LOG((MSP_TRACE,"CTapiCollection::get_Item - enter"));
+    if(!retval) return E_POINTER;
+    try {
+      VariantInit(retval);
+    } catch(...) {
+      hr = E_INVALIDARG;
+    }
+    if(hr!=S_OK) return hr;
+    retval->vt = VT_UNKNOWN;
+    retval->punkVal = NULL;
+    if((Index < 1) || (Index > m_nSize)) return E_INVALIDARG;
+    hr = VariantCopy(retval,&m_Var[Index-1]);
+    if(FAILED(hr)) {
+      LOG((MSP_ERROR,"CTapiCollection::get_Item - VariantCopy failed. hr = %lx",hr));
+      return hr;
+    }
+    LOG((MSP_TRACE,"CTapiCollection::get_Item - exit"));
+    return S_OK;
+  }
+  HRESULT WINAPI get__NewEnum(IUnknown **retval) {
+    HRESULT hr;
+    LOG((MSP_TRACE,"CTapiCollection::new__Enum - enter"));
+    if(!retval) return E_POINTER;
+    *retval = NULL;
+    typedef CComObject<CSafeComEnum<IEnumVARIANT,&IID_IEnumVARIANT,VARIANT,_Copy<VARIANT> > > enumvar;
+    enumvar *p;
+    hr = enumvar::CreateInstance(&p);
+    if(FAILED(hr)) return hr;
+    hr = p->Init(&m_Var[0],&m_Var[m_nSize],NULL,AtlFlagCopy);
+    if(SUCCEEDED(hr)) hr = p->QueryInterface(IID_IEnumVARIANT,(void**)retval);
+    if(FAILED(hr)) delete p;
+    LOG((MSP_TRACE,"CTapiCollection::new__Enum - exit"));
+    return hr;
+  }
+};
+
+class CTapiBstrCollection : public CComObjectRootEx<CComMultiThreadModelNoCS>,public IDispatchImpl<ITCollection,&IID_ITCollection,&LIBID_TAPI3Lib>,public CMSPObjectSafetyImpl
+{
+public:
+  BEGIN_COM_MAP(CTapiBstrCollection)
+    COM_INTERFACE_ENTRY(IDispatch)
+    COM_INTERFACE_ENTRY(ITCollection)
+    COM_INTERFACE_ENTRY(IObjectSafety)
+  END_COM_MAP()
+private:
+  DWORD m_dwSize;
+  CComVariant *m_Var;
+public:
+  CTapiBstrCollection(void) : m_dwSize(0),m_Var(NULL) { }
+  HRESULT WINAPI Initialize(DWORD dwSize,BSTR *pBegin,BSTR *pEnd) {
+    BSTR *i;
+    DWORD dw = 0;
+    LOG((MSP_TRACE,"CTapiBstrCollection::Initialize - enter"));
+    m_dwSize = dwSize;
+    m_Var = new CComVariant[m_dwSize];
+    if(!m_Var) return E_OUTOFMEMORY;
+    for(i = pBegin;i!=pEnd;i++) {
+      CComVariant& var = m_Var[dw];
+      var.vt = VT_BSTR;
+      var.bstrVal = *i;
+      dw++;
+    }
+    LOG((MSP_TRACE,"CTapiBstrCollection::Initialize - exit"));
+    return S_OK;
+  }
+  STDMETHOD(get_Count)(long *retval) {
+    HRESULT hr = S_OK;
+    LOG((MSP_TRACE,"CTapiBstrCollection::get_Count - enter"));
+    try {
+      *retval = m_dwSize;
+    } catch(...) {
+      hr = E_INVALIDARG;
+    }
+    LOG((MSP_TRACE,"CTapiBstrCollection::get_Count - exit"));
+    return hr;
+  }
+  STDMETHOD(get_Item)(long Index,VARIANT *retval) {
+    HRESULT hr = S_OK;
+    LOG((MSP_TRACE,"CTapiBstrCollection::get_Item - enter"));
+    if(!retval) return E_POINTER;
+    try {
+      VariantInit(retval);
+    } catch(...) {
+      hr = E_INVALIDARG;
+    }
+    if(hr!=S_OK) return hr;
+    retval->vt = VT_BSTR;
+    retval->bstrVal = NULL;
+    if((Index < 1) || ((DWORD) Index > m_dwSize)) return E_INVALIDARG;
+    hr = VariantCopy(retval,&m_Var[Index-1]);
+    if(FAILED(hr)) {
+      LOG((MSP_ERROR,"CTapiBstrCollection::get_Item - VariantCopy failed. hr = %lx",hr));
+      return hr;
+    }
+    LOG((MSP_TRACE,"CTapiBstrCollection::get_Item - exit"));
+    return S_OK;
+  }
+  HRESULT WINAPI get__NewEnum(IUnknown **retval) {
+    HRESULT hr;
+    LOG((MSP_TRACE,"CTapiBstrCollection::get__NumEnum - enter"));
+    if(!retval) return E_POINTER;
+    *retval = NULL;
+    typedef CComObject<CSafeComEnum<IEnumVARIANT,&IID_IEnumVARIANT,VARIANT,_Copy<VARIANT> > > enumvar;
+    enumvar *p = new enumvar;
+    if(!p) return E_OUTOFMEMORY;
+    hr = p->Init(&m_Var[0],&m_Var[m_dwSize],NULL,AtlFlagCopy);
+    if(SUCCEEDED(hr)) {
+      hr = p->QueryInterface(IID_IEnumVARIANT,(void**)retval);
+    }
+    if(FAILED(hr)) delete p;
+    LOG((MSP_TRACE,"CTapiBstrCollection::get__NewEnum - exit"));
+    return hr;
+  }
+  void FinalRelease() {
+    LOG((MSP_TRACE,"CTapiBstrCollection::FinalRelease() - enter"));
+    delete [] m_Var;
+    LOG((MSP_TRACE,"CTapiBstrCollection::FinalRelease() - exit"));
+  }
+};
+#endif
diff --git a/mingw-w64-headers/include/mspenum.h b/mingw-w64-headers/include/mspenum.h
new file mode 100755
index 0000000..01cc9ec
--- /dev/null
+++ b/mingw-w64-headers/include/mspenum.h
@@ -0,0 +1,40 @@
+#ifndef _MSPENUM_H_
+#define _MSPENUM_H_
+
+template <class Base,const IID *piid,class T,class Copy,class ThreadModel = CComObjectThreadModel>
+class ATL_NO_VTABLE CSafeComEnum : public CComEnumImpl<Base,piid,T,Copy>,public CComObjectRootEx< ThreadModel >
+{
+  typedef CSafeComEnum<Base,piid,T,Copy,ThreadModel> ThisClass;
+  typedef CComEnumImpl<Base,piid,T,Copy> BaseClass;
+  STDMETHOD(Next)(ULONG celt,T *rgelt,ULONG *pceltFetched) {
+    if(IsBadWritePtr(rgelt,celt *sizeof(T))) return E_POINTER;
+    if((pceltFetched!=NULL) && IsBadWritePtr(pceltFetched,sizeof(ULONG))) return E_POINTER;
+    return BaseClass::Next(celt,rgelt,pceltFetched);
+  }
+  STDMETHOD(Clone)(Base **ppEnum) {
+    if(IsBadWritePtr(ppEnum,sizeof(Base *))) return E_POINTER;
+    return BaseClass::Clone(ppEnum);
+  }
+  BEGIN_COM_MAP(ThisClass)
+    COM_INTERFACE_ENTRY_IID(*piid,BaseClass)
+    COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal,m_pFTM)
+  END_COM_MAP()
+  DECLARE_GET_CONTROLLING_UNKNOWN()
+  HRESULT Init(T *begin,T *end,IUnknown *pUnk,CComEnumFlags flags = AtlFlagNoCopy) {
+    HRESULT hr;
+    IUnknown *pIU = GetControllingUnknown();
+    hr = CoCreateFreeThreadedMarshaler(pIU,& m_pFTM);
+    if(FAILED(hr)) return hr;
+    return BaseClass::Init(begin,end,pUnk,flags);
+  }
+  CSafeComEnum() { m_pFTM = NULL; }
+  void FinalRelease(void) {
+    if(m_pFTM) {
+      m_pFTM->Release();
+    }
+    CComObjectRootEx< ThreadModel >::FinalRelease();
+  }
+protected:
+  IUnknown *m_pFTM;
+};
+#endif
diff --git a/mingw-w64-headers/include/msplog.h b/mingw-w64-headers/include/msplog.h
new file mode 100755
index 0000000..57efb7f
--- /dev/null
+++ b/mingw-w64-headers/include/msplog.h
@@ -0,0 +1,32 @@
+#ifndef _MSPLOG_H_
+#define _MSPLOG_H_
+
+#ifdef MSPLOG
+
+#include <rtutils.h>
+
+#define MSP_ERROR ((DWORD)0x00010000 | TRACE_USE_MASK)
+#define MSP_WARN ((DWORD)0x00020000 | TRACE_USE_MASK)
+#define MSP_INFO ((DWORD)0x00040000 | TRACE_USE_MASK)
+#define MSP_TRACE ((DWORD)0x00080000 | TRACE_USE_MASK)
+#define MSP_EVENT ((DWORD)0x00100000 | TRACE_USE_MASK)
+
+WINBOOL NTAPI MSPLogRegister(LPCTSTR szName);
+void NTAPI MSPLogDeRegister();
+void NTAPI LogPrint(DWORD dwDbgLevel,LPCSTR DbgMessage,...);
+
+#define MSPLOGREGISTER(arg) MSPLogRegister(arg)
+#define MSPLOGDEREGISTER() MSPLogDeRegister()
+
+extern WINBOOL g_bMSPBaseTracingOn;
+
+#define LOG(arg) g_bMSPBaseTracingOn?LogPrint arg:0
+#else
+#define MSPLOGREGISTER(arg)
+#define MSPLOGDEREGISTER()
+#define LOG(arg)
+#endif
+
+#define DECLARE_LOG_ADDREF_RELEASE(x)
+#define CMSPComObject CComObject
+#endif
diff --git a/mingw-w64-headers/include/mspst.h b/mingw-w64-headers/include/mspst.h
new file mode 100755
index 0000000..bd3de48
--- /dev/null
+++ b/mingw-w64-headers/include/mspst.h
@@ -0,0 +1,17 @@
+#ifndef _MSPST_H_
+#define _MSPST_H_
+
+#define PST_EXTERN_PROPID_BASE (0x6700)
+#define PR_PST_PATH PROP_TAG(PT_STRING8,PST_EXTERN_PROPID_BASE + 0)
+#define PR_PST_REMEMBER_PW PROP_TAG(PT_BOOLEAN,PST_EXTERN_PROPID_BASE + 1)
+#define PR_PST_ENCRYPTION PROP_TAG(PT_LONG,PST_EXTERN_PROPID_BASE + 2)
+#define PR_PST_PW_SZ_OLD PROP_TAG(PT_STRING8,PST_EXTERN_PROPID_BASE + 3)
+#define PR_PST_PW_SZ_NEW PROP_TAG(PT_STRING8,PST_EXTERN_PROPID_BASE + 4)
+
+#define PSTF_NO_ENCRYPTION ((DWORD)0x80000000)
+#define PSTF_COMPRESSABLE_ENCRYPTION ((DWORD)0x40000000)
+#define PSTF_BEST_ENCRYPTION ((DWORD)0x20000000)
+
+#define MSPST_UID_PROVIDER { 0x4e,0x49,0x54,0x41,0xf9,0xbf,0xb8,0x01,0x00,0xaa,0x00,0x37,0xd9,0x6e,0x00,0x00 }
+
+#endif
diff --git a/mingw-w64-headers/include/mspstrm.h b/mingw-w64-headers/include/mspstrm.h
new file mode 100755
index 0000000..a0098b5
--- /dev/null
+++ b/mingw-w64-headers/include/mspstrm.h
@@ -0,0 +1,93 @@
+#ifndef _MSPSTRM_H_
+#define _MSPSTRM_H_
+
+#define STRM_INITIAL 0x00000000
+#define STRM_TERMINALSELECTED 0x00000001
+#define STRM_CONFIGURED 0x00000002
+#define STRM_RUNNING 0x00000004
+#define STRM_PAUSED 0x00000008
+#define STRM_STOPPED 0x00000010
+
+class CMSPStream;
+
+class ATL_NO_VTABLE CPTEventSink : public CComObjectRootEx<CComMultiThreadModel>,public ITPluggableTerminalEventSink {
+public:
+  CPTEventSink();
+  ~CPTEventSink();
+  BEGIN_COM_MAP(CPTEventSink)
+    COM_INTERFACE_ENTRY(ITPluggableTerminalEventSink)
+  END_COM_MAP()
+public:
+  STDMETHOD(FireEvent)(const MSP_EVENT_INFO *pMspEventInfo);
+public:
+  HRESULT SetSinkStream(CMSPStream *pStream);
+private:
+  struct AsyncEventStruct {
+    CMSPStream *pMSPStream;
+    MSPEVENTITEM *pEventItem;
+    AsyncEventStruct() : pMSPStream(NULL),pEventItem(NULL) {
+      LOG((MSP_TRACE,"AsyncEventStruct::AsyncEventStruct[%p]",this));
+    }
+    ~AsyncEventStruct() {
+      pMSPStream = NULL;
+      pEventItem = NULL;
+      LOG((MSP_TRACE,"AsyncEventStruct::~AsyncEventStruct[%p]",this));
+    }
+  };
+  static DWORD WINAPI FireEventCallBack(LPVOID pEventStructure);
+private:
+  CMSPStream *m_pMSPStream;
+};
+
+class ATL_NO_VTABLE CMSPStream : public CComObjectRootEx<CComMultiThreadModelNoCS>,public IDispatchImpl<ITStream,&IID_ITStream,&LIBID_TAPI3Lib> {
+public:
+  BEGIN_COM_MAP(CMSPStream)
+    COM_INTERFACE_ENTRY(IDispatch)
+    COM_INTERFACE_ENTRY(ITStream)
+    COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal,m_pFTM)
+  END_COM_MAP()
+  DECLARE_GET_CONTROLLING_UNKNOWN()
+  CMSPStream();
+  ~CMSPStream();
+  virtual void FinalRelease();
+  STDMETHOD (get_MediaType) (long *plMediaType);
+  STDMETHOD (get_Direction) (TERMINAL_DIRECTION *pTerminalDirection);
+  STDMETHOD (get_Name) (BSTR *ppName) = 0;
+  STDMETHOD (SelectTerminal) (ITTerminal *pTerminal);
+  STDMETHOD (UnselectTerminal) (ITTerminal *pTerminal);
+  STDMETHOD (EnumerateTerminals) (IEnumTerminal **ppEnumTerminal);
+  STDMETHOD (get_Terminals) (VARIANT *pTerminals);
+  STDMETHOD (StartStream) ();
+  STDMETHOD (PauseStream) ();
+  STDMETHOD (StopStream) ();
+  virtual HRESULT Init(HANDLE hAddress,CMSPCallBase *pMSPCall,IMediaEvent *pGraph,DWORD dwMediaType,TERMINAL_DIRECTION Direction);
+  virtual HRESULT ShutDown();
+  virtual HRESULT GetState(DWORD *pdwStatus) { return E_NOTIMPL; }
+  virtual HRESULT HandleTSPData(BYTE *pData,DWORD dwSize);
+  virtual HRESULT ProcessGraphEvent(long lEventCode,LONG_PTR lParam1,LONG_PTR lParam2);
+protected:
+  HRESULT RegisterPluggableTerminalEventSink(ITTerminal *pTerminal);
+  HRESULT UnregisterPluggableTerminalEventSink(ITTerminal *pTerminal);
+  HRESULT ReleaseSink();
+  ULONG InternalAddRef();
+  ULONG InternalRelease();
+public:
+  HRESULT HandleSinkEvent(MSPEVENTITEM *pEventItem);
+protected:
+  IUnknown *m_pFTM;
+  DWORD m_dwState;
+  DWORD m_dwMediaType;
+  TERMINAL_DIRECTION m_Direction;
+  HANDLE m_hAddress;
+  CMSPCallBase *m_pMSPCall;
+  IGraphBuilder *m_pIGraphBuilder;
+  IMediaControl *m_pIMediaControl;
+  CMSPArray <ITTerminal *> m_Terminals;
+  CMSPCritSection m_lock;
+  CMSPCritSection m_lockRefCount;
+  ITPluggableTerminalEventSink *m_pPTEventSink;
+  long m_lMyPersonalRefcount;
+  WINBOOL m_bFirstAddRef;
+};
+
+#endif
diff --git a/mingw-w64-headers/include/mspterm.h b/mingw-w64-headers/include/mspterm.h
new file mode 100755
index 0000000..77e031d
--- /dev/null
+++ b/mingw-w64-headers/include/mspterm.h
@@ -0,0 +1,75 @@
+#ifndef _MSPTERM_H_
+#define _MSPTERM_H_
+
+template <class T> class ITTerminalVtblBase : public ITTerminal {
+};
+
+class CBaseTerminal : virtual public CComObjectRootEx<CComMultiThreadModelNoCS>,public IDispatchImpl<ITTerminalVtblBase<CBaseTerminal>,&IID_ITTerminal,&LIBID_TAPI3Lib>,public ITTerminalControl
+{
+  BEGIN_COM_MAP(CBaseTerminal)
+    COM_INTERFACE_ENTRY(IDispatch)
+    COM_INTERFACE_ENTRY(ITTerminal)
+    COM_INTERFACE_ENTRY(ITTerminalControl)
+    COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal,m_pFTM)
+  END_COM_MAP()
+  DECLARE_VQI()
+  DECLARE_GET_CONTROLLING_UNKNOWN()
+public:
+  CBaseTerminal();
+  virtual ~CBaseTerminal();
+public:
+  STDMETHOD(get_TerminalClass)(BSTR *pVal);
+  STDMETHOD(get_TerminalType)(TERMINAL_TYPE *pVal);
+  STDMETHOD(get_State)(TERMINAL_STATE *pVal);
+  STDMETHOD(get_Name)(BSTR *pVal);
+  STDMETHOD(get_MediaType)(long *plMediaType);
+  STDMETHOD(get_Direction)(TERMINAL_DIRECTION *pDirection);
+public:
+  virtual HRESULT Initialize(IID iidTerminalClass,DWORD dwMediaType,TERMINAL_DIRECTION Direction,MSP_HANDLE htAddress);
+public:
+  STDMETHOD (get_AddressHandle)(MSP_HANDLE *phtAddress);
+  STDMETHOD (ConnectTerminal)(IGraphBuilder *pGraph,DWORD dwTerminalDirection,DWORD *pdwNumPins,IPin **ppPins);
+  STDMETHOD (CompleteConnectTerminal)(void);
+  STDMETHOD (DisconnectTerminal)(IGraphBuilder *pGraph,DWORD dwReserved);
+  STDMETHOD (RunRenderFilter)(void) = 0;
+  STDMETHOD (StopRenderFilter)(void) = 0;
+protected:
+  CMSPCritSection m_CritSec;
+public:
+  TERMINAL_DIRECTION m_TerminalDirection;
+  TERMINAL_TYPE m_TerminalType;
+  TERMINAL_STATE m_TerminalState;
+  TCHAR m_szName[MAX_PATH + 1];
+  IID m_TerminalClassID;
+  DWORD m_dwMediaType;
+  MSP_HANDLE m_htAddress;
+  IUnknown *m_pFTM;
+  CComPtr<IGraphBuilder> m_pGraph;
+  virtual HRESULT AddFiltersToGraph() = 0;
+  virtual HRESULT ConnectFilters() { return S_OK; }
+  virtual HRESULT GetNumExposedPins(IGraphBuilder *pGraph,DWORD *pdwNumPins) = 0;
+  virtual HRESULT GetExposedPins(IPin **ppPins) = 0;
+  virtual DWORD GetSupportedMediaTypes(void) = 0;
+  virtual HRESULT RemoveFiltersFromGraph() = 0;
+  WINBOOL MediaTypeSupported(long lMediaType);
+};
+
+class CSingleFilterTerminal : public CBaseTerminal {
+public:
+  CComPtr<IPin> m_pIPin;
+  CComPtr<IBaseFilter> m_pIFilter;
+public:
+  STDMETHOD(RunRenderFilter)(void);
+  STDMETHOD(StopRenderFilter)(void);
+  virtual HRESULT GetNumExposedPins(IGraphBuilder *pGraph,DWORD *pdwNumPins);
+  virtual HRESULT GetExposedPins(IPin **ppPins);
+  virtual HRESULT RemoveFiltersFromGraph();
+};
+
+class CSingleFilterStaticTerminal : public CSingleFilterTerminal {
+public:
+  CComPtr<IMoniker> m_pMoniker;
+  WINBOOL m_bMark;
+  virtual HRESULT CompareMoniker(IMoniker *pMoniker);
+};
+#endif
diff --git a/mingw-w64-headers/include/mspthrd.h b/mingw-w64-headers/include/mspthrd.h
new file mode 100755
index 0000000..dd3e5d5
--- /dev/null
+++ b/mingw-w64-headers/include/mspthrd.h
@@ -0,0 +1,59 @@
+#ifndef __MSPTHRD_H
+#define __MSPTHRD_H
+
+typedef enum {
+  WORK_ITEM,STOP
+} COMMAND;
+
+typedef struct {
+  COMMAND cmd;
+  LPTHREAD_START_ROUTINE pfn;
+  PVOID pContext;
+  HANDLE hEvent;
+} COMMAND_NODE;
+
+typedef struct {
+  LIST_ENTRY link;
+  COMMAND_NODE node;
+} COMMAND_QUEUE_ITEM;
+
+typedef struct _NOTIF_LIST {
+  CMSPAddress *addr;
+  _NOTIF_LIST *next;
+} NOTIF_LIST,*PNOTIF_LIST;
+
+class CMSPThread {
+public:
+  CMSPThread() {
+    InitializeListHead(&m_CommandQueue);
+    m_hCommandEvent = NULL;
+    m_hThread = NULL;
+    m_NotifList = NULL;
+    m_iStartCount = 0;
+  }
+  ~CMSPThread() { };
+  HRESULT Start();
+  HRESULT Stop();
+  HRESULT Shutdown();
+  HRESULT ThreadProc();
+  static LRESULT CALLBACK NotifWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
+  HRESULT RegisterPnpNotification(CMSPAddress *pCMSPAddress);
+  HRESULT UnregisterPnpNotification(CMSPAddress *pCMSPAddress);
+  HRESULT QueueWorkItem(LPTHREAD_START_ROUTINE Function,PVOID Context,WINBOOL fSynchronous);
+private:
+  WINBOOL SignalThreadProc() { return SetEvent(m_hCommandEvent); }
+  CMSPCritSection m_CountLock;
+  CMSPCritSection m_QueueLock;
+  int m_iStartCount;
+  LIST_ENTRY m_CommandQueue;
+  HANDLE m_hCommandEvent;
+  HANDLE m_hThread;
+  HDEVNOTIFY m_hDevNotifyVideo;
+  HDEVNOTIFY m_hDevNotifyAudio;
+  HWND m_hWndNotif;
+  PNOTIF_LIST m_NotifList;
+  CMSPCritSection m_NotifLock;
+};
+
+extern CMSPThread g_Thread;
+#endif
diff --git a/mingw-w64-headers/include/msptrmac.h b/mingw-w64-headers/include/msptrmac.h
new file mode 100755
index 0000000..8ee612c
--- /dev/null
+++ b/mingw-w64-headers/include/msptrmac.h
@@ -0,0 +1,44 @@
+#ifndef _MSPTRMAC_H_
+#define _MSPTRMAC_H_
+
+#define WAVEIN_NAME L"WaveIn Terminal"
+
+class CAudioCaptureTerminal : public IDispatchImpl<ITBasicAudioTerminal,&IID_ITBasicAudioTerminal,&LIBID_TAPI3Lib>,public IDispatchImpl<ITStaticAudioTerminal,&IID_ITStaticAudioTerminal,&LIBID_TAPI3Lib>,public CSingleFilterStaticTerminal,public CMSPObjectSafetyImpl
+{
+  BEGIN_COM_MAP(CAudioCaptureTerminal)
+    COM_INTERFACE_ENTRY(IObjectSafety)
+    COM_INTERFACE_ENTRY(ITBasicAudioTerminal)
+    COM_INTERFACE_ENTRY(ITStaticAudioTerminal)
+    COM_INTERFACE_ENTRY_CHAIN(CSingleFilterStaticTerminal)
+  END_COM_MAP()
+  DECLARE_VQI()
+  DECLARE_LOG_ADDREF_RELEASE(CAudioCaptureTerminal)
+public:
+  CAudioCaptureTerminal();
+  virtual ~CAudioCaptureTerminal();
+  static HRESULT CreateTerminal(CComPtr<IMoniker> pMoniker,MSP_HANDLE htAddress,ITTerminal **ppTerm);
+  HRESULT FindTerminalPin();
+public:
+  STDMETHOD(get_Balance)(long *pVal);
+  STDMETHOD(put_Balance)(long newVal);
+  STDMETHOD(get_Volume) (long *pVal);
+  STDMETHOD(put_Volume) (long newVal);
+public:
+  STDMETHOD(get_WaveId) (long *plWaveId);
+  STDMETHODIMP CompleteConnectTerminal(void);
+  STDMETHODIMP DisconnectTerminal(IGraphBuilder *pGraph,DWORD dwReserved);
+  virtual HRESULT AddFiltersToGraph();
+  virtual DWORD GetSupportedMediaTypes(void) { return (DWORD) TAPIMEDIATYPE_AUDIO; }
+  HRESULT CreateFilters();
+  inline HRESULT CreateFiltersIfRequired();
+private:
+  bool m_bResourceReserved;
+  CComPtr<IAMAudioInputMixer> m_pIAMAudioInputMixer;
+};
+
+inline HRESULT CAudioCaptureTerminal::CreateFiltersIfRequired() {
+  if(!m_pIFilter) return CreateFilters();
+  return S_OK;
+}
+
+#endif
diff --git a/mingw-w64-headers/include/msptrmar.h b/mingw-w64-headers/include/msptrmar.h
new file mode 100755
index 0000000..257c66e
--- /dev/null
+++ b/mingw-w64-headers/include/msptrmar.h
@@ -0,0 +1,40 @@
+#ifndef _MSPTRMAR_H_
+#define _MSPTRMAR_H_
+
+#define WAVEOUT_NAME L"WaveOut Terminal"
+#define MIXER_NAME L"PCM Mixer"
+
+class CAudioRenderTerminal : public IDispatchImpl<ITBasicAudioTerminal,&IID_ITBasicAudioTerminal,&LIBID_TAPI3Lib>,public IDispatchImpl<ITStaticAudioTerminal,&IID_ITStaticAudioTerminal,&LIBID_TAPI3Lib>,public CSingleFilterStaticTerminal,public CMSPObjectSafetyImpl
+{
+public:
+  CAudioRenderTerminal();
+  virtual ~CAudioRenderTerminal();
+  HRESULT InitializeDefaultTerminal();
+  static HRESULT CreateTerminal(CComPtr<IMoniker> pMoniker,MSP_HANDLE htAddress,ITTerminal **ppTerm);
+  HRESULT FindTerminalPin();
+  BEGIN_COM_MAP(CAudioRenderTerminal)
+    COM_INTERFACE_ENTRY(IObjectSafety)
+    COM_INTERFACE_ENTRY(ITBasicAudioTerminal)
+    COM_INTERFACE_ENTRY(ITStaticAudioTerminal)
+    COM_INTERFACE_ENTRY_CHAIN(CSingleFilterStaticTerminal)
+  END_COM_MAP()
+  DECLARE_VQI()
+  DECLARE_LOG_ADDREF_RELEASE(CAudioRenderTerminal)
+public:
+  STDMETHOD(get_Balance)(long *pVal);
+  STDMETHOD(put_Balance)(long newVal);
+  STDMETHOD(get_Volume)(long *pVal);
+  STDMETHOD(put_Volume)(long newVal);
+  STDMETHOD(get_WaveId) (long *plWaveId);
+public:
+  STDMETHODIMP CompleteConnectTerminal(void);
+  STDMETHODIMP DisconnectTerminal(IGraphBuilder *pGraph,DWORD dwReserved);
+  virtual HRESULT AddFiltersToGraph();
+  virtual DWORD GetSupportedMediaTypes(void) { return (DWORD) TAPIMEDIATYPE_AUDIO; }
+  HRESULT CreateFilters();
+private:
+  bool m_bResourceReserved;
+  CComPtr<IBasicAudio> m_pIBasicAudio;
+};
+
+#endif
diff --git a/mingw-w64-headers/include/msptrmvc.h b/mingw-w64-headers/include/msptrmvc.h
new file mode 100755
index 0000000..4e7508b
--- /dev/null
+++ b/mingw-w64-headers/include/msptrmvc.h
@@ -0,0 +1,24 @@
+#ifndef _MSPTRMVC_H_
+#define _MSPTRMVC_H_
+
+class CVideoCaptureTerminal : public CSingleFilterStaticTerminal {
+public:
+  CVideoCaptureTerminal();
+  virtual ~CVideoCaptureTerminal();
+public:
+  static HRESULT CreateTerminal(CComPtr<IMoniker> pMoniker,MSP_HANDLE htAddress,ITTerminal **ppTerm);
+  DECLARE_LOG_ADDREF_RELEASE(CVideoCaptureTerminal);
+private:
+  virtual HRESULT AddFiltersToGraph();
+  virtual LONG CountOfMediaTypes() { return 1; }
+  virtual DWORD GetSupportedMediaTypes(void) { return (DWORD) TAPIMEDIATYPE_VIDEO; }
+  HRESULT CreateFilters();
+  HRESULT FindCapturePin();
+};
+
+inline CVideoCaptureTerminal::CVideoCaptureTerminal() {
+  m_TerminalDirection = TD_CAPTURE;
+  m_TerminalType = TT_STATIC;
+}
+
+#endif
diff --git a/mingw-w64-headers/include/msputils.h b/mingw-w64-headers/include/msputils.h
new file mode 100755
index 0000000..63aba74
--- /dev/null
+++ b/mingw-w64-headers/include/msputils.h
@@ -0,0 +1,194 @@
+#ifndef __MSPUTILS_H_
+#define __MSPUTILS_H_
+
+#if _ATL_VER >= 0x0300
+#define DECLARE_VQI()
+#else
+#define DECLARE_VQI() STDMETHOD(QueryInterface)(REFIID iid,void **ppvObject) = 0; STDMETHOD_(ULONG,AddRef)() = 0; STDMETHOD_(ULONG,Release)() = 0;
+#endif
+
+#define MSP_(hr) (FAILED(hr)?MSP_ERROR:MSP_TRACE)
+
+extern __inline WINBOOL IsValidAggregatedMediaType(DWORD dwAggregatedMediaType) {
+  const DWORD dwAllPossibleMediaTypes = TAPIMEDIATYPE_AUDIO | TAPIMEDIATYPE_VIDEO | TAPIMEDIATYPE_DATAMODEM | TAPIMEDIATYPE_G3FAX | TAPIMEDIATYPE_MULTITRACK;
+  WINBOOL bValidMediaType = FALSE;
+  if((0==(dwAggregatedMediaType & dwAllPossibleMediaTypes)) || (0!=(dwAggregatedMediaType & (~dwAllPossibleMediaTypes)))) {
+    bValidMediaType = FALSE;
+  } else {
+    bValidMediaType = TRUE;
+  }
+  return bValidMediaType;
+}
+
+extern __inline WINBOOL IsSingleMediaType(DWORD dwMediaType) { return !((dwMediaType==0) || ((dwMediaType & (dwMediaType - 1))!=0)); }
+extern __inline WINBOOL IsValidSingleMediaType(DWORD dwMediaType,DWORD dwMask) { return IsSingleMediaType(dwMediaType) && ((dwMediaType & dwMask)==dwMediaType); }
+
+const DWORD INITIAL = 8;
+const DWORD DELTA = 8;
+
+template <class T,DWORD dwInitial = INITIAL,DWORD dwDelta = DELTA> class CMSPArray {
+protected:
+  T *m_aT;
+  int m_nSize;
+  int m_nAllocSize;
+public:
+  CMSPArray() : m_aT(NULL),m_nSize(0),m_nAllocSize(0) { }
+  ~CMSPArray() { RemoveAll(); }
+  int GetSize() const { return m_nSize; }
+  WINBOOL Grow() {
+    T *aT;
+    int nNewAllocSize = (m_nAllocSize==0) ? dwInitial : (m_nSize + DELTA);
+    aT = (T *)realloc(m_aT,nNewAllocSize *sizeof(T));
+    if(!aT) return FALSE;
+    m_nAllocSize = nNewAllocSize;
+    m_aT = aT;
+    return TRUE;
+  }
+  WINBOOL Add(T &t) {
+    if(m_nSize==m_nAllocSize) {
+      if(!Grow()) return FALSE;
+    }
+    m_nSize++;
+    SetAtIndex(m_nSize - 1,t);
+    return TRUE;
+  }
+  WINBOOL Remove(T &t) {
+    int nIndex = Find(t);
+    if(nIndex==-1) return FALSE;
+    return RemoveAt(nIndex);
+  }
+  WINBOOL RemoveAt(int nIndex) {
+    if(nIndex!=(m_nSize - 1))
+      memmove((void*)&m_aT[nIndex],(void*)&m_aT[nIndex + 1],(m_nSize - (nIndex + 1))*sizeof(T));
+    m_nSize--;
+    return TRUE;
+  }
+  void RemoveAll() {
+    if(m_nAllocSize > 0) {
+      free(m_aT);
+      m_aT = NULL;
+      m_nSize = 0;
+      m_nAllocSize = 0;
+    }
+  }
+  T &operator[] (int nIndex) const {
+    _ASSERTE(nIndex >= 0 && nIndex < m_nSize);
+    return m_aT[nIndex];
+  }
+  T *GetData() const { return m_aT; }
+  void SetAtIndex(int nIndex,T &t) {
+    _ASSERTE(nIndex >= 0 && nIndex < m_nSize);
+    m_aT[nIndex] = t;
+  }
+  int Find(T &t) const {
+    for(int i = 0;i < m_nSize;i++) {
+      if(m_aT[i]==t) return i;
+    }
+    return -1;
+  }
+};
+
+class CMSPCritSection {
+private:
+  CRITICAL_SECTION m_CritSec;
+public:
+  CMSPCritSection() { InitializeCriticalSection(&m_CritSec); }
+  ~CMSPCritSection() { DeleteCriticalSection(&m_CritSec); }
+  void Lock() { EnterCriticalSection(&m_CritSec); }
+  WINBOOL TryLock() { return TryEnterCriticalSection(&m_CritSec); }
+  void Unlock() { LeaveCriticalSection(&m_CritSec); }
+};
+
+class CLock {
+private:
+  CMSPCritSection &m_CriticalSection;
+public:
+  CLock(CMSPCritSection &CriticalSection) : m_CriticalSection(CriticalSection) {
+    m_CriticalSection.Lock();
+  }
+  ~CLock() { m_CriticalSection.Unlock(); }
+};
+
+class CCSLock {
+private:
+  CRITICAL_SECTION *m_pCritSec;
+public:
+  CCSLock(CRITICAL_SECTION *pCritSec) : m_pCritSec(pCritSec) {
+    EnterCriticalSection(m_pCritSec);
+  }
+  ~CCSLock() { LeaveCriticalSection(m_pCritSec); }
+};
+
+#ifndef CONTAINING_RECORD
+#define CONTAINING_RECORD(address,type,field) ((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field)))
+#endif
+
+#ifndef InitializeListHead
+#define InitializeListHead(ListHead) ((ListHead)->Flink = (ListHead)->Blink = (ListHead))
+#define IsListEmpty(ListHead) ((ListHead)->Flink==(ListHead))
+#define RemoveHeadList(ListHead) (ListHead)->Flink; {RemoveEntryList((ListHead)->Flink)}
+#define RemoveTailList(ListHead) (ListHead)->Blink; {RemoveEntryList((ListHead)->Blink)}
+#define RemoveEntryList(Entry) { PLIST_ENTRY _EX_Blink; PLIST_ENTRY _EX_Flink; _EX_Flink = (Entry)->Flink; _EX_Blink = (Entry)->Blink; _EX_Blink->Flink = _EX_Flink; _EX_Flink->Blink = _EX_Blink; }
+#define InsertTailList(ListHead,Entry) { PLIST_ENTRY _EX_Blink; PLIST_ENTRY _EX_ListHead; _EX_ListHead = (ListHead); _EX_Blink = _EX_ListHead->Blink; (Entry)->Flink = _EX_ListHead; (Entry)->Blink = _EX_Blink; _EX_Blink->Flink = (Entry); _EX_ListHead->Blink = (Entry); }
+#define InsertHeadList(ListHead,Entry) { PLIST_ENTRY _EX_Flink; PLIST_ENTRY _EX_ListHead; _EX_ListHead = (ListHead); _EX_Flink = _EX_ListHead->Flink; (Entry)->Flink = _EX_Flink; (Entry)->Blink = _EX_ListHead; _EX_Flink->Blink = (Entry); _EX_ListHead->Flink = (Entry); }
+
+WINBOOL IsNodeOnList(PLIST_ENTRY ListHead,PLIST_ENTRY Entry);
+#endif
+
+template <class T> ULONG MSPAddRefHelper (T *pMyThis) {
+  LOG((MSP_INFO,"MSPAddRefHelper - this = 0x%08x",pMyThis));
+  typedef CComAggObject<T> AggClass;
+  AggClass *p = CONTAINING_RECORD(pMyThis,AggClass,m_contained);
+  return p->AddRef();
+}
+
+template <class T> ULONG MSPReleaseHelper (T *pMyThis) {
+  LOG((MSP_INFO,"MSPReleaseHelper - this = 0x%08x",pMyThis));
+  typedef CComAggObject<T> AggClass;
+  AggClass *p = CONTAINING_RECORD(pMyThis,AggClass,m_contained);
+  return p->Release();
+}
+
+#include <objsafe.h>
+
+class CMSPObjectSafetyImpl : public IObjectSafety {
+public:
+  CMSPObjectSafetyImpl() : m_dwSafety(0) { }
+  enum {
+    SUPPORTED_SAFETY_OPTIONS = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA
+  };
+  STDMETHOD(SetInterfaceSafetyOptions)(REFIID riid,DWORD dwOptionSetMask,DWORD dwEnabledOptions) {
+    if((~SUPPORTED_SAFETY_OPTIONS & dwOptionSetMask)!=0) return E_FAIL;
+    IUnknown *pUnk = NULL;
+    HRESULT hr = QueryInterface(riid,(void**)&pUnk);
+    if(SUCCEEDED(hr)) {
+      pUnk->Release();
+      pUnk = NULL;
+      s_CritSection.Lock();
+      m_dwSafety = (dwEnabledOptions & dwOptionSetMask) | (m_dwSafety & ~dwOptionSetMask);
+      s_CritSection.Unlock();
+    }
+    return hr;
+  }
+  STDMETHOD(GetInterfaceSafetyOptions)(REFIID riid,DWORD *pdwSupportedOptions,DWORD *pdwEnabledOptions) {
+    if(IsBadWritePtr(pdwSupportedOptions,sizeof(DWORD)) || IsBadWritePtr(pdwEnabledOptions,sizeof(DWORD))) return E_POINTER;
+    *pdwSupportedOptions = 0;
+    *pdwEnabledOptions = 0;
+    IUnknown *pUnk = NULL;
+    HRESULT hr = QueryInterface(riid,(void**)&pUnk);
+    if(SUCCEEDED(hr)) {
+      pUnk->Release();
+      pUnk = NULL;
+      *pdwSupportedOptions = SUPPORTED_SAFETY_OPTIONS;
+      s_CritSection.Lock();
+      *pdwEnabledOptions = m_dwSafety;
+      s_CritSection.Unlock();
+    }
+    return hr;
+  }
+private:
+  DWORD m_dwSafety;
+  static CMSPCritSection s_CritSection;
+};
+
+#endif
diff --git a/mingw-w64-headers/include/nl_types.h b/mingw-w64-headers/include/nl_types.h
new file mode 100755
index 0000000..0196d26
--- /dev/null
+++ b/mingw-w64-headers/include/nl_types.h
@@ -0,0 +1,34 @@
+#ifndef _NL_TYPES_H
+#define _NL_TYPES_H
+
+typedef enum {
+  CODESET,
+  D_T_FMT,
+  D_FMT,
+  T_FMT,
+  T_FMT_AMPM,
+  AM_STR,
+  PM_STR,
+  DAY_1, DAY_2, DAY_3, DAY_4, DAY_5, DAY_6, DAY_7,
+  ABDAY_1, ABDAY_2, ABDAY_3, ABDAY_4, ABDAY_5, ABDAY_6, ABDAY_7,
+  MON_1, MON_2, MON_3, MON_4, MON_5, MON_6,
+  MON_7, MON_8, MON_9, MON_10, MON_11, MON_12,
+  ABMON_1, ABMON_2, ABMON_3, ABMON_4, ABMON_5, ABMON_6,
+  ABMON_7, ABMON_8, ABMON_9, ABMON_10, ABMON_11, ABMON_12,
+  ERA,
+  ERA_D_FMT,
+  ERA_D_T_FMT,
+  ERA_T_FMT,
+  ALT_DIGITS,
+  RADIXCHAR,
+  THOUSEP,
+  YESEXPR,
+  NOEXPR,
+  CRNCYSTR
+} nl_item;
+
+typedef void* nl_catd;
+
+enum { NL_SETD=0, NL_CAT_LOCALE=1 };
+
+#endif
diff --git a/mingw-w64-headers/include/stddef.h b/mingw-w64-headers/include/stddef.h
index 0d79996..4aeb0e7 100755
--- a/mingw-w64-headers/include/stddef.h
+++ b/mingw-w64-headers/include/stddef.h
@@ -380,18 +380,6 @@
 #undef	__need_wchar_t
 #endif /* _STDDEF_H or __need_wchar_t.  */
 
-#if defined (__need_wint_t)
-#ifndef _WINT_T
-#define _WINT_T
-
-#ifndef __WINT_TYPE__
-#define __WINT_TYPE__ unsigned int
-#endif
-typedef __WINT_TYPE__ wint_t;
-#endif
-#undef __need_wint_t
-#endif
-
 /*  In 4.3bsd-net2, leave these undefined to indicate that size_t, etc.
     are already defined.  */
 /*  BSD/OS 3.1 and FreeBSD [23].x require the MACHINE_ANSI_H check here.  */
diff --git a/mingw-w64-headers/include/stdio.h b/mingw-w64-headers/include/stdio.h
index ad26151..b4468d8 100755
--- a/mingw-w64-headers/include/stdio.h
+++ b/mingw-w64-headers/include/stdio.h
@@ -305,6 +305,8 @@
   _CRTIMP int __cdecl _scwprintf(const wchar_t *_Format,...);
   int __cdecl vfwprintf(FILE *_File,const wchar_t *_Format,va_list _ArgList);
   int __cdecl vwprintf(const wchar_t *_Format,va_list _ArgList);
+  _CRTIMP int __cdecl swprintf(wchar_t*, const wchar_t*, ...);
+  _CRTIMP int __cdecl vswprintf(wchar_t*, const wchar_t*,va_list);
   _CRTIMP int __cdecl _swprintf_c(wchar_t *_DstBuf,size_t _SizeInWords,const wchar_t *_Format,...);
   _CRTIMP int __cdecl _vswprintf_c(wchar_t *_DstBuf,size_t _SizeInWords,const wchar_t *_Format,va_list _ArgList);
   _CRTIMP int __cdecl _snwprintf(wchar_t *_Dest,size_t _Count,const wchar_t *_Format,...);
diff --git a/mingw-w64-headers/include/tchar.h b/mingw-w64-headers/include/tchar.h
index 8f542ba..ba6ce5b 100755
--- a/mingw-w64-headers/include/tchar.h
+++ b/mingw-w64-headers/include/tchar.h
@@ -138,7 +138,7 @@
 #define _ftprintf_l _fwprintf_l
 #define _ftprintf_p _fwprintf_p
 #define _ftprintf_p_l _fwprintf_p_l
-#define _stprintf _swprintf
+#define _stprintf swprintf
 #define _stprintf_l __swprintf_l
 #define _stprintf_p _swprintf_p
 #define _stprintf_p_l _swprintf_p_l
@@ -156,7 +156,7 @@
 #define _vftprintf_l _vfwprintf_l
 #define _vftprintf_p _vfwprintf_p
 #define _vftprintf_p_l _vfwprintf_p_l
-#define _vstprintf _vswprintf
+#define _vstprintf vswprintf
 #define _vstprintf_l _vswprintf_l
 #define _vstprintf_p _vswprintf_p
 #define _vstprintf_p_l _vswprintf_p_l
diff --git a/mingw-w64-headers/include/w32api.h b/mingw-w64-headers/include/w32api.h
new file mode 100755
index 0000000..40d83d1
--- /dev/null
+++ b/mingw-w64-headers/include/w32api.h
@@ -0,0 +1,52 @@
+#ifndef _W32API_H
+#define _W32API_H
+#define _W32API_H_
+#if __GNUC__ >=3
+#pragma GCC system_header
+#endif
+
+#define __W32API_VERSION 3.10
+#define __W32API_MAJOR_VERSION 3
+#define __W32API_MINOR_VERSION 10
+
+/* The following defines are for documentation purposes.  The following defines
+ * identify the versions of Windows and Internet Explorer.  They are not to be
+ * used in the w32api library but may be used by a user to set the _WIN32_WINNT
+ * or _WIN32_WINDOWS and the WINVER values to their minimum level of support.
+ *
+ * Similarly the user can use the Internet Explorer values to set the _WIN32_IE
+ * value to their minimum level of support.
+ */
+
+/* Use these values to set _WIN32_WINDOWS and WINVER to your minimum support 
+ * level */
+#define Windows95    0x0400
+#define Windows98    0x0410
+#define WindowsME    0x0500
+
+/* Use these values to set _WIN32_WINNT and WINVER to your mimimum support 
+ * level. */
+#define WindowsNT4   0x0400
+#define Windows2000  0x0500
+#define WindowsXP    0x0501
+#define Windows2003  0x0502
+#define WindowsVista 0x0600
+
+/* Use these values to set _WIN32_IE to your minimum support level */
+#define IE3	0x0300
+#define IE301	0x0300
+#define IE302	0x0300
+#define IE4	0x0400
+#define IE401	0x0401
+#define IE5	0x0500
+#define IE5a	0x0500
+#define IE5b	0x0500
+#define IE501	0x0501
+#define IE55	0x0501
+#define IE56	0x0560
+#define IE6	0x0600
+#define IE601	0x0601
+#define IE602	0x0603
+#define IE7	0x0700
+
+#endif /* ndef _W32API_H */
diff --git a/mingw-w64-headers/include/wchar.h b/mingw-w64-headers/include/wchar.h
index 3bf3753..a708a3a 100755
--- a/mingw-w64-headers/include/wchar.h
+++ b/mingw-w64-headers/include/wchar.h
@@ -530,6 +530,8 @@
   _CRTIMP int __cdecl _scwprintf(const wchar_t *_Format,...);
   int __cdecl vfwprintf(FILE *_File,const wchar_t *_Format,va_list _ArgList);
   int __cdecl vwprintf(const wchar_t *_Format,va_list _ArgList);
+  _CRTIMP int __cdecl swprintf(wchar_t*, const wchar_t*, ...);
+  _CRTIMP int __cdecl vswprintf(wchar_t*, const wchar_t*,va_list);
   _CRTIMP int __cdecl _swprintf_c(wchar_t *_DstBuf,size_t _SizeInWords,const wchar_t *_Format,...);
   _CRTIMP int __cdecl _vswprintf_c(wchar_t *_DstBuf,size_t _SizeInWords,const wchar_t *_Format,va_list _ArgList);
   _CRTIMP int __cdecl _snwprintf(wchar_t *_Dest,size_t _Count,const wchar_t *_Format,...);
diff --git a/mingw-w64-headers/include/winsock2.h b/mingw-w64-headers/include/winsock2.h
index 916c037..3360217 100755
--- a/mingw-w64-headers/include/winsock2.h
+++ b/mingw-w64-headers/include/winsock2.h
@@ -3,6 +3,7 @@
  * This file is part of the w64 mingw-runtime package.
  * No warranty is given; refer to the file DISCLAIMER within this package.
  */
+
 #ifndef _WINSOCK2API_
 #define _WINSOCK2API_
 
diff --git a/mingw-w64-headers/include/wmiatlprov.h b/mingw-w64-headers/include/wmiatlprov.h
new file mode 100755
index 0000000..db479bd
--- /dev/null
+++ b/mingw-w64-headers/include/wmiatlprov.h
@@ -0,0 +1,355 @@
+#ifndef __ATLWMIPROV_H__
+#define __ATLWMIPROV_H__
+
+#ifndef __cplusplus
+#error Requires C++ compilation (use a .cpp suffix)
+#endif
+
+#ifndef __wbemprov_h__
+#include <wbemprov.h>
+#endif
+
+#ifndef __wmiutils_h__
+#include <wmiutils.h>
+#endif
+
+namespace ATL {
+  class ATL_NO_VTABLE IWbemInstProviderImpl : public IWbemServices,public IWbemProviderInit {
+  public:
+    HRESULT WINAPI OpenNamespace(const BSTR Namespace,long lFlags,IWbemContext *pCtx,IWbemServices **ppWorkingNamespace,IWbemCallResult **ppResult) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI CancelAsyncCall(IWbemObjectSink *pSink) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI QueryObjectSink(long lFlags,IWbemObjectSink **ppResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI GetObject(const BSTR ObjectPath,long lFlags,IWbemContext *pCtx,IWbemClassObject **ppObject,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI PutClass(IWbemClassObject *pObject,long lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI PutClassAsync(IWbemClassObject *pObject,long lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI DeleteClass(const BSTR Class,long lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI DeleteClassAsync(const BSTR Class,long lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI CreateClassEnum(const BSTR Superclass,long lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI CreateClassEnumAsync(const BSTR Superclass,long lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI PutInstance(IWbemClassObject *pInst,long lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI DeleteInstance(const BSTR ObjectPath,long lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI CreateInstanceEnum(const BSTR Class,long lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI ExecQuery(const BSTR QueryLanguage,const BSTR Query,long lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI ExecNotificationQuery(const BSTR QueryLanguage,const BSTR Query,long lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI ExecNotificationQueryAsync(const BSTR QueryLanguage,const BSTR Query,long lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI ExecMethod(const BSTR strObjectPath,const BSTR strMethodName,long lFlags,IWbemContext *pCtx,IWbemClassObject *pInParams,IWbemClassObject **ppOutParams,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI ExecMethodAsync(const BSTR strObjectPath,const BSTR strMethodName,long lFlags,IWbemContext *pCtx,IWbemClassObject *pInParams,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+  };
+
+  class CProviderHelper {
+  private:
+    CComPtr<IWbemClassObject> m_pErrorObject;
+    HRESULT m_hr;
+  public:
+    CProviderHelper(IWbemServices *pNamespace,IWbemContext *pCtx) {
+      m_hr = WBEM_E_FAILED;
+      m_pErrorObject = NULL;
+      if(!pNamespace) {
+	m_hr = WBEM_E_INVALID_PARAMETER;
+	ATLASSERT (0);
+	return;
+      }
+      BSTR bstrString = SysAllocString(L"__ExtendedStatus");
+      if(!bstrString) {
+	m_hr = WBEM_E_OUT_OF_MEMORY;
+	return;
+      }
+      m_hr = pNamespace->GetObject(bstrString,0,pCtx,&m_pErrorObject,NULL);
+      SysFreeString(bstrString);
+      return;
+    }
+    virtual ~CProviderHelper() { }
+    HRESULT WINAPI ConstructErrorObject (const ULONG ulStatusCode,const BSTR bstrDescription,const BSTR bstrOperation,const BSTR bstrParameter,const BSTR bstrProviderName,IWbemClassObject **ppErrorObject) {
+      static const LPWSTR lpwstrDescription = L"Description";
+      static const LPWSTR lpwstrOperation = L"Operation";
+      static const LPWSTR lpwstrStatusCode = L"StatusCode";
+      static const LPWSTR lpwstrParameterInfo = L"ParameterInfo";
+      static const LPWSTR lpwstrProviderName = L"ProviderName";
+
+      if(FAILED (m_hr)) {
+	ATLASSERT (0);
+	return m_hr;
+      }
+      if(!ppErrorObject) {
+	ATLASSERT (0);
+	return WBEM_E_INVALID_PARAMETER;
+      }
+      HRESULT hr = m_pErrorObject->SpawnInstance(0,ppErrorObject);
+      if(FAILED(hr)) return hr;
+      VARIANT var;
+      VariantInit(&var);
+      var.vt = VT_I4;
+      var.lVal = ulStatusCode;
+      hr = (*ppErrorObject)->Put(lpwstrStatusCode,0,&var,0);
+      if(FAILED(hr)) return hr;
+      var.vt = VT_BSTR;
+      if(bstrDescription!=NULL) {
+	var.bstrVal = bstrDescription;
+	hr = (*ppErrorObject)->Put(lpwstrDescription,0,&var,0);
+	if(FAILED(hr)) return hr;
+      }
+      if(bstrOperation!=NULL) {
+	var.bstrVal = bstrOperation;
+	hr = (*ppErrorObject)->Put(lpwstrOperation,0,&var,0);
+	if(FAILED(hr)) return hr;
+      }
+      if(bstrParameter!=NULL) {
+	var.bstrVal = bstrParameter;
+	hr = (*ppErrorObject)->Put(lpwstrParameterInfo,0,&var,0);
+	if(FAILED(hr)) return hr;
+      }
+      if(bstrProviderName!=NULL) {
+	var.bstrVal = bstrProviderName;
+	hr = (*ppErrorObject)->Put(lpwstrProviderName,0,&var,0);
+	if(FAILED(hr)) return hr;
+      }
+      return hr;
+    }
+  };
+
+  class CIntrinsicEventProviderHelper : public CProviderHelper {
+  private:
+    CComPtr<IWbemClassObject> m_pCreationEventClass;
+    CComPtr<IWbemClassObject> m_pDeletionEventClass;
+    CComPtr<IWbemClassObject> m_pModificationEventClass;
+    HRESULT m_hr;
+  public:
+    CIntrinsicEventProviderHelper(IWbemServices *pNamespace,IWbemContext *pCtx) : CProviderHelper (pNamespace,pCtx) {
+      m_hr = WBEM_E_FAILED;
+      if(!pNamespace || !pCtx) {
+	m_hr = WBEM_E_INVALID_PARAMETER;
+	ATLASSERT (0);
+	return;
+      }
+      m_pCreationEventClass = NULL;
+      m_pModificationEventClass = NULL;
+      m_pDeletionEventClass = NULL;
+      BSTR bstrString = SysAllocString(L"__InstanceCreationEvent");
+      if(!bstrString) {
+	m_hr = WBEM_E_OUT_OF_MEMORY;
+	return;
+      }
+      m_hr = pNamespace->GetObject(bstrString,0,pCtx,&m_pCreationEventClass,NULL);
+      SysFreeString(bstrString);
+      bstrString=NULL;
+      if(FAILED(m_hr)) return;
+      bstrString = SysAllocString(L"__InstanceModificationEvent");
+      if(!bstrString) {
+	m_hr = WBEM_E_OUT_OF_MEMORY;
+	return;
+      }
+      m_hr = pNamespace->GetObject(bstrString,0,pCtx,&m_pModificationEventClass,NULL);
+      SysFreeString(bstrString);
+      bstrString=NULL;
+      if(FAILED(m_hr)) return;
+      bstrString = SysAllocString(L"__InstanceDeletionEvent");
+      if(!bstrString) {
+	m_hr = WBEM_E_OUT_OF_MEMORY;
+	return;
+      }
+      m_hr = pNamespace->GetObject(bstrString,0,pCtx,&m_pDeletionEventClass,NULL);
+      SysFreeString(bstrString);
+      bstrString=NULL;
+      if(FAILED(m_hr)) return;
+      return;
+    }
+    virtual ~CIntrinsicEventProviderHelper() { }
+    HRESULT WINAPI FireCreationEvent(IWbemClassObject *pNewInstance,IWbemObjectSink *pSink) {
+      if(FAILED(m_hr)) {
+	ATLASSERT (0);
+	return m_hr;
+      }
+      if(!pNewInstance || !pSink) {
+	ATLASSERT (0);
+	return WBEM_E_INVALID_PARAMETER;
+      }
+      CComPtr<IWbemClassObject> pEvtInstance;
+      HRESULT hr = m_pCreationEventClass->SpawnInstance(0,&pEvtInstance);
+      if(FAILED(hr)) return hr;
+      VARIANT var;
+      VariantInit(&var);
+      var.vt = VT_UNKNOWN;
+      CComQIPtr<IUnknown,&IID_IUnknown>pTemp(pNewInstance);
+      var.punkVal = pTemp;
+      hr = pEvtInstance->Put(L"TargetInstance",0,&var,0);
+      if(FAILED(hr)) return hr;
+      IWbemClassObject *_pEvtInstance = (IWbemClassObject*)pEvtInstance;
+      return pSink->Indicate(1,&_pEvtInstance);
+    }
+    HRESULT WINAPI FireDeletionEvent(IWbemClassObject *pInstanceToDelete,IWbemObjectSink *pSink) {
+      if(FAILED (m_hr)) {
+	ATLASSERT (0);
+	return m_hr;
+      }
+      if(!pInstanceToDelete || !pSink) {
+	ATLASSERT (0);
+	return WBEM_E_INVALID_PARAMETER;
+      }
+      CComPtr<IWbemClassObject> pEvtInstance;
+      HRESULT hr = m_pDeletionEventClass->SpawnInstance(0,&pEvtInstance);
+      if(FAILED(hr)) return hr;
+      VARIANT var;
+      VariantInit(&var);
+      var.vt = VT_UNKNOWN;
+      CComQIPtr<IUnknown,&IID_IUnknown>pTemp(pInstanceToDelete);
+      var.punkVal = pTemp;
+      hr = pEvtInstance->Put(L"TargetInstance",0,&var,0);
+      if(FAILED(hr)) return hr;
+      IWbemClassObject *_pEvtInstance = (IWbemClassObject*)pEvtInstance;
+      return pSink->Indicate(1,&_pEvtInstance);
+    }
+    HRESULT WINAPI FireModificationEvent(IWbemClassObject *pOldInstance,IWbemClassObject *pNewInstance,IWbemObjectSink *pSink) {
+      if(FAILED (m_hr)) {
+	ATLASSERT (0);
+	return m_hr;
+      }
+      if(!pOldInstance || !pNewInstance || !pSink) {
+	ATLASSERT (0);
+	return WBEM_E_INVALID_PARAMETER;
+      }
+      CComPtr<IWbemClassObject> pEvtInstance;
+      HRESULT hr = m_pModificationEventClass->SpawnInstance(0,&pEvtInstance);
+      if(FAILED(hr)) return hr;
+      VARIANT var;
+      VariantInit(&var);
+      var.vt = VT_UNKNOWN;
+      CComQIPtr<IUnknown,&IID_IUnknown>pTempNew(pNewInstance);
+      var.punkVal = pTempNew;
+      hr = pEvtInstance->Put(L"TargetInstance",0,&var,0);
+      if(FAILED(hr)) return hr;
+      CComQIPtr<IUnknown,&IID_IUnknown>pTempOld(pOldInstance);
+      var.punkVal = pTempOld;
+      hr = pEvtInstance->Put(L"PreviousInstance",0,&var,0);
+      if(FAILED(hr)) return hr;
+      IWbemClassObject *_pEvtInstance = (IWbemClassObject*)pEvtInstance;
+      return pSink->Indicate(1,&_pEvtInstance);
+    }
+  };
+
+  class CInstanceProviderHelper : public CProviderHelper {
+  public:
+    CInstanceProviderHelper (IWbemServices *pNamespace,IWbemContext *pCtx) : CProviderHelper (pNamespace,pCtx) { }
+    virtual ~CInstanceProviderHelper() { }
+    HRESULT WINAPI CheckInstancePath(IClassFactory *pParserFactory,const BSTR ObjectPath,const BSTR ClassName,ULONGLONG ullTest) {
+      if(!pParserFactory) {
+	ATLASSERT (0);
+	return WBEM_E_INVALID_PARAMETER;
+      }
+      CComPtr<IWbemPath>pPath;
+      HRESULT hr = pParserFactory->CreateInstance(NULL,IID_IWbemPath,(void **) &pPath);
+      if(FAILED(hr)) return WBEM_E_INVALID_PARAMETER;
+      hr = pPath->SetText(WBEMPATH_CREATE_ACCEPT_ALL,ObjectPath);
+      if(FAILED(hr)) return hr;
+      unsigned int nPathLen = SysStringLen(ObjectPath);
+      if(nPathLen >= (unsigned long)(-1)) return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW);
+      unsigned long ulBufLen = (unsigned long)(nPathLen + 1);
+      WCHAR *wClass = new WCHAR[ulBufLen];
+      if(!wClass) return WBEM_E_OUT_OF_MEMORY;
+      hr = pPath->GetClassName(&ulBufLen,wClass);
+      if(FAILED(hr)) {
+	delete[] wClass;
+	return hr;
+      }
+      DWORD lcid = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT);
+      if(CSTR_EQUAL!=CompareStringW(lcid,NORM_IGNORECASE,ClassName,-1,wClass,-1)) {
+	delete[] wClass;
+	return WBEM_E_NOT_FOUND;
+      }
+      delete[] wClass;
+      unsigned __int64 ullPathInfo;
+      hr = pPath->GetInfo(0L,&ullPathInfo);
+      if(FAILED(hr)) return hr;
+      if(!(ullPathInfo & ullTest)) return WBEM_E_INVALID_OBJECT_PATH;
+      return WBEM_S_NO_ERROR;
+    }
+  };
+
+  template <class T> class ATL_NO_VTABLE IWbemPullClassProviderImpl : public IWbemServices,public IWbemProviderInit {
+  public:
+    virtual HRESULT WINAPI OpenNamespace(const BSTR strNamespace,long lFlags,IWbemContext *pCtx,IWbemServices **ppWorkingNamespace,IWbemCallResult **ppResult){return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI CancelAsyncCall(IWbemObjectSink *pSink){return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI QueryObjectSink(long lFlags,IWbemObjectSink **ppResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI GetObject(const BSTR strObjectPath,long lFlags,IWbemContext *pCtx,IWbemClassObject **ppObject,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI PutClass(IWbemClassObject *pObject,long lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult){return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI DeleteClass(const BSTR strClass,long lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult){return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI CreateClassEnum(const BSTR strSuperclass,long lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI PutInstance(IWbemClassObject *pInst,long lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult){return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI PutInstanceAsync(IWbemClassObject *pInst,long lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI DeleteInstance(const BSTR strObjectPath,long lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult){return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI DeleteInstanceAsync(const BSTR strObjectPath,long lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler){return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI CreateInstanceEnum(const BSTR strClass,long lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI CreateInstanceEnumAsync(const BSTR strClass,long lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI ExecQuery(const BSTR strQueryLanguage,const BSTR strQuery,long lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI ExecNotificationQuery(const BSTR strQueryLanguage,const BSTR strQuery,long lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI ExecNotificationQueryAsync(const BSTR strQueryLanguage,const BSTR strQuery,long lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI ExecMethod(const BSTR strObjectPath,const BSTR strMethodName,long lFlags,IWbemContext *pCtx,IWbemClassObject *pInParams,IWbemClassObject **ppOutParams,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI ExecMethodAsync(const BSTR strObjectPath,const BSTR strMethodName,long lFlags,IWbemContext *pCtx,IWbemClassObject *pInParams,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+  };
+
+  class CImpersonateClientHelper {
+  private:
+    WINBOOL m_bImpersonate;
+  public:
+    CImpersonateClientHelper() { m_bImpersonate = FALSE; }
+    ~CImpersonateClientHelper() {
+      if(m_bImpersonate)
+	CoRevertToSelf();
+    }
+    HRESULT ImpersonateClient() {
+      HRESULT hr = S_OK;
+      if(SUCCEEDED(hr = CoImpersonateClient())) m_bImpersonate = TRUE;
+      return hr;
+    }
+    HRESULT GetCurrentImpersonationLevel (DWORD & a_Level) {
+      DWORD t_ImpersonationLevel = RPC_C_IMP_LEVEL_ANONYMOUS;
+      HANDLE t_ThreadToken = NULL;
+      HRESULT t_Result = S_OK;
+      if(SUCCEEDED(t_Result = CoImpersonateClient())) {
+	WINBOOL t_Status = OpenThreadToken (GetCurrentThread() ,TOKEN_QUERY,TRUE,&t_ThreadToken);
+	if(t_Status) {
+	  SECURITY_IMPERSONATION_LEVEL t_Level = SecurityAnonymous;
+	  DWORD t_Returned = 0;
+	  t_Status = GetTokenInformation (t_ThreadToken ,TokenImpersonationLevel ,&t_Level ,sizeof(SECURITY_IMPERSONATION_LEVEL),&t_Returned);
+	  CloseHandle (t_ThreadToken);
+	  if(t_Status==FALSE) {
+	    t_Result = MAKE_HRESULT(SEVERITY_ERROR,FACILITY_WIN32,GetLastError());
+	  } else {
+	    switch(t_Level) {
+	    case SecurityAnonymous:
+	      {
+		t_ImpersonationLevel = RPC_C_IMP_LEVEL_ANONYMOUS;
+	      }
+	      break;
+	    case SecurityIdentification:
+	      {
+		t_ImpersonationLevel = RPC_C_IMP_LEVEL_IDENTIFY;
+	      }
+	      break;
+	    case SecurityImpersonation:
+	      {
+		t_ImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE;
+	      }
+	      break;
+	    case SecurityDelegation:
+	      {
+		t_ImpersonationLevel = RPC_C_IMP_LEVEL_DELEGATE;
+	      }
+	      break;
+	    default:
+	      {
+		t_Result = MAKE_HRESULT(SEVERITY_ERROR,FACILITY_WIN32,E_UNEXPECTED);
+	      }
+	      break;
+	    }
+	  }
+	} else {
+	  t_Result = MAKE_HRESULT(SEVERITY_ERROR,FACILITY_WIN32,GetLastError());
+	}
+	CoRevertToSelf();
+      }
+      a_Level = t_ImpersonationLevel;
+      return t_Result;
+    }
+  };
+}
+#endif
diff --git a/mingw-w64-headers/include/ws2tcpip.h b/mingw-w64-headers/include/ws2tcpip.h
index 3b3cd34..0e7dca4 100755
--- a/mingw-w64-headers/include/ws2tcpip.h
+++ b/mingw-w64-headers/include/ws2tcpip.h
@@ -3,14 +3,22 @@
  * This file is part of the w64 mingw-runtime package.
  * No warranty is given; refer to the file DISCLAIMER within this package.
  */
-#ifndef _WS2TCPIP_H_
-#define _WS2TCPIP_H_
+#ifndef _WS2TCPIP_H
+#define _WS2TCPIP_H
 
+#if __GNUC__ >=3
+#pragma GCC system_header
+#endif
+
+#if (defined _WINSOCK_H && !defined _WINSOCK2_H)
+#error "ws2tcpip.h is not compatible with winsock.h. Include winsock2.h instead."
+#endif
+/**
 struct ip_mreq {
   struct in_addr imr_multiaddr;
   struct in_addr imr_interface;
 };
-
+*/
 struct ip_mreq_source {
   struct in_addr imr_multiaddr;
   struct in_addr imr_sourceaddr;