diff --git a/reactos/dll/win32/avifil32/avifile_De.rc b/reactos/dll/win32/avifil32/avifile_De.rc
index 7b40709b9a6..0730046dc20 100644
--- a/reactos/dll/win32/avifil32/avifile_De.rc
+++ b/reactos/dll/win32/avifil32/avifile_De.rc
@@ -52,4 +52,3 @@ STRINGTABLE DISCARDABLE
IDS_AVIFILETYPE "Wine AVI-Standard-Dateibehandlungsroutine"
IDS_UNCOMPRESSED "Unkomprimiert"
}
-#pragma code_page(default)
diff --git a/reactos/dll/win32/avifil32/avifile_Fr.rc b/reactos/dll/win32/avifil32/avifile_Fr.rc
index 45adafe8f02..d313226b0a1 100644
--- a/reactos/dll/win32/avifil32/avifile_Fr.rc
+++ b/reactos/dll/win32/avifil32/avifile_Fr.rc
@@ -57,4 +57,3 @@ STRINGTABLE DISCARDABLE
IDS_AVIFILETYPE "Gestionnaire de fichiers AVI par défaut de Wine"
IDS_UNCOMPRESSED "non compressé"
}
-#pragma code_page(default)
diff --git a/reactos/dll/win32/avifil32/avifile_Ja.rc b/reactos/dll/win32/avifil32/avifile_Ja.rc
index 4ac229c21fe..847a1fd471f 100644
--- a/reactos/dll/win32/avifil32/avifile_Ja.rc
+++ b/reactos/dll/win32/avifil32/avifile_Ja.rc
@@ -53,5 +53,3 @@ STRINGTABLE DISCARDABLE
IDS_AVIFILETYPE "Wine AVI-default-filehandler"
IDS_UNCOMPRESSED "未圧縮"
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/avifil32/avifile_Lt.rc b/reactos/dll/win32/avifil32/avifile_Lt.rc
index ca93ba6ad2d..e4795b5ea03 100644
--- a/reactos/dll/win32/avifil32/avifile_Lt.rc
+++ b/reactos/dll/win32/avifil32/avifile_Lt.rc
@@ -53,4 +53,3 @@ STRINGTABLE DISCARDABLE
IDS_AVIFILETYPE "Wine numatyta-AVI-doroklė"
IDS_UNCOMPRESSED "neglaudintas"
}
-#pragma code_page(default)
diff --git a/reactos/dll/win32/avifil32/avifile_Ro.rc b/reactos/dll/win32/avifil32/avifile_Ro.rc
index 1e5d710b8c8..6e63780045f 100644
--- a/reactos/dll/win32/avifil32/avifile_Ro.rc
+++ b/reactos/dll/win32/avifil32/avifile_Ro.rc
@@ -55,4 +55,3 @@ STRINGTABLE DISCARDABLE
IDS_AVIFILETYPE "Tratare implicită Wine pentru AVI"
IDS_UNCOMPRESSED "necomprimat"
}
-#pragma code_page(default)
diff --git a/reactos/dll/win32/avifil32/avifile_Ru.rc b/reactos/dll/win32/avifil32/avifile_Ru.rc
index 4a75a6721b6..12ac27d3b98 100644
--- a/reactos/dll/win32/avifil32/avifile_Ru.rc
+++ b/reactos/dll/win32/avifil32/avifile_Ru.rc
@@ -55,4 +55,3 @@ STRINGTABLE DISCARDABLE
IDS_AVIFILETYPE "Обработчик по умолчанию avi-файлов в Wine"
IDS_UNCOMPRESSED "без сжатия"
}
-#pragma code_page(default)
diff --git a/reactos/dll/win32/avifil32/avifile_Si.rc b/reactos/dll/win32/avifil32/avifile_Si.rc
index e7d90f65893..0840321eaa1 100644
--- a/reactos/dll/win32/avifil32/avifile_Si.rc
+++ b/reactos/dll/win32/avifil32/avifile_Si.rc
@@ -52,5 +52,3 @@ STRINGTABLE DISCARDABLE
IDS_AVIFILETYPE "Wine privzeti-upravljalec-AVI-datotek"
IDS_UNCOMPRESSED "nestisnjeno"
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/avifil32/avifile_Tr.rc b/reactos/dll/win32/avifil32/avifile_Tr.rc
index 451802f42bf..c5dbf6e818d 100644
--- a/reactos/dll/win32/avifil32/avifile_Tr.rc
+++ b/reactos/dll/win32/avifil32/avifile_Tr.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "avifile_private.h"
+
LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT
IDD_SAVEOPTIONS DIALOG FIXED IMPURE 43, 37, 226, 82
diff --git a/reactos/dll/win32/avifil32/avifile_Uk.rc b/reactos/dll/win32/avifil32/avifile_Uk.rc
index d380c8ad78c..9934ab411fa 100644
--- a/reactos/dll/win32/avifil32/avifile_Uk.rc
+++ b/reactos/dll/win32/avifil32/avifile_Uk.rc
@@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "avifile_private.h"
LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
diff --git a/reactos/dll/win32/avifil32/avifile_Zh.rc b/reactos/dll/win32/avifil32/avifile_Zh.rc
index 0075ed8ecfe..5d962e7fdd5 100644
--- a/reactos/dll/win32/avifil32/avifile_Zh.rc
+++ b/reactos/dll/win32/avifil32/avifile_Zh.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "avifile_private.h"
+
/* Chinese text is encoded in UTF-8 */
#pragma code_page(65001)
@@ -86,5 +88,3 @@ STRINGTABLE DISCARDABLE
IDS_AVIFILETYPE "Wine AVI-默認處理器"
IDS_UNCOMPRESSED "未壓縮"
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/avifil32/rsrc.rc b/reactos/dll/win32/avifil32/rsrc.rc
index e4363a7d7cb..d86578c5a6b 100644
--- a/reactos/dll/win32/avifil32/rsrc.rc
+++ b/reactos/dll/win32/avifil32/rsrc.rc
@@ -40,23 +40,25 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
*/
#include "avifile_Cs.rc"
#include "avifile_Da.rc"
-#include "avifile_De.rc"
#include "avifile_En.rc"
#include "avifile_Es.rc"
-#include "avifile_Fr.rc"
#include "avifile_Hu.rc"
#include "avifile_It.rc"
-#include "avifile_Ja.rc"
#include "avifile_Ko.rc"
-#include "avifile_Lt.rc"
#include "avifile_Nl.rc"
#include "avifile_No.rc"
#include "avifile_Pl.rc"
#include "avifile_Pt.rc"
-#include "avifile_Ro.rc"
-#include "avifile_Ru.rc"
-#include "avifile_Si.rc"
#include "avifile_Sv.rc"
#include "avifile_Tr.rc"
#include "avifile_Uk.rc"
+
+/* UTF-8 */
+#include "avifile_De.rc"
+#include "avifile_Fr.rc"
+#include "avifile_Ja.rc"
+#include "avifile_Lt.rc"
+#include "avifile_Ro.rc"
+#include "avifile_Ru.rc"
+#include "avifile_Si.rc"
#include "avifile_Zh.rc"
diff --git a/reactos/dll/win32/hnetcfg/hnetcfg.c b/reactos/dll/win32/hnetcfg/hnetcfg.c
index 72336f91210..3ecc8c23219 100644
--- a/reactos/dll/win32/hnetcfg/hnetcfg.c
+++ b/reactos/dll/win32/hnetcfg/hnetcfg.c
@@ -147,6 +147,5 @@ HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv )
HRESULT WINAPI DllCanUnloadNow( void )
{
- FIXME("\n");
return S_FALSE;
}
diff --git a/reactos/dll/win32/hnetcfg/hnetcfg.rbuild b/reactos/dll/win32/hnetcfg/hnetcfg.rbuild
index dd4612f360c..91c8fcb7b81 100644
--- a/reactos/dll/win32/hnetcfg/hnetcfg.rbuild
+++ b/reactos/dll/win32/hnetcfg/hnetcfg.rbuild
@@ -12,6 +12,8 @@
hnetcfg.c
manager.c
policy.c
+ port.c
profile.c
regsvr.c
+ service.c
diff --git a/reactos/dll/win32/hnetcfg/hnetcfg_private.h b/reactos/dll/win32/hnetcfg/hnetcfg_private.h
index 933782950bb..c64bdc2820b 100644
--- a/reactos/dll/win32/hnetcfg/hnetcfg_private.h
+++ b/reactos/dll/win32/hnetcfg/hnetcfg_private.h
@@ -21,3 +21,5 @@ HRESULT NetFwPolicy_create(IUnknown *, LPVOID *);
HRESULT NetFwProfile_create(IUnknown *, LPVOID *);
HRESULT NetFwAuthorizedApplication_create(IUnknown *, LPVOID *);
HRESULT NetFwAuthorizedApplications_create(IUnknown *, LPVOID *);
+HRESULT NetFwOpenPorts_create(IUnknown *, LPVOID *);
+HRESULT NetFwServices_create(IUnknown *, LPVOID *);
diff --git a/reactos/dll/win32/hnetcfg/port.c b/reactos/dll/win32/hnetcfg/port.c
new file mode 100644
index 00000000000..c80b5f7bfce
--- /dev/null
+++ b/reactos/dll/win32/hnetcfg/port.c
@@ -0,0 +1,544 @@
+/*
+ * Copyright 2009 Hans Leidekker for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * 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. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "config.h"
+#include
+#include
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "ole2.h"
+#include "netfw.h"
+
+#include "wine/debug.h"
+#include "wine/unicode.h"
+#include "hnetcfg_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg);
+
+typedef struct fw_port
+{
+ const INetFwOpenPortVtbl *vtbl;
+ LONG refs;
+} fw_port;
+
+static inline fw_port *impl_from_INetFwOpenPort( INetFwOpenPort *iface )
+{
+ return (fw_port *)((char *)iface - FIELD_OFFSET( fw_port, vtbl ));
+}
+
+static ULONG WINAPI fw_port_AddRef(
+ INetFwOpenPort *iface )
+{
+ fw_port *fw_port = impl_from_INetFwOpenPort( iface );
+ return InterlockedIncrement( &fw_port->refs );
+}
+
+static ULONG WINAPI fw_port_Release(
+ INetFwOpenPort *iface )
+{
+ fw_port *fw_port = impl_from_INetFwOpenPort( iface );
+ LONG refs = InterlockedDecrement( &fw_port->refs );
+ if (!refs)
+ {
+ TRACE("destroying %p\n", fw_port);
+ HeapFree( GetProcessHeap(), 0, fw_port );
+ }
+ return refs;
+}
+
+static HRESULT WINAPI fw_port_QueryInterface(
+ INetFwOpenPort *iface,
+ REFIID riid,
+ void **ppvObject )
+{
+ fw_port *This = impl_from_INetFwOpenPort( iface );
+
+ TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
+
+ if ( IsEqualGUID( riid, &IID_INetFwOpenPort ) ||
+ IsEqualGUID( riid, &IID_IDispatch ) ||
+ IsEqualGUID( riid, &IID_IUnknown ) )
+ {
+ *ppvObject = iface;
+ }
+ else
+ {
+ FIXME("interface %s not implemented\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
+ INetFwOpenPort_AddRef( iface );
+ return S_OK;
+}
+
+static HRESULT WINAPI fw_port_GetTypeInfoCount(
+ INetFwOpenPort *iface,
+ UINT *pctinfo )
+{
+ fw_port *This = impl_from_INetFwOpenPort( iface );
+
+ FIXME("%p %p\n", This, pctinfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_port_GetTypeInfo(
+ INetFwOpenPort *iface,
+ UINT iTInfo,
+ LCID lcid,
+ ITypeInfo **ppTInfo )
+{
+ fw_port *This = impl_from_INetFwOpenPort( iface );
+
+ FIXME("%p %u %u %p\n", This, iTInfo, lcid, ppTInfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_port_GetIDsOfNames(
+ INetFwOpenPort *iface,
+ REFIID riid,
+ LPOLESTR *rgszNames,
+ UINT cNames,
+ LCID lcid,
+ DISPID *rgDispId )
+{
+ fw_port *This = impl_from_INetFwOpenPort( iface );
+
+ FIXME("%p %s %p %u %u %p\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_port_Invoke(
+ INetFwOpenPort *iface,
+ DISPID dispIdMember,
+ REFIID riid,
+ LCID lcid,
+ WORD wFlags,
+ DISPPARAMS *pDispParams,
+ VARIANT *pVarResult,
+ EXCEPINFO *pExcepInfo,
+ UINT *puArgErr )
+{
+ fw_port *This = impl_from_INetFwOpenPort( iface );
+
+ FIXME("%p %d %s %d %d %p %p %p %p\n", This, dispIdMember, debugstr_guid(riid),
+ lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_port_get_Name(
+ INetFwOpenPort *iface,
+ BSTR *name)
+{
+ fw_port *This = impl_from_INetFwOpenPort( iface );
+
+ FIXME("%p %p\n", This, name);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_port_put_Name(
+ INetFwOpenPort *iface,
+ BSTR name)
+{
+ fw_port *This = impl_from_INetFwOpenPort( iface );
+
+ FIXME("%p %s\n", This, debugstr_w(name));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_port_get_IpVersion(
+ INetFwOpenPort *iface,
+ NET_FW_IP_VERSION *ipVersion)
+{
+ fw_port *This = impl_from_INetFwOpenPort( iface );
+
+ FIXME("%p %p\n", This, ipVersion);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_port_put_IpVersion(
+ INetFwOpenPort *iface,
+ NET_FW_IP_VERSION ipVersion)
+{
+ fw_port *This = impl_from_INetFwOpenPort( iface );
+
+ FIXME("%p %u\n", This, ipVersion);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_port_get_Protocol(
+ INetFwOpenPort *iface,
+ NET_FW_IP_PROTOCOL *ipProtocol)
+{
+ fw_port *This = impl_from_INetFwOpenPort( iface );
+
+ FIXME("%p %p\n", This, ipProtocol);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_port_put_Protocol(
+ INetFwOpenPort *iface,
+ NET_FW_IP_PROTOCOL ipProtocol)
+{
+ fw_port *This = impl_from_INetFwOpenPort( iface );
+
+ FIXME("%p %u\n", This, ipProtocol);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_port_get_Port(
+ INetFwOpenPort *iface,
+ LONG *portNumber)
+{
+ fw_port *This = impl_from_INetFwOpenPort( iface );
+
+ FIXME("%p %p\n", This, portNumber);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_port_put_Port(
+ INetFwOpenPort *iface,
+ LONG portNumber)
+{
+ fw_port *This = impl_from_INetFwOpenPort( iface );
+
+ FIXME("%p %d\n", This, portNumber);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_port_get_Scope(
+ INetFwOpenPort *iface,
+ NET_FW_SCOPE *scope)
+{
+ fw_port *This = impl_from_INetFwOpenPort( iface );
+
+ FIXME("%p %p\n", This, scope);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_port_put_Scope(
+ INetFwOpenPort *iface,
+ NET_FW_SCOPE scope)
+{
+ fw_port *This = impl_from_INetFwOpenPort( iface );
+
+ FIXME("%p %u\n", This, scope);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_port_get_RemoteAddresses(
+ INetFwOpenPort *iface,
+ BSTR *remoteAddrs)
+{
+ fw_port *This = impl_from_INetFwOpenPort( iface );
+
+ FIXME("%p %p\n", This, remoteAddrs);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_port_put_RemoteAddresses(
+ INetFwOpenPort *iface,
+ BSTR remoteAddrs)
+{
+ fw_port *This = impl_from_INetFwOpenPort( iface );
+
+ FIXME("%p %s\n", This, debugstr_w(remoteAddrs));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_port_get_Enabled(
+ INetFwOpenPort *iface,
+ VARIANT_BOOL *enabled)
+{
+ fw_port *This = impl_from_INetFwOpenPort( iface );
+
+ FIXME("%p %p\n", This, enabled);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_port_put_Enabled(
+ INetFwOpenPort *iface,
+ VARIANT_BOOL enabled)
+{
+ fw_port *This = impl_from_INetFwOpenPort( iface );
+
+ FIXME("%p %d\n", This, enabled);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_port_get_BuiltIn(
+ INetFwOpenPort *iface,
+ VARIANT_BOOL *builtIn)
+{
+ fw_port *This = impl_from_INetFwOpenPort( iface );
+
+ FIXME("%p %p\n", This, builtIn);
+ return E_NOTIMPL;
+}
+
+static const struct INetFwOpenPortVtbl fw_port_vtbl =
+{
+ fw_port_QueryInterface,
+ fw_port_AddRef,
+ fw_port_Release,
+ fw_port_GetTypeInfoCount,
+ fw_port_GetTypeInfo,
+ fw_port_GetIDsOfNames,
+ fw_port_Invoke,
+ fw_port_get_Name,
+ fw_port_put_Name,
+ fw_port_get_IpVersion,
+ fw_port_put_IpVersion,
+ fw_port_get_Protocol,
+ fw_port_put_Protocol,
+ fw_port_get_Port,
+ fw_port_put_Port,
+ fw_port_get_Scope,
+ fw_port_put_Scope,
+ fw_port_get_RemoteAddresses,
+ fw_port_put_RemoteAddresses,
+ fw_port_get_Enabled,
+ fw_port_put_Enabled,
+ fw_port_get_BuiltIn
+};
+
+static HRESULT NetFwOpenPort_create( IUnknown *pUnkOuter, LPVOID *ppObj )
+{
+ fw_port *fp;
+
+ TRACE("(%p,%p)\n", pUnkOuter, ppObj);
+
+ fp = HeapAlloc( GetProcessHeap(), 0, sizeof(*fp) );
+ if (!fp) return E_OUTOFMEMORY;
+
+ fp->vtbl = &fw_port_vtbl;
+ fp->refs = 1;
+
+ *ppObj = &fp->vtbl;
+
+ TRACE("returning iface %p\n", *ppObj);
+ return S_OK;
+}
+
+typedef struct fw_ports
+{
+ const INetFwOpenPortsVtbl *vtbl;
+ LONG refs;
+} fw_ports;
+
+static inline fw_ports *impl_from_INetFwOpenPorts( INetFwOpenPorts *iface )
+{
+ return (fw_ports *)((char *)iface - FIELD_OFFSET( fw_ports, vtbl ));
+}
+
+static ULONG WINAPI fw_ports_AddRef(
+ INetFwOpenPorts *iface )
+{
+ fw_ports *fw_ports = impl_from_INetFwOpenPorts( iface );
+ return InterlockedIncrement( &fw_ports->refs );
+}
+
+static ULONG WINAPI fw_ports_Release(
+ INetFwOpenPorts *iface )
+{
+ fw_ports *fw_ports = impl_from_INetFwOpenPorts( iface );
+ LONG refs = InterlockedDecrement( &fw_ports->refs );
+ if (!refs)
+ {
+ TRACE("destroying %p\n", fw_ports);
+ HeapFree( GetProcessHeap(), 0, fw_ports );
+ }
+ return refs;
+}
+
+static HRESULT WINAPI fw_ports_QueryInterface(
+ INetFwOpenPorts *iface,
+ REFIID riid,
+ void **ppvObject )
+{
+ fw_ports *This = impl_from_INetFwOpenPorts( iface );
+
+ TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
+
+ if ( IsEqualGUID( riid, &IID_INetFwOpenPorts ) ||
+ IsEqualGUID( riid, &IID_IDispatch ) ||
+ IsEqualGUID( riid, &IID_IUnknown ) )
+ {
+ *ppvObject = iface;
+ }
+ else
+ {
+ FIXME("interface %s not implemented\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
+ INetFwOpenPorts_AddRef( iface );
+ return S_OK;
+}
+
+static HRESULT WINAPI fw_ports_GetTypeInfoCount(
+ INetFwOpenPorts *iface,
+ UINT *pctinfo )
+{
+ fw_ports *This = impl_from_INetFwOpenPorts( iface );
+
+ FIXME("%p %p\n", This, pctinfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_ports_GetTypeInfo(
+ INetFwOpenPorts *iface,
+ UINT iTInfo,
+ LCID lcid,
+ ITypeInfo **ppTInfo )
+{
+ fw_ports *This = impl_from_INetFwOpenPorts( iface );
+
+ FIXME("%p %u %u %p\n", This, iTInfo, lcid, ppTInfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_ports_GetIDsOfNames(
+ INetFwOpenPorts *iface,
+ REFIID riid,
+ LPOLESTR *rgszNames,
+ UINT cNames,
+ LCID lcid,
+ DISPID *rgDispId )
+{
+ fw_ports *This = impl_from_INetFwOpenPorts( iface );
+
+ FIXME("%p %s %p %u %u %p\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_ports_Invoke(
+ INetFwOpenPorts *iface,
+ DISPID dispIdMember,
+ REFIID riid,
+ LCID lcid,
+ WORD wFlags,
+ DISPPARAMS *pDispParams,
+ VARIANT *pVarResult,
+ EXCEPINFO *pExcepInfo,
+ UINT *puArgErr )
+{
+ fw_ports *This = impl_from_INetFwOpenPorts( iface );
+
+ FIXME("%p %d %s %d %d %p %p %p %p\n", This, dispIdMember, debugstr_guid(riid),
+ lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_ports_get_Count(
+ INetFwOpenPorts *iface,
+ LONG *count)
+{
+ fw_ports *This = impl_from_INetFwOpenPorts( iface );
+
+ FIXME("%p, %p\n", This, count);
+
+ *count = 0;
+ return S_OK;
+}
+
+static HRESULT WINAPI fw_ports_Add(
+ INetFwOpenPorts *iface,
+ INetFwOpenPort *port)
+{
+ fw_ports *This = impl_from_INetFwOpenPorts( iface );
+
+ FIXME("%p, %p\n", This, port);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_ports_Remove(
+ INetFwOpenPorts *iface,
+ LONG portNumber,
+ NET_FW_IP_PROTOCOL ipProtocol)
+{
+ fw_ports *This = impl_from_INetFwOpenPorts( iface );
+
+ FIXME("%p, %d, %u\n", This, portNumber, ipProtocol);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_ports_Item(
+ INetFwOpenPorts *iface,
+ LONG portNumber,
+ NET_FW_IP_PROTOCOL ipProtocol,
+ INetFwOpenPort **openPort)
+{
+ HRESULT hr;
+ fw_ports *This = impl_from_INetFwOpenPorts( iface );
+
+ FIXME("%p, %d, %u, %p\n", This, portNumber, ipProtocol, openPort);
+
+ hr = NetFwOpenPort_create( NULL, (void **)openPort );
+ if (SUCCEEDED(hr))
+ {
+ INetFwOpenPort_put_Protocol( *openPort, ipProtocol );
+ INetFwOpenPort_put_Port( *openPort, portNumber );
+ }
+ return hr;
+}
+
+static HRESULT WINAPI fw_ports_get__NewEnum(
+ INetFwOpenPorts *iface,
+ IUnknown **newEnum)
+{
+ fw_ports *This = impl_from_INetFwOpenPorts( iface );
+
+ FIXME("%p, %p\n", This, newEnum);
+ return E_NOTIMPL;
+}
+
+static const struct INetFwOpenPortsVtbl fw_ports_vtbl =
+{
+ fw_ports_QueryInterface,
+ fw_ports_AddRef,
+ fw_ports_Release,
+ fw_ports_GetTypeInfoCount,
+ fw_ports_GetTypeInfo,
+ fw_ports_GetIDsOfNames,
+ fw_ports_Invoke,
+ fw_ports_get_Count,
+ fw_ports_Add,
+ fw_ports_Remove,
+ fw_ports_Item,
+ fw_ports_get__NewEnum
+};
+
+HRESULT NetFwOpenPorts_create( IUnknown *pUnkOuter, LPVOID *ppObj )
+{
+ fw_ports *fp;
+
+ TRACE("(%p,%p)\n", pUnkOuter, ppObj);
+
+ fp = HeapAlloc( GetProcessHeap(), 0, sizeof(*fp) );
+ if (!fp) return E_OUTOFMEMORY;
+
+ fp->vtbl = &fw_ports_vtbl;
+ fp->refs = 1;
+
+ *ppObj = &fp->vtbl;
+
+ TRACE("returning iface %p\n", *ppObj);
+ return S_OK;
+}
diff --git a/reactos/dll/win32/hnetcfg/profile.c b/reactos/dll/win32/hnetcfg/profile.c
index 91c73afbf21..8536bd7ce69 100644
--- a/reactos/dll/win32/hnetcfg/profile.c
+++ b/reactos/dll/win32/hnetcfg/profile.c
@@ -261,8 +261,8 @@ static HRESULT WINAPI fw_profile_get_GloballyOpenPorts(
{
fw_profile *This = impl_from_INetFwProfile( iface );
- FIXME("%p, %p\n", This, openPorts);
- return E_NOTIMPL;
+ TRACE("%p, %p\n", This, openPorts);
+ return NetFwOpenPorts_create( NULL, (void **)openPorts );
}
static HRESULT WINAPI fw_profile_get_Services(
@@ -271,8 +271,8 @@ static HRESULT WINAPI fw_profile_get_Services(
{
fw_profile *This = impl_from_INetFwProfile( iface );
- FIXME("%p, %p\n", This, Services);
- return E_NOTIMPL;
+ TRACE("%p, %p\n", This, Services);
+ return NetFwServices_create( NULL, (void **)Services );
}
static HRESULT WINAPI fw_profile_get_AuthorizedApplications(
diff --git a/reactos/dll/win32/hnetcfg/regsvr.c b/reactos/dll/win32/hnetcfg/regsvr.c
index e739cc0b76d..829590a3f9a 100644
--- a/reactos/dll/win32/hnetcfg/regsvr.c
+++ b/reactos/dll/win32/hnetcfg/regsvr.c
@@ -400,7 +400,7 @@ static struct regsvr_interface const interface_list[] = {
};
/***********************************************************************
- * DllRegisterServer (INETCOMM.@)
+ * DllRegisterServer (HNETCFG.@)
*/
HRESULT WINAPI DllRegisterServer(void)
{
@@ -415,7 +415,7 @@ HRESULT WINAPI DllRegisterServer(void)
}
/***********************************************************************
- * DllUnregisterServer (INETCOMM.@)
+ * DllUnregisterServer (HNETCFG.@)
*/
HRESULT WINAPI DllUnregisterServer(void)
{
diff --git a/reactos/dll/win32/hnetcfg/service.c b/reactos/dll/win32/hnetcfg/service.c
new file mode 100644
index 00000000000..ecfc00cba25
--- /dev/null
+++ b/reactos/dll/win32/hnetcfg/service.c
@@ -0,0 +1,479 @@
+/*
+ * Copyright 2009 Hans Leidekker for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * 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. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "config.h"
+#include
+#include
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "ole2.h"
+#include "netfw.h"
+
+#include "wine/debug.h"
+#include "wine/unicode.h"
+#include "hnetcfg_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg);
+
+typedef struct fw_service
+{
+ const INetFwServiceVtbl *vtbl;
+ LONG refs;
+} fw_service;
+
+static inline fw_service *impl_from_INetFwService( INetFwService *iface )
+{
+ return (fw_service *)((char *)iface - FIELD_OFFSET( fw_service, vtbl ));
+}
+
+static ULONG WINAPI fw_service_AddRef(
+ INetFwService *iface )
+{
+ fw_service *fw_service = impl_from_INetFwService( iface );
+ return InterlockedIncrement( &fw_service->refs );
+}
+
+static ULONG WINAPI fw_service_Release(
+ INetFwService *iface )
+{
+ fw_service *fw_service = impl_from_INetFwService( iface );
+ LONG refs = InterlockedDecrement( &fw_service->refs );
+ if (!refs)
+ {
+ TRACE("destroying %p\n", fw_service);
+ HeapFree( GetProcessHeap(), 0, fw_service );
+ }
+ return refs;
+}
+
+static HRESULT WINAPI fw_service_QueryInterface(
+ INetFwService *iface,
+ REFIID riid,
+ void **ppvObject )
+{
+ fw_service *This = impl_from_INetFwService( iface );
+
+ TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
+
+ if ( IsEqualGUID( riid, &IID_INetFwService ) ||
+ IsEqualGUID( riid, &IID_IDispatch ) ||
+ IsEqualGUID( riid, &IID_IUnknown ) )
+ {
+ *ppvObject = iface;
+ }
+ else
+ {
+ FIXME("interface %s not implemented\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
+ INetFwService_AddRef( iface );
+ return S_OK;
+}
+
+static HRESULT WINAPI fw_service_GetTypeInfoCount(
+ INetFwService *iface,
+ UINT *pctinfo )
+{
+ fw_service *This = impl_from_INetFwService( iface );
+
+ FIXME("%p %p\n", This, pctinfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_service_GetTypeInfo(
+ INetFwService *iface,
+ UINT iTInfo,
+ LCID lcid,
+ ITypeInfo **ppTInfo )
+{
+ fw_service *This = impl_from_INetFwService( iface );
+
+ FIXME("%p %u %u %p\n", This, iTInfo, lcid, ppTInfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_service_GetIDsOfNames(
+ INetFwService *iface,
+ REFIID riid,
+ LPOLESTR *rgszNames,
+ UINT cNames,
+ LCID lcid,
+ DISPID *rgDispId )
+{
+ fw_service *This = impl_from_INetFwService( iface );
+
+ FIXME("%p %s %p %u %u %p\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_service_Invoke(
+ INetFwService *iface,
+ DISPID dispIdMember,
+ REFIID riid,
+ LCID lcid,
+ WORD wFlags,
+ DISPPARAMS *pDispParams,
+ VARIANT *pVarResult,
+ EXCEPINFO *pExcepInfo,
+ UINT *puArgErr )
+{
+ fw_service *This = impl_from_INetFwService( iface );
+
+ FIXME("%p %d %s %d %d %p %p %p %p\n", This, dispIdMember, debugstr_guid(riid),
+ lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_service_get_Name(
+ INetFwService *iface,
+ BSTR *name )
+{
+ fw_service *This = impl_from_INetFwService( iface );
+
+ FIXME("%p %p\n", This, name);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_service_get_Type(
+ INetFwService *iface,
+ NET_FW_SERVICE_TYPE *type )
+{
+ fw_service *This = impl_from_INetFwService( iface );
+
+ FIXME("%p %p\n", This, type);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_service_get_Customized(
+ INetFwService *iface,
+ VARIANT_BOOL *customized )
+{
+ fw_service *This = impl_from_INetFwService( iface );
+
+ FIXME("%p %p\n", This, customized);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_service_get_IpVersion(
+ INetFwService *iface,
+ NET_FW_IP_VERSION *ipVersion )
+{
+ fw_service *This = impl_from_INetFwService( iface );
+
+ FIXME("%p %p\n", This, ipVersion);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_service_put_IpVersion(
+ INetFwService *iface,
+ NET_FW_IP_VERSION ipVersion )
+{
+ fw_service *This = impl_from_INetFwService( iface );
+
+ FIXME("%p %u\n", This, ipVersion);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_service_get_Scope(
+ INetFwService *iface,
+ NET_FW_SCOPE *scope )
+{
+ fw_service *This = impl_from_INetFwService( iface );
+
+ FIXME("%p %p\n", This, scope);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_service_put_Scope(
+ INetFwService *iface,
+ NET_FW_SCOPE scope )
+{
+ fw_service *This = impl_from_INetFwService( iface );
+
+ FIXME("%p %u\n", This, scope);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_service_get_RemoteAddresses(
+ INetFwService *iface,
+ BSTR *remoteAddrs )
+{
+ fw_service *This = impl_from_INetFwService( iface );
+
+ FIXME("%p %p\n", This, remoteAddrs);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_service_put_RemoteAddresses(
+ INetFwService *iface,
+ BSTR remoteAddrs )
+{
+ fw_service *This = impl_from_INetFwService( iface );
+
+ FIXME("%p %s\n", This, debugstr_w(remoteAddrs));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_service_get_Enabled(
+ INetFwService *iface,
+ VARIANT_BOOL *enabled )
+{
+ fw_service *This = impl_from_INetFwService( iface );
+
+ FIXME("%p %p\n", This, enabled);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_service_put_Enabled(
+ INetFwService *iface,
+ VARIANT_BOOL enabled )
+{
+ fw_service *This = impl_from_INetFwService( iface );
+
+ FIXME("%p %d\n", This, enabled);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_service_get_GloballyOpenPorts(
+ INetFwService *iface,
+ INetFwOpenPorts **openPorts )
+{
+ fw_service *This = impl_from_INetFwService( iface );
+
+ TRACE("%p %p\n", This, openPorts);
+ return NetFwOpenPorts_create( NULL, (void **)openPorts );
+}
+
+static const struct INetFwServiceVtbl fw_service_vtbl =
+{
+ fw_service_QueryInterface,
+ fw_service_AddRef,
+ fw_service_Release,
+ fw_service_GetTypeInfoCount,
+ fw_service_GetTypeInfo,
+ fw_service_GetIDsOfNames,
+ fw_service_Invoke,
+ fw_service_get_Name,
+ fw_service_get_Type,
+ fw_service_get_Customized,
+ fw_service_get_IpVersion,
+ fw_service_put_IpVersion,
+ fw_service_get_Scope,
+ fw_service_put_Scope,
+ fw_service_get_RemoteAddresses,
+ fw_service_put_RemoteAddresses,
+ fw_service_get_Enabled,
+ fw_service_put_Enabled,
+ fw_service_get_GloballyOpenPorts
+};
+
+static HRESULT NetFwService_create( IUnknown *pUnkOuter, LPVOID *ppObj )
+{
+ fw_service *fp;
+
+ TRACE("(%p,%p)\n", pUnkOuter, ppObj);
+
+ fp = HeapAlloc( GetProcessHeap(), 0, sizeof(*fp) );
+ if (!fp) return E_OUTOFMEMORY;
+
+ fp->vtbl = &fw_service_vtbl;
+ fp->refs = 1;
+
+ *ppObj = &fp->vtbl;
+
+ TRACE("returning iface %p\n", *ppObj);
+ return S_OK;
+}
+
+typedef struct fw_services
+{
+ const INetFwServicesVtbl *vtbl;
+ LONG refs;
+} fw_services;
+
+static inline fw_services *impl_from_INetFwServices( INetFwServices *iface )
+{
+ return (fw_services *)((char *)iface - FIELD_OFFSET( fw_services, vtbl ));
+}
+
+static ULONG WINAPI fw_services_AddRef(
+ INetFwServices *iface )
+{
+ fw_services *fw_services = impl_from_INetFwServices( iface );
+ return InterlockedIncrement( &fw_services->refs );
+}
+
+static ULONG WINAPI fw_services_Release(
+ INetFwServices *iface )
+{
+ fw_services *fw_services = impl_from_INetFwServices( iface );
+ LONG refs = InterlockedDecrement( &fw_services->refs );
+ if (!refs)
+ {
+ TRACE("destroying %p\n", fw_services);
+ HeapFree( GetProcessHeap(), 0, fw_services );
+ }
+ return refs;
+}
+
+static HRESULT WINAPI fw_services_QueryInterface(
+ INetFwServices *iface,
+ REFIID riid,
+ void **ppvObject )
+{
+ fw_services *This = impl_from_INetFwServices( iface );
+
+ TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
+
+ if ( IsEqualGUID( riid, &IID_INetFwServices ) ||
+ IsEqualGUID( riid, &IID_IDispatch ) ||
+ IsEqualGUID( riid, &IID_IUnknown ) )
+ {
+ *ppvObject = iface;
+ }
+ else
+ {
+ FIXME("interface %s not implemented\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
+ INetFwServices_AddRef( iface );
+ return S_OK;
+}
+
+static HRESULT WINAPI fw_services_GetTypeInfoCount(
+ INetFwServices *iface,
+ UINT *pctinfo )
+{
+ fw_services *This = impl_from_INetFwServices( iface );
+
+ FIXME("%p %p\n", This, pctinfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_services_GetTypeInfo(
+ INetFwServices *iface,
+ UINT iTInfo,
+ LCID lcid,
+ ITypeInfo **ppTInfo )
+{
+ fw_services *This = impl_from_INetFwServices( iface );
+
+ FIXME("%p %u %u %p\n", This, iTInfo, lcid, ppTInfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_services_GetIDsOfNames(
+ INetFwServices *iface,
+ REFIID riid,
+ LPOLESTR *rgszNames,
+ UINT cNames,
+ LCID lcid,
+ DISPID *rgDispId )
+{
+ fw_services *This = impl_from_INetFwServices( iface );
+
+ FIXME("%p %s %p %u %u %p\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_services_Invoke(
+ INetFwServices *iface,
+ DISPID dispIdMember,
+ REFIID riid,
+ LCID lcid,
+ WORD wFlags,
+ DISPPARAMS *pDispParams,
+ VARIANT *pVarResult,
+ EXCEPINFO *pExcepInfo,
+ UINT *puArgErr )
+{
+ fw_services *This = impl_from_INetFwServices( iface );
+
+ FIXME("%p %d %s %d %d %p %p %p %p\n", This, dispIdMember, debugstr_guid(riid),
+ lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_services_get_Count(
+ INetFwServices *iface,
+ LONG *count )
+{
+ fw_services *This = impl_from_INetFwServices( iface );
+
+ FIXME("%p, %p\n", This, count);
+
+ *count = 0;
+ return S_OK;
+}
+
+static HRESULT WINAPI fw_services_Item(
+ INetFwServices *iface,
+ NET_FW_SERVICE_TYPE svcType,
+ INetFwService **service )
+{
+ fw_services *This = impl_from_INetFwServices( iface );
+
+ FIXME("%p, %u, %p\n", This, svcType, service);
+ return NetFwService_create( NULL, (void **)service );
+}
+
+static HRESULT WINAPI fw_services_get__NewEnum(
+ INetFwServices *iface,
+ IUnknown **newEnum )
+{
+ fw_services *This = impl_from_INetFwServices( iface );
+
+ FIXME("%p, %p\n", This, newEnum);
+ return E_NOTIMPL;
+}
+
+static const struct INetFwServicesVtbl fw_services_vtbl =
+{
+ fw_services_QueryInterface,
+ fw_services_AddRef,
+ fw_services_Release,
+ fw_services_GetTypeInfoCount,
+ fw_services_GetTypeInfo,
+ fw_services_GetIDsOfNames,
+ fw_services_Invoke,
+ fw_services_get_Count,
+ fw_services_Item,
+ fw_services_get__NewEnum
+};
+
+HRESULT NetFwServices_create( IUnknown *pUnkOuter, LPVOID *ppObj )
+{
+ fw_services *fp;
+
+ TRACE("(%p,%p)\n", pUnkOuter, ppObj);
+
+ fp = HeapAlloc( GetProcessHeap(), 0, sizeof(*fp) );
+ if (!fp) return E_OUTOFMEMORY;
+
+ fp->vtbl = &fw_services_vtbl;
+ fp->refs = 1;
+
+ *ppObj = &fp->vtbl;
+
+ TRACE("returning iface %p\n", *ppObj);
+ return S_OK;
+}
diff --git a/reactos/dll/win32/initpki/initpki.spec b/reactos/dll/win32/initpki/initpki.spec
index 51d80bc8ea3..e9db624e78a 100644
--- a/reactos/dll/win32/initpki/initpki.spec
+++ b/reactos/dll/win32/initpki/initpki.spec
@@ -1,4 +1,4 @@
@ stub DllInstall
-@ stub DllRegisterServer
-@ stub DllUnregisterServer
+@ stdcall -private DllRegisterServer()
+@ stdcall -private DllUnregisterServer()
@ stub InitializePKI
diff --git a/reactos/dll/win32/initpki/main.c b/reactos/dll/win32/initpki/main.c
index d936dd819de..caa00365649 100644
--- a/reactos/dll/win32/initpki/main.c
+++ b/reactos/dll/win32/initpki/main.c
@@ -44,3 +44,21 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
}
return TRUE;
}
+
+/*****************************************************
+ * DllRegisterServer (INITPKI.@)
+ */
+HRESULT WINAPI DllRegisterServer(void)
+{
+ FIXME("Not implemented.\n");
+ return E_UNEXPECTED;
+}
+
+/*****************************************************
+ * DllUnregisterServer (INITPKI.@)
+ */
+HRESULT WINAPI DllUnregisterServer(void)
+{
+ FIXME("Not implemented.\n");
+ return E_UNEXPECTED;
+}
diff --git a/reactos/dll/win32/localspl/localspl.rc b/reactos/dll/win32/localspl/localspl.rc
index 71c1e4604b9..baaba648f02 100644
--- a/reactos/dll/win32/localspl/localspl.rc
+++ b/reactos/dll/win32/localspl/localspl.rc
@@ -36,17 +36,21 @@
#include "wine/wine_common_ver.rc"
-#include "spl_En.rc"
#include "spl_Da.rc"
-#include "spl_De.rc"
+#include "spl_En.rc"
#include "spl_Fr.rc"
#include "spl_Ko.rc"
#include "spl_Nl.rc"
#include "spl_No.rc"
#include "spl_Pl.rc"
#include "spl_Pt.rc"
+#include "spl_Sv.rc"
+
+/* UTF-8 */
+#include "spl_De.rc"
+#include "spl_Es.rc"
+#include "spl_Lt.rc"
#include "spl_Ro.rc"
#include "spl_Ru.rc"
#include "spl_Si.rc"
-#include "spl_Sv.rc"
#include "spl_Zh.rc"
diff --git a/reactos/dll/win32/localspl/localspl_private.h b/reactos/dll/win32/localspl/localspl_private.h
index 5174a1a847e..952c1f6652d 100644
--- a/reactos/dll/win32/localspl/localspl_private.h
+++ b/reactos/dll/win32/localspl/localspl_private.h
@@ -21,6 +21,7 @@
#ifndef __WINE_LOCALSPL_PRIVATE__
#define __WINE_LOCALSPL_PRIVATE__
+#include
/* ## DLL-wide Globals ## */
extern HINSTANCE LOCALSPL_hInstance;
diff --git a/reactos/dll/win32/localspl/provider.c b/reactos/dll/win32/localspl/provider.c
index 79541db9937..b17e074b845 100644
--- a/reactos/dll/win32/localspl/provider.c
+++ b/reactos/dll/win32/localspl/provider.c
@@ -103,14 +103,23 @@ static const WCHAR default_devmodeW[] = {'D','e','f','a','u','l','t',' ','D','e'
static const WCHAR dependent_filesW[] = {'D','e','p','e','n','d','e','n','t',' ','F','i','l','e','s',0};
static const WCHAR descriptionW[] = {'D','e','s','c','r','i','p','t','i','o','n',0};
static const WCHAR driverW[] = {'D','r','i','v','e','r',0};
+static const WCHAR emptyW[] = {0};
static const WCHAR fmt_driversW[] = { 'S','y','s','t','e','m','\\',
'C','u', 'r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
'c','o','n','t','r','o','l','\\',
'P','r','i','n','t','\\',
'E','n','v','i','r','o','n','m','e','n','t','s','\\',
'%','s','\\','D','r','i','v','e','r','s','%','s',0 };
+static const WCHAR fmt_printprocessorsW[] = { 'S','y','s','t','e','m','\\',
+ 'C','u', 'r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
+ 'C','o','n','t','r','o','l','\\',
+ 'P','r','i','n','t','\\',
+ 'E','n','v','i','r','o','n','m','e','n','t','s','\\','%','s','\\',
+ 'P','r','i','n','t',' ','P','r','o','c','e','s','s','o','r','s',0 };
static const WCHAR hardwareidW[] = {'H','a','r','d','w','a','r','e','I','D',0};
static const WCHAR help_fileW[] = {'H','e','l','p',' ','F','i','l','e',0};
+static const WCHAR ia64_envnameW[] = {'W','i','n','d','o','w','s',' ','I','A','6','4',0};
+static const WCHAR ia64_subdirW[] = {'i','a','6','4',0};
static const WCHAR localportW[] = {'L','o','c','a','l',' ','P','o','r','t',0};
static const WCHAR locationW[] = {'L','o','c','a','t','i','o','n',0};
static const WCHAR manufacturerW[] = {'M','a','n','u','f','a','c','t','u','r','e','r',0};
@@ -132,6 +141,7 @@ static const WCHAR printersW[] = {'S','y','s','t','e','m','\\',
'P','r','i','n','t','\\',
'P','r','i','n','t','e','r','s',0};
static const WCHAR spooldriversW[] = {'\\','s','p','o','o','l','\\','d','r','i','v','e','r','s','\\',0};
+static const WCHAR spoolprtprocsW[] = {'\\','s','p','o','o','l','\\','p','r','t','p','r','o','c','s','\\',0};
static const WCHAR version0_regpathW[] = {'\\','V','e','r','s','i','o','n','-','0',0};
static const WCHAR version0_subdirW[] = {'\\','0',0};
static const WCHAR version3_regpathW[] = {'\\','V','e','r','s','i','o','n','-','3',0};
@@ -144,6 +154,7 @@ static const WCHAR winnt_cv_portsW[] = {'S','o','f','t','w','a','r','e','\\',
'W','i','n','d','o','w','s',' ','N','T','\\',
'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
'P','o','r','t','s',0};
+static const WCHAR winprintW[] = {'w','i','n','p','r','i','n','t',0};
static const WCHAR x64_envnameW[] = {'W','i','n','d','o','w','s',' ','x','6','4',0};
static const WCHAR x64_subdirW[] = {'x','6','4',0};
static const WCHAR x86_envnameW[] = {'W','i','n','d','o','w','s',' ','N','T',' ','x','8','6',0};
@@ -152,6 +163,9 @@ static const WCHAR XcvMonitorW[] = {',','X','c','v','M','o','n','i','t','o','r',
static const WCHAR XcvPortW[] = {',','X','c','v','P','o','r','t',' ',0};
+static const printenv_t env_ia64 = {ia64_envnameW, ia64_subdirW, 3,
+ version3_regpathW, version3_subdirW};
+
static const printenv_t env_x86 = {x86_envnameW, x86_subdirW, 3,
version3_regpathW, version3_subdirW};
@@ -161,7 +175,7 @@ static const printenv_t env_x64 = {x64_envnameW, x64_subdirW, 3,
static const printenv_t env_win40 = {win40_envnameW, win40_subdirW, 0,
version0_regpathW, version0_subdirW};
-static const printenv_t * const all_printenv[] = {&env_x86, &env_x64, &env_win40};
+static const printenv_t * const all_printenv[] = {&env_x86, &env_x64, &env_ia64, &env_win40};
static const DWORD di_sizeof[] = {0, sizeof(DRIVER_INFO_1W), sizeof(DRIVER_INFO_2W),
@@ -184,7 +198,7 @@ static LPWSTR strdupW(LPCWSTR p)
if(!p) return NULL;
len = (lstrlenW(p) + 1) * sizeof(WCHAR);
ret = heap_alloc(len);
- memcpy(ret, p, len);
+ if (ret) memcpy(ret, p, len);
return ret;
}
@@ -345,7 +359,7 @@ static void monitor_unload(monitor_t * pm)
/******************************************************************
* monitor_unloadall [internal]
*
- * release all printmonitors and unload them from memory, when needed
+ * release all registered printmonitors and unload them from memory, when needed
*
*/
@@ -358,7 +372,8 @@ static void monitor_unloadall(void)
/* iterate through the list, with safety against removal */
LIST_FOR_EACH_ENTRY_SAFE(pm, next, &monitor_handles, monitor_t, entry)
{
- monitor_unload(pm);
+ /* skip monitorui dlls */
+ if (pm->monitor) monitor_unload(pm);
}
LeaveCriticalSection(&monitor_handles_cs);
}
@@ -556,6 +571,47 @@ static DWORD monitor_loadall(void)
return loaded;
}
+/******************************************************************
+ * monitor_loadui [internal]
+ *
+ * load the userinterface-dll for a given portmonitor
+ *
+ * On failure, NULL is returned
+ */
+static monitor_t * monitor_loadui(monitor_t * pm)
+{
+ monitor_t * pui = NULL;
+ WCHAR buffer[MAX_PATH];
+ HANDLE hXcv;
+ DWORD len;
+ DWORD res;
+
+ if (pm == NULL) return NULL;
+ TRACE("(%p) => dllname: %s\n", pm, debugstr_w(pm->dllname));
+
+ /* Try the Portmonitor first; works for many monitors */
+ if (pm->monitorUI) {
+ EnterCriticalSection(&monitor_handles_cs);
+ pm->refcount++;
+ LeaveCriticalSection(&monitor_handles_cs);
+ return pm;
+ }
+
+ /* query the userinterface-dllname from the Portmonitor */
+ if ((pm->monitor) && (pm->monitor->pfnXcvDataPort)) {
+ /* building (",XcvMonitor %s",pm->name) not needed yet */
+ res = pm->monitor->pfnXcvOpenPort(emptyW, SERVER_ACCESS_ADMINISTER, &hXcv);
+ TRACE("got %u with %p\n", res, hXcv);
+ if (res) {
+ res = pm->monitor->pfnXcvDataPort(hXcv, monitorUIW, NULL, 0, (BYTE *) buffer, sizeof(buffer), &len);
+ TRACE("got %u with %s\n", res, debugstr_w(buffer));
+ if (res == ERROR_SUCCESS) pui = monitor_load(NULL, buffer);
+ pm->monitor->pfnXcvClosePort(hXcv);
+ }
+ }
+ return pui;
+}
+
/******************************************************************
* monitor_load_by_port [internal]
*
@@ -776,6 +832,92 @@ static DWORD get_local_monitors(DWORD level, LPBYTE pMonitors, DWORD cbBuf, LPDW
return needed;
}
+/*****************************************************************************
+ * enumerate the local print processors (INTERNAL)
+ *
+ * returns the needed size (in bytes) for pPPInfo
+ * and *lpreturned is set to number of entries returned in pPPInfo
+ *
+ */
+static DWORD get_local_printprocessors(LPWSTR regpathW, LPBYTE pPPInfo, DWORD cbBuf, LPDWORD lpreturned)
+{
+ HKEY hroot = NULL;
+ HKEY hentry = NULL;
+ LPWSTR ptr;
+ PPRINTPROCESSOR_INFO_1W ppi;
+ WCHAR buffer[MAX_PATH];
+ WCHAR dllname[MAX_PATH];
+ DWORD dllsize;
+ DWORD len;
+ DWORD index = 0;
+ DWORD needed = 0;
+ DWORD numentries;
+
+ numentries = *lpreturned; /* this is 0, when we scan the registry */
+ len = numentries * sizeof(PRINTPROCESSOR_INFO_1W);
+ ptr = (LPWSTR) &pPPInfo[len];
+
+ numentries = 0;
+ len = sizeof(buffer)/sizeof(buffer[0]);
+ buffer[0] = '\0';
+
+ if (RegCreateKeyW(HKEY_LOCAL_MACHINE, regpathW, &hroot) == ERROR_SUCCESS) {
+ /* add "winprint" first */
+ numentries++;
+ needed = sizeof(PRINTPROCESSOR_INFO_1W) + sizeof(winprintW);
+ if (pPPInfo && (cbBuf >= needed)){
+ ppi = (PPRINTPROCESSOR_INFO_1W) pPPInfo;
+ pPPInfo += sizeof(PRINTPROCESSOR_INFO_1W);
+
+ TRACE("%p: writing PRINTPROCESSOR_INFO_1W #%d\n", ppi, numentries);
+ ppi->pName = ptr;
+ lstrcpyW(ptr, winprintW); /* Name of the Print Processor */
+ ptr += sizeof(winprintW) / sizeof(WCHAR);
+ }
+
+ /* Scan all Printprocessor Keys */
+ while ((RegEnumKeyExW(hroot, index, buffer, &len, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) &&
+ (lstrcmpiW(buffer, winprintW) != 0)) {
+ TRACE("PrintProcessor_%d: %s\n", numentries, debugstr_w(buffer));
+ dllsize = sizeof(dllname);
+ dllname[0] = '\0';
+
+ /* The Print Processor must have a Driver-DLL */
+ if (RegOpenKeyExW(hroot, buffer, 0, KEY_READ, &hentry) == ERROR_SUCCESS) {
+ if (RegQueryValueExW(hentry, driverW, NULL, NULL, (LPBYTE) dllname, &dllsize) == ERROR_SUCCESS) {
+ /* We found a valid DLL for this Print Processor */
+ TRACE("using Driver: %s\n", debugstr_w(dllname));
+ }
+ RegCloseKey(hentry);
+ }
+
+ if (dllname[0]) {
+ numentries++;
+ needed += sizeof(PRINTPROCESSOR_INFO_1W);
+ needed += (len+1) * sizeof(WCHAR); /* len is lstrlenW(printprocessor name) */
+
+ /* required size is calculated. Now fill the user-buffer */
+ if (pPPInfo && (cbBuf >= needed)){
+ ppi = (PPRINTPROCESSOR_INFO_1W) pPPInfo;
+ pPPInfo += sizeof(PRINTPROCESSOR_INFO_1W);
+
+ TRACE("%p: writing PRINTPROCESSOR_INFO_1W #%d\n", ppi, numentries);
+ ppi->pName = ptr;
+ lstrcpyW(ptr, buffer); /* Name of the Print Processor */
+ ptr += (len+1); /* len is lstrlenW(printprosessor name) */
+ }
+ }
+ index++;
+ len = sizeof(buffer)/sizeof(buffer[0]);
+ buffer[0] = '\0';
+ }
+ RegCloseKey(hroot);
+ }
+ *lpreturned = numentries;
+ TRACE("need %d byte for %d entries\n", needed, numentries);
+ return needed;
+}
+
/******************************************************************
* enumerate the local Ports from all loaded monitors (internal)
*
@@ -1152,7 +1294,6 @@ end:
*/
static BOOL myAddPrinterDriverEx(DWORD level, LPBYTE pDriverInfo, DWORD dwFileCopyFlags, BOOL lazy)
{
- static const WCHAR emptyW[1];
const printenv_t *env;
apd_data_t apd;
DRIVER_INFO_8W di;
@@ -1415,6 +1556,136 @@ static BOOL WINAPI fpAddMonitor(LPWSTR pName, DWORD Level, LPBYTE pMonitors)
return (res);
}
+/******************************************************************************
+ * fpAddPort [exported through PRINTPROVIDOR]
+ *
+ * Add a Port for a specific Monitor
+ *
+ * PARAMS
+ * pName [I] Servername or NULL (local Computer)
+ * hWnd [I] Handle to parent Window for the Dialog-Box
+ * pMonitorName [I] Name of the Monitor that manage the Port
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
+ *
+ */
+static BOOL WINAPI fpAddPort(LPWSTR pName, HWND hWnd, LPWSTR pMonitorName)
+{
+ monitor_t * pm;
+ monitor_t * pui;
+ LONG lres;
+ DWORD res;
+
+ TRACE("(%s, %p, %s)\n", debugstr_w(pName), hWnd, debugstr_w(pMonitorName));
+
+ lres = copy_servername_from_name(pName, NULL);
+ if (lres) {
+ FIXME("server %s not supported\n", debugstr_w(pName));
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ /* an empty Monitorname is Invalid */
+ if (!pMonitorName[0]) {
+ SetLastError(ERROR_NOT_SUPPORTED);
+ return FALSE;
+ }
+
+ pm = monitor_load(pMonitorName, NULL);
+ if (pm && pm->monitor && pm->monitor->pfnAddPort) {
+ res = pm->monitor->pfnAddPort(pName, hWnd, pMonitorName);
+ TRACE("got %d with %u (%s)\n", res, GetLastError(), debugstr_w(pm->dllname));
+ }
+ else
+ {
+ pui = monitor_loadui(pm);
+ if (pui && pui->monitorUI && pui->monitorUI->pfnAddPortUI) {
+ res = pui->monitorUI->pfnAddPortUI(pName, hWnd, pMonitorName, NULL);
+ TRACE("got %d with %u (%s)\n", res, GetLastError(), debugstr_w(pui->dllname));
+ }
+ else
+ {
+ FIXME("not implemented for %s (monitor %p: %s / monitorui %p: %s)\n",
+ debugstr_w(pMonitorName), pm, debugstr_w(pm ? pm->dllname : NULL),
+ pui, debugstr_w(pui ? pui->dllname : NULL));
+
+ SetLastError(ERROR_NOT_SUPPORTED);
+ res = FALSE;
+ }
+ monitor_unload(pui);
+ }
+ monitor_unload(pm);
+
+ TRACE("returning %d with %u\n", res, GetLastError());
+ return res;
+}
+
+/******************************************************************************
+ * fpAddPortEx [exported through PRINTPROVIDOR]
+ *
+ * Add a Port for a specific Monitor, without presenting a user interface
+ *
+ * PARAMS
+ * pName [I] Servername or NULL (local Computer)
+ * level [I] Structure-Level (1 or 2) for pBuffer
+ * pBuffer [I] PTR to: PORT_INFO_1 or PORT_INFO_2
+ * pMonitorName [I] Name of the Monitor that manage the Port
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
+ *
+ */
+static BOOL WINAPI fpAddPortEx(LPWSTR pName, DWORD level, LPBYTE pBuffer, LPWSTR pMonitorName)
+{
+ PORT_INFO_2W * pi2;
+ monitor_t * pm;
+ DWORD lres;
+ DWORD res;
+
+ pi2 = (PORT_INFO_2W *) pBuffer;
+
+ TRACE("(%s, %d, %p, %s): %s %s %s\n", debugstr_w(pName), level, pBuffer,
+ debugstr_w(pMonitorName), debugstr_w(pi2 ? pi2->pPortName : NULL),
+ debugstr_w(((level > 1) && pi2) ? pi2->pMonitorName : NULL),
+ debugstr_w(((level > 1) && pi2) ? pi2->pDescription : NULL));
+
+ lres = copy_servername_from_name(pName, NULL);
+ if (lres) {
+ FIXME("server %s not supported\n", debugstr_w(pName));
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ if ((level < 1) || (level > 2)) {
+ SetLastError(ERROR_INVALID_LEVEL);
+ return FALSE;
+ }
+
+ if ((!pi2) || (!pMonitorName) || (!pMonitorName[0])) {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ /* load the Monitor */
+ pm = monitor_load(pMonitorName, NULL);
+ if (pm && pm->monitor && pm->monitor->pfnAddPortEx) {
+ res = pm->monitor->pfnAddPortEx(pName, level, pBuffer, pMonitorName);
+ TRACE("got %d with %u (%s)\n", res, GetLastError(), debugstr_w(pm->dllname));
+ }
+ else
+ {
+ FIXME("not implemented for %s (monitor %p: %s)\n",
+ debugstr_w(pMonitorName), pm, pm ? debugstr_w(pm->dllname) : NULL);
+ SetLastError(ERROR_INVALID_PARAMETER);
+ res = FALSE;
+ }
+ monitor_unload(pm);
+ return res;
+}
+
/******************************************************************************
* fpAddPrinterDriverEx [exported through PRINTPROVIDOR]
*
@@ -1476,6 +1747,75 @@ static BOOL WINAPI fpClosePrinter(HANDLE hPrinter)
return FALSE;
}
+/******************************************************************************
+ * fpConfigurePort [exported through PRINTPROVIDOR]
+ *
+ * Display the Configuration-Dialog for a specific Port
+ *
+ * PARAMS
+ * pName [I] Servername or NULL (local Computer)
+ * hWnd [I] Handle to parent Window for the Dialog-Box
+ * pPortName [I] Name of the Port, that should be configured
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
+ *
+ */
+static BOOL WINAPI fpConfigurePort(LPWSTR pName, HWND hWnd, LPWSTR pPortName)
+{
+ monitor_t * pm;
+ monitor_t * pui;
+ LONG lres;
+ DWORD res;
+
+ TRACE("(%s, %p, %s)\n", debugstr_w(pName), hWnd, debugstr_w(pPortName));
+
+ lres = copy_servername_from_name(pName, NULL);
+ if (lres) {
+ FIXME("server %s not supported\n", debugstr_w(pName));
+ SetLastError(ERROR_INVALID_NAME);
+ return FALSE;
+ }
+
+ /* an empty Portname is Invalid, but can popup a Dialog */
+ if (!pPortName[0]) {
+ SetLastError(ERROR_NOT_SUPPORTED);
+ return FALSE;
+ }
+
+ pm = monitor_load_by_port(pPortName);
+ if (pm && pm->monitor && pm->monitor->pfnConfigurePort) {
+ TRACE("use %s for %s (monitor %p: %s)\n", debugstr_w(pm->name),
+ debugstr_w(pPortName), pm, debugstr_w(pm->dllname));
+ res = pm->monitor->pfnConfigurePort(pName, hWnd, pPortName);
+ TRACE("got %d with %u\n", res, GetLastError());
+ }
+ else
+ {
+ pui = monitor_loadui(pm);
+ if (pui && pui->monitorUI && pui->monitorUI->pfnConfigurePortUI) {
+ TRACE("use %s for %s (monitorui %p: %s)\n", debugstr_w(pui->name),
+ debugstr_w(pPortName), pui, debugstr_w(pui->dllname));
+ res = pui->monitorUI->pfnConfigurePortUI(pName, hWnd, pPortName);
+ TRACE("got %d with %u\n", res, GetLastError());
+ }
+ else
+ {
+ FIXME("not implemented for %s (monitor %p: %s / monitorui %p: %s)\n",
+ debugstr_w(pPortName), pm, debugstr_w(pm ? pm->dllname : NULL),
+ pui, debugstr_w(pui ? pui->dllname : NULL));
+
+ SetLastError(ERROR_NOT_SUPPORTED);
+ res = FALSE;
+ }
+ monitor_unload(pui);
+ }
+ monitor_unload(pm);
+
+ TRACE("returning %d with %u\n", res, GetLastError());
+ return res;
+}
/******************************************************************
* fpDeleteMonitor [exported through PRINTPROVIDOR]
@@ -1537,6 +1877,76 @@ static BOOL WINAPI fpDeleteMonitor(LPWSTR pName, LPWSTR pEnvironment, LPWSTR pMo
return FALSE;
}
+/*****************************************************************************
+ * fpDeletePort [exported through PRINTPROVIDOR]
+ *
+ * Delete a specific Port
+ *
+ * PARAMS
+ * pName [I] Servername or NULL (local Computer)
+ * hWnd [I] Handle to parent Window for the Dialog-Box
+ * pPortName [I] Name of the Port, that should be deleted
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
+ *
+ */
+static BOOL WINAPI fpDeletePort(LPWSTR pName, HWND hWnd, LPWSTR pPortName)
+{
+ monitor_t * pm;
+ monitor_t * pui;
+ LONG lres;
+ DWORD res;
+
+ TRACE("(%s, %p, %s)\n", debugstr_w(pName), hWnd, debugstr_w(pPortName));
+
+ lres = copy_servername_from_name(pName, NULL);
+ if (lres) {
+ FIXME("server %s not supported\n", debugstr_w(pName));
+ SetLastError(ERROR_INVALID_NAME);
+ return FALSE;
+ }
+
+ /* an empty Portname is Invalid */
+ if (!pPortName[0]) {
+ SetLastError(ERROR_NOT_SUPPORTED);
+ return FALSE;
+ }
+
+ pm = monitor_load_by_port(pPortName);
+ if (pm && pm->monitor && pm->monitor->pfnDeletePort) {
+ TRACE("use %s for %s (monitor %p: %s)\n", debugstr_w(pm->name),
+ debugstr_w(pPortName), pm, debugstr_w(pm->dllname));
+ res = pm->monitor->pfnDeletePort(pName, hWnd, pPortName);
+ TRACE("got %d with %u\n", res, GetLastError());
+ }
+ else
+ {
+ pui = monitor_loadui(pm);
+ if (pui && pui->monitorUI && pui->monitorUI->pfnDeletePortUI) {
+ TRACE("use %s for %s (monitorui %p: %s)\n", debugstr_w(pui->name),
+ debugstr_w(pPortName), pui, debugstr_w(pui->dllname));
+ res = pui->monitorUI->pfnDeletePortUI(pName, hWnd, pPortName);
+ TRACE("got %d with %u\n", res, GetLastError());
+ }
+ else
+ {
+ FIXME("not implemented for %s (monitor %p: %s / monitorui %p: %s)\n",
+ debugstr_w(pPortName), pm, debugstr_w(pm ? pm->dllname : NULL),
+ pui, debugstr_w(pui ? pui->dllname : NULL));
+
+ SetLastError(ERROR_NOT_SUPPORTED);
+ res = FALSE;
+ }
+ monitor_unload(pui);
+ }
+ monitor_unload(pm);
+
+ TRACE("returning %d with %u\n", res, GetLastError());
+ return res;
+}
+
/*****************************************************************************
* fpEnumMonitors [exported through PRINTPROVIDOR]
*
@@ -1689,6 +2099,156 @@ emP_cleanup:
return (res);
}
+/*****************************************************************************
+ * fpEnumPrintProcessors [exported through PRINTPROVIDOR]
+ *
+ * Enumerate available Print Processors
+ *
+ * PARAMS
+ * pName [I] Servername or NULL (local Computer)
+ * pEnvironment [I] Printing-Environment or NULL (Default)
+ * Level [I] Structure-Level (Only 1 is allowed)
+ * pPPInfo [O] PTR to Buffer that receives the Result
+ * cbBuf [I] Size of Buffer at pMonitors
+ * pcbNeeded [O] PTR to DWORD that receives the size in Bytes used / required for pPPInfo
+ * pcReturned [O] PTR to DWORD that receives the number of Print Processors in pPPInfo
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE and in pcbNeeded the Bytes required for pPPInfo, if cbBuf is too small
+ *
+ */
+static BOOL WINAPI fpEnumPrintProcessors(LPWSTR pName, LPWSTR pEnvironment, DWORD Level,
+ LPBYTE pPPInfo, DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned)
+{
+ const printenv_t * env;
+ LPWSTR regpathW = NULL;
+ DWORD numentries = 0;
+ DWORD needed = 0;
+ LONG lres;
+ BOOL res = FALSE;
+
+ TRACE("(%s, %s, %d, %p, %d, %p, %p)\n", debugstr_w(pName), debugstr_w(pEnvironment),
+ Level, pPPInfo, cbBuf, pcbNeeded, pcReturned);
+
+ lres = copy_servername_from_name(pName, NULL);
+ if (lres) {
+ FIXME("server %s not supported\n", debugstr_w(pName));
+ SetLastError(ERROR_INVALID_NAME);
+ goto epp_cleanup;
+ }
+
+ if (Level != 1) {
+ SetLastError(ERROR_INVALID_LEVEL);
+ goto epp_cleanup;
+ }
+
+ env = validate_envW(pEnvironment);
+ if (!env)
+ goto epp_cleanup; /* ERROR_INVALID_ENVIRONMENT */
+
+ regpathW = heap_alloc(sizeof(fmt_printprocessorsW) +
+ (lstrlenW(env->envname) * sizeof(WCHAR)));
+
+ if (!regpathW)
+ goto epp_cleanup;
+
+ wsprintfW(regpathW, fmt_printprocessorsW, env->envname);
+
+ /* Scan all Printprocessor-Keys */
+ numentries = 0;
+ needed = get_local_printprocessors(regpathW, NULL, 0, &numentries);
+
+ /* we calculated the needed buffersize. now do more error-checks */
+ if (cbBuf < needed) {
+ SetLastError(ERROR_INSUFFICIENT_BUFFER);
+ goto epp_cleanup;
+ }
+
+ /* fill the Buffer with the Printprocessor Infos */
+ needed = get_local_printprocessors(regpathW, pPPInfo, cbBuf, &numentries);
+ res = TRUE;
+
+epp_cleanup:
+ heap_free(regpathW);
+ if (pcbNeeded) *pcbNeeded = needed;
+ if (pcReturned) *pcReturned = numentries;
+
+ TRACE("returning %d with %d (%d byte for %d entries)\n",
+ res, GetLastError(), needed, numentries);
+
+ return (res);
+}
+
+/******************************************************************************
+ * fpGetPrintProcessorDirectory [exported through PRINTPROVIDOR]
+ *
+ * Return the PATH for the Print-Processors
+ *
+ * PARAMS
+ * pName [I] Servername or NULL (this computer)
+ * pEnvironment [I] Printing-Environment or NULL (Default)
+ * level [I] Structure-Level (must be 1)
+ * pPPInfo [O] PTR to Buffer that receives the Result
+ * cbBuf [I] Size of Buffer at pPPInfo
+ * pcbNeeded [O] PTR to DWORD that receives the size in Bytes used / required for pPPInfo
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE and in pcbNeeded the Bytes required for pPPInfo, if cbBuf is too small
+ *
+ * Native Values returned in pPPInfo on Success for this computer:
+ *| NT(Windows x64): "%winsysdir%\\spool\\PRTPROCS\\x64"
+ *| NT(Windows NT x86): "%winsysdir%\\spool\\PRTPROCS\\w32x86"
+ *| NT(Windows 4.0): "%winsysdir%\\spool\\PRTPROCS\\win40"
+ *
+ * "%winsysdir%" is the Value from GetSystemDirectoryW()
+ *
+ */
+static BOOL WINAPI fpGetPrintProcessorDirectory(LPWSTR pName, LPWSTR pEnvironment, DWORD level,
+ LPBYTE pPPInfo, DWORD cbBuf, LPDWORD pcbNeeded)
+{
+ const printenv_t * env;
+ DWORD needed;
+ LONG lres;
+
+ TRACE("(%s, %s, %d, %p, %d, %p)\n", debugstr_w(pName), debugstr_w(pEnvironment),
+ level, pPPInfo, cbBuf, pcbNeeded);
+
+ *pcbNeeded = 0;
+ lres = copy_servername_from_name(pName, NULL);
+ if (lres) {
+ FIXME("server %s not supported\n", debugstr_w(pName));
+ SetLastError(RPC_S_SERVER_UNAVAILABLE);
+ return FALSE;
+ }
+
+ env = validate_envW(pEnvironment);
+ if (!env)
+ return FALSE; /* ERROR_INVALID_ENVIRONMENT */
+
+ /* GetSystemDirectoryW returns number of WCHAR including the '\0' */
+ needed = GetSystemDirectoryW(NULL, 0);
+ /* add the Size for the Subdirectories */
+ needed += lstrlenW(spoolprtprocsW);
+ needed += lstrlenW(env->subdir);
+ needed *= sizeof(WCHAR); /* return-value is size in Bytes */
+
+ *pcbNeeded = needed;
+
+ if (needed > cbBuf) {
+ SetLastError(ERROR_INSUFFICIENT_BUFFER);
+ return FALSE;
+ }
+
+ GetSystemDirectoryW((LPWSTR) pPPInfo, cbBuf/sizeof(WCHAR));
+ /* add the Subdirectories */
+ lstrcatW((LPWSTR) pPPInfo, spoolprtprocsW);
+ lstrcatW((LPWSTR) pPPInfo, env->subdir);
+ TRACE("==> %s\n", debugstr_w((LPWSTR) pPPInfo));
+ return TRUE;
+}
+
/******************************************************************************
* fpOpenPrinter [exported through PRINTPROVIDOR]
*
@@ -1812,8 +2372,8 @@ void setup_provider(void)
fpGetPrinterDriverDirectory,
NULL, /* fpDeletePrinterDriver */
NULL, /* fpAddPrintProcessor */
- NULL, /* fpEnumPrintProcessors */
- NULL, /* fpGetPrintProcessorDirectory */
+ fpEnumPrintProcessors,
+ fpGetPrintProcessorDirectory,
NULL, /* fpDeletePrintProcessor */
NULL, /* fpEnumPrintProcessorDatatypes */
NULL, /* fpStartDocPrinter */
@@ -1836,9 +2396,9 @@ void setup_provider(void)
NULL, /* fpEnumForms */
fpEnumMonitors,
fpEnumPorts,
- NULL, /* fpAddPort */
- NULL, /* fpConfigurePort */
- NULL, /* fpDeletePort */
+ fpAddPort,
+ fpConfigurePort,
+ fpDeletePort,
NULL, /* fpCreatePrinterIC */
NULL, /* fpPlayGdiScriptOnPrinterIC */
NULL, /* fpDeletePrinterIC */
@@ -1851,7 +2411,7 @@ void setup_provider(void)
NULL, /* fpGetPrinterDriverEx */
NULL, /* fpFindFirstPrinterChangeNotification */
NULL, /* fpFindClosePrinterChangeNotification */
- NULL, /* fpAddPortEx */
+ fpAddPortEx,
NULL, /* fpShutDown */
NULL, /* fpRefreshPrinterChangeNotification */
NULL, /* fpOpenPrinterEx */
diff --git a/reactos/dll/win32/localspl/spl_Da.rc b/reactos/dll/win32/localspl/spl_Da.rc
index a149cabc20a..cf1f3189904 100644
--- a/reactos/dll/win32/localspl/spl_Da.rc
+++ b/reactos/dll/win32/localspl/spl_Da.rc
@@ -18,7 +18,9 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
- LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
+#include "localspl_private.h"
+
+LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
{
diff --git a/reactos/dll/win32/localspl/spl_De.rc b/reactos/dll/win32/localspl/spl_De.rc
index 4c95e2bcfa5..b30e13c903b 100644
--- a/reactos/dll/win32/localspl/spl_De.rc
+++ b/reactos/dll/win32/localspl/spl_De.rc
@@ -19,6 +19,10 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localspl_private.h"
+
+#pragma code_page(65001)
+
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/localspl/spl_En.rc b/reactos/dll/win32/localspl/spl_En.rc
index c9d12f4f16a..d189c26a132 100644
--- a/reactos/dll/win32/localspl/spl_En.rc
+++ b/reactos/dll/win32/localspl/spl_En.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localspl_private.h"
+
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/localspl/spl_Es.rc b/reactos/dll/win32/localspl/spl_Es.rc
new file mode 100644
index 00000000000..9b9a5580d64
--- /dev/null
+++ b/reactos/dll/win32/localspl/spl_Es.rc
@@ -0,0 +1,32 @@
+/*
+ * Spanish resources for localspl
+ *
+ * Copyright 2010 José Manuel Ferrer Ortiz
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * 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. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "localspl_private.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_LOCALPORT "Puerto local"
+ IDS_LOCALMONITOR "Monitor local"
+}
diff --git a/reactos/dll/win32/localspl/spl_Fr.rc b/reactos/dll/win32/localspl/spl_Fr.rc
index 95269727162..0e93dc8b72b 100644
--- a/reactos/dll/win32/localspl/spl_Fr.rc
+++ b/reactos/dll/win32/localspl/spl_Fr.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localspl_private.h"
+
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/localspl/spl_Ko.rc b/reactos/dll/win32/localspl/spl_Ko.rc
index fe2d5720a56..86db86797f6 100644
--- a/reactos/dll/win32/localspl/spl_Ko.rc
+++ b/reactos/dll/win32/localspl/spl_Ko.rc
@@ -20,6 +20,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localspl_private.h"
+
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/localspl/spl_Lt.rc b/reactos/dll/win32/localspl/spl_Lt.rc
new file mode 100644
index 00000000000..4c72767105d
--- /dev/null
+++ b/reactos/dll/win32/localspl/spl_Lt.rc
@@ -0,0 +1,32 @@
+/*
+ * Lithuanian resources for localspl
+ *
+ * Copyright 2009 Aurimas Fišeras
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * 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. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "localspl_private.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_LOCALPORT "Vietinis prievadas"
+ IDS_LOCALMONITOR "Vietinis monitorius"
+}
diff --git a/reactos/dll/win32/localspl/spl_Nl.rc b/reactos/dll/win32/localspl/spl_Nl.rc
index b9d4c5ca608..bd024469e80 100644
--- a/reactos/dll/win32/localspl/spl_Nl.rc
+++ b/reactos/dll/win32/localspl/spl_Nl.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localspl_private.h"
+
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/localspl/spl_No.rc b/reactos/dll/win32/localspl/spl_No.rc
index 5efa5631e9b..b81a7b7d1ce 100644
--- a/reactos/dll/win32/localspl/spl_No.rc
+++ b/reactos/dll/win32/localspl/spl_No.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localspl_private.h"
+
LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/localspl/spl_Pl.rc b/reactos/dll/win32/localspl/spl_Pl.rc
index a0802088666..cdbb4226771 100644
--- a/reactos/dll/win32/localspl/spl_Pl.rc
+++ b/reactos/dll/win32/localspl/spl_Pl.rc
@@ -20,6 +20,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localspl_private.h"
+
LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/localspl/spl_Pt.rc b/reactos/dll/win32/localspl/spl_Pt.rc
index 8ec66c55f36..79506c34dc2 100644
--- a/reactos/dll/win32/localspl/spl_Pt.rc
+++ b/reactos/dll/win32/localspl/spl_Pt.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localspl_private.h"
+
LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/localspl/spl_Ro.rc b/reactos/dll/win32/localspl/spl_Ro.rc
index 44321957313..7f988001687 100644
--- a/reactos/dll/win32/localspl/spl_Ro.rc
+++ b/reactos/dll/win32/localspl/spl_Ro.rc
@@ -18,6 +18,10 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localspl_private.h"
+
+#pragma code_page(65001)
+
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/localspl/spl_Ru.rc b/reactos/dll/win32/localspl/spl_Ru.rc
index 1ee1e2f327b..085488d460d 100644
--- a/reactos/dll/win32/localspl/spl_Ru.rc
+++ b/reactos/dll/win32/localspl/spl_Ru.rc
@@ -18,10 +18,15 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localspl_private.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
{
- IDS_LOCALPORT " "
- IDS_LOCALMONITOR " "
+ IDS_LOCALPORT "Локальный порт"
+ IDS_LOCALMONITOR "Локальный монитор"
}
diff --git a/reactos/dll/win32/localspl/spl_Si.rc b/reactos/dll/win32/localspl/spl_Si.rc
index 66ca2c4ce76..11928abfa37 100644
--- a/reactos/dll/win32/localspl/spl_Si.rc
+++ b/reactos/dll/win32/localspl/spl_Si.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localspl_private.h"
+
#pragma code_page(65001)
LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
@@ -27,5 +29,3 @@ STRINGTABLE DISCARDABLE
IDS_LOCALPORT "Lokalna vrata"
IDS_LOCALMONITOR "Lokalen monitor"
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/localspl/spl_Sv.rc b/reactos/dll/win32/localspl/spl_Sv.rc
index fca0d6b0835..2831da64e11 100644
--- a/reactos/dll/win32/localspl/spl_Sv.rc
+++ b/reactos/dll/win32/localspl/spl_Sv.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localspl_private.h"
+
LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/localspl/spl_Zh.rc b/reactos/dll/win32/localspl/spl_Zh.rc
index c5db382ffe3..108cb50ee96 100644
--- a/reactos/dll/win32/localspl/spl_Zh.rc
+++ b/reactos/dll/win32/localspl/spl_Zh.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localspl_private.h"
+
/* Chinese text is encoded in UTF-8 */
#pragma code_page(65001)
@@ -36,5 +38,3 @@ STRINGTABLE DISCARDABLE
IDS_LOCALPORT "本地端口"
IDS_LOCALMONITOR "本地監視器"
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/localui/localui.c b/reactos/dll/win32/localui/localui.c
index 2acfc7ecafa..b9e4c4ee324 100644
--- a/reactos/dll/win32/localui/localui.c
+++ b/reactos/dll/win32/localui/localui.c
@@ -503,7 +503,6 @@ static BOOL WINAPI localui_AddPortUI(PCWSTR pName, HWND hWnd, PCWSTR pMonitorNam
{
addportui_t data;
HANDLE hXcv;
- LPWSTR ptr = NULL;
DWORD needed;
DWORD dummy;
DWORD status;
@@ -529,14 +528,11 @@ static BOOL WINAPI localui_AddPortUI(PCWSTR pName, HWND hWnd, PCWSTR pMonitorNam
(PBYTE) &dummy, 0, &needed, &status);
TRACE("got %u with status %u\n", res, status);
- if (res && (status == ERROR_SUCCESS)) {
+ if (res && (status == ERROR_SUCCESS) && ppPortName) {
/* Native localui uses GlobalAlloc also.
The caller must GlobalFree the buffer */
- ptr = GlobalAlloc(GPTR, (lstrlenW(data.portname)+1) * sizeof(WCHAR));
- if (ptr) {
- lstrcpyW(ptr, data.portname);
- if (ppPortName) *ppPortName = ptr;
- }
+ *ppPortName = GlobalAlloc(GPTR, (lstrlenW(data.portname)+1) * sizeof(WCHAR));
+ if (*ppPortName) lstrcpyW(*ppPortName, data.portname);
}
if (res && (status == ERROR_ALREADY_EXISTS)) {
diff --git a/reactos/dll/win32/localui/localui.h b/reactos/dll/win32/localui/localui.h
index aa244bdc824..25424da568c 100644
--- a/reactos/dll/win32/localui/localui.h
+++ b/reactos/dll/win32/localui/localui.h
@@ -21,6 +21,8 @@
#ifndef __WINE_LOCALUI__
#define __WINE_LOCALUI__
+#include
+#include
/* ## Resource-ID ## */
#define ADDPORT_DIALOG 100
diff --git a/reactos/dll/win32/localui/localui.rc b/reactos/dll/win32/localui/localui.rc
index 9963acb20ae..f229f722cc9 100644
--- a/reactos/dll/win32/localui/localui.rc
+++ b/reactos/dll/win32/localui/localui.rc
@@ -39,17 +39,19 @@
#include "ui_Da.rc"
-#include "ui_De.rc"
#include "ui_En.rc"
-#include "ui_Fr.rc"
#include "ui_Ko.rc"
-#include "ui_Lt.rc"
#include "ui_Nl.rc"
#include "ui_No.rc"
#include "ui_Pl.rc"
#include "ui_Pt.rc"
+#include "ui_Sv.rc"
+
+/* UTF-8 */
+#include "ui_De.rc"
+#include "ui_Fr.rc"
+#include "ui_Lt.rc"
#include "ui_Ro.rc"
#include "ui_Ru.rc"
#include "ui_Si.rc"
-#include "ui_Sv.rc"
#include "ui_Zh.rc"
diff --git a/reactos/dll/win32/localui/ui_Da.rc b/reactos/dll/win32/localui/ui_Da.rc
index 97299266959..861ba8f2ddf 100644
--- a/reactos/dll/win32/localui/ui_Da.rc
+++ b/reactos/dll/win32/localui/ui_Da.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_De.rc b/reactos/dll/win32/localui/ui_De.rc
index 2fe35fc4e77..74148c3441b 100644
--- a/reactos/dll/win32/localui/ui_De.rc
+++ b/reactos/dll/win32/localui/ui_De.rc
@@ -18,14 +18,18 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
+#pragma code_page(65001)
+
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Lokalen Anschluss hinzufgen"
+CAPTION "Lokalen Anschluss hinzufügen"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "&Lokaler Anschuss, der hinzugefgt werden soll:", -1, 7, 13, 194, 13, WS_VISIBLE
+ LTEXT "&Lokaler Anschuss, der hinzugefügt werden soll:", -1, 7, 13, 194, 13, WS_VISIBLE
EDITTEXT ADDPORT_EDIT, 6, 28, 174, 12, WS_VISIBLE | ES_AUTOHSCROLL
DEFPUSHBUTTON "OK", IDOK, 188, 10, 50, 14, WS_VISIBLE
PUSHBUTTON "Abbrechen", IDCANCEL, 188, 27, 50, 14, WS_VISIBLE
@@ -37,8 +41,8 @@ STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPW
CAPTION "LPT-Anschluss konfigurieren"
FONT 8, "MS Shell Dlg"
BEGIN
- GROUPBOX "Zeitberschreitung (Sekunden)", LPTCONFIG_GROUP, 6, 6, 150, 35, BS_GROUPBOX
- LTEXT "&bertragung wiederholen:", -1, 14, 22, 90, 13, WS_VISIBLE
+ GROUPBOX "Zeitüberschreitung (Sekunden)", LPTCONFIG_GROUP, 6, 6, 150, 35, BS_GROUPBOX
+ LTEXT "Ü&bertragung wiederholen:", -1, 14, 22, 90, 13, WS_VISIBLE
EDITTEXT LPTCONFIG_EDIT, 112, 20, 32, 13, WS_VISIBLE | ES_NUMBER
DEFPUSHBUTTON "OK", IDOK, 164, 10, 50, 14, WS_VISIBLE
PUSHBUTTON "Abbrechen", IDCANCEL, 164, 27, 50, 14, WS_VISIBLE
@@ -48,7 +52,7 @@ END
STRINGTABLE DISCARDABLE
{
IDS_LOCALPORT "Lokaler Anschluss"
- IDS_INVALIDNAME "'%s' ist kein gltiger Anschlussname"
+ IDS_INVALIDNAME "'%s' ist kein gültiger Anschlussname"
IDS_PORTEXISTS "Der Anschluss %s existiert bereits"
IDS_NOTHINGTOCONFIG "Dieser Anschluss hat keine Optionen zum Konfigurieren"
}
diff --git a/reactos/dll/win32/localui/ui_En.rc b/reactos/dll/win32/localui/ui_En.rc
index c2de6263a8a..5a218680472 100644
--- a/reactos/dll/win32/localui/ui_En.rc
+++ b/reactos/dll/win32/localui/ui_En.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_Fr.rc b/reactos/dll/win32/localui/ui_Fr.rc
index 261fa0b7dd2..70e4baf06ee 100644
--- a/reactos/dll/win32/localui/ui_Fr.rc
+++ b/reactos/dll/win32/localui/ui_Fr.rc
@@ -17,6 +17,9 @@
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+
+#include "localui.h"
+
#pragma code_page(65001)
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
@@ -53,5 +56,3 @@ STRINGTABLE DISCARDABLE
IDS_PORTEXISTS "Le port %s existe déjà"
IDS_NOTHINGTOCONFIG "Ce port n'a pas d'options de configuration"
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/localui/ui_Ko.rc b/reactos/dll/win32/localui/ui_Ko.rc
index 9a380308422..d86b7ef58a5 100644
--- a/reactos/dll/win32/localui/ui_Ko.rc
+++ b/reactos/dll/win32/localui/ui_Ko.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_Lt.rc b/reactos/dll/win32/localui/ui_Lt.rc
index 698918afb85..ff789e17fba 100644
--- a/reactos/dll/win32/localui/ui_Lt.rc
+++ b/reactos/dll/win32/localui/ui_Lt.rc
@@ -53,8 +53,7 @@ END
STRINGTABLE DISCARDABLE
{
IDS_LOCALPORT "Vietinis prievadas"
- IDS_INVALIDNAME "'%s' yra netinkamas prievado vardas"
+ IDS_INVALIDNAME "„%s“ yra netinkamas prievado vardas"
IDS_PORTEXISTS "Prievadas %s jau egzistuoja"
IDS_NOTHINGTOCONFIG "Šis prievadas neturi parinkčių konfigūravimui"
}
-#pragma code_page(default)
diff --git a/reactos/dll/win32/localui/ui_Nl.rc b/reactos/dll/win32/localui/ui_Nl.rc
index 59c58ffd3aa..21d7cc84fae 100644
--- a/reactos/dll/win32/localui/ui_Nl.rc
+++ b/reactos/dll/win32/localui/ui_Nl.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_No.rc b/reactos/dll/win32/localui/ui_No.rc
index 3a46bc8ee88..8ed9e00c8aa 100644
--- a/reactos/dll/win32/localui/ui_No.rc
+++ b/reactos/dll/win32/localui/ui_No.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_Pl.rc b/reactos/dll/win32/localui/ui_Pl.rc
index 74a5015e00a..822763d7dae 100644
--- a/reactos/dll/win32/localui/ui_Pl.rc
+++ b/reactos/dll/win32/localui/ui_Pl.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_Pt.rc b/reactos/dll/win32/localui/ui_Pt.rc
index 7bad5211ead..7f1684820f7 100644
--- a/reactos/dll/win32/localui/ui_Pt.rc
+++ b/reactos/dll/win32/localui/ui_Pt.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_Ro.rc b/reactos/dll/win32/localui/ui_Ro.rc
index 43edfe6a4b1..a1b1c771fa1 100644
--- a/reactos/dll/win32/localui/ui_Ro.rc
+++ b/reactos/dll/win32/localui/ui_Ro.rc
@@ -17,6 +17,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
#pragma code_page(65001)
@@ -53,5 +55,3 @@ STRINGTABLE DISCARDABLE
IDS_PORTEXISTS "Portul %s existsă deja"
IDS_NOTHINGTOCONFIG "Acest port nu are opțiuni de configurat"
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/localui/ui_Ru.rc b/reactos/dll/win32/localui/ui_Ru.rc
index 96e78f1971b..04f87b68e70 100644
--- a/reactos/dll/win32/localui/ui_Ru.rc
+++ b/reactos/dll/win32/localui/ui_Ru.rc
@@ -18,37 +18,42 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
+CAPTION "Добавить локальный порт"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT " & :", -1, 7, 13, 194, 13, WS_VISIBLE
+ LTEXT "Введите &название локального порта:", -1, 7, 13, 194, 13, WS_VISIBLE
EDITTEXT ADDPORT_EDIT, 6, 28, 174, 12, WS_VISIBLE | ES_AUTOHSCROLL
DEFPUSHBUTTON "OK", IDOK, 199, 10, 40, 14, WS_VISIBLE
- PUSHBUTTON "", IDCANCEL, 199, 27, 40, 14, WS_VISIBLE
+ PUSHBUTTON "Отменить", IDCANCEL, 199, 27, 40, 14, WS_VISIBLE
END
LPTCONFIG_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 220, 47
STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
+CAPTION "Установки параллельного порта"
FONT 8, "MS Shell Dlg"
BEGIN
- GROUPBOX "- ()", LPTCONFIG_GROUP, 6, 6, 150, 35, BS_GROUPBOX
- LTEXT "& :", -1, 14, 22, 90, 13, WS_VISIBLE
+ GROUPBOX "Тайм-аут (секунд)", LPTCONFIG_GROUP, 6, 6, 150, 35, BS_GROUPBOX
+ LTEXT "&Попыток пересылки:", -1, 14, 22, 90, 13, WS_VISIBLE
EDITTEXT LPTCONFIG_EDIT, 112, 20, 32, 13, WS_VISIBLE | ES_NUMBER
DEFPUSHBUTTON "OK", IDOK, 164, 10, 50, 14, WS_VISIBLE
- PUSHBUTTON "", IDCANCEL, 164, 27, 50, 14, WS_VISIBLE
+ PUSHBUTTON "Отмена", IDCANCEL, 164, 27, 50, 14, WS_VISIBLE
END
STRINGTABLE DISCARDABLE
{
- IDS_LOCALPORT " "
- IDS_INVALIDNAME " '%s'"
- IDS_PORTEXISTS " '%s' "
- IDS_NOTHINGTOCONFIG " "
+ IDS_LOCALPORT "Локальный порт"
+ IDS_INVALIDNAME "Не правильное название порта '%s'"
+ IDS_PORTEXISTS "Порт '%s' уже существует"
+ IDS_NOTHINGTOCONFIG "Этот порт не имеет настроек"
}
diff --git a/reactos/dll/win32/localui/ui_Si.rc b/reactos/dll/win32/localui/ui_Si.rc
index 961a2e046d4..6810c7ce733 100644
--- a/reactos/dll/win32/localui/ui_Si.rc
+++ b/reactos/dll/win32/localui/ui_Si.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
#pragma code_page(65001)
LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
@@ -54,5 +56,3 @@ STRINGTABLE DISCARDABLE
IDS_PORTEXISTS "Vrata z imenom %s že obstajajo"
IDS_NOTHINGTOCONFIG "Ta vrata nimajo možnosti nastavitve"
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/localui/ui_Sv.rc b/reactos/dll/win32/localui/ui_Sv.rc
index 3cd22fd8c70..e137079ffe4 100644
--- a/reactos/dll/win32/localui/ui_Sv.rc
+++ b/reactos/dll/win32/localui/ui_Sv.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_Zh.rc b/reactos/dll/win32/localui/ui_Zh.rc
index 197ac1dd38d..f43dde9afbd 100644
--- a/reactos/dll/win32/localui/ui_Zh.rc
+++ b/reactos/dll/win32/localui/ui_Zh.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "localui.h"
+
/* Chinese text is encoded in UTF-8 */
#pragma code_page(65001)
@@ -90,5 +92,3 @@ STRINGTABLE DISCARDABLE
IDS_PORTEXISTS "端口 %s 已經存在"
IDS_NOTHINGTOCONFIG "這個端口沒有可設定選項"
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/mciavi32/info.c b/reactos/dll/win32/mciavi32/info.c
index 64d51eb1010..b2ec0308cdd 100644
--- a/reactos/dll/win32/mciavi32/info.c
+++ b/reactos/dll/win32/mciavi32/info.c
@@ -80,6 +80,8 @@ DWORD MCIAVI_mciGetDevCaps(UINT wDevID, DWORD dwFlags, LPMCI_GETDEVCAPS_PARMS l
if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
+ if (!(dwFlags & MCI_GETDEVCAPS_ITEM)) return MCIERR_MISSING_PARAMETER;
+ if (dwFlags & MCI_TEST) return 0;
EnterCriticalSection(&wma->cs);
@@ -130,14 +132,52 @@ DWORD MCIAVI_mciGetDevCaps(UINT wDevID, DWORD dwFlags, LPMCI_GETDEVCAPS_PARMS l
lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
ret = MCI_RESOURCE_RETURNED;
break;
+ case MCI_DGV_GETDEVCAPS_CAN_REVERSE:
+ TRACE("MCI_DGV_GETDEVCAPS_CAN_REVERSE !\n");
+ lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE); /* FIXME */
+ ret = MCI_RESOURCE_RETURNED;
+ break;
+ case MCI_DGV_GETDEVCAPS_CAN_STRETCH:
+ TRACE("MCI_DGV_GETDEVCAPS_CAN_STRETCH !\n");
+ lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE); /* FIXME */
+ ret = MCI_RESOURCE_RETURNED;
+ break;
+ case MCI_DGV_GETDEVCAPS_CAN_LOCK:
+ TRACE("MCI_DGV_GETDEVCAPS_CAN_LOCK !\n");
+ lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
+ ret = MCI_RESOURCE_RETURNED;
+ break;
+ case MCI_DGV_GETDEVCAPS_CAN_FREEZE:
+ TRACE("MCI_DGV_GETDEVCAPS_CAN_FREEZE !\n");
+ lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
+ ret = MCI_RESOURCE_RETURNED;
+ break;
+ case MCI_DGV_GETDEVCAPS_CAN_STR_IN:
+ TRACE("MCI_DGV_GETDEVCAPS_CAN_STRETCH_INPUT !\n");
+ lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
+ ret = MCI_RESOURCE_RETURNED;
+ break;
+ case MCI_DGV_GETDEVCAPS_HAS_STILL:
+ TRACE("MCI_DGV_GETDEVCAPS_HAS_STILL !\n");
+ lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
+ ret = MCI_RESOURCE_RETURNED;
+ break;
+ case MCI_DGV_GETDEVCAPS_CAN_TEST:
+ TRACE("MCI_DGV_GETDEVCAPS_CAN_TEST !\n");
+ lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);
+ ret = MCI_RESOURCE_RETURNED;
+ break;
+ case MCI_DGV_GETDEVCAPS_PALETTES:
+ TRACE("MCI_DGV_GETDEVCAPS_PALETTES !\n");
+ lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE); /* FIXME */
+ ret = MCI_RESOURCE_RETURNED;
+ break;
+ /* w2k does not know MAX_WINDOWS or MAX/MINIMUM_RATE */
default:
FIXME("Unknown capability (%08x) !\n", lpParms->dwItem);
- ret = MCIERR_UNRECOGNIZED_COMMAND;
+ ret = MCIERR_UNSUPPORTED_FUNCTION;
break;
}
- } else {
- WARN("No GetDevCaps-Item !\n");
- ret = MCIERR_UNRECOGNIZED_COMMAND;
}
LeaveCriticalSection(&wma->cs);
@@ -157,6 +197,7 @@ DWORD MCIAVI_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_DGV_INFO_PARMSW lpParms)
if (lpParms == NULL || lpParms->lpstrReturn == NULL)
return MCIERR_NULL_PARAMETER_BLOCK;
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
+ if (dwFlags & MCI_TEST) return 0;
TRACE("buf=%p, len=%u\n", lpParms->lpstrReturn, lpParms->dwRetSize);
@@ -193,6 +234,7 @@ DWORD MCIAVI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SET_PARMS lpParms)
if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
+ if (dwFlags & MCI_TEST) return 0;
EnterCriticalSection(&wma->cs);
@@ -329,6 +371,8 @@ DWORD MCIAVI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMSW lpPar
if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
+ if (!(dwFlags & MCI_STATUS_ITEM)) return MCIERR_MISSING_PARAMETER;
+ if (dwFlags & MCI_TEST) return 0;
EnterCriticalSection(&wma->cs);
@@ -387,22 +431,28 @@ DWORD MCIAVI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMSW lpPar
TRACE("MCI_STATUS_TIME_FORMAT => %u\n", LOWORD(lpParms->dwReturn));
ret = MCI_RESOURCE_RETURNED;
break;
+ case MCI_DGV_STATUS_AUDIO:
+ lpParms->dwReturn = (wma->dwSet & 3) ?
+ MAKEMCIRESOURCE(MCI_ON, MCI_ON_S) : MAKEMCIRESOURCE(MCI_OFF, MCI_OFF_S);
+ ret = MCI_RESOURCE_RETURNED|MCI_RESOURCE_DRIVER;
+ TRACE("MCI_STATUS_AUDIO = %u\n", LOWORD(lpParms->dwReturn));
+ break;
+ case MCI_DGV_STATUS_VIDEO:
+ lpParms->dwReturn = (wma->dwSet & 4) ?
+ MAKEMCIRESOURCE(MCI_ON, MCI_ON_S) : MAKEMCIRESOURCE(MCI_OFF, MCI_OFF_S);
+ ret = MCI_RESOURCE_RETURNED|MCI_RESOURCE_DRIVER;
+ TRACE("MCI_STATUS_VIDEO = %u\n", LOWORD(lpParms->dwReturn));
+ break;
+
#if 0
case MCI_AVI_STATUS_AUDIO_BREAKS:
case MCI_AVI_STATUS_FRAMES_SKIPPED:
case MCI_AVI_STATUS_LAST_PLAY_SPEED:
- case MCI_DGV_STATUS_AUDIO:
case MCI_DGV_STATUS_AUDIO_INPUT:
case MCI_DGV_STATUS_AUDIO_RECORD:
case MCI_DGV_STATUS_AUDIO_SOURCE:
- case MCI_DGV_SETAUDIO_AVERAGE:
- case MCI_DGV_SETAUDIO_LEFT:
- case MCI_DGV_SETAUDIO_RIGHT:
- case MCI_DGV_SETAUDIO_STEREO:
- case MCI_DGV_STATUS_AUDIO_STREAM:
case MCI_DGV_STATUS_AVGBYTESPERSEC:
case MCI_DGV_STATUS_BASS:
- case MCI_DGV_STATUS_BITSPERPEL:
case MCI_DGV_STATUS_BITSPERSAMPLE:
case MCI_DGV_STATUS_BLOCKALIGN:
case MCI_DGV_STATUS_BRIGHTNESS:
@@ -411,10 +461,12 @@ DWORD MCIAVI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMSW lpPar
case MCI_DGV_STATUS_FILEFORMAT:
case MCI_DGV_STATUS_FILE_MODE:
case MCI_DGV_STATUS_FILE_COMPLETION:
- case MCI_DGV_STATUS_FORWARD:
- case MCI_DGV_STATUS_FRAME_RATE:
case MCI_DGV_STATUS_GAMMA:
#endif
+ case MCI_DGV_STATUS_BITSPERPEL:
+ lpParms->dwReturn = wma->inbih->biBitCount;
+ TRACE("MCI_DGV_STATUS_BITSPERPEL => %lu\n", lpParms->dwReturn);
+ break;
case MCI_DGV_STATUS_HPAL:
lpParms->dwReturn = 0;
TRACE("MCI_DGV_STATUS_HPAL => %lx\n", lpParms->dwReturn);
@@ -422,7 +474,52 @@ DWORD MCIAVI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMSW lpPar
case MCI_DGV_STATUS_HWND:
lpParms->dwReturn = (DWORD_PTR)wma->hWndPaint;
TRACE("MCI_DGV_STATUS_HWND => %p\n", wma->hWndPaint);
+ break;
+ case MCI_DGV_STATUS_WINDOW_VISIBLE:
+ lpParms->dwReturn = IsWindowVisible(wma->hWndPaint) ?
+ MAKEMCIRESOURCE(TRUE, MCI_TRUE) : MAKEMCIRESOURCE(FALSE, MCI_FALSE);
+ ret = MCI_RESOURCE_RETURNED;
+ TRACE("MCI_STATUS_WINDOW_VISIBLE = %u\n", LOWORD(lpParms->dwReturn));
break;
+ case MCI_DGV_STATUS_WINDOW_MINIMIZED:
+ lpParms->dwReturn = IsIconic(wma->hWndPaint) ?
+ MAKEMCIRESOURCE(TRUE, MCI_TRUE) : MAKEMCIRESOURCE(FALSE, MCI_FALSE);
+ ret = MCI_RESOURCE_RETURNED;
+ TRACE("MCI_STATUS_WINDOW_MINIMIZED = %u\n", LOWORD(lpParms->dwReturn));
+ break;
+ case MCI_DGV_STATUS_WINDOW_MAXIMIZED:
+ lpParms->dwReturn = IsZoomed(wma->hWndPaint) ?
+ MAKEMCIRESOURCE(TRUE, MCI_TRUE) : MAKEMCIRESOURCE(FALSE, MCI_FALSE);
+ ret = MCI_RESOURCE_RETURNED;
+ TRACE("MCI_STATUS_WINDOW_MMAXIMIZED = %u\n", LOWORD(lpParms->dwReturn));
+ break;
+ case MCI_DGV_STATUS_SPEED:
+ lpParms->dwReturn = 1000;
+ TRACE("MCI_DGV_STATUS_SPEED = %lu\n", lpParms->dwReturn);
+ break;
+ case MCI_DGV_STATUS_FRAME_RATE:
+ /* FIXME: 1000 is a settable speed multiplier */
+ lpParms->dwReturn = MulDiv(1000000,1000,wma->mah.dwMicroSecPerFrame);
+ TRACE("MCI_DGV_STATUS_FRAME_RATE = %lu\n", lpParms->dwReturn);
+ break;
+ case MCI_DGV_STATUS_FORWARD:
+ lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);
+ ret = MCI_RESOURCE_RETURNED;
+ TRACE("MCI_DGV_STATUS_FORWARD = %u\n", LOWORD(lpParms->dwReturn));
+ break;
+ case MCI_DGV_STATUS_PAUSE_MODE:
+ if (wma->dwStatus != MCI_MODE_PAUSE) {
+ LeaveCriticalSection(&wma->cs);
+ return MCIERR_NONAPPLICABLE_FUNCTION;
+ }
+ lpParms->dwReturn = MAKEMCIRESOURCE(MCI_MODE_PLAY, MCI_MODE_PLAY);
+ ret = MCI_RESOURCE_RETURNED;
+ TRACE("MCI_STATUS_MODE => 0x%04x\n", LOWORD(lpParms->dwReturn));
+ break;
+ case MCI_DGV_STATUS_AUDIO_STREAM:
+ lpParms->dwReturn = wma->audio_stream_n;
+ TRACE("MCI_DGV_STATUS_AUDIO_STREAM => %lu\n", lpParms->dwReturn);
+ break;
#if 0
case MCI_DGV_STATUS_KEY_COLOR:
case MCI_DGV_STATUS_KEY_INDEX:
@@ -430,38 +527,27 @@ DWORD MCIAVI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMSW lpPar
case MCI_DGV_MONITOR_FILE:
case MCI_DGV_MONITOR_INPUT:
case MCI_DGV_STATUS_MONITOR_METHOD:
- case MCI_DGV_STATUS_PAUSE_MODE:
case MCI_DGV_STATUS_SAMPLESPERSECOND:
case MCI_DGV_STATUS_SEEK_EXACTLY:
case MCI_DGV_STATUS_SHARPNESS:
case MCI_DGV_STATUS_SIZE:
case MCI_DGV_STATUS_SMPTE:
- case MCI_DGV_STATUS_SPEED:
case MCI_DGV_STATUS_STILL_FILEFORMAT:
case MCI_DGV_STATUS_TINT:
case MCI_DGV_STATUS_TREBLE:
case MCI_DGV_STATUS_UNSAVED:
- case MCI_DGV_STATUS_VIDEO:
case MCI_DGV_STATUS_VIDEO_RECORD:
case MCI_DGV_STATUS_VIDEO_SOURCE:
case MCI_DGV_STATUS_VIDEO_SRC_NUM:
case MCI_DGV_STATUS_VIDEO_STREAM:
case MCI_DGV_STATUS_VOLUME:
- case MCI_DGV_STATUS_WINDOW_VISIBLE:
- case MCI_DGV_STATUS_WINDOW_MINIMIZED:
- case MCI_DGV_STATUS_WINDOW_MAXIMIZED:
- case MCI_STATUS_MEDIA_PRESENT:
#endif
default:
FIXME("Unknown command %08X !\n", lpParms->dwItem);
TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms);
LeaveCriticalSection(&wma->cs);
- return MCIERR_UNRECOGNIZED_COMMAND;
+ return MCIERR_UNSUPPORTED_FUNCTION;
}
- } else {
- WARN("No Status-Item!\n");
- LeaveCriticalSection(&wma->cs);
- return MCIERR_UNRECOGNIZED_COMMAND;
}
if (dwFlags & MCI_NOTIFY) {
diff --git a/reactos/dll/win32/mciavi32/mciavi.c b/reactos/dll/win32/mciavi32/mciavi.c
index 4e5faac7c0a..d77525ca4ff 100644
--- a/reactos/dll/win32/mciavi32/mciavi.c
+++ b/reactos/dll/win32/mciavi32/mciavi.c
@@ -217,8 +217,6 @@ static DWORD MCIAVI_mciOpen(UINT wDevID, DWORD dwFlags,
TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpOpenParms);
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
if (lpOpenParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
wma = (WINE_MCIAVI *)mciGetDriverData(wDevID);
@@ -250,29 +248,26 @@ static DWORD MCIAVI_mciOpen(UINT wDevID, DWORD dwFlags,
* contains the hFile value ?
*/
dwRet = MCIERR_UNRECOGNIZED_COMMAND;
- } else if (strlenW(lpOpenParms->lpstrElementName) > 0) {
+ } else if (lpOpenParms->lpstrElementName && lpOpenParms->lpstrElementName[0]) {
/* FIXME : what should be done id wma->hFile is already != 0, or the driver is playin' */
TRACE("MCI_OPEN_ELEMENT %s!\n", debugstr_w(lpOpenParms->lpstrElementName));
- if (lpOpenParms->lpstrElementName && (strlenW(lpOpenParms->lpstrElementName) > 0))
- {
- wma->lpFileName = HeapAlloc(GetProcessHeap(), 0, (strlenW(lpOpenParms->lpstrElementName) + 1) * sizeof(WCHAR));
- strcpyW(wma->lpFileName, lpOpenParms->lpstrElementName);
+ wma->lpFileName = HeapAlloc(GetProcessHeap(), 0, (strlenW(lpOpenParms->lpstrElementName) + 1) * sizeof(WCHAR));
+ strcpyW(wma->lpFileName, lpOpenParms->lpstrElementName);
- wma->hFile = mmioOpenW(lpOpenParms->lpstrElementName, NULL,
- MMIO_ALLOCBUF | MMIO_DENYWRITE | MMIO_READ);
+ wma->hFile = mmioOpenW(lpOpenParms->lpstrElementName, NULL,
+ MMIO_ALLOCBUF | MMIO_DENYWRITE | MMIO_READ);
- if (wma->hFile == 0) {
- WARN("can't find file=%s!\n", debugstr_w(lpOpenParms->lpstrElementName));
- dwRet = MCIERR_FILE_NOT_FOUND;
- } else {
- if (!MCIAVI_GetInfo(wma))
- dwRet = MCIERR_INVALID_FILE;
- else if (!MCIAVI_OpenVideo(wma))
- dwRet = MCIERR_CANNOT_LOAD_DRIVER;
- else if (!MCIAVI_CreateWindow(wma, dwFlags, lpOpenParms))
- dwRet = MCIERR_CREATEWINDOW;
- }
+ if (wma->hFile == 0) {
+ WARN("can't find file=%s!\n", debugstr_w(lpOpenParms->lpstrElementName));
+ dwRet = MCIERR_FILE_NOT_FOUND;
+ } else {
+ if (!MCIAVI_GetInfo(wma))
+ dwRet = MCIERR_INVALID_FILE;
+ else if (!MCIAVI_OpenVideo(wma))
+ dwRet = MCIERR_CANNOT_LOAD_DRIVER;
+ else if (!MCIAVI_CreateWindow(wma, dwFlags, lpOpenParms))
+ dwRet = MCIERR_CREATEWINDOW;
}
} else {
FIXME("Don't record yet\n");
@@ -303,8 +298,6 @@ DWORD MCIAVI_mciClose(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms);
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
wma = MCIAVI_mciGetOpenDev(wDevID);
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
@@ -390,13 +383,13 @@ static DWORD MCIAVI_mciPlay_async(WINE_MCIAVI *wma, DWORD dwFlags, LPMCI_PLAY_PA
static DWORD MCIAVI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
{
WINE_MCIAVI *wma;
- DWORD tc;
DWORD frameTime;
- DWORD delta;
DWORD dwRet;
LPWAVEHDR waveHdr = NULL;
unsigned i, nHdr = 0;
DWORD dwFromFrame, dwToFrame;
+ DWORD numEvents = 1;
+ HANDLE events[2];
TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms);
@@ -404,6 +397,8 @@ static DWORD MCIAVI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
wma = MCIAVI_mciGetOpenDev(wDevID);
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
+ if (dwFlags & MCI_DGV_PLAY_REVERSE) return MCIERR_UNSUPPORTED_FUNCTION;
+ if (dwFlags & MCI_TEST) return 0;
EnterCriticalSection(&wma->cs);
@@ -464,12 +459,13 @@ static DWORD MCIAVI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
/* signal the state change */
SetEvent(wma->ack_event);
- if (dwFlags & (MCI_DGV_PLAY_REPEAT|MCI_DGV_PLAY_REVERSE|MCI_MCIAVI_PLAY_WINDOW|MCI_MCIAVI_PLAY_FULLSCREEN))
+ if (dwFlags & (MCI_DGV_PLAY_REPEAT|MCI_MCIAVI_PLAY_WINDOW|MCI_MCIAVI_PLAY_FULLSCREEN))
FIXME("Unsupported flag %08x\n", dwFlags);
/* time is in microseconds, we should convert it to milliseconds */
frameTime = (wma->mah.dwMicroSecPerFrame + 500) / 1000;
+ events[0] = wma->hStopEvent;
if (wma->lpWaveFormat) {
if (MCIAVI_OpenAudio(wma, &nHdr, &waveHdr) != 0)
{
@@ -477,14 +473,19 @@ static DWORD MCIAVI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
HeapFree(GetProcessHeap(), 0, wma->lpWaveFormat);
wma->lpWaveFormat = NULL;
}
- else
- /* fill the queue with as many wave headers as possible */
- MCIAVI_PlayAudioBlocks(wma, nHdr, waveHdr);
+ else
+ {
+ /* fill the queue with as many wave headers as possible */
+ MCIAVI_PlayAudioBlocks(wma, nHdr, waveHdr);
+ events[1] = wma->hEvent;
+ numEvents = 2;
+ }
}
while (wma->dwStatus == MCI_MODE_PLAY)
{
HDC hDC;
+ DWORD tc, delta;
DWORD ret;
tc = GetTickCount();
@@ -496,21 +497,8 @@ static DWORD MCIAVI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
ReleaseDC(wma->hWndPaint, hDC);
}
- if (wma->lpWaveFormat) {
- HANDLE events[2];
-
- events[0] = wma->hStopEvent;
- events[1] = wma->hEvent;
-
+ if (wma->lpWaveFormat)
MCIAVI_PlayAudioBlocks(wma, nHdr, waveHdr);
- delta = GetTickCount() - tc;
-
- LeaveCriticalSection(&wma->cs);
- ret = WaitForMultipleObjects(2, events, FALSE, (delta >= frameTime) ? 0 : frameTime - delta);
- EnterCriticalSection(&wma->cs);
-
- if (ret == WAIT_OBJECT_0 || wma->dwStatus != MCI_MODE_PLAY) break;
- }
delta = GetTickCount() - tc;
if (delta < frameTime)
@@ -519,9 +507,9 @@ static DWORD MCIAVI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
delta = 0;
LeaveCriticalSection(&wma->cs);
- ret = WaitForMultipleObjects(1, &wma->hStopEvent, FALSE, delta);
+ ret = WaitForMultipleObjects(numEvents, events, FALSE, delta);
EnterCriticalSection(&wma->cs);
- if (ret == WAIT_OBJECT_0) break;
+ if (ret == WAIT_OBJECT_0 || wma->dwStatus != MCI_MODE_PLAY) break;
if (wma->dwCurrVideoFrame < dwToFrame)
wma->dwCurrVideoFrame++;
@@ -572,28 +560,6 @@ mci_play_done:
return dwRet;
}
-/***************************************************************************
- * MCIAVI_mciRecord [internal]
- */
-static DWORD MCIAVI_mciRecord(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RECORD_PARMS lpParms)
-{
- WINE_MCIAVI *wma;
-
- FIXME("(%04x, %08X, %p) : stub\n", wDevID, dwFlags, lpParms);
-
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
- if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
-
- wma = MCIAVI_mciGetOpenDev(wDevID);
- if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
-
- EnterCriticalSection(&wma->cs);
- wma->dwStatus = MCI_MODE_RECORD;
- LeaveCriticalSection(&wma->cs);
- return 0;
-}
-
/***************************************************************************
* MCIAVI_mciStop [internal]
*/
@@ -606,6 +572,7 @@ static DWORD MCIAVI_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpPa
wma = MCIAVI_mciGetOpenDev(wDevID);
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
+ if (dwFlags & MCI_TEST) return 0;
EnterCriticalSection(&wma->cs);
@@ -658,6 +625,7 @@ static DWORD MCIAVI_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpP
wma = MCIAVI_mciGetOpenDev(wDevID);
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
+ if (dwFlags & MCI_TEST) return 0;
EnterCriticalSection(&wma->cs);
@@ -684,6 +652,7 @@ static DWORD MCIAVI_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lp
wma = MCIAVI_mciGetOpenDev(wDevID);
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
+ if (dwFlags & MCI_TEST) return 0;
EnterCriticalSection(&wma->cs);
@@ -705,33 +674,36 @@ static DWORD MCIAVI_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lp
static DWORD MCIAVI_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
{
WINE_MCIAVI *wma;
+ DWORD position;
TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms);
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
wma = MCIAVI_mciGetOpenDev(wDevID);
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
+ position = dwFlags & (MCI_SEEK_TO_START|MCI_SEEK_TO_END|MCI_TO);
+ if (!position) return MCIERR_MISSING_PARAMETER;
+ if (position&(position-1)) return MCIERR_FLAGS_NOT_COMPATIBLE;
+
+ if (dwFlags & MCI_TO) {
+ position = MCIAVI_ConvertTimeFormatToFrame(wma, lpParms->dwTo);
+ if (position >= wma->dwPlayableVideoFrames)
+ return MCIERR_OUTOFRANGE;
+ } else if (dwFlags & MCI_SEEK_TO_START) {
+ position = 0;
+ } else {
+ position = wma->dwPlayableVideoFrames - 1;
+ }
+ if (dwFlags & MCI_TEST) return 0;
+
+ MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
+
EnterCriticalSection(&wma->cs);
- if (dwFlags & MCI_SEEK_TO_START) {
- wma->dwCurrVideoFrame = 0;
- } else if (dwFlags & MCI_SEEK_TO_END) {
- wma->dwCurrVideoFrame = wma->dwPlayableVideoFrames - 1;
- } else if (dwFlags & MCI_TO) {
- if (lpParms->dwTo > wma->dwPlayableVideoFrames - 1)
- lpParms->dwTo = wma->dwPlayableVideoFrames - 1;
- wma->dwCurrVideoFrame = MCIAVI_ConvertTimeFormatToFrame(wma, lpParms->dwTo);
- } else {
- WARN("dwFlag doesn't tell where to seek to...\n");
- LeaveCriticalSection(&wma->cs);
- return MCIERR_MISSING_PARAMETER;
- }
-
- TRACE("Seeking to frame=%u bytes\n", wma->dwCurrVideoFrame);
+ wma->dwCurrVideoFrame = position;
+ TRACE("Seeking to frame=%u\n", wma->dwCurrVideoFrame);
if (dwFlags & MCI_NOTIFY) {
mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),
@@ -750,52 +722,12 @@ static DWORD MCIAVI_mciLoad(UINT wDevID, DWORD dwFlags, LPMCI_DGV_LOAD_PARMSW lp
FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
wma = MCIAVI_mciGetOpenDev(wDevID);
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
- return 0;
-}
-
-/******************************************************************************
- * MCIAVI_mciSave [internal]
- */
-static DWORD MCIAVI_mciSave(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SAVE_PARMSW lpParms)
-{
- WINE_MCIAVI *wma;
-
- FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
-
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
- if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
-
- wma = MCIAVI_mciGetOpenDev(wDevID);
- if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
-
- return 0;
-}
-
-/******************************************************************************
- * MCIAVI_mciFreeze [internal]
- */
-static DWORD MCIAVI_mciFreeze(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RECT_PARMS lpParms)
-{
- WINE_MCIAVI *wma;
-
- FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
-
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
- if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
-
- wma = MCIAVI_mciGetOpenDev(wDevID);
- if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
-
- return 0;
+ return MCIERR_UNSUPPORTED_FUNCTION; /* like w2k */
}
/******************************************************************************
@@ -807,31 +739,11 @@ static DWORD MCIAVI_mciRealize(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS l
FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
- if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
-
- wma = MCIAVI_mciGetOpenDev(wDevID);
- if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
-
- return 0;
-}
-
-/******************************************************************************
- * MCIAVI_mciUnFreeze [internal]
- */
-static DWORD MCIAVI_mciUnFreeze(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RECT_PARMS lpParms)
-{
- WINE_MCIAVI *wma;
-
- FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
-
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
wma = MCIAVI_mciGetOpenDev(wDevID);
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
+ if (dwFlags & MCI_TEST) return 0;
return 0;
}
@@ -849,6 +761,7 @@ static DWORD MCIAVI_mciUpdate(UINT wDevID, DWORD dwFlags, LPMCI_DGV_UPDATE_PARMS
wma = MCIAVI_mciGetOpenDev(wDevID);
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
+ /* Ignore MCI_TEST flag. */
EnterCriticalSection(&wma->cs);
@@ -866,92 +779,34 @@ static DWORD MCIAVI_mciUpdate(UINT wDevID, DWORD dwFlags, LPMCI_DGV_UPDATE_PARMS
static DWORD MCIAVI_mciStep(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STEP_PARMS lpParms)
{
WINE_MCIAVI *wma;
+ DWORD position;
+ int delta = 1;
- FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
-
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
+ TRACE("(%04x, %08x, %p)\n", wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
wma = MCIAVI_mciGetOpenDev(wDevID);
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
- return 0;
-}
-
-/******************************************************************************
- * MCIAVI_mciCopy [internal]
- */
-static DWORD MCIAVI_mciCopy(UINT wDevID, DWORD dwFlags, LPMCI_DGV_COPY_PARMS lpParms)
-{
- WINE_MCIAVI *wma;
-
- FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
+ if (dwFlags & MCI_DGV_STEP_FRAMES) delta = lpParms->dwFrames;
+ if (dwFlags & MCI_DGV_STEP_REVERSE) delta = -delta;
+ position = wma->dwCurrVideoFrame + delta;
+ if (position >= wma->dwPlayableVideoFrames) return MCIERR_OUTOFRANGE;
+ if (dwFlags & MCI_TEST) return 0;
MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
- if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
+ EnterCriticalSection(&wma->cs);
- wma = MCIAVI_mciGetOpenDev(wDevID);
- if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
-
- return 0;
-}
-
-/******************************************************************************
- * MCIAVI_mciCut [internal]
- */
-static DWORD MCIAVI_mciCut(UINT wDevID, DWORD dwFlags, LPMCI_DGV_CUT_PARMS lpParms)
-{
- WINE_MCIAVI *wma;
-
- FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
-
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
- if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
-
- wma = MCIAVI_mciGetOpenDev(wDevID);
- if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
-
- return 0;
-}
-
-/******************************************************************************
- * MCIAVI_mciDelete [internal]
- */
-static DWORD MCIAVI_mciDelete(UINT wDevID, DWORD dwFlags, LPMCI_DGV_DELETE_PARMS lpParms)
-{
- WINE_MCIAVI *wma;
-
- FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
-
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
- if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
-
- wma = MCIAVI_mciGetOpenDev(wDevID);
- if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
-
- return 0;
-}
-
-/******************************************************************************
- * MCIAVI_mciPaste [internal]
- */
-static DWORD MCIAVI_mciPaste(UINT wDevID, DWORD dwFlags, LPMCI_DGV_PASTE_PARMS lpParms)
-{
- WINE_MCIAVI *wma;
-
- FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
-
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
- if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
-
- wma = MCIAVI_mciGetOpenDev(wDevID);
- if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
+ wma->dwCurrVideoFrame = position;
+ TRACE("Stepping to frame=%u\n", wma->dwCurrVideoFrame);
+ if (dwFlags & MCI_NOTIFY) {
+ mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),
+ wDevID, MCI_NOTIFY_SUCCESSFUL);
+ }
+ LeaveCriticalSection(&wma->cs);
return 0;
}
@@ -964,69 +819,12 @@ static DWORD MCIAVI_mciCue(UINT wDevID, DWORD dwFlags, LPMCI_DGV_CUE_PARMS lpPar
FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
- if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
-
- wma = MCIAVI_mciGetOpenDev(wDevID);
- if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
-
- return 0;
-}
-
-/******************************************************************************
- * MCIAVI_mciCapture [internal]
- */
-static DWORD MCIAVI_mciCapture(UINT wDevID, DWORD dwFlags, LPMCI_DGV_CAPTURE_PARMSW lpParms)
-{
- WINE_MCIAVI *wma;
-
- FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
-
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
- if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
-
- wma = MCIAVI_mciGetOpenDev(wDevID);
- if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
-
- return 0;
-}
-
-/******************************************************************************
- * MCIAVI_mciMonitor [internal]
- */
-static DWORD MCIAVI_mciMonitor(UINT wDevID, DWORD dwFlags, LPMCI_DGV_MONITOR_PARMS lpParms)
-{
- WINE_MCIAVI *wma;
-
- FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
-
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
- if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
-
- wma = MCIAVI_mciGetOpenDev(wDevID);
- if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
-
- return 0;
-}
-
-/******************************************************************************
- * MCIAVI_mciReserve [internal]
- */
-static DWORD MCIAVI_mciReserve(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RESERVE_PARMSW lpParms)
-{
- WINE_MCIAVI *wma;
-
- FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
-
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
wma = MCIAVI_mciGetOpenDev(wDevID);
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
+ if (dwFlags & MCI_DGV_CUE_INPUT) return MCIERR_UNSUPPORTED_FUNCTION;
+ if (dwFlags & MCI_TEST) return 0;
return 0;
}
@@ -1040,14 +838,12 @@ static DWORD MCIAVI_mciSetAudio(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SETAUDIO_P
FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
wma = MCIAVI_mciGetOpenDev(wDevID);
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
- return 0;
+ return MCIERR_UNSUPPORTED_FUNCTION; /* like w2k */
}
/******************************************************************************
@@ -1059,8 +855,6 @@ static DWORD MCIAVI_mciSignal(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SIGNAL_PARMS
FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
wma = MCIAVI_mciGetOpenDev(wDevID);
@@ -1078,71 +872,12 @@ static DWORD MCIAVI_mciSetVideo(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SETVIDEO_P
FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
wma = MCIAVI_mciGetOpenDev(wDevID);
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
- return 0;
-}
-
-/******************************************************************************
- * MCIAVI_mciQuality [internal]
- */
-static DWORD MCIAVI_mciQuality(UINT wDevID, DWORD dwFlags, LPMCI_DGV_QUALITY_PARMSW lpParms)
-{
- WINE_MCIAVI *wma;
-
- FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
-
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
- if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
-
- wma = MCIAVI_mciGetOpenDev(wDevID);
- if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
-
- return 0;
-}
-
-/******************************************************************************
- * MCIAVI_mciList [internal]
- */
-static DWORD MCIAVI_mciList(UINT wDevID, DWORD dwFlags, LPMCI_DGV_LIST_PARMSW lpParms)
-{
- WINE_MCIAVI *wma;
-
- FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
-
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
- if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
-
- wma = MCIAVI_mciGetOpenDev(wDevID);
- if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
-
- return 0;
-}
-
-/******************************************************************************
- * MCIAVI_mciUndo [internal]
- */
-static DWORD MCIAVI_mciUndo(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
-{
- WINE_MCIAVI *wma;
-
- FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
-
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
- if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
-
- wma = MCIAVI_mciGetOpenDev(wDevID);
- if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
-
- return 0;
+ return MCIERR_UNSUPPORTED_FUNCTION; /* like w2k */
}
/******************************************************************************
@@ -1154,31 +889,11 @@ static DWORD MCIAVI_mciConfigure(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS
FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
- if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
-
- wma = MCIAVI_mciGetOpenDev(wDevID);
- if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
-
- return 0;
-}
-
-/******************************************************************************
- * MCIAVI_mciRestore [internal]
- */
-static DWORD MCIAVI_mciRestore(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RESTORE_PARMSW lpParms)
-{
- WINE_MCIAVI *wma;
-
- FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
-
- MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
-
if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
wma = MCIAVI_mciGetOpenDev(wDevID);
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
+ if (dwFlags & MCI_TEST) return 0;
return 0;
}
@@ -1216,7 +931,6 @@ LRESULT CALLBACK MCIAVI_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg,
case MCI_OPEN_DRIVER: return MCIAVI_mciOpen (dwDevID, dwParam1, (LPMCI_DGV_OPEN_PARMSW) dwParam2);
case MCI_CLOSE_DRIVER: return MCIAVI_mciClose (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
case MCI_PLAY: return MCIAVI_mciPlay (dwDevID, dwParam1, (LPMCI_PLAY_PARMS) dwParam2);
- case MCI_RECORD: return MCIAVI_mciRecord (dwDevID, dwParam1, (LPMCI_DGV_RECORD_PARMS) dwParam2);
case MCI_STOP: return MCIAVI_mciStop (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
case MCI_SET: return MCIAVI_mciSet (dwDevID, dwParam1, (LPMCI_DGV_SET_PARMS) dwParam2);
case MCI_PAUSE: return MCIAVI_mciPause (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
@@ -1228,34 +942,38 @@ LRESULT CALLBACK MCIAVI_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg,
case MCI_PUT: return MCIAVI_mciPut (dwDevID, dwParam1, (LPMCI_DGV_PUT_PARMS) dwParam2);
case MCI_WINDOW: return MCIAVI_mciWindow (dwDevID, dwParam1, (LPMCI_DGV_WINDOW_PARMSW) dwParam2);
case MCI_LOAD: return MCIAVI_mciLoad (dwDevID, dwParam1, (LPMCI_DGV_LOAD_PARMSW) dwParam2);
- case MCI_SAVE: return MCIAVI_mciSave (dwDevID, dwParam1, (LPMCI_DGV_SAVE_PARMSW) dwParam2);
- case MCI_FREEZE: return MCIAVI_mciFreeze (dwDevID, dwParam1, (LPMCI_DGV_RECT_PARMS) dwParam2);
case MCI_REALIZE: return MCIAVI_mciRealize (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
- case MCI_UNFREEZE: return MCIAVI_mciUnFreeze (dwDevID, dwParam1, (LPMCI_DGV_RECT_PARMS) dwParam2);
case MCI_UPDATE: return MCIAVI_mciUpdate (dwDevID, dwParam1, (LPMCI_DGV_UPDATE_PARMS) dwParam2);
case MCI_WHERE: return MCIAVI_mciWhere (dwDevID, dwParam1, (LPMCI_DGV_RECT_PARMS) dwParam2);
case MCI_STEP: return MCIAVI_mciStep (dwDevID, dwParam1, (LPMCI_DGV_STEP_PARMS) dwParam2);
- case MCI_COPY: return MCIAVI_mciCopy (dwDevID, dwParam1, (LPMCI_DGV_COPY_PARMS) dwParam2);
- case MCI_CUT: return MCIAVI_mciCut (dwDevID, dwParam1, (LPMCI_DGV_CUT_PARMS) dwParam2);
- case MCI_DELETE: return MCIAVI_mciDelete (dwDevID, dwParam1, (LPMCI_DGV_DELETE_PARMS) dwParam2);
- case MCI_PASTE: return MCIAVI_mciPaste (dwDevID, dwParam1, (LPMCI_DGV_PASTE_PARMS) dwParam2);
case MCI_CUE: return MCIAVI_mciCue (dwDevID, dwParam1, (LPMCI_DGV_CUE_PARMS) dwParam2);
/* Digital Video specific */
- case MCI_CAPTURE: return MCIAVI_mciCapture (dwDevID, dwParam1, (LPMCI_DGV_CAPTURE_PARMSW) dwParam2);
- case MCI_MONITOR: return MCIAVI_mciMonitor (dwDevID, dwParam1, (LPMCI_DGV_MONITOR_PARMS) dwParam2);
- case MCI_RESERVE: return MCIAVI_mciReserve (dwDevID, dwParam1, (LPMCI_DGV_RESERVE_PARMSW) dwParam2);
case MCI_SETAUDIO: return MCIAVI_mciSetAudio (dwDevID, dwParam1, (LPMCI_DGV_SETAUDIO_PARMSW) dwParam2);
case MCI_SIGNAL: return MCIAVI_mciSignal (dwDevID, dwParam1, (LPMCI_DGV_SIGNAL_PARMS) dwParam2);
case MCI_SETVIDEO: return MCIAVI_mciSetVideo (dwDevID, dwParam1, (LPMCI_DGV_SETVIDEO_PARMSW) dwParam2);
- case MCI_QUALITY: return MCIAVI_mciQuality (dwDevID, dwParam1, (LPMCI_DGV_QUALITY_PARMSW) dwParam2);
- case MCI_LIST: return MCIAVI_mciList (dwDevID, dwParam1, (LPMCI_DGV_LIST_PARMSW) dwParam2);
- case MCI_UNDO: return MCIAVI_mciUndo (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
case MCI_CONFIGURE: return MCIAVI_mciConfigure (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
- case MCI_RESTORE: return MCIAVI_mciRestore (dwDevID, dwParam1, (LPMCI_DGV_RESTORE_PARMSW) dwParam2);
+ /* no editing, recording, saving, locking without inputs */
+ case MCI_CAPTURE:
+ case MCI_COPY:
+ case MCI_CUT:
+ case MCI_DELETE:
+ case MCI_FREEZE:
+ case MCI_LIST:
+ case MCI_MONITOR:
+ case MCI_PASTE:
+ case MCI_QUALITY:
+ case MCI_RECORD:
+ case MCI_RESERVE:
+ case MCI_RESTORE:
+ case MCI_SAVE:
+ case MCI_UNDO:
+ case MCI_UNFREEZE:
+ TRACE("Unsupported function [0x%x] flags=%08x\n", wMsg, (DWORD)dwParam1);
+ return MCIERR_UNSUPPORTED_FUNCTION;
case MCI_SPIN:
case MCI_ESCAPE:
- WARN("Unsupported command [%u]\n", wMsg);
+ WARN("Unsupported command [0x%x] %08x\n", wMsg, (DWORD)dwParam1);
break;
case MCI_OPEN:
case MCI_CLOSE:
diff --git a/reactos/dll/win32/mciavi32/mciavi_res.rc b/reactos/dll/win32/mciavi32/mciavi_res.rc
index 5f6d973e54a..d1e8faca3ec 100644
--- a/reactos/dll/win32/mciavi32/mciavi_res.rc
+++ b/reactos/dll/win32/mciavi32/mciavi_res.rc
@@ -20,6 +20,7 @@
#include "windef.h"
#include "winbase.h"
#include "mmddk.h"
+#include "digitalv.h"
MCIAVI RCDATA
BEGIN
@@ -563,3 +564,10 @@ L"text\0", 0x00080000L, MCI_STRING,
L"\0", 0x00000000L, MCI_END_COMMAND,
L"\0", 0x00000000L, MCI_END_COMMAND_LIST
END
+
+STRINGTABLE
+BEGIN
+
+MCI_ON_S, "on"
+MCI_OFF_S, "off"
+END
diff --git a/reactos/dll/win32/mciavi32/mmoutput.c b/reactos/dll/win32/mciavi32/mmoutput.c
index f9d1ddd9dd4..2cd33398ead 100644
--- a/reactos/dll/win32/mciavi32/mmoutput.c
+++ b/reactos/dll/win32/mciavi32/mmoutput.c
@@ -333,6 +333,7 @@ BOOL MCIAVI_GetInfo(WINE_MCIAVI* wma)
if (!MCIAVI_GetInfoVideo(wma, &mmckList, &mmckStream))
return FALSE;
wma->video_stream_n = stream_n;
+ wma->dwSet |= 4;
}
}
else if (strh.fccType == streamtypeAUDIO)
@@ -347,6 +348,7 @@ BOOL MCIAVI_GetInfo(WINE_MCIAVI* wma)
if (!MCIAVI_GetInfoAudio(wma, &mmckList, &mmckStream))
return FALSE;
wma->audio_stream_n = stream_n;
+ wma->dwSet |= 3;
}
}
else
diff --git a/reactos/dll/win32/mciavi32/wnd.c b/reactos/dll/win32/mciavi32/wnd.c
index 36f56e6293a..c7dcf61d07c 100644
--- a/reactos/dll/win32/mciavi32/wnd.c
+++ b/reactos/dll/win32/mciavi32/wnd.c
@@ -154,6 +154,7 @@ DWORD MCIAVI_mciPut(UINT wDevID, DWORD dwFlags, LPMCI_DGV_PUT_PARMS lpParms)
if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
+ if (dwFlags & MCI_TEST) return 0;
EnterCriticalSection(&wma->cs);
@@ -211,6 +212,7 @@ DWORD MCIAVI_mciWhere(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RECT_PARMS lpParms)
if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
+ /* Ignore MCI_TEST flag. */
EnterCriticalSection(&wma->cs);
@@ -283,6 +285,7 @@ DWORD MCIAVI_mciWindow(UINT wDevID, DWORD dwFlags, LPMCI_DGV_WINDOW_PARMSW lpPar
if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
+ if (dwFlags & MCI_TEST) return 0;
EnterCriticalSection(&wma->cs);
diff --git a/reactos/dll/win32/mciqtz32/mciqtz.c b/reactos/dll/win32/mciqtz32/mciqtz.c
index 837122747c7..b98e163ebbc 100644
--- a/reactos/dll/win32/mciqtz32/mciqtz.c
+++ b/reactos/dll/win32/mciqtz32/mciqtz.c
@@ -105,6 +105,7 @@ static DWORD MCIQTZ_drvClose(DWORD dwDevID)
/* finish all outstanding things */
MCIQTZ_mciClose(dwDevID, MCI_WAIT, NULL);
+ mciSetDriverData(dwDevID, 0);
HeapFree(GetProcessHeap(), 0, wma);
return 1;
}
@@ -166,7 +167,7 @@ static DWORD MCIQTZ_mciOpen(UINT wDevID, DWORD dwFlags,
goto err;
}
- if (!((dwFlags & MCI_OPEN_ELEMENT) && (dwFlags & MCI_OPEN_ELEMENT))) {
+ if (!(dwFlags & MCI_OPEN_ELEMENT) || (dwFlags & MCI_OPEN_ELEMENT_ID)) {
TRACE("Wrong dwFlags %x\n", dwFlags);
goto err;
}
@@ -353,10 +354,8 @@ static DWORD MCIQTZ_mciGetDevCaps(UINT wDevID, DWORD dwFlags, LPMCI_GETDEVCAPS_P
if (!wma)
return MCIERR_INVALID_DEVICE_ID;
- if (!(dwFlags & MCI_STATUS_ITEM)) {
- WARN("No capability item specified\n");
- return MCIERR_UNRECOGNIZED_COMMAND;
- }
+ if (!(dwFlags & MCI_GETDEVCAPS_ITEM))
+ return MCIERR_MISSING_PARAMETER;
switch (lpParms->dwItem) {
case MCI_GETDEVCAPS_CAN_RECORD:
@@ -395,9 +394,44 @@ static DWORD MCIQTZ_mciGetDevCaps(UINT wDevID, DWORD dwFlags, LPMCI_GETDEVCAPS_P
lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
TRACE("MCI_GETDEVCAPS_CAN_SAVE = %08x\n", lpParms->dwReturn);
break;
+ case MCI_DGV_GETDEVCAPS_CAN_REVERSE:
+ lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
+ TRACE("MCI_DGV_GETDEVCAPS_CAN_REVERSE = %08x\n", lpParms->dwReturn);
+ break;
+ case MCI_DGV_GETDEVCAPS_CAN_STRETCH:
+ lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE); /* FIXME */
+ TRACE("MCI_DGV_GETDEVCAPS_CAN_STRETCH = %08x\n", lpParms->dwReturn);
+ break;
+ case MCI_DGV_GETDEVCAPS_CAN_LOCK:
+ lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
+ TRACE("MCI_DGV_GETDEVCAPS_CAN_LOCK = %08x\n", lpParms->dwReturn);
+ break;
+ case MCI_DGV_GETDEVCAPS_CAN_FREEZE:
+ lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
+ TRACE("MCI_DGV_GETDEVCAPS_CAN_FREEZE = %08x\n", lpParms->dwReturn);
+ break;
+ case MCI_DGV_GETDEVCAPS_CAN_STR_IN:
+ lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
+ TRACE("MCI_DGV_GETDEVCAPS_CAN_STRETCH_INPUT = %08x\n", lpParms->dwReturn);
+ break;
+ case MCI_DGV_GETDEVCAPS_HAS_STILL:
+ lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
+ TRACE("MCI_DGV_GETDEVCAPS_HAS_STILL = %08x\n", lpParms->dwReturn);
+ break;
+ case MCI_DGV_GETDEVCAPS_CAN_TEST:
+ lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE); /* FIXME */
+ TRACE("MCI_DGV_GETDEVCAPS_CAN_TEST = %08x\n", lpParms->dwReturn);
+ break;
+ case MCI_DGV_GETDEVCAPS_MAX_WINDOWS:
+ lpParms->dwReturn = 1;
+ TRACE("MCI_DGV_GETDEVCAPS_MAX_WINDOWS = %u\n", lpParms->dwReturn);
+ return 0;
default:
- ERR("Unknown capability %08x\n", lpParms->dwItem);
- return MCIERR_UNRECOGNIZED_COMMAND;
+ WARN("Unknown capability %08x\n", lpParms->dwItem);
+ /* Fall through */
+ case MCI_DGV_GETDEVCAPS_MAXIMUM_RATE: /* unknown to w2k */
+ case MCI_DGV_GETDEVCAPS_MINIMUM_RATE: /* unknown to w2k */
+ return MCIERR_UNSUPPORTED_FUNCTION;
}
return MCI_RESOURCE_RETURNED;
@@ -435,8 +469,25 @@ static DWORD MCIQTZ_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SET_PARMS lpPar
}
}
- if (dwFlags & ~MCI_SET_TIME_FORMAT)
- FIXME("Flags not supported yet %08lX\n", dwFlags & ~MCI_SET_TIME_FORMAT);
+ if (dwFlags & MCI_SET_DOOR_OPEN)
+ FIXME("MCI_SET_DOOR_OPEN not implemented yet\n");
+ if (dwFlags & MCI_SET_DOOR_CLOSED)
+ FIXME("MCI_SET_DOOR_CLOSED not implemented yet\n");
+ if (dwFlags & MCI_SET_AUDIO)
+ FIXME("MCI_SET_AUDIO not implemented yet\n");
+ if (dwFlags & MCI_SET_VIDEO)
+ FIXME("MCI_SET_VIDEO not implemented yet\n");
+ if (dwFlags & MCI_SET_ON)
+ FIXME("MCI_SET_ON not implemented yet\n");
+ if (dwFlags & MCI_SET_OFF)
+ FIXME("MCI_SET_OFF not implemented yet\n");
+ if (dwFlags & MCI_SET_AUDIO_LEFT)
+ FIXME("MCI_SET_AUDIO_LEFT not implemented yet\n");
+ if (dwFlags & MCI_SET_AUDIO_RIGHT)
+ FIXME("MCI_SET_AUDIO_RIGHT not implemented yet\n");
+
+ if (dwFlags & ~0x7f03 /* All MCI_SET flags mask */)
+ ERR("Unknown flags %08x\n", dwFlags & ~0x7f03);
return 0;
}
@@ -603,6 +654,27 @@ static DWORD MCIQTZ_mciWhere(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RECT_PARMS lp
return 0;
}
+/***************************************************************************
+ * MCIQTZ_mciSetAudio [internal]
+ */
+static DWORD MCIQTZ_mciSetAudio(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SETAUDIO_PARMSW lpParms)
+{
+ WINE_MCIQTZ *wma;
+
+ FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
+
+ if (!lpParms)
+ return MCIERR_NULL_PARAMETER_BLOCK;
+
+ wma = MCIQTZ_mciGetOpenDev(wDevID);
+ if (!wma)
+ return MCIERR_INVALID_DEVICE_ID;
+
+ MCIQTZ_mciStop(wDevID, MCI_WAIT, NULL);
+
+ return 0;
+}
+
/*======================================================================*
* MCI QTZ entry points *
*======================================================================*/
@@ -643,6 +715,8 @@ LRESULT CALLBACK MCIQTZ_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg,
case MCI_SET: return MCIQTZ_mciSet (dwDevID, dwParam1, (LPMCI_DGV_SET_PARMS) dwParam2);
case MCI_STATUS: return MCIQTZ_mciStatus (dwDevID, dwParam1, (LPMCI_DGV_STATUS_PARMSW) dwParam2);
case MCI_WHERE: return MCIQTZ_mciWhere (dwDevID, dwParam1, (LPMCI_DGV_RECT_PARMS) dwParam2);
+ /* Digital Video specific */
+ case MCI_SETAUDIO: return MCIQTZ_mciSetAudio (dwDevID, dwParam1, (LPMCI_DGV_SETAUDIO_PARMSW) dwParam2);
case MCI_RECORD:
case MCI_PAUSE:
case MCI_RESUME:
@@ -665,7 +739,6 @@ LRESULT CALLBACK MCIQTZ_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg,
case MCI_CAPTURE:
case MCI_MONITOR:
case MCI_RESERVE:
- case MCI_SETAUDIO:
case MCI_SIGNAL:
case MCI_SETVIDEO:
case MCI_QUALITY:
diff --git a/reactos/dll/win32/mciseq/mcimidi.c b/reactos/dll/win32/mciseq/mcimidi.c
index 47cb792362c..301428d517d 100644
--- a/reactos/dll/win32/mciseq/mcimidi.c
+++ b/reactos/dll/win32/mciseq/mcimidi.c
@@ -113,9 +113,6 @@ static DWORD CALLBACK MCI_SCAStarter(LPVOID arg)
TRACE("In thread after async command (%08x,%u,%08lx,%08lx)\n",
sca->wDevID, sca->wMsg, sca->dwParam1, sca->dwParam2);
HeapFree(GetProcessHeap(), 0, sca);
- ExitThread(ret);
- WARN("Should not happen ? what's wrong\n");
- /* should not go after this point */
return ret;
}
@@ -147,7 +144,7 @@ static DWORD MCI_SendCommandAsync(UINT wDevID, UINT wMsg, DWORD_PTR dwParam1,
if ((handle = CreateThread(NULL, 0, MCI_SCAStarter, sca, 0, NULL)) == 0) {
WARN("Couldn't allocate thread for async command handling, sending synchronously\n");
- return MCI_SCAStarter(&sca);
+ return MCI_SCAStarter(sca);
}
SetThreadPriority(handle, THREAD_PRIORITY_TIME_CRITICAL);
CloseHandle(handle);
@@ -412,7 +409,7 @@ static DWORD MIDI_mciReadMTrk(WINE_MCIMIDI* wmm, MCI_MIDITRACK* mmt)
} else {
len = MultiByteToWideChar( CP_ACP, 0, buf, -1, NULL, 0 );
wmm->lpstrCopyright = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
- len = MultiByteToWideChar( CP_ACP, 0, buf, -1, wmm->lpstrCopyright, len );
+ MultiByteToWideChar( CP_ACP, 0, buf, -1, wmm->lpstrCopyright, len );
}
break;
case 0x03:
@@ -421,7 +418,7 @@ static DWORD MIDI_mciReadMTrk(WINE_MCIMIDI* wmm, MCI_MIDITRACK* mmt)
} else {
len = MultiByteToWideChar( CP_ACP, 0, buf, -1, NULL, 0 );
wmm->lpstrName = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
- len = MultiByteToWideChar( CP_ACP, 0, buf, -1, wmm->lpstrName, len );
+ MultiByteToWideChar( CP_ACP, 0, buf, -1, wmm->lpstrName, len );
}
break;
}
diff --git a/reactos/dll/win32/mlang/mlang.c b/reactos/dll/win32/mlang/mlang.c
index c28e695962d..47b1745215a 100644
--- a/reactos/dll/win32/mlang/mlang.c
+++ b/reactos/dll/win32/mlang/mlang.c
@@ -2501,7 +2501,7 @@ static HRESULT EnumRfc1766_create(LANGID LangId, IEnumRfc1766 **ppEnum)
if (!data.info)
{
HeapFree(GetProcessHeap(), 0, rfc);
- return S_FALSE;
+ return E_OUTOFMEMORY;
}
TlsSetValue(MLANG_tls_index, &data);
@@ -2514,7 +2514,7 @@ static HRESULT EnumRfc1766_create(LANGID LangId, IEnumRfc1766 **ppEnum)
{
HeapFree(GetProcessHeap(), 0, data.info);
HeapFree(GetProcessHeap(), 0, rfc);
- return FALSE;
+ return E_FAIL;
}
rfc->info = data.info;
@@ -3007,9 +3007,6 @@ exit:
return hr;
}
-/*
- * TODO: handle dwFlag and lpFallBack
-*/
static HRESULT WINAPI fnIMultiLanguage2_ConvertStringToUnicodeEx(
IMultiLanguage3* iface,
DWORD* pdwMode,
@@ -3021,7 +3018,10 @@ static HRESULT WINAPI fnIMultiLanguage2_ConvertStringToUnicodeEx(
DWORD dwFlag,
WCHAR* lpFallBack)
{
- FIXME("\n");
+ if (dwFlag || lpFallBack)
+ FIXME("Ignoring dwFlag (0x%x/%d) and lpFallBack (%p)\n",
+ dwFlag, dwFlag, lpFallBack);
+
return ConvertINetMultiByteToUnicode(pdwMode, dwEncoding,
pSrcStr, (LPINT)pcSrcSize, pDstStr, (LPINT)pcDstSize);
}