Implemented some very basic functionality.

diff --git a/dlls/urlmon/umon.c b/dlls/urlmon/umon.c
index 99a4096..8ba7e4e 100644
--- a/dlls/urlmon/umon.c
+++ b/dlls/urlmon/umon.c
@@ -13,7 +13,10 @@
 
 #include "urlmon.h"
 
-DEFAULT_DEBUG_CHANNEL(win32);
+DEFAULT_DEBUG_CHANNEL(urlmon);
+
+/* native urlmon.dll uses this key, too */
+static WCHAR BSCBHolder[] = { '_','B','S','C','B','_','H','o','l','d','e','r','_',0 };
 
 /***********************************************************************
  *           CreateURLMoniker (URLMON.22)
@@ -35,3 +38,76 @@
 
    return CreateFileMoniker(szURL, ppmk);
 }
+
+/***********************************************************************
+ *           RegisterBindStatusCallback (URLMON.52)
+ *
+ * Register a bind status callback
+ *
+ * RETURNS
+ *    S_OK 		success
+ *    E_INVALIDARG  invalid argument(s)
+ *    E_OUTOFMEMORY	out of memory 
+ *
+ */
+HRESULT WINAPI RegisterBindStatusCallback(
+    IBindCtx *pbc,
+    IBindStatusCallback *pbsc,
+    IBindStatusCallback **ppbscPrevious,
+    DWORD dwReserved)
+{
+    IBindStatusCallback *prev;
+
+	TRACE("(%p,%p,%p,%lu)\n", pbc, pbsc, ppbscPrevious, dwReserved);
+
+    if (pbc == NULL || pbsc == NULL)
+        return E_INVALIDARG;
+
+    if (SUCCEEDED(IBindCtx_GetObjectParam(pbc, BSCBHolder, (IUnknown **)&prev)))
+    {
+        IBindCtx_RevokeObjectParam(pbc, BSCBHolder);
+        if (ppbscPrevious)
+            *ppbscPrevious = prev;
+        else
+            IBindStatusCallback_Release(prev);
+    }
+    
+	return IBindCtx_RegisterObjectParam(pbc, BSCBHolder, (IUnknown *)pbsc);
+}
+
+/***********************************************************************
+ *           RevokeBindStatusCallback (URLMON.57)
+ *
+ * Unregister a bind status callback
+ *
+ * RETURNS
+ *    S_OK 		success
+ *    E_INVALIDARG  invalid argument(s)
+ *    E_FAIL pbsc wasn't registered with pbc
+ *
+ */
+HRESULT WINAPI RevokeBindStatusCallback(
+    IBindCtx *pbc,
+    IBindStatusCallback *pbsc)
+{
+    IBindStatusCallback *callback;
+    HRESULT hr = E_FAIL;
+
+	TRACE("(%p,%p)\n", pbc, pbsc);
+
+    if (pbc == NULL || pbsc == NULL)
+        return E_INVALIDARG;
+
+    if (SUCCEEDED(IBindCtx_GetObjectParam(pbc, BSCBHolder, (IUnknown **)&callback)))
+    {
+        if (callback == pbsc)
+        {
+            IBindCtx_RevokeObjectParam(pbc, BSCBHolder);
+            hr = S_OK;
+        }
+        IBindStatusCallback_Release(pbsc);
+    }
+
+    return hr;
+}
+