Added stubs for msrle32.dll and implemented RLE8 decoder.
Added stub for avicap32.

diff --git a/configure b/configure
index 1d749fe..69857a7 100755
--- a/configure
+++ b/configure
@@ -7053,6 +7053,7 @@
 debugger/Makefile
 dlls/Makefile
 dlls/advapi32/Makefile
+dlls/avicap32/Makefile
 dlls/avifil32/Makefile
 dlls/comctl32/Makefile
 dlls/commdlg/Makefile
@@ -7077,6 +7078,7 @@
 dlls/msdmo/Makefile
 dlls/msimg32/Makefile
 dlls/msnet32/Makefile
+dlls/msrle32/Makefile
 dlls/msvcrt/Makefile
 dlls/msvideo/Makefile
 dlls/ntdll/Makefile
@@ -7310,6 +7312,7 @@
 debugger/Makefile
 dlls/Makefile
 dlls/advapi32/Makefile
+dlls/avicap32/Makefile
 dlls/avifil32/Makefile
 dlls/comctl32/Makefile
 dlls/commdlg/Makefile
@@ -7334,6 +7337,7 @@
 dlls/msdmo/Makefile
 dlls/msimg32/Makefile
 dlls/msnet32/Makefile
+dlls/msrle32/Makefile
 dlls/msvcrt/Makefile
 dlls/msvideo/Makefile
 dlls/ntdll/Makefile
diff --git a/configure.in b/configure.in
index a2fcc00..69697eb 100644
--- a/configure.in
+++ b/configure.in
@@ -1219,6 +1219,7 @@
 debugger/Makefile
 dlls/Makefile
 dlls/advapi32/Makefile
+dlls/avicap32/Makefile
 dlls/avifil32/Makefile
 dlls/comctl32/Makefile
 dlls/commdlg/Makefile
@@ -1243,6 +1244,7 @@
 dlls/msdmo/Makefile
 dlls/msimg32/Makefile
 dlls/msnet32/Makefile
+dlls/msrle32/Makefile
 dlls/msvcrt/Makefile
 dlls/msvideo/Makefile
 dlls/ntdll/Makefile
diff --git a/dlls/Makefile.in b/dlls/Makefile.in
index 132232b..8845ab3 100644
--- a/dlls/Makefile.in
+++ b/dlls/Makefile.in
@@ -18,6 +18,7 @@
 SUBDIRS = \
 	$(EXTRADIRS) \
 	advapi32 \
+	avicap32 \
 	avifil32 \
 	comctl32 \
 	commdlg \
@@ -40,6 +41,7 @@
 	msdmo \
 	msimg32 \
 	msnet32 \
+	msrle32 \
 	msvcrt \
 	msvideo \
 	ntdll \
@@ -96,6 +98,7 @@
 all: \
 	$(EXTRADIRS:%=lib%.$(LIBEXT)) \
 	libadvapi32.$(LIBEXT) \
+	libavicap32.$(LIBEXT) \
 	libavifil32.$(LIBEXT) \
 	libavifile.$(LIBEXT) \
 	libcomctl32.$(LIBEXT) \
@@ -141,6 +144,7 @@
 	libmsdmo.$(LIBEXT) \
 	libmsimg32.$(LIBEXT) \
 	libmsnet32.$(LIBEXT) \
+	libmsrle32.$(LIBEXT) \
 	libmsvcrt.$(LIBEXT) \
 	libmsvfw32.$(LIBEXT) \
 	libmsvideo.$(LIBEXT) \
@@ -221,6 +225,9 @@
 libadvapi32.$(LIBEXT): advapi32/libadvapi32.$(LIBEXT)
 	$(RM) $@ && $(LN_S) advapi32/libadvapi32.$(LIBEXT) $@
 
+libavicap32.$(LIBEXT): avicap32/libavicap32.$(LIBEXT)
+	$(RM) $@ && $(LN_S) avicap32/libavicap32.$(LIBEXT) $@
+
 libavifil32.$(LIBEXT) libavifile.$(LIBEXT): avifil32/libavifil32.$(LIBEXT)
 	$(RM) $@ && $(LN_S) avifil32/libavifil32.$(LIBEXT) $@
 
@@ -320,6 +327,9 @@
 libmsnet32.$(LIBEXT): msnet32/libmsnet32.$(LIBEXT)
 	$(RM) $@ && $(LN_S) msnet32/libmsnet32.$(LIBEXT) $@
 
+libmsrle32.$(LIBEXT): msrle32/libmsrle32.$(LIBEXT)
+	$(RM) $@ && $(LN_S) msrle32/libmsrle32.$(LIBEXT) $@
+
 libmsvcrt.$(LIBEXT): msvcrt/libmsvcrt.$(LIBEXT)
 	$(RM) $@ && $(LN_S) msvcrt/libmsvcrt.$(LIBEXT) $@
 
@@ -460,6 +470,9 @@
 advapi32/libadvapi32.$(LIBEXT): dummy libkernel32.$(LIBEXT) libntdll.$(LIBEXT)
 	@cd advapi32 && $(MAKE) libadvapi32.$(LIBEXT)
 
+avicap32/libavicap32.$(LIBEXT): dummy libntdll.$(LIBEXT)
+	@cd avicap32 && $(MAKE) libavicap32.$(LIBEXT)
+
 avifil32/libavifil32.$(LIBEXT): dummy libmsvfw32.$(LIBEXT) libole32.$(LIBEXT) \
   libkernel32.$(LIBEXT) libntdll.$(LIBEXT)
 	@cd avifil32 && $(MAKE) libavifil32.$(LIBEXT)
@@ -544,6 +557,10 @@
 msnet32/libmsnet32.$(LIBEXT): dummy libntdll.$(LIBEXT)
 	@cd msnet32 && $(MAKE) libmsnet32.$(LIBEXT)
 
+msrle32/libmsrle32.$(LIBEXT): dummy libwinmm.$(LIBEXT) libuser32.$(LIBEXT) \
+  libkernel32.$(LIBEXT) libntdll.$(LIBEXT)
+	@cd msrle32 && $(MAKE) libmsrle32.$(LIBEXT)
+
 msvcrt/libmsvcrt.$(LIBEXT): dummy libkernel32.$(LIBEXT) libntdll.$(LIBEXT)
 	@cd msvcrt && $(MAKE) libmsvcrt.$(LIBEXT)
 
diff --git a/dlls/avicap32/.cvsignore b/dlls/avicap32/.cvsignore
new file mode 100644
index 0000000..103d1dd
--- /dev/null
+++ b/dlls/avicap32/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+avicap32.spec.c
diff --git a/dlls/avicap32/Makefile.in b/dlls/avicap32/Makefile.in
new file mode 100644
index 0000000..40c1432
--- /dev/null
+++ b/dlls/avicap32/Makefile.in
@@ -0,0 +1,14 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = avicap32
+
+LDDLLFLAGS = @LDDLLFLAGS@
+SYMBOLFILE = $(MODULE).tmp.o
+
+C_SRCS = avicap32_main.c
+
+@MAKE_DLL_RULES@
+
+### Dependencies:
diff --git a/dlls/avicap32/avicap32.spec b/dlls/avicap32/avicap32.spec
new file mode 100644
index 0000000..9ca1379
--- /dev/null
+++ b/dlls/avicap32/avicap32.spec
@@ -0,0 +1,11 @@
+name url
+type win32
+
+import ntdll.dll
+
+debug_channels()
+
+@ stub capCreateCaptureWindowA
+@ stub capCreateCaptureWindowW
+@ stub capGetDriverDescriptionA
+@ stub capGetDriverDescriptionW
diff --git a/dlls/avicap32/avicap32_main.c b/dlls/avicap32/avicap32_main.c
new file mode 100644
index 0000000..67a01ed
--- /dev/null
+++ b/dlls/avicap32/avicap32_main.c
@@ -0,0 +1 @@
+/* nothing here yet */
diff --git a/dlls/msrle32/.cvsignore b/dlls/msrle32/.cvsignore
new file mode 100644
index 0000000..2a842f8
--- /dev/null
+++ b/dlls/msrle32/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+msrle32.spec.c
diff --git a/dlls/msrle32/Makefile.in b/dlls/msrle32/Makefile.in
new file mode 100644
index 0000000..6eeac93
--- /dev/null
+++ b/dlls/msrle32/Makefile.in
@@ -0,0 +1,14 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = msrle32
+
+LDDLLFLAGS = @LDDLLFLAGS@
+SYMBOLFILE = $(MODULE).tmp.o
+
+C_SRCS = msrle32.c
+
+@MAKE_DLL_RULES@
+
+### Dependencies:
diff --git a/dlls/msrle32/msrle32.c b/dlls/msrle32/msrle32.c
new file mode 100644
index 0000000..699fd5e
--- /dev/null
+++ b/dlls/msrle32/msrle32.c
@@ -0,0 +1,612 @@
+/*
+ *	MSRLE32 Driver
+ *
+ *	Copyright 2001 TAKESHIMA Hidenori <hidenori@a2.ctktv.ne.jp>
+ *
+ *	FIXME - encoding
+ *	FIXME - RLE4
+ *
+ */
+
+#include "config.h"
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "mmsystem.h"
+#include "vfw.h"
+
+#include "debugtools.h"
+DEFAULT_DEBUG_CHANNEL(msrle32);
+
+
+
+
+typedef struct CodecImpl
+{
+	BOOL	bInCompress;
+	BOOL	bInDecompress;
+	BOOL	bInDecompressEx;
+} CodecImpl;
+
+/***********************************************************************/
+
+static LONG MSRLE32_DecompressRLE4(
+	BYTE* pDst, LONG pitch,
+	const BYTE* pSrc,
+	LONG width, LONG height )
+{
+	FIXME( "RLE4 - not implemented yet\n" );
+	return ICERR_UNSUPPORTED;
+}
+
+static LONG MSRLE32_DecompressRLE8(
+	BYTE* pDst, LONG pitch,
+	const BYTE* pSrc,
+	LONG width, LONG height )
+{
+	LONG	x,y;
+	int		len;
+	UINT	data;
+
+	x = 0; y = 0;
+	while ( y < height )
+	{
+		len = *pSrc++; data = *pSrc++;
+		if ( len > 0 )
+		{
+			/* run length encoding */
+			while ( len-- > 0 && x < width )
+				pDst[x++] = (BYTE)data;
+		}
+		else
+		{
+			switch ( data )
+			{
+			case 0: /* EOL */
+				x = 0; y++; pDst += pitch;
+				break;
+			case 1: /* END */
+				return ICERR_OK;
+			case 2: /* DELTA */
+				x += (LONG)*pSrc++; y += (LONG)*pSrc++;
+				break;
+			default: /* RAW */
+				len = data;
+				if ( (len+x) > width )
+					len = width-x;
+				memcpy( &pDst[x], pSrc, len );
+				x += len;
+				pSrc += (data+1)&(~1);
+				break;
+			}
+		}
+	}
+
+	return ICERR_OK;
+}
+
+/***********************************************************************/
+
+static BOOL MSRLE32_IsValidInfoHeader( const BITMAPINFO* pbiIn )
+{
+	if ( pbiIn->bmiHeader.biSize < sizeof(BITMAPINFOHEADER) ||
+		 pbiIn->bmiHeader.biWidth <= 0 ||
+		 pbiIn->bmiHeader.biHeight == 0 ||
+		 pbiIn->bmiHeader.biPlanes != 1 )
+		return FALSE;
+
+	return TRUE;
+}
+
+static DWORD MSRLE32_GetClrUsed( const BITMAPINFO* pbiIn )
+{
+	if ( pbiIn->bmiHeader.biBitCount > 8 )
+		return 0;
+	return (pbiIn->bmiHeader.biClrUsed == 0) ? (1<<pbiIn->bmiHeader.biBitCount) : pbiIn->bmiHeader.biClrUsed;
+}
+
+static DWORD MSRLE32_GetUncompressedPitch( const BITMAPINFOHEADER* pbiIn )
+{
+	return ((((pbiIn->biWidth*pbiIn->biBitCount)+7)>>3)+3)&(~3);
+}
+
+static DWORD MSRLE32_GetUncompressedSize( const BITMAPINFOHEADER* pbiIn )
+{
+	return MSRLE32_GetUncompressedPitch( pbiIn ) * abs(pbiIn->biHeight);
+}
+
+
+static BOOL MSRLE32_IsValidRGB( const BITMAPINFO* pbiIn )
+{
+	if ( !MSRLE32_IsValidInfoHeader( pbiIn ) )
+		return FALSE;
+
+	if ( pbiIn->bmiHeader.biSizeImage != 0 &&
+		 pbiIn->bmiHeader.biSizeImage < MSRLE32_GetUncompressedSize( &pbiIn->bmiHeader ) )
+		return FALSE;
+
+
+	switch ( pbiIn->bmiHeader.biCompression )
+	{
+	case 0:
+	case mmioFOURCC('R','G','B',' '):
+		if ( pbiIn->bmiHeader.biBitCount == 1 ||
+			 pbiIn->bmiHeader.biBitCount == 4 ||
+			 pbiIn->bmiHeader.biBitCount == 8 ||
+			 pbiIn->bmiHeader.biBitCount == 16 ||
+			 pbiIn->bmiHeader.biBitCount == 24 ||
+			 pbiIn->bmiHeader.biBitCount == 32 )
+			return TRUE;
+		break;
+	default:
+		break;
+	}
+
+	return FALSE;
+}
+
+static BOOL MSRLE32_IsValidRLE( const BITMAPINFO* pbiIn )
+{
+	if ( !MSRLE32_IsValidInfoHeader( pbiIn ) )
+		return FALSE;
+
+	switch ( pbiIn->bmiHeader.biCompression )
+	{
+	case 1:
+	case 2:
+	case mmioFOURCC('R','L','E',' '):
+	case mmioFOURCC('R','L','E','8'):
+	case mmioFOURCC('R','L','E','4'):
+	case mmioFOURCC('M','R','L','E'):
+		if ( pbiIn->bmiHeader.biBitCount == 8 ||
+			 pbiIn->bmiHeader.biBitCount == 4 )
+			return TRUE;
+		break;
+	default:
+		break;
+	}
+
+	return FALSE;
+}
+
+static BOOL MSRLE32_CompareInfoHeader( const BITMAPINFO* pbiIn, const BITMAPINFO* pbiOut )
+{
+	if ( !MSRLE32_IsValidInfoHeader( pbiIn ) ||
+		 !MSRLE32_IsValidInfoHeader( pbiOut ) )
+		return FALSE;
+
+	if ( pbiIn->bmiHeader.biWidth != pbiOut->bmiHeader.biWidth ||
+		 pbiIn->bmiHeader.biHeight != pbiOut->bmiHeader.biHeight ||
+		 pbiIn->bmiHeader.biPlanes != pbiOut->bmiHeader.biPlanes ||
+		 pbiIn->bmiHeader.biBitCount != pbiOut->bmiHeader.biBitCount )
+		return FALSE;
+
+	return TRUE;
+}
+
+
+/***********************************************************************/
+
+static LONG Codec_DrvQueryConfigure( CodecImpl* This )
+{
+	return ICERR_UNSUPPORTED;
+}
+
+static LONG Codec_DrvConfigure( CodecImpl* This, HWND hwnd, DRVCONFIGINFO* pinfo )
+{
+	return ICERR_UNSUPPORTED;
+}
+
+static LONG Codec_QueryAbout( void )
+{
+	return ICERR_UNSUPPORTED;
+}
+
+static LONG Codec_About( HWND hwnd )
+{
+	return ICERR_UNSUPPORTED;
+}
+
+static LONG Codec_CompressQuery( CodecImpl* This, BITMAPINFO* pbiIn, BITMAPINFO* pbiOut )
+{
+	FIXME( "compression is not implemented!\n" );
+	return ICERR_UNSUPPORTED;
+}
+
+static LONG Codec_CompressBegin( CodecImpl* This, BITMAPINFO* pbiIn, BITMAPINFO* pbiOut )
+{
+	return ICERR_UNSUPPORTED;
+}
+
+static LONG Codec_Compress( CodecImpl* This, ICCOMPRESS* picc, DWORD dwSize )
+{
+	FIXME( "compression is not implemented!\n" );
+	return ICERR_UNSUPPORTED;
+}
+
+static LONG Codec_CompressEnd( CodecImpl* This )
+{
+	This->bInCompress = FALSE;
+	return ICERR_UNSUPPORTED;
+}
+
+static LONG Codec_CompressFramesInfo( CodecImpl* This, ICCOMPRESSFRAMES* piccf, DWORD dwSize )
+{
+	return ICERR_UNSUPPORTED;
+}
+
+static LONG Codec_CompressGetFormat( CodecImpl* This, BITMAPINFO* pbiIn, BITMAPINFO* pbiOut )
+{
+	return ICERR_UNSUPPORTED;
+}
+
+static LONG Codec_CompressGetSize( CodecImpl* This, BITMAPINFO* pbiIn, BITMAPINFO* pbiOut )
+{
+	return ICERR_UNSUPPORTED;
+}
+
+static LONG Codec_ICQueryConfigure( CodecImpl* This )
+{
+	return ICERR_OK;
+}
+static LONG Codec_ICConfigure( CodecImpl* This, HWND hwnd )
+{
+	MessageBoxA( hwnd, "Wine RLE Driver", "MSRLE32", MB_OK );
+	return ICERR_OK;
+}
+
+static LONG Codec_DecompressQuery( CodecImpl* This, BITMAPINFO* pbiIn, BITMAPINFO* pbiOut )
+{
+	if ( pbiIn == NULL )
+		return ICERR_BADPARAM;
+	if ( !MSRLE32_IsValidRLE( pbiIn ) )
+		return ICERR_UNSUPPORTED;
+
+	if ( pbiOut != NULL )
+	{
+		if ( !MSRLE32_IsValidRGB( pbiOut ) )
+			return ICERR_UNSUPPORTED;
+		if ( !MSRLE32_CompareInfoHeader( pbiIn, pbiOut ) )
+			return ICERR_UNSUPPORTED;
+	}
+
+	return ICERR_OK;
+}
+
+static LONG Codec_DecompressBegin( CodecImpl* This, BITMAPINFO* pbiIn, BITMAPINFO* pbiOut )
+{
+	LONG	lr;
+
+	if ( pbiIn == NULL || pbiOut == NULL )
+		return ICERR_BADPARAM;
+	lr = Codec_DecompressQuery( This, pbiIn, pbiOut );
+	if ( lr != ICERR_OK )
+		return lr;
+
+	This->bInDecompress = TRUE;
+
+	return ICERR_OK;
+}
+
+static LONG Codec_Decompress( CodecImpl* This, ICDECOMPRESS* picd, DWORD dwSize )
+{
+	LONG	lr;
+
+	if ( !This->bInDecompress )
+		return ICERR_BADHANDLE; /* FIXME? */
+
+	if ( ( picd->dwFlags & ICDECOMPRESS_NOTKEYFRAME ) &&
+		 ( picd->dwFlags & ICDECOMPRESS_UPDATE ) )
+		return ICERR_CANTUPDATE; /* FIXME? */
+
+	if ( picd->lpbiInput == NULL ||
+		 picd->lpInput == NULL ||
+		 picd->lpbiOutput == NULL ||
+		 picd->lpOutput == NULL )
+		return ICERR_BADPARAM;
+
+	switch ( picd->lpbiInput->biBitCount )
+	{
+	case 4: /* RLE4 */
+		lr = MSRLE32_DecompressRLE4(
+			(BYTE*)picd->lpOutput,
+			MSRLE32_GetUncompressedPitch( picd->lpbiInput ),
+			(const BYTE*)picd->lpInput,
+			picd->lpbiInput->biWidth,
+			picd->lpbiInput->biHeight );
+		break;
+	case 8: /* RLE8 */
+		lr = MSRLE32_DecompressRLE8(
+			(BYTE*)picd->lpOutput,
+			MSRLE32_GetUncompressedPitch( picd->lpbiInput ),
+			(const BYTE*)picd->lpInput,
+			picd->lpbiInput->biWidth,
+			picd->lpbiInput->biHeight );
+		break;
+	default:
+		lr = ICERR_BADBITDEPTH;
+		break;
+	}
+
+	return lr;
+}
+
+static LONG Codec_DecompressEnd( CodecImpl* This )
+{
+	This->bInDecompress = FALSE;
+	return ICERR_OK;
+}
+
+static LONG Codec_DecompressGetFormat( CodecImpl* This, BITMAPINFO* pbiIn, BITMAPINFO* pbiOut )
+{
+	DWORD	biClrUsed;
+	LONG	lr;
+
+	if ( pbiIn == NULL )
+		return ICERR_BADPARAM;
+
+	lr = Codec_DecompressQuery( This, pbiIn, NULL );
+	if ( lr != ICERR_OK )
+		return ( pbiOut == NULL ) ? 0 : lr;
+
+	biClrUsed = MSRLE32_GetClrUsed(pbiIn);
+	if ( pbiOut == NULL )
+		return sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * biClrUsed;
+
+	ZeroMemory( pbiOut, sizeof(BITMAPINFOHEADER) );
+	memcpy( &pbiOut->bmiHeader, &pbiIn->bmiHeader, sizeof(BITMAPINFOHEADER) );
+	memcpy( &pbiOut->bmiColors, &pbiIn->bmiColors, sizeof(RGBQUAD) * biClrUsed );
+	pbiOut->bmiHeader.biCompression = 0;
+	pbiOut->bmiHeader.biSizeImage = MSRLE32_GetUncompressedSize( &pbiOut->bmiHeader );
+
+	return ICERR_OK;
+}
+
+static LONG Codec_DecompressGetPalette( CodecImpl* This, BITMAPINFO* pbiIn, BITMAPINFO* pbiOut )
+{
+	if ( pbiIn == NULL )
+		return ICERR_BADPARAM;
+
+	return (pbiOut == NULL) ? 0 : ICERR_UNSUPPORTED;
+}
+
+static LONG Codec_DecompressSetPalette( CodecImpl* This, BITMAPINFO* pbiIn )
+{
+	return ICERR_UNSUPPORTED;
+}
+
+static LONG Codec_DecompressExQuery( CodecImpl* This, ICDECOMPRESSEX* picdex, DWORD dwSize )
+{
+	FIXME( "DecompressEx is not implemented!\n" );
+	return ICERR_UNSUPPORTED;
+}
+
+static LONG Codec_DecompressExBegin( CodecImpl* This, ICDECOMPRESSEX* picdex, DWORD dwSize )
+{
+	FIXME( "DecompressEx is not implemented!\n" );
+	return ICERR_UNSUPPORTED;
+}
+
+static LONG Codec_DecompressEx( CodecImpl* This, ICDECOMPRESSEX* picdex, DWORD dwSize )
+{
+	return ICERR_UNSUPPORTED;
+}
+
+static LONG Codec_DecompressExEnd( CodecImpl* This )
+{
+	This->bInDecompressEx = FALSE;
+	return ICERR_UNSUPPORTED;
+}
+
+static LONG Codec_GetInfo( CodecImpl* This, ICINFO* pici, DWORD dwSize )
+{
+	return ICERR_UNSUPPORTED;
+}
+
+static LONG Codec_GetQuality( CodecImpl* This, DWORD* pdwQuality )
+{
+	return ICERR_UNSUPPORTED;
+}
+
+static LONG Codec_GetState( CodecImpl* This, LPVOID pvState, DWORD dwSize )
+{
+	if ( pvState == NULL )
+		return 0;
+
+	/* no driver-specific state */
+
+	return 0;
+}
+
+static LONG Codec_SetQuality( CodecImpl* This, DWORD* pdwQuality )
+{
+	return ICERR_UNSUPPORTED;
+}
+
+static LONG Codec_SetStatusProc(CodecImpl* This, ICSETSTATUSPROC* picssp, DWORD dwSize )
+{
+	if ( picssp == NULL )
+		return 0;
+
+	/* no driver-specific state */
+
+	return 0;
+}
+
+static LONG Codec_SetState( CodecImpl* This, LPVOID pvState, DWORD dwSize )
+{
+	return ICERR_UNSUPPORTED;
+}
+
+static CodecImpl* Codec_AllocDriver( void )
+{
+	CodecImpl*	This;
+
+	This = HeapAlloc( GetProcessHeap(), 0, sizeof(CodecImpl) );
+	if ( This == NULL )
+		return NULL;
+	ZeroMemory( This, sizeof(CodecImpl) );
+	This->bInCompress = FALSE;
+	This->bInDecompress = FALSE;
+	This->bInDecompressEx = FALSE;
+
+	return This;
+}
+
+static void Codec_Close( CodecImpl* This )
+{
+	if ( This->bInCompress )
+		Codec_CompressEnd(This);
+	if ( This->bInDecompress )
+		Codec_DecompressEnd(This);
+	if ( This->bInDecompressEx )
+		Codec_DecompressExEnd(This);
+
+	HeapFree( GetProcessHeap(), 0, This );
+}
+
+
+
+
+
+
+LONG APIENTRY MSRLE32_DriverProc(
+	DWORD dwDriverId, HDRVR hdrvr, UINT msg, LONG lParam1, LONG lParam2 )
+{
+	TRACE( "DriverProc(%08lx,%08x,%08x,%08lx,%08lx)\n",
+			 dwDriverId, hdrvr, msg, lParam1, lParam2 );
+
+	switch ( msg )
+	{
+	case DRV_LOAD:
+		TRACE("DRV_LOAD\n");
+		return TRUE;
+	case DRV_FREE:
+		TRACE("DRV_FREE\n");
+		return TRUE;
+	case DRV_OPEN:
+		TRACE("DRV_OPEN\n");
+		return (LONG)Codec_AllocDriver();
+	case DRV_CLOSE:
+		TRACE("DRV_CLOSE\n");
+		Codec_Close( (CodecImpl*)dwDriverId );
+		return TRUE;
+	case DRV_ENABLE:
+		TRACE("DRV_ENABLE\n");
+		return TRUE;
+	case DRV_DISABLE:
+		TRACE("DRV_DISABLE\n");
+		return TRUE;
+	case DRV_QUERYCONFIGURE:
+		TRACE("DRV_QUERYCONFIGURE\n");
+		return Codec_DrvQueryConfigure( (CodecImpl*)dwDriverId );
+	case DRV_CONFIGURE:
+		TRACE("DRV_CONFIGURE\n");
+		return Codec_DrvConfigure( (CodecImpl*)dwDriverId,
+					(HWND)lParam1, (DRVCONFIGINFO*)lParam2 );
+	case DRV_INSTALL:
+		TRACE("DRV_INSTALL\n");
+		return DRVCNF_OK;
+	case DRV_REMOVE:
+		TRACE("DRV_REMOVE\n");
+		return 0;
+	case DRV_POWER:
+		TRACE("DRV_POWER\n");
+		return TRUE;
+
+	case ICM_ABOUT:
+		TRACE("ICM_ABOUT\n");
+		return (lParam1 == -1) ? Codec_QueryAbout() : Codec_About( (HWND)lParam1 );
+	case ICM_COMPRESS:
+		TRACE("ICM_COMPRESS\n");
+		return Codec_Compress((CodecImpl*)dwDriverId,(ICCOMPRESS*)lParam1,(DWORD)lParam2);
+	case ICM_COMPRESS_BEGIN:
+		TRACE("ICM_COMPRESS_BEGIN\n");
+		return Codec_CompressBegin((CodecImpl*)dwDriverId,(BITMAPINFO*)lParam1,(BITMAPINFO*)lParam2);
+	case ICM_COMPRESS_END:
+		TRACE("ICM_COMPRESS_END\n");
+		return Codec_CompressEnd((CodecImpl*)dwDriverId);
+	case ICM_COMPRESS_FRAMES_INFO:
+		TRACE("ICM_COMPRESS_FRAMES_INFO\n");
+		return Codec_CompressFramesInfo((CodecImpl*)dwDriverId,(ICCOMPRESSFRAMES*)lParam1,(DWORD)lParam2);
+	case ICM_COMPRESS_GET_FORMAT:
+		TRACE("ICM_COMPRESS_GET_FORMAT\n");
+		return Codec_CompressGetFormat((CodecImpl*)dwDriverId,(BITMAPINFO*)lParam1,(BITMAPINFO*)lParam2);
+	case ICM_COMPRESS_GET_SIZE:
+		TRACE("ICM_COMPRESS_GET_SIZE\n");
+		return Codec_CompressGetSize((CodecImpl*)dwDriverId,(BITMAPINFO*)lParam1,(BITMAPINFO*)lParam2);
+	case ICM_COMPRESS_QUERY:
+		TRACE("ICM_COMPRESS_GET_SIZE\n");
+		return Codec_CompressQuery((CodecImpl*)dwDriverId,(BITMAPINFO*)lParam1,(BITMAPINFO*)lParam2);
+
+	case ICM_CONFIGURE:
+		TRACE("ICM_CONFIGURE\n");
+		return ( lParam1 == -1 ) ? Codec_ICQueryConfigure( (CodecImpl*)dwDriverId ) : Codec_ICConfigure( (CodecImpl*)dwDriverId, (HWND)lParam1 );
+
+	case ICM_DECOMPRESS:
+		TRACE( "ICM_DECOMPRESS\n" );
+		return Codec_Decompress((CodecImpl*)dwDriverId,(ICDECOMPRESS*)lParam1,(DWORD)lParam2);
+	case ICM_DECOMPRESS_BEGIN:
+		TRACE( "ICM_DECOMPRESS_BEGIN\n" );
+		return Codec_DecompressBegin((CodecImpl*)dwDriverId,(BITMAPINFO*)lParam1,(BITMAPINFO*)lParam2);
+	case ICM_DECOMPRESS_END:
+		TRACE( "ICM_DECOMPRESS_END\n" );
+		return Codec_DecompressEnd((CodecImpl*)dwDriverId);
+	case ICM_DECOMPRESS_GET_FORMAT:
+		TRACE( "ICM_DECOMPRESS_GET_FORMAT\n" );
+		return Codec_DecompressGetFormat((CodecImpl*)dwDriverId,(BITMAPINFO*)lParam1,(BITMAPINFO*)lParam2);
+	case ICM_DECOMPRESS_GET_PALETTE:
+		TRACE( "ICM_DECOMPRESS_GET_PALETTE\n" );
+		return Codec_DecompressGetPalette((CodecImpl*)dwDriverId,(BITMAPINFO*)lParam1,(BITMAPINFO*)lParam2);
+	case ICM_DECOMPRESS_QUERY:
+		TRACE( "ICM_DECOMPRESS_QUERY\n" );
+		return Codec_DecompressQuery((CodecImpl*)dwDriverId,(BITMAPINFO*)lParam1,(BITMAPINFO*)lParam2);
+	case ICM_DECOMPRESS_SET_PALETTE:
+		TRACE( "ICM_DECOMPRESS_SET_PALETTE\n" );
+		return Codec_DecompressSetPalette((CodecImpl*)dwDriverId,(BITMAPINFO*)lParam1);
+
+	case ICM_DECOMPRESSEX_BEGIN:
+		TRACE( "ICM_DECOMPRESSEX_BEGIN\n" );
+		return Codec_DecompressExBegin((CodecImpl*)dwDriverId,(ICDECOMPRESSEX*)lParam1,(DWORD)lParam2);
+	case ICM_DECOMPRESSEX:
+		TRACE( "ICM_DECOMPRESSEX\n" );
+		return Codec_DecompressEx((CodecImpl*)dwDriverId,(ICDECOMPRESSEX*)lParam1,(DWORD)lParam2);
+	case ICM_DECOMPRESSEX_END:
+		TRACE( "ICM_DECOMPRESSEX_END\n" );
+		return Codec_DecompressExEnd((CodecImpl*)dwDriverId);
+	case ICM_DECOMPRESSEX_QUERY:
+		TRACE( "ICM_DECOMPRESSEX_QUERY\n" );
+		return Codec_DecompressExQuery((CodecImpl*)dwDriverId,(ICDECOMPRESSEX*)lParam1,(DWORD)lParam2);
+
+	case ICM_GETINFO:
+		TRACE( "ICM_GETINFO\n" );
+		return Codec_GetInfo((CodecImpl*)dwDriverId,(ICINFO*)lParam1,(DWORD)lParam2);
+	case ICM_GETQUALITY:
+		TRACE( "ICM_SETQUALITY\n");
+		return Codec_GetQuality((CodecImpl*)dwDriverId,(DWORD*)lParam1);
+	case ICM_GETSTATE:
+		TRACE( "ICM_GETSTATE\n" );
+		return Codec_GetState((CodecImpl*)dwDriverId,(LPVOID)lParam1,(DWORD)lParam2);
+	case ICM_SETQUALITY:
+		TRACE( "ICM_SETQUALITY\n");
+		return Codec_SetQuality((CodecImpl*)dwDriverId,(DWORD*)lParam1);
+	case ICM_SET_STATUS_PROC:
+		TRACE( "ICM_SET_STATUS_PROC\n" );
+		return Codec_SetStatusProc((CodecImpl*)dwDriverId,(ICSETSTATUSPROC*)lParam1,(DWORD)lParam2);
+	case ICM_SETSTATE:
+		TRACE( "ICM_SETSTATE\n" );
+		return Codec_SetState((CodecImpl*)dwDriverId,(LPVOID)lParam1,(DWORD)lParam2);
+
+	}
+
+	return DefDriverProc( dwDriverId, hdrvr, msg, lParam1, lParam2 );
+}
+
+BOOL APIENTRY MSRLE32_DllMain( HINSTANCE hInst, DWORD dwReason, LPVOID lpvReserved )
+{
+	TRACE( "(%08x,%08lx,%p)\n",hInst,dwReason,lpvReserved );
+
+	return TRUE;
+}
diff --git a/dlls/msrle32/msrle32.spec b/dlls/msrle32/msrle32.spec
new file mode 100644
index 0000000..4d405fa
--- /dev/null
+++ b/dlls/msrle32/msrle32.spec
@@ -0,0 +1,13 @@
+name msrle32
+type win32
+init MSRLE32_DllMain
+
+import winmm.dll
+import user32.dll
+import kernel32.dll
+import ntdll.dll
+
+debug_channels(msrle32)
+
+@ stdcall DriverProc(long long long long long) MSRLE32_DriverProc
+